[
  {
    "path": ".gitignore",
    "content": "node_modules\n.cache\n.parcel-cache\nskin.json\ntoken.json\nartifacts\n"
  },
  {
    "path": ".travis.yml",
    "content": "matrix:\n  include:\n  - os: osx\n    osx_image: xcode9.2\n    language: node_js\n    node_js: '10'\n    env:\n    - ELECTRON_CACHE=$HOME/.cache/electron\n    - ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder\n  - os: linux\n    dist: xenial\n    language: node_js\n    node_js: '10'\n    env:\n    - ELECTRON_CACHE=$HOME/.cache/electron\n    - ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder\ncache:\n  directories:\n  - ~/.npm\n  - ~/.cache\n  - node_modules\n  - \"$HOME/.cache/electron\"\n  - \"$HOME/.cache/electron-builder\"\n  override:\n    - yarn install --frozen-lockfile\nbefore_install:\n- |\n  if [ \"$TRAVIS_OS_NAME\" == \"osx\" ]; then\n    mkdir -p /tmp/git-lfs && curl -L https://github.com/github/git-lfs/releases/download/v2.3.1/git-lfs-$([ \"$TRAVIS_OS_NAME\" == \"linux\" ] && echo \"linux\" || echo \"darwin\")-amd64-2.3.1.tar.gz | tar -xz -C /tmp/git-lfs --strip-components 1\n    export PATH=\"/tmp/git-lfs:$PATH\"\n  fi\nbefore_script:\n- git lfs pull\n# For Electron e2e UI testing\n# See https://github.com/electron/spectron#on-travis-ci\n- |\n  if [ \"$TRAVIS_OS_NAME\" == \"linux\" ]; then\n    export DISPLAY=:99.0\n    sh -e /etc/init.d/xvfb start\n    sleep 3 # give xvfb some time to start\n  fi\nscript:\n- yarn build\n- |\n  if [ \"$TRAVIS_OS_NAME\" == \"linux\" ]; then\n    docker run --rm \\\n      $(env | \\\n        grep -Eo '^[^\\s=]*(DEBUG|NODE_|ELECTRON_|YARN_|NPM_|CI|CIRCLE|TRAVIS|APPVEYOR_|CSC_|_TOKEN|_KEY|AWS_|STRIP|BUILD_)[^\\s=]*' | \\\n        sed '/^$/d;s/^/-e /' | \\\n        paste -sd ' ' \\\n      ) \\\n      -v ${PWD}:/project \\\n      -v ~/.cache/electron:/root/.cache/electron \\\n      -v ~/.cache/electron-builder:/root/.cache/electron-builder \\\n      electronuserland/builder:wine \\\n      /bin/bash -c \"yarn --link-duplicates --pure-lockfile && yarn dist --linux --win\"\n  else\n    yarn test && yarn dist\n  fi\nbefore_cache:\n- rm -rf $HOME/.cache/electron-builder/wine"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Maksim Chingin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "![](https://github.com/umnik1/yaamp/assets/2902730/70de0d28-d871-4a45-8416-0f0a09cbb198)\n\n# Yaamp\n\nИсходники проекта по интеграции Яндекс.Музыки и *Winamp (Webamp)*\n\n## Описание\n\n**Yaamp** — это десктопный музыкальный плеер, который объединяет классический интерфейс Winamp с возможностями Яндекс.Музыки. Приложение построено на базе Electron и использует Webamp для воссоздания аутентичного опыта использования легендарного Winamp с современной интеграцией потокового сервиса.\n\nYaamp позволяет наслаждаться музыкой из каталога Яндекс.Музыки через знакомый интерфейс Winamp, сохраняя все его характерные особенности: скины, эквалайзер, визуализацию и ностальгический вид.\n\n## Особенности\n\n### Основной функционал\n- **Интеграция с Яндекс.Музыкой** — полный доступ к каталогу музыки через официальный API\n- **Классический интерфейс Winamp** — точная копия оригинального плеера через Webamp\n- **Поддержка скинов** — использование оригинальных скинов Winamp (.wsz файлы)\n- **Эквалайзер** — 10-полосный графический эквалайзер с сохранением настроек\n- **Визуализация Milkdrop** — поддержка визуализации музыки\n- **Плейлист** — полнофункциональный плейлист с возможностью управления треками\n\n### Управление воспроизведением\n- **Моя волна** — запуск персонализированной радиостанции\n- **Любимые треки** — быстрый доступ к избранным композициям\n- **Поиск** — поиск артистов и альбомов с возможностью воспроизведения\n- **Управление треками** — переключение, пауза, воспроизведение через интерфейс или горячие клавиши\n\n### HTTP API\n- **Веб-интерфейс** — управление плеером через браузер\n- **REST API** — программное управление плеером через HTTP запросы\n- **Удаленное управление** — контроль воспроизведения с любого устройства в локальной сети\n- **Поиск и воспроизведение** — поиск артистов/альбомов и запуск через API\n\n### Интеграции\n- **Discord Rich Presence** — отображение текущего трека в статусе Discord\n- **Горячие клавиши** — поддержка стандартных горячих клавиш Winamp\n- **Touch Bar (macOS)** — управление воспроизведением через Touch Bar на MacBook\n\n### Технические особенности\n- **Кроссплатформенность** — поддержка Windows, macOS и Linux\n- **Автоматические обновления** — встроенная система обновлений через electron-updater\n- **Сохранение настроек** — автоматическое сохранение позиций окон, скинов и эквалайзера\n- **Прозрачность окон** — поддержка прозрачности для аутентичного вида Winamp\n- **IPC коммуникация** — взаимодействие между Electron и Webamp через IPC\n\n---\n\n### **Установка**\n\n1. `yarn install` и `yarn install` в папке **webamp**\n2. Поправить в **package.json** - \"copy\" и \"deploy-webamp\" на тот, на какой системе вы сейчас работаете, на данный момент настроенно на Windows\n\n**Добавление функционала и работа с Webamp**\n\n1. Используйте `yarn deploy-webamp` для сборки Webamp\n\n\n---\n\n**Based on:** [Webamp](https://github.com/captbaritone/webamp \"Webamp\"), [yandex-music-api](https://github.com/MarshalX/yandex-music-api \"yandex-music-api\"), [yandex-music-open-api](https://github.com/acherkashin/yandex-music-open-api \"yandex-music-open-api\")\n*While the Winamp name, interface and logo are surely property of Nullsoft.*\n\n\n---\n\n# Yaamp API\n\nHTTP API для управления плеером Yaamp.\n\n## Включение API\n\nAPI можно включить двумя способами:\n\n1. **Через файл настроек** (`settings.json` в папке userData):\n```json\n{\n  \"api\": {\n    \"enabled\": true,\n    \"port\": 8080\n  }\n}\n```\n\n2. **Через IPC** (из renderer процесса):\n```javascript\nipcRenderer.invoke('setApiSettings', { enabled: true, port: 8080 });\n```\n\nПосле изменения настроек API сервер автоматически перезапустится.\n\n## Веб-интерфейс\n\nНа корневой странице API (`http://127.0.0.1:{port}/`) доступен веб-интерфейс для управления плеером.\n\n**Особенности:**\n- Кнопки управления: Предыдущий трек, Воспроизведение/Пауза, Следующий трек\n- Слайдер управления громкостью (0-100%)\n- Кнопки для запуска \"Моя волна\" и \"Любимые треки\"\n- Поиск треков с возможностью воспроизведения найденных артистов и альбомов\n- Отображение статуса API и последнего действия\n- Поддержка клавиатурных сокращений:\n  - `Пробел` - Воспроизведение/Пауза\n  - `←` - Предыдущий трек\n  - `→` - Следующий трек\n\nПросто откройте в браузере: `http://127.0.0.1:8080/`\n\n## Endpoints\n\nВсе endpoints доступны по адресу `http://127.0.0.1:{port}` (по умолчанию `http://127.0.0.1:8080`).\n\n### GET /next\nПереключить на следующий трек.\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/next\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Next track\"\n}\n```\n\n### GET /prev\nПереключить на предыдущий трек.\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/prev\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Previous track\"\n}\n```\n\n### GET /playpause\nПереключить воспроизведение/паузу.\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/playpause\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Play/Pause toggled\"\n}\n```\n\n### GET /play\nВоспроизвести трек.\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/play\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Play\"\n}\n```\n\n### GET /pause\nПоставить на паузу.\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/pause\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Pause\"\n}\n```\n\n### GET /volume?value=50\nУстановить громкость плеера (0-100).\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/volume?value=75\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Volume set to 75%\",\n  \"volume\": 75\n}\n```\n\n### GET /mywave\nЗапустить \"Моя волна\".\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/mywave\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Моя волна запущена\"\n}\n```\n\n### GET /myloved\nЗагрузить \"Любимые треки\".\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/myloved\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Любимые треки загружены\"\n}\n```\n\n### GET /search?query=...\nПоиск артистов и альбомов.\n\n**Параметры:**\n- `query` или `q` (обязательный) - поисковый запрос\n\n**Пример:**\n```bash\ncurl \"http://127.0.0.1:8080/search?query=король\"\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"results\": [\n    {\n      \"type\": \"artist\",\n      \"id\": \"12345\",\n      \"name\": \"Король и Шут\"\n    }\n  ]\n}\n```\n\n**Примечание:** Результаты поиска могут содержать артистов (`type: \"artist\"`) или альбомы (`type: \"album\"`). Используйте ID из результатов с эндпоинтами `/setArtist` или `/setAlbum` для воспроизведения.\n\n### GET /setArtist?id=...\nЗагрузить популярные треки артиста по ID и начать воспроизведение.\n\n**Параметры:**\n- `id` или `artistId` (обязательный) - ID артиста из результатов поиска\n\n**Пример:**\n```bash\ncurl \"http://127.0.0.1:8080/setArtist?id=12345\"\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Артист загружен\"\n}\n```\n\n**Примечание:** ID артиста можно получить из результатов поиска (`/search`).\n\n### GET /setAlbum?id=...\nЗагрузить треки альбома по ID и начать воспроизведение.\n\n**Параметры:**\n- `id` или `albumId` (обязательный) - ID альбома из результатов поиска\n\n**Пример:**\n```bash\ncurl \"http://127.0.0.1:8080/setAlbum?id=67890\"\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Альбом загружен\"\n}\n```\n\n**Примечание:** ID альбома можно получить из результатов поиска (`/search`).\n\n### GET /status\nПроверить статус API сервера.\n\n**Пример:**\n```bash\ncurl http://127.0.0.1:8080/status\n```\n\n**Ответ:**\n```json\n{\n  \"success\": true,\n  \"message\": \"API server is running\",\n  \"endpoints\": [\"/next\", \"/prev\", \"/play\", \"/pause\", \"/playpause\", \"/volume?value=50\", \"/mywave\", \"/myloved\", \"/search?query=...\", \"/setArtist?id=...\", \"/setAlbum?id=...\", \"/status\"]\n}\n```\n\n## Безопасность\n\nAPI сервер доступен только на `127.0.0.1` (localhost), что означает, что он доступен только с локальной машины. Это обеспечивает базовую безопасность."
  },
  {
    "path": "bundled/skins/.gitignore",
    "content": "base-2.91.zip\nSkinner_Atlas/\n"
  },
  {
    "path": "bundled/skins/base-2.91/PLEDIT.TXT",
    "content": "[Text]\nNormal=#00FF00\nCurrent=#FFFFFF\nNormalBG=#000000\nSelectedBG=#0000C6\nFont=Arial\n"
  },
  {
    "path": "bundled/skins/base-2.91/REGION.TXT",
    "content": "; I stole this from the Complex skin, cause hey I thought it was cool :)\n; (and cause I'm too lazy to document it myself. :)\n; The original author is Adam Kennedy <adamk@iname.com>\n;\n; Hope you don't mind Adam :)\n;\n;\n; -Justin\n;\n;\n; P.S. you can use the section names [WindowShade] and [Equalizer]\n; for obvious purposes =)\n;\n;\n;                    REGION.TXT STRUCTURE FOR DEFINING SKIN MASKS\n;\n;The region information comes without any supporting documentation\n;so I thought I might as well make some.\n;\n;The region.txt in WinAmp 1.92 allows us to some interesting things with transparencies\n;But how does it work?\n;\n;Well, basically, it lets you define a set of polygons. Anything inside a polygon is drawn. Anything not in a polygon is not drawn. Simple heh?\n;For how to define it have a look below at the first block. Un-comment it now. Don't worry about commenting the actual one lower down, if WinAmp finds multiple definitions, it only does the first and ignores the rest\n;\n;How to make a mask\n;1. Type [Normal]. Real simple that one. (My guess is it is just for forward compatibility)\n;2. Just type the NumPoints= and leave the number blank, we'll fill it in later\n;3. OK, now for the fun part.\n;   The co-ordinates you should type in are the OUTSIDE pixel co-ordinates in x,y format.\n;   Start at the top lefthand corner and work your way CLOCKWISE around you polygon.\n;   Now WinAmp ONLY accepts the PointList as one line of comma seperated variables.\n;   You can use spaces, but DONT GO ONTO A NEW LINE. Clear? Good. :)\n;   One last thing, don't type the first position again at the end, WinAmp joins them.\n;   Putting a space between each pair is simply common sense, right?\n;4. Once your done, count the number of co-ords, and fill in that number for NumPoints.\n;\n;Oh, as a side note, the x variables go from 0 to 275, and the y from 0 to 116.\n;So if you look at the first example you can see I've gone across the second top line, gone down a bit, ducked in one pixel, gone down to the bottom, and across and back up the other side, putting another ledge on the other side.\n\n;This does the outside border, and chops some bits out on the top and edges\n;[Normal]\n;NumPoints=8    ;Do this LAST!\n;PointList=0,1,  275,1,  275,14,  274,14,  274,115,  1,115,  1,14,  0,14  \n\n;Cool heh? Very subtle effect. Now lets try a more complex one, with multiple polygons\n;For your first hard(ish) mask, I suggest defining each element as a seperate mask.\n;It makes them a bit easier to think about.\n\n;First, lets define an area that JUST does the titlebar.\n;[Normal]\n;NumPoints=4\n;PointList=0,1,  275,1,  275,14,  0,14\n\n;Simple as can be :)\n;Go ahead, uncomment it and have a look. Just remember to recomment everything above it\n;Doing your areas one at a time does speed the process up a bit\n\n;Now lets define JUST the area sort of inside the outer ring\n;[Normal]\n;NumPoints = 4\n;PointList = 3,15,  272,15,  272,113,  3,113\n\n;Right, so say we want a mask that has, the titlebar AND the main area.\n;We just add them together\n; [Normal] \n; NumPoints = 4, 4  ;Make sure to get the order right(although it doesnt matter here =P )\n; PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,113, 3,113\n\n;Dont forget to add that extra comma after the first set.\n; Having that bigger gap that lets you \"keep it in your head\" easier, it's a good idea\n\n;OK, now lets try something tricky. We are going to make a mask for just one green line around the outside of the skin\n;This introduces the other \"big thing\" with masks. Have a look at the first three co-ordinates below. You can see the first two moves we make are to go one to the side and then go down to the bottom. Looking at the last co-ordinate you can see we will come back up at the end, making a line two wide, right? \n;WRONG!! Here comes the big important phrase.\n;IF YOU ARNT FOLLOWING THE OUTSIDE EDGE, YOUR CO-ORDINATES MARK TRANSPARENT SPACE LIMITS\n;That's right. Because I don't make a square, because I have to turn \"inside\" the box, I am only marking space, and what I end up with is a mask with one green line.\n;WARNING: Leave your skins dialog open when you do this one. :)\n;[Normal]\n;NumPoints = 8\n;PointList = 1,14,  2,14,  2,114,  273,114,  273,14,  274,14,  274,115,  1,115\n\n;OK, as the final touch lets add lets the border we just made to the other two.\n;You should be able to work this out on your own\n;[Normal]\n;NumPoints = 4, 4, 8\n;PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,113, 3,113,     1,14, 2,14, 2,114, 273,114, 273,14, 274,14, 274,115, 1,115\n\n;hmm... that still looks a bit tacky down the bottom right\n;So I'm going to modify it a bit\n;See if you can work out what I've had to alter just by looking at the display of it\n;[Normal]\n;NumPoints = 4, 4, 8\n;PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,80, 3,80,     1,14, 2,14, 2,81, 273,81, 273,14, 274,14, 274,115, 1,115\n\n\n; Justin's whacked trans skin :) in one, big lame messy line\n; [Normal]\n; NumPoints=20,4,4,4,8,4,4,6,6,4,4,4,4\n; PointList=0,0,19,0,19,11,114,11,114,0,156,0,156,11,243,11,243,0,275,0,275,13,266,13,266,22,264,22,264,13,111,13,111,22,109,22,109,13,0,13,     109,22,266,22,266,36,109,36, 16,88,130,88,130,105,16,105,    136,89,157,89,157,104,136,104,    22,13,22,62,102,62,102,13,100,13,100,24,24,24,24,13,    0,0,275,0,275,3,0,3,   16,72,264,72,264,81,16,81,  0,13,0,78,16,78,16,75,4,75,4,13,   275,13,275,78,264,78,264,75,272,75,272,13,     14,78,16,78,16,105,14,105,     130,81,132,81,132,105,130,105,     146,81,146,89,148,89,148,81,     130,96,136,96,136,98,130,98\n\n;THE END\n;\n;Post-Script\n;The other good thing about doing your mask in bits and pieces like this is that can make multiple versions so you can change as your whims change\n"
  },
  {
    "path": "bundled/skins/base-2.91/Skining Updates.txt",
    "content": "Coppied from winamp/wa_dlg.h from the Winamp 2.9 ML SDK.\n\n       1) gen.bmp has a generic window frame for plugins to use.\n          its format is similar to the minibrowser's.\n          In addition gen.bmp includes a font for the titlebar, in both\n          highlight and no-highlight modes. The font is variable width,\n          and it uses the first color before the letter A as the delimiter.\n          The no-highlight form of letter must be the same width as the\n          highlight form.\n       2) genex.bmp has button and scrollbar images, as well as some individual\n          pixels that describe the colors for the dialog. The button and\n          scrollbar images should be self explanatory (note that the buttons\n          have 4 pixel sized edges that are not stretched, and the center is\n          stretched), and the scrollbars do something similar.\n          The colors start at (48,0) and run every other pixel. The meaning\n          of each pixel is:\n            x=48: item background (background to edits, listviews etc)\n            x=50: item foreground (text color of edit/listview, etc)\n            x=52: window background (used to set the bg color for the dialog)\n            x=54: button text color\n            x=56: window text color\n            x=58: color of dividers and sunken borders\n            x=60: selection color for listviews/playlists/etc\n            x=62: listview header background color\n            x=64: listview header text color\n            x=66: listview header frame top color\n            x=68: listview header frame middle color\n            x=70: listview header frame bottom color\n            x=72: listview header empty color\n            x=74: scrollbar foreground color\n            x=76: scrollbar background color\n            x=78: inverse scrollbar foreground color\n            x=80: inverse scrollbar background color\n            x=82: scrollbar dead area color"
  },
  {
    "path": "bundled/skins/base-2.91/VISCOLOR.TXT",
    "content": "0,0,0, // color 0 = black\n24,33,41, // color 1 = grey for dots\n239,49,16, // color 2 = top of spec\n206,41,16, // 3\n214,90,0, // 4\n214,102,0, // 5\n214,115,0, // 6\n198,123,8, // 7\n222,165,24, // 8\n214,181,33, // 9\n189,222,41, // 10\n148,222,33, // 11\n41,206,16, // 12\n50,190,16, // 13\n57,181,16, // 14\n49,156,8,  // 15\n41,148,0,  // 16\n24,132,8,   // 17 = bottom of spec\n255,255,255, // 18 = osc 1\n214,214,222, // 19 = osc 2 (slightly dimmer)\n181,189,189, // 20 = osc 3\n160,170,175,  // 21 = osc 4\n148,156,165,  // 22 = osc 4\n150, 150, 150, // 23 = analyzer peak dots\n"
  },
  {
    "path": "dist/.gitignore",
    "content": "*\n!.gitignore"
  },
  {
    "path": "main.js",
    "content": "// TODO: Нужно сделать рефакторинг всего кода, но мне лень с:\n\nconst path = require('path');\nconst url = require('url');\nconst { ipcMain, webContents, session, remote, screen, TouchBar, nativeImage } = require('electron');\nconst { TouchBarLabel, TouchBarButton, TouchBarSpacer } = TouchBar;\nconst crypto = require(\"crypto\");\nconst DiscordRPC =  require('discord-rpc');\n\nconst checkForUpdatesAndNotify = require('./src/node/updates.js')\nconst interceptStreamProtocol = require('./src/node/protocol.js')\nconst { createApiServer, stopApiServer } = require('./src/node/api-server.js')\n\nconst electron = require('electron')\nconst fs = require('fs')\nconst {readFile} = require('fs/promises');\n\nconst app = electron.app\nconst BrowserWindow = electron.BrowserWindow\n\nconst { YandexMusicClient } = require('yandex-music-client/YandexMusicClient')\nconst { getTrackUrl } = require('yandex-music-client/trackUrl')\n\n// раскомментировать для отображения дебаг панели\n//require('electron-debug')({ showDevTools:true, devToolsMode: 'undocked' })\n\nconst tokenPath = app.getPath(\"userData\") + '/token.json';\nconst skinPath = app.getPath(\"userData\") + '/skin.json';\nconst eqPath = app.getPath(\"userData\") + '/eq.json';\nconst settingsPath = app.getPath(\"userData\") + '/settings.json';\nconst URL_WITH_ACCESS_TOKEN_REGEX = 'https:\\\\/\\\\/music\\\\.yandex\\\\.(?:ru|com|by|kz|ua)\\\\/#access_token=([^&]*)';\n\nlet nowPlaying = 0;\nlet nowPlaylist = [];\n\nlet yaAuthToken = '';\nlet skinData = '';\nlet eqData = '';\nlet settingsData = {\n  windows: {\n    mainWindow: {\n      x: 0,\n      y: 12,\n      visible: true,\n    },\n    playlistWindow: {\n      x: 0,\n      y: 244,\n      size: [0, 0],\n      visible: true,\n    },\n    equalizerWindow: {\n      x: 0,\n      y: 128,\n      visible: true,\n    },\n    milkdropWindow: {\n      x: 275,\n      y: 12,\n      size: [7,8],\n      visible: true,\n    }\n  },\n  zoom: 1,\n  api: {\n    enabled: false,\n    port: 8080\n  }\n};\n\nlet resetSettings = settingsData;\nlet currentBounds;\n\n// Discord\nconst sessionId = crypto.randomBytes(20).toString('hex');\nconst clientId = '1161295534770892860';\n\nDiscordRPC.register(clientId);\n\nconst rpc = new DiscordRPC.Client({ transport: 'ipc' });\n\nrpc.login({ clientId }).catch(console.error);\n\n// Mac Touchbar\nlet prev = new TouchBarButton({\n  backgroundColor: '#000000',\n  icon: nativeImage.createFromDataURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAAXNSR0IArs4c6QAAASZJREFUOE9jXLv12H8GKoPr9+8zzJ8wmYERZLiTlyXVjN+37TjD0nVrGS4dOIow/Nz56xRb8OH5BwaQq48dO8Zw69S5ATK8t2cq3CfFJdkYvoLJI8uBXH7u/DmG89euM9w6eRa3y0Gaff38GCLC3RjQgwyXHIrh+IIFlwEwcZBX0C2myHBkgwkZfvv0eeKDBd1gQobjTS3owWJkqMmwYuUulIjFFywkuRxkKroFVDUc3QKqG45sAdmGg4IABrAVDTB5ZDnkpIgS5qAChxoAlkPhhoMMBRU43z+8p4b54Ox/5/QFBsaWKUv/g2z78f0HVQyGGXL7zAUGRnl5w/+MDIwIgxkhbCZGBob/DFAZRkYGRqg4SA4k+h8k9h9UzzAyMCDLwdQCpQBA03BAzydq3wAAAABJRU5ErkJggg=='),\n  iconPosition: 'overlay',\n  click: () => {\n    mainWindow.webContents.send('prevTrack');\n  }\n})\n\nlet play = new TouchBarButton({\n  backgroundColor: '#000000',\n  icon: nativeImage.createFromDataURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAAXNSR0IArs4c6QAAAQ9JREFUOE/FlbESwUAQhnfzLswo6YxOoTBDyzsoeQQlHaWSjoKhVJ4uoRGqoFFKR3dmw0oGiRM345rM3F2+/78/uxccToUEzcN2HBh0e4AEzxez2vDz2QL6oyFshOXDTcv+WcA9ukCuhRBwWG3+BG+3ut5J6o2a8onIuWmZYK1t2C0jnBO8VC7DZDxWFgnCI2NhONtWEfna+XMmUSKxnauIaINXKwVPL1jCQfh+tQ0vxefM2fk7KK/Fdh4FfQ9XcK4C/RqeSadeMv3UTaGZ04WjY3CHPj4oQenCObsnHXyv/Q9ULc1OX5La5XzRAmaI5zyZyEkABDTQhyMC8i8Eb/PIT+B9/n7j/q6ktfs0SgOutQw52vzOQLoAAAAASUVORK5CYII='),\n  iconPosition: 'overlay',\n  click: () => {\n    mainWindow.webContents.send('playPause');\n  }\n})\n\nlet next = new TouchBarButton({\n  backgroundColor: '#000000',\n  icon: nativeImage.createFromDataURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAAXNSR0IArs4c6QAAAPtJREFUOE9jXLv12H8GKoPr9+8zaCoqMjCCDHfysqSa8fu2HWdYum4tQ3RQMMLwc+evU2zBh+cfGECuPnbsGENydPQAGd7bMxXsk+KSbAwfweTQ5UEuP3f+HMP5a9fxuxxkgK+fH8PmTZswLIDJRYS7MSAHJ8mGg1yHbgFVDUe3gOqGI1tAE8NhYUx1w5Ejj6qGo6cKqhmObjAo7Ck23MhQE5x5sBULMDl0eZzpHFTgUANg5FCQoaAC5/uH99QwH5z93917z8DYMmXpf5BtP77/oIrBMEP2rVvKwGhmFgquLBgZmRj+///PwMjIiNUSRgbs4gw41F+4sJ0BABVaXHLFWpERAAAAAElFTkSuQmCC'),\n  iconPosition: 'overlay',\n  click: () => {\n    mainWindow.webContents.send('nextTrack');\n  }\n})\n\nlet trackinfo = new TouchBarButton({\n  backgroundColor: '#000000',\n  textColor: '#01E804',\n  label: '',\n  click: () => {\n    mainWindow.webContents.send('nextTrack');\n  }\n})\n\nconst touchBar = new TouchBar({\n  items: [\n    prev,\n    play,\n    next,\n    new TouchBarSpacer({ size: 'small' }),\n    trackinfo\n  ]\n})\n\n// Keep a global reference of the window object, if you don't, the window will\n// be closed automatically when the JavaScript object is garbage collected.\nlet mainWindow;\n\nfunction createWindow() {\n  electron.protocol.interceptStreamProtocol(\n    'file',\n    interceptStreamProtocol(),\n    (error) => {\n      if (error) {\n        console.error('Failed to register protocol')\n      }\n    },\n  )\n\n  app.commandLine.appendSwitch(\"disable-features\", \"OutOfBlinkCors\");\n  // For Linux: Remove \"resizable\"\n\n  // Create the browser window.\n  getSettingsFromFile().then( () => {\n\n    mainWindow = new BrowserWindow({\n      width: 800,\n      height: 600,\n      transparent: true,\n      useContentSize: false,\n      frame: false,\n      hasShadow: false,\n      show: false,\n      resizable: false,\n      fullscreenable: false,\n      icon: path.join(__dirname, 'res/icon.png'),\n      webPreferences: {\n        nodeIntegration: true,\n        contextIsolation: false,\n        enableRemoteModule: true,\n        webSecurity: false,\n        preload: path.join(__dirname, 'src/node/preload.js'),\n      }\n    })\n\n    // and load the index.html of the app.\n    mainWindow.loadURL(url.format({\n      pathname: './dist/index.html',\n      protocol: 'file:',\n      slashes: true\n    }))\n    mainWindow.setTouchBar(touchBar)\n\n    // and show window once it's ready (to prevent flashing)\n    mainWindow.once('ready-to-show', () => {\n      mainWindow.webContents.setZoomFactor(settingsData.zoom ? settingsData.zoom : 1)\n      mainWindow.show()\n      checkForUpdatesAndNotify()\n      \n      if (settingsData.api && settingsData.api.enabled) {\n        const port = settingsData.api.port || 8080;\n        createApiServer(port, mainWindow);\n      }\n    })\n\n    mainWindow.on('closed', function () {\n      stopApiServer();\n      mainWindow = null\n    })\n\n  });\n\n}\n\n\nfunction createLogin() {\n  electron.protocol.interceptStreamProtocol(\n    'file',\n    interceptStreamProtocol(),\n    (error) => {\n      if (error) {\n        console.error('Failed to register protocol')\n      }\n    },\n  )\n\n  app.commandLine.appendSwitch(\"disable-features\", \"OutOfBlinkCors\");\n\n  // Create the browser window.\n  mainWindow = new BrowserWindow({\n    width: 350,\n    height: 450,\n    frame: false,\n    hasShadow: false,\n    resizable: false,\n    icon: path.join(__dirname, 'res/icon.png'),\n    webPreferences: {\n      preload: path.join(__dirname, 'src/node/preload.js'),\n    }\n  })\n\n  // and load the index.html of the app.\n  mainWindow.loadURL('http://yaamp.ru/login.html')\n\n  mainWindow.on('closed', function () {\n    // Dereference the window object\n    mainWindow = null\n  })\n\n}\n\n\nconst getTokenFromFile = async()=>{\n  try {\n    const result = await readFile(tokenPath,'binary')\n    yaAuthToken = result;\n  } catch (error) {\n    fs.writeFile(tokenPath, '', (error) => {});  }\n}\n\nconst getSkinFromFile = async()=>{\n  try {\n    const result = await readFile(skinPath,'binary')\n    skinData = result;\n  } catch (error) {\n    fs.writeFile(skinPath, '', (error) => {});  }\n}\n\nconst getEQFromFile = async()=>{\n  try {\n    const result = await readFile(eqPath,'binary')\n    eqData = result;\n  } catch (error) {\n    fs.writeFile(eqPath, '', (error) => {});  }\n}\n\n\nconst getSettingsFromFile = async()=>{\n  try {\n    const result = await readFile(settingsPath, 'binary')\n    const parsed = JSON.parse(result);\n    settingsData = {\n      ...settingsData,\n      ...parsed,\n      api: {\n        enabled: parsed.api?.enabled !== undefined ? parsed.api.enabled : false,\n        port: parsed.api?.port || 8080\n      }\n    };\n  } catch (error) {\n    fs.writeFile(settingsPath, JSON.stringify(settingsData), (error) => {});  }\n}\n\n// This method will be called when Electron has finished\n// initialization and is ready to create browser windows.\n// Some APIs can only be used after this event occurs.\n// Linux has transparency disabled and window creation delayed\n// due to issues with transparency of Chromium on Linux.\n// See https://bugs.chromium.org/p/chromium/issues/detail?id=854601#c7\nif (process.platform === 'linux') {\n  app.disableHardwareAcceleration()\n  app.on('ready', () => {\n    getTokenFromFile().then( () => {\n  \n      if (yaAuthToken) {\n        setTimeout(createWindow, 100)\n      } else {\n        setTimeout(createLogin, 100)\n      }\n    })\n  })\n} else {\n  app.on('ready', () => {\n    getTokenFromFile().then( () => {\n  \n      if (yaAuthToken) {\n        createWindow()\n      } else {\n        createLogin()\n      }\n    })\n  })\n}\n\nif (yaAuthToken) {\n  app.on('web-contents-created', (event, contents) => {\n    // Prevent all navigation for security reasons\n    // See https://github.com/electron/electron/blob/master/docs/tutorial/security.md#13-disable-or-limit-navigation\n    contents.on('will-navigate', (event, navigationUrl) => {\n      event.preventDefault()\n    })\n    // Prevent new window creation for security reasons\n    // and open the URLs in the default browser instead\n    // See https://github.com/electron/electron/blob/master/docs/tutorial/security.md#14-disable-or-limit-creation-of-new-windows\n    contents.on('new-window', (event, navigationUrl) => {\n      const parsedUrl = url.parse(navigationUrl)\n\n      if (parsedUrl.protocol === 'file:' || parsedUrl.protocol === 'chrome-devtools:') {\n        return\n      }\n\n      event.preventDefault()\n      electron.shell.openExternal(navigationUrl)\n    })\n  })\n} else {\n  app.on('web-contents-created', (event, contents) => {\n\n    contents.on('will-navigate', (event, navigationUrl) => {\n\n      const match = navigationUrl.match(URL_WITH_ACCESS_TOKEN_REGEX);\n      if (match) {\n        fs.writeFile(tokenPath, match[1], (error) => {\n          if (!error) {\n            app.relaunch();\n            app.quit();\n          }\n        });\n      }\n    })\n  })}\n\n// Quit when all windows are closed.\napp.on('window-all-closed', function () {\n  // Stop API server when all windows are closed\n  stopApiServer();\n  // On OS X it is common for applications and their menu bar\n  // to stay active until the user quits explicitly with Cmd + Q\n  if (process.platform !== 'darwin') {\n    app.quit()\n  }\n})\n\napp.on('activate', function () {\n  // On OS X it's common to re-create a window in the app when the\n  // dock icon is clicked and there are no other windows open.\n  if (mainWindow === null) {\n    createWindow()\n  } else if (settingsData.api && settingsData.api.enabled && mainWindow && !mainWindow.isDestroyed()) {\n    // Restart API server if it was enabled\n    const port = settingsData.api.port || 8080;\n    createApiServer(port, mainWindow);\n  }\n})\n\nlet accountData = {};\n\ngetTokenFromFile().then( () => {\n  const client = new YandexMusicClient({\n    BASE: \"https://api.music.yandex.net:443\",\n    HEADERS: {\n        'Authorization': `OAuth ${yaAuthToken}`,\n        // specify 'en' to receive data in English\n        'Accept-Language': 'ru'\n      },\n  });\n\n  client.account.getAccountStatus().then(async ({result}) => {\n    accountData.uid = result.account.uid;\n    accountData.login = result.account.login;\n    accountData.fullName = result.account.fullName;\n    accountData.secondName = result.account.secondName;\n    accountData.firstName = result.account.firstName;\n    accountData.displayName = result.account.displayName;\n  });\n\n\n  // Получаем любимые треки\n  ipcMain.handle('getLikedTracks', async (event) => {\n    nowPlaylist = [];\n    let likeTrackIDs = [];\n\n    const data = await client.tracks.getLikedTracksIds(client, accountData.uid).then((data) => {\n        data.result.library.tracks.forEach((element) => {\n          likeTrackIDs.push(element.id);\n        });\n        return data;\n    })\n\n    const tracks = await client.tracks.getTracks({\"track-ids\": likeTrackIDs}).then((data) => {\n      return data;\n    })\n\n    return tracks;\n  })\n\n  // Получаем URL трека по ID\n  ipcMain.handle('getTrackByID', async (event, trackid) => {\n\n    if (!trackid.includes('blob')) {\n      nowPlaying = trackid;\n\n      const data = await getTrackUrl(client, trackid).then((data) => {\n          return data;\n      })\n  \n      await client.tracks.playAudio({\"track-id\": trackid, \"from\": 'web-main-rup-radio-main', \"timestamp\": new Date().toISOString(), 'uid': accountData.uid, 'play-id': sessionId}).then((data) => {\n        return data;\n      })\n  \n        // Discord Integration\n  \n        // Check on uploaded track\n        if (!/^.*-.*-.*-.*-.*$/.test(trackid)) {\n          await client.tracks.getTracks({\"track-ids\": [trackid]}).then((data) => {\n            const element = data.result[0];\n            const startTimestamp = new Date();\n  \n            let artist = [];\n  \n            element.artists.forEach((a) => {\n              artist.push(a.name);\n            });\n  \n            const presObj = {\n              details: `${element.title}`,\n              state: `${artist.join(', ')}`,\n              largeImageKey: 'https://' + element.coverUri.replace(\"%%\", \"200x200\"),\n              largeImageText: `${artist.join(', ')} - ${element.title}`,\n              smallImageKey: 'https://yaamp.ru/icon.png',\n              smallImageText: 'Yaamp.ru',\n              buttons: [\n                {\n                  label: 'Listen to this track',\n                  url: `https://music.yandex.ru/track/${element.id}`,\n                },\n              ],\n            };\n          \n            rpc.setActivity(presObj);\n  \n            return data;\n          })\n        }\n        \n      return data;\n    } else {\n\n      return trackid;\n    }\n\n  })\n\n  // Получаем список плейлистов пользователя\n  ipcMain.handle('getUserPlaylists', async (event) => {\n    let userPlaylists = [];\n\n    await client.playlists.getPlayLists(client, accountData.uid).then((data) => {\n      data.result.forEach((element) => {\n        userPlaylists.push({ title: element.title, uid: element.uid, kind: element.kind });\n      });\n\n      return userPlaylists;\n    });\n\n    return userPlaylists;\n  })\n\n  // Задаём плейлист\n  ipcMain.handle('setPlaylist', async (event, data) => {\n    let tracks = [];\n    let tracksList = [];\n\n\n    await client.playlists.getPlaylistById(data.uid, data.kind).then(async (data) => {\n      nowPlaylist = { uid: data.result.uid, kind: data.result.kind, title: data.result.title };\n      \n      let tracks = [];\n\n      data.result.tracks.forEach((element) => {\n        tracks.push(element.id);\n      });\n\n      await client.tracks.getTracks({\"track-ids\": tracks}).then((data) => {\n        mainWindow.webContents.send('setTracks', data.result);\n      })\n\n    });\n\n    return true;\n  })\n\n  // Получаем список исполнителей пользователя\n  ipcMain.handle('getUserArtists', async (event) => {\n    let userArtists = [];\n\n    await client.artists.getArtists(client, accountData.uid).then((data) => {\n      data.result.forEach((element) => {\n        userArtists.push({ title: element.name, id: element.id });\n      });\n\n      return userArtists;\n    });\n\n    return userArtists;\n  })\n\n  // Задаём испольнителя\n  ipcMain.handle('setArtist', async (event, data) => {\n    let tracks = [];\n\n    await client.artists.getPopularTracks(data.id).then(async (data) => {\n      tracks = data.result.tracks;\n      tracks = await client.tracks.getTracks({\"track-ids\": tracks}).then((data) => {\n        mainWindow.webContents.send('setTracks', data.result);\n        \n        return data;\n      })\n\n      return tracks;\n    });\n\n    return true;\n  })\n\n  // Получаем список альбомов пользователя\n  ipcMain.handle('getUserAlbums', async (event) => {\n    let userAlbumsIds = [];\n    let userAlbums = [];\n\n    await client.albums.getAlbums(client, accountData.uid).then((data) => {\n      data.result.forEach((element) => {\n        userAlbumsIds.push(element.id);\n      });\n    });\n\n    await client.albums.getAlbumsByIds({\"album-ids\": userAlbumsIds}).then((data) => {\n      data.result.forEach((element) => {\n        if (element.type !== 'podcast') {\n          userAlbums.push({ title: element.artists[0].name + ' - ' +element.title, id: element.id });\n        }\n      });\n    });\n\n    return userAlbums;\n  })\n\n  // Задаём альбом\n  ipcMain.handle('setAlbum', async (event, data) => {\n    nowPlaylist = [];\n    let tracks = [];\n\n    await client.albums.getAlbumsWithTracks(data.id).then(async (data) => {\n      data.result.volumes[0].forEach((element) => {\n        tracks.push(element.id);\n      });\n      tracks = await client.tracks.getTracks({\"track-ids\": tracks}).then((data) => {\n        mainWindow.webContents.send('setTracks', data.result);\n        \n        return data;\n      })\n\n      return tracks;\n    });\n\n    return true;\n  })\n\n  // Получаем список станций\n  ipcMain.handle('getRotor', async (event) => {\n    let stations = [];\n    let userAlbums = [];\n\n    await client.rotor.getStationsList('ru').then((data) => {\n      data.result.forEach((element) => {\n        stations.push({ title: element.station.name, id: element.station.id.type + ':' + element.station.id.tag });\n      });\n    });\n\n    return stations;\n  })\n\n  // Задаём станцию\n  ipcMain.handle('setRotor', async (event, data) => {\n    nowPlaylist = [];\n    let rotorTracks = [];\n    let lastTrackID = null;\n\n    mainWindow.webContents.send('setLoader');\n\n    await client.rotor.sendStationFeedback(data.id, {type: 'radioStarted', \"from\": 'web-main-rup-radio-main', \"timestamp\": new Date().toISOString()}, null).then((data) => {\n      // console.log(data);\n    })\n\n    for (let i = 0; i < 15; i++) {\n      if (i !== 0) {\n        lastTrackID = rotorTracks[rotorTracks.length - 1].id;\n      }\n\n      await client.rotor.getStationTracks(data.id, true, lastTrackID).then((data) => {\n        data.result.sequence.forEach((element) => {\n          rotorTracks.push(element.track);\n        });\n      });\n    }\n\n    mainWindow.webContents.send('setTracks', rotorTracks);\n    mainWindow.webContents.send('hideLoader');\n\n    return true;\n  })\n\n  // Моя волна\n  ipcMain.handle('setMywave', async (event) => {\n    nowPlaylist = [];\n    let myWave = [];\n\n    let lastTrackID = null;\n\n    await client.rotor.sendStationFeedback('user:onyourwave', {type: 'radioStarted', \"from\": 'web-main-rup-radio-main', \"timestamp\": new Date().toISOString()}, null).then((data) => {\n      // console.log(data);\n    })\n\n    mainWindow.webContents.send('setLoader');\n\n    for (let i = 0; i < 25; i++) {\n      if (i !== 0) {\n        lastTrackID = myWave[myWave.length - 1].id;\n      }\n\n      await client.rotor.getStationTracks('user:onyourwave', true, lastTrackID).then((data) => {\n        data.result.sequence.forEach((element) => {\n          myWave.push(element.track);\n        });\n      });\n    }\n\n    mainWindow.webContents.send('setTracks', myWave);\n    mainWindow.webContents.send('hideLoader');\n\n    return true;\n  })\n\n\n  // Любимые треки\n  ipcMain.handle('setMyloved', async (event) => {\n    nowPlaylist = [];\n    let likeTrackIDs = [];\n\n    const data = await client.tracks.getLikedTracksIds(client, accountData.uid).then((data) => {\n        data.result.library.tracks.forEach((element) => {\n          likeTrackIDs.push(element.id);\n        });\n        return data;\n    })\n\n    const tracks = await client.tracks.getTracks({\"track-ids\": likeTrackIDs}).then((data) => {\n      mainWindow.webContents.send('setTracks', data.result);\n    })\n  })\n\n\n  // Поиск\n  ipcMain.handle('search', async (event, data) => {\n    let best = [];\n\n    await client.search.getSearchSuggest(data.searchText).then(async (data) => {\n      if (data.result.best) {\n        if (data.result.best.type === 'artist') {\n          best = [{type: data.result.best.type, id: data.result.best.result.id, name: data.result.best.result.name }];\n        }\n        if (data.result.best.type === 'album') {\n          best = [{type: data.result.best.type, id: data.result.best.result.id, name: data.result.best.result.title }];\n        }\n      }\n\n      return best;\n    });\n\n    return best;\n  })\n\n  // Лендинг блоки\n  ipcMain.handle('lendings', async (event, data) => {\n    let lendings = [];\n\n    const ALL_LANDING_BLOCKS = [\n      \"personalplaylists\",\n    ];\n\n    const allBlocks = ALL_LANDING_BLOCKS.join(\",\");\n\n    lendings = await client.landing.getLandingBlocks(allBlocks).then((data) => {\n      lendings = data.result.blocks;\n\n      return data.result.blocks[0].entities;\n    })\n\n    return lendings;\n  })\n\n  // Открытие ссылок\n  ipcMain.handle('openLink', async (event, data) => {\n    require('electron').shell.openExternal(data.link)\n\n    return true;\n  })\n\n  // Играет сейчас\n  ipcMain.handle('openPlayNow', async (event, data) => {\n    require('electron').shell.openExternal(`https://music.yandex.ru/track/${nowPlaying}`)\n\n    return true;\n  })\n\n  // Сохранения скина\n  ipcMain.handle('setSkin', async (event, data) => {\n    fs.writeFile(skinPath, data.link, (error) => {});\n\n    return true;\n  })\n\n  // Удаление скина при ошибке\n  ipcMain.handle('deleteSkin', async (event, data) => {\n    fs.writeFile(skinPath, '', (error) => {});\n\n    return true;\n  })\n\n  // Получение скина\n  ipcMain.handle('getSkin', async (event, data) => {\n    skinData = await getSkinFromFile().then( () => {\n      return skinData;\n    });\n\n    return skinData;\n  })\n\n  // Поставить лайк\n  ipcMain.handle('setLike', async (event, data) => {\n    await client.tracks.likeTracks(client, {\"track-ids\": nowPlaying}).then((data) => {\n      mainWindow.webContents.send('showMessage', 'Трек добавлен в \"Мне нравится\"');\n    })\n  })\n\n  // Поставить дизлайк\n  ipcMain.handle('setDislike', async (event, data) => {\n    await client.tracks.dislikeTracks(accountData.uid, {\"track-ids\": nowPlaying}).then((data) => {\n      mainWindow.webContents.send('showMessage', 'Дизлайк поставлен');\n    })\n  })\n\n  // Выход из профиля\n  ipcMain.handle('logout', async (event) => {\n    fs.writeFile(tokenPath, '', (error) => {});\n    await session.defaultSession.clearStorageData();\n    app.relaunch();\n    app.quit();\n  })\n\n  // Текущий плейлист\n  ipcMain.handle('nowPlaylist', async (event, data) => {\n    return nowPlaylist;\n  })\n\n  // Рекомендации по плейлисту\n  ipcMain.handle('setPlaylistRecomendation', async (event, data) => {\n    let tracks = [];\n\n    mainWindow.webContents.send('setLoader');\n    for (let i = 0; i < 25; i++) {\n      await client.playlists.getRecommendations(data.uid, data.kind).then(async (data) => {\n        data.result.tracks.forEach((element) => {\n          tracks.push(element.id);\n        });\n      });\n    }\n\n    await client.tracks.getTracks({\"track-ids\": tracks}).then((data) => {\n      mainWindow.webContents.send('setTracks', data.result);\n      mainWindow.webContents.send('hideLoader');\n    })\n\n  })\n\n\n  let locked = false;\n\n  // Разблокировка окна для перетаскивания окон\n  ipcMain.handle('movingWindowStarted', async (event, data) => {\n    if (!locked) {\n      const { width, height } = mainWindow.getBounds();\n      const newWidth = width + 500;\n      const newHeight = height + 500;\n\n      mainWindow.webContents.send('unlockWindow');\n\n      mainWindow.setBounds({\n        width: newWidth,\n        height: newHeight\n      })\n\n      locked = true;\n    }\n  })\n  \n  // Блокировка окна для перетаскивания окон\n  ipcMain.handle('movingWindowEnded', async (event, data) => {\n  \n    if (data) {\n      const windows = data.windows;\n  \n      windows.forEach(window => {\n        if (window.key == 'main') {\n          settingsData.windows.mainWindow.x = window.x;\n          settingsData.windows.mainWindow.y = window.y;\n        } else if (window.key == 'playlist') {\n          settingsData.windows.playlistWindow.x = window.x;\n          settingsData.windows.playlistWindow.y = window.y;\n        } else if (window.key == 'equalizer') {\n          settingsData.windows.equalizerWindow.x = window.x;\n          settingsData.windows.equalizerWindow.y = window.y;\n        } else if (window.key == 'milkdrop') {\n          settingsData.windows.milkdropWindow.x = window.x;\n          settingsData.windows.milkdropWindow.y = window.y;\n        }\n  \n      });\n    \n      fs.writeFile(settingsPath, JSON.stringify(settingsData), (error) => {\n        if (error) {\n          console.error('Error writing to settings file:', error);\n        } else {\n          mainWindow.webContents.send('lockWindow');\n        }\n      });\n    }\n  \n    locked = false;\n  })\n\n  // Блокировка окна для перетаскивания окон без сохраения\n  ipcMain.handle('movingWindowEndedWithoutSave', async (event) => {\n    mainWindow.webContents.send('lockWindowWithoutSave');\n    setTimeout(() => {\n\n    mainWindow.center();\n  }, 100)\n\n  })\n\n  // Увеличение окна\n  ipcMain.handle('setRatio', async (event, data) => {\n    settingsData.zoom = data.value;\n\n    fs.writeFile(settingsPath, JSON.stringify(settingsData), (error) => {});\n\n    setTimeout(() => {\n      app.relaunch();\n      app.quit();\n    }, 3000)\n\n  })\n\n  // Получение настроек\n  ipcMain.handle('getSettings', async (event) => {\n\n    if (!settingsData.windows.milkdropWindow) {\n      settingsData.windows.milkdropWindow = {\n        x: 275,\n        y: 12,\n        size: [7,8],\n        visible: true,\n      };\n    }\n\n    if (!settingsData.api) {\n      settingsData.api = {\n        enabled: false,\n        port: 8080\n      };\n    }\n    \n    return JSON.stringify(settingsData);\n  })\n\n  // Настройки API\n  ipcMain.handle('setApiSettings', async (event, data) => {\n    if (!settingsData.api) {\n      settingsData.api = {\n        enabled: false,\n        port: 8080\n      };\n    }\n\n    const wasEnabled = settingsData.api.enabled;\n    const oldPort = settingsData.api.port;\n\n    if (data.enabled !== undefined) {\n      settingsData.api.enabled = data.enabled;\n    }\n    if (data.port !== undefined) {\n      settingsData.api.port = parseInt(data.port) || 8080;\n    }\n\n    fs.writeFile(settingsPath, JSON.stringify(settingsData), (error) => {\n      if (error) {\n        console.error('Error writing to settings file:', error);\n      }\n    });\n\n    if (mainWindow && !mainWindow.isDestroyed()) {\n      stopApiServer();\n      if (settingsData.api.enabled) {\n        const port = settingsData.api.port || 8080;\n        createApiServer(port, mainWindow);\n      } else if (wasEnabled) {\n        mainWindow.webContents.send('showMessage', 'API сервер остановлен');\n      }\n    }\n\n    return true;\n  })\n\n  // Задать размер\n  ipcMain.handle('setSize', async (event, data) => {\n\n    if (data.id == 'playlist-resize-target') {\n      settingsData.windows.playlistWindow.size = data.size;\n    } else if (data.id == 'gen-resize-target') {\n      settingsData.windows.milkdropWindow.size = data.size;\n    }\n\n    fs.writeFile(settingsPath, JSON.stringify(settingsData), (error) => {\n      console.log(error);\n    });\n  })\n\n  // Сохранение EQ\n  ipcMain.handle('setEQ', async (event, data) => {\n    fs.writeFile(eqPath, data.link, (error) => {});\n    console.log(data.link);\n    mainWindow.webContents.send('showMessage', 'EQ сохранён');\n    return true;\n  })\n\n  // Получение EQ\n  ipcMain.handle('getEq', async (event, data) => {\n    eqData = await getEQFromFile().then( () => {\n      return eqData;\n    });\n\n    return eqData;\n  })\n\n  // Сбросить настройки\n  ipcMain.handle('resetSettings', async (event, data) => {\n    fs.writeFile(settingsPath, JSON.stringify(resetSettings), (error) => {\n      console.log(error);\n    });\n    setTimeout(() => {\n      app.relaunch();\n      app.quit();\n    }, 3000)\n  })\n\n  // Milkdrop fullscreen\n  ipcMain.handle('toggle-milkdrop-fullscreen', async (event, status) => {\n    if (status) {\n      currentBounds = mainWindow.getBounds();\n\n      mainWindow.maximize();\n      mainWindow.webContents.send('setFullscreen', status);\n\n    } else {\n      mainWindow.webContents.send('setFullscreen', status);\n      mainWindow.restore();\n      mainWindow.setBounds(currentBounds);\n    }\n  })\n\n  ipcMain.handle('isPlay', async (event, data) => {\n    if (data) {\n      play.icon = nativeImage.createFromDataURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAAXNSR0IArs4c6QAAAQ9JREFUOE/FlbESwUAQhnfzLswo6YxOoTBDyzsoeQQlHaWSjoKhVJ4uoRGqoFFKR3dmw0oGiRM345rM3F2+/78/uxccToUEzcN2HBh0e4AEzxez2vDz2QL6oyFshOXDTcv+WcA9ukCuhRBwWG3+BG+3ut5J6o2a8onIuWmZYK1t2C0jnBO8VC7DZDxWFgnCI2NhONtWEfna+XMmUSKxnauIaINXKwVPL1jCQfh+tQ0vxefM2fk7KK/Fdh4FfQ9XcK4C/RqeSadeMv3UTaGZ04WjY3CHPj4oQenCObsnHXyv/Q9ULc1OX5La5XzRAmaI5zyZyEkABDTQhyMC8i8Eb/PIT+B9/n7j/q6ktfs0SgOutQw52vzOQLoAAAAASUVORK5CYII=');\n    } else {\n      play.icon = nativeImage.createFromDataURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAAXNSR0IArs4c6QAAAPZJREFUOE9jXLv12H8GKoPr9+8zrJmzjIERZLiTlyXVjN+37TjD0nVrGe6duYkw/Nz56xRb8OH5BwaQq48dO8bw/PqjATC8t2cqii+KS7LhfHxyIJefO3+O4fy16wzPrj7E7nKQAb5+fmADI8LdGJCDDJ8csuE4g2VkGz4a5vBkSr/UcgNHDjUy1ETJRMjpHJ8cTpeDChxqAFgOfX79MSSHggwFFTjfP7ynhvng7A/OoS1Tlv4H2fbj+w+qGAwz5AXI5To6rv8ZGBgZGBkZEYYzMjIwwqoQEJuRkeH///9gGgRh4D8jAwMjiGBgYGBkQoiD1IC0AwDEdnVTCfcsTgAAAABJRU5ErkJggg==');\n    }\n  })\n\n  ipcMain.handle('nowPlaying', async (event, data) => {\n    trackinfo.label = data;\n  })\n\n  // Управление громкостью\n  ipcMain.handle('setVolume', async (event, volume) => {\n    if (mainWindow && !mainWindow.isDestroyed()) {\n      mainWindow.webContents.send('setVolume', volume);\n    }\n    return true;\n  })\n\n  // Получение текущей громкости (можно расширить позже)\n  ipcMain.handle('getVolume', async (event) => {\n    // По умолчанию возвращаем 50, можно сохранять в настройках\n    return 50;\n  })\n\n\n})"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"yaamp\",\n  \"version\": \"0.0.6\",\n  \"description\": \"Winamp + Yandex Music\",\n  \"main\": \"main.js\",\n  \"targets\": {\n    \"main\": false\n  },\n  \"scripts\": {\n    \"copy\": \"xcopy bundled dist /e /Y && xcopy res dist /e /Y\",\n    \"clean\": \"rmdir /s /q node_modules && del /f yarn.lock && yarn cache clean && yarn install\",\n    \"build\": \"yarn run copy && yarn build:src\",\n    \"build:src\": \"npx parcel build --public-url ./ ./src/index.html\",\n    \"watch\": \"npx parcel watch --public-url ./ --hmr-hostname 127.0.0.1 --hmr-port 54439 ./src/index.html\",\n    \"test\": \"jest\",\n    \"electron\": \"./node_modules/.bin/electron .\",\n    \"start\": \"yarn run build && electron .\",\n    \"pack:win\": \"electron-builder build -w --x64\",\n    \"pack:linux\": \"electron-builder build -l --x64\",\n    \"pack:mac\": \"electron-builder build -m --x64\",\n    \"pack\": \"yarn run pack:win && yarn run pack:linux && yarn run pack:mac\",\n    \"dist\": \"yarn run build && build --x64\",\n    \"deploy-webamp\": \"cd webamp && yarn deploy && copy packages\\\\webamp\\\\built\\\\webamp.bundle.js ..\\\\src\\\\webamp\\\\\"\n  },\n  \"homepage\": \"https://yaamp.ru\",\n  \"repository\": \"https://github.com/umnik1/yaamp\",\n  \"author\": \"Maksim Chingin <colorless-unknown@yandex.ru>\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"axios\": \"^1.5.1\",\n    \"bufferutil\": \"^4.0.8\",\n    \"discord-rpc\": \"^4.0.1\",\n    \"electron-is-dev\": \"^1.0.1\",\n    \"electron-log\": \"^3.0.1\",\n    \"electron-updater\": \"^4.0.6\",\n    \"encoding\": \"^0.1.13\",\n    \"form-data\": \"^4.0.0\",\n    \"html-to-text\": \"^4.0.0\",\n    \"left-clicky\": \"0.1.1\",\n    \"mime-types\": \"^2.1.22\",\n    \"parcel\": \"^2.9.3\",\n    \"utf-8-validate\": \"^6.0.3\",\n    \"yandex-music-client\": \"github:umnik1/yandex-music-client\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^24.0.11\",\n    \"@types/node\": \"^10.14.1\",\n    \"@types/webdriverio\": \"^4.13.3\",\n    \"electron\": \"^13.0.0\",\n    \"electron-builder\": \"^24.0\",\n    \"electron-debug\": \"^3.2.0\",\n    \"eslint\": \"^5.15.2\",\n    \"jest\": \"^24.5.0\",\n    \"parcel-bundler\": \"^1.12.2\",\n    \"spectron\": \"^13.0.0\",\n    \"ts-jest\": \"^24.0.0\",\n    \"tslint\": \"^5.14.0\",\n    \"typescript\": \"^3.2.4\"\n  },\n  \"browserslist\": [\n    \"Chrome 69\"\n  ],\n  \"build\": {\n    \"appId\": \"me.umnikone.yaamp\",\n    \"productName\": \"Yaamp\",\n    \"copyright\": \"Copyright © 2023 Maksim Chingin\",\n    \"files\": [\n      \"!.*${/*}\",\n      \"!src/*.*\",\n      \"!artifacts${/*}\",\n      \"!docs${/*}\",\n      \"!bundled${/*}\"\n    ],\n    \"directories\": {\n      \"buildResources\": \"res\",\n      \"output\": \"artifacts\"\n    },\n    \"mac\": {\n      \"category\": \"public.app-category.music\",\n      \"target\": \"pkg\"\n    },\n    \"win\": {\n      \"target\": \"nsis-web\"\n    },\n    \"linux\": {\n      \"target\": [\n        \"AppImage\",\n        \"deb\"\n      ],\n      \"category\": \"AudioVideo\"\n    },\n    \"publish\": {\n      \"provider\": \"github\",\n      \"owner\": \"umnik1\",\n      \"token\": \"<token>\"\n    }\n  },\n  \"jest\": {\n    \"transform\": {\n      \"^.+\\\\.tsx?$\": \"ts-jest\"\n    },\n    \"testRegex\": \"(/__tests__/.*(\\\\.|/)spec)\\\\.tsx?$\",\n    \"moduleFileExtensions\": [\n      \"ts\",\n      \"tsx\",\n      \"js\",\n      \"jsx\",\n      \"json\",\n      \"node\"\n    ]\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n"
  },
  {
    "path": "res/icon.hqx",
    "content": "(This file must be converted with BinHex 4.0)\n:%$N`-$3h1$\"M0Q3cBc3a0@B%9%9B9(4dH(3%!!!!!Y!!!dYGL+9)EhFJG'mJGA0\nP)(4SDA-JD@0[EMS+#P0dCA!J-6SJ3fp`H5\"dD'8JD@0[EL\"dEb\"dD'8JBfaTF'*\n[BA*N#Q%T)%0XD@0V)'pZ)(4SDA-JCQPXC5\"QFQpY)(4SC5\"'D@jNCA)+BLNJ3fK\n[Eh0P)#G(CA3J5@jQEbFJCR*[E5\"dD'8J*dCTE'8R)'ePER8Z#Q-T)%PZ)(4SC5\"\nTEQC[)(GTEQ4[Gb\"dD'&d)(\"[F(-JGA!X)'0XD@0V)'pZ)(4SC5\"TBfpZ#Q3T)%0\nSEfpcC5!R3fp`H5FJCR*[E5\"dD'8J*d9NDA3R)'ePER8Z#Q8T)%0XEh0P)(4SC5\"\nTEQC[)(GTEQ4[G`S+8h4PF#!b1L\"3BA0dC5\"dD'8JD@0[EL\"dEb\"dD'8JC'9cDA*\nPC#\"TG'9Y#Q%T)%G[)(4[)(4SC5\"TG'9Y)'PZ)(4SC5\"'D@jNCA)JG'KKG#\"jEh8\nJGf&ZG#\"K)'0eFh4[E5\"TBfpZ#Q)T)%0XD@0V)(4SC5\"TG'9Y)#KQD@aP,#\"QEfa\nNCA)X)'4TFfXX)'9dBbNJ#Q)T)%0SEfpcC5!R4f9d)%PZCQmR)'CbEfdJG'KP)#G\n'D@aP*b\"YC@je,JTM+5\"*EL\"dD'8JD@jQEb\"hD@jNEhFJG'KKG#\"`Eh\"c)(9`,#\"\nME'PMDb\"[EL\"dD'8JD@0[EJTN+5\"$D'p[Ff8J*e\"KFh4P*b\"QFQpY)(4SC5!R4@4\nTG#FJE@9ZG5i+C5NJ3fa[Ff8JG'KP)'PZCQmJGfPZC'ph#JT6G'9`)$-k)!T&EQT\n[H5\"jEh9b)'jPGfaj)'0eFh4[E@PkC@3JD@0[EL%+#NC[FL\"YEh*P)(4SEh*[G@G\nS)'4TFQ9MG'P[ER-X)(0PC5\"\"F(\"XC5Gc)(GPBR0TG'8JBA3k#QKdG(!k,bphGhF\nZBA\"`E'8ZBfpY,h0eF(\"[FR3[E@&M-6!a,f0eFh4[E@PkC5mf,`V6V!!!!3!!!dX\nV!!0++`!!!$)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!dSRD@0ZF`!$5LGTFc-b!!!#p3d!!!%!!!J)!`-+'ASL\"i!!(!%\n!!!X+!`m0!`$r0cIrr`%!!!d0\"\")B'3S!DYHAJ3\"r$`m&&L!E!b5Jr2\"Grrm!%3m\n&'bJ6$A(Zrrpb!!!(%\"%&)LJ03-Rrq[q4!!N,#48'*\"mKP2[rqIrG&4)1!JB)+LP\nBh[rlqrrlrlN,&`d###`Sd2rirIrkqIqi\"4N3!L!-'hpcVIrfrrQQB88A!3!U@aT\n)G[,prmXc!Me5(h-b!3!)!%lZrr\"Y!J!\"J!!3!J$rreMXrCmF!!-#!!8!!!D!!!@\nCf@J!!31&!!ErkcJfr`!$L!!%\"bKk&3'\"!!!\"J3!0!!!%!!!R-a-60#PU'JD!!\"`\n&!!!`-Jj46JXCrb`Vk[m&!!!d04&9Fh0-!&HSJ)%!IcJk%ParGea0L-R+6rrr!$X\nl%f+2Ge*X`Gr4A!!!!MBl%QfDD&UKh0E9K$-C6bT#&(D9A)(2hFhAXc9`5`dU')+\n5BkrBdYr9cY#@8A41$aH+J+hTbpVA`F$JNdTk83jY)f#%E*VAX-c9LAbC@!dT5ji\nXBA1m`0bU+33q9LH,33!!#!!l`Gr,@J%!!B!!%!d!rrp'cpQ$&`!#!J!&!!F%J!!\n+Jl99!!%#!!!\"!!#!!J[r`5iXr`!$!!!\"!!#!!S!!$3BJDa%!!3%!!!-#!J!!$3!\n!\"3!!+cF8&$JI,3F#J!!F\"3!!0$82@&8-+6N3$NkY\"3!!0cN5A(Yj9`8I15f\"!\"S\nl240LKRp[4$9(44k'R!!q2a4RPSCE0%\"A54q!!&mi2K0`TAP#1%a@8MP#&eFX4\"4\nlT9Sf4P*-8$icI&%1,KQ(Qcdp89Y`8%T*0Pap9\"!AMiB`88TM9Mdq65Y8JeF3Fb4\nP9$p(8Lp#6$jhS9i1,8ZC*h092MP23!d+398SM81!!!3428a-)B-!#!i!NR)E6%m\na#)%!!`8!\"`5!!\"``3Km!!!%!!!%!!!-#!R\"(%4#6!!)!!!%!!!-#!S!!$3)+,J8\n!!3%!!!-#!J!!FcKYD`!!!3J!!!!!!!3!P*3!\"!)!\"`!!!!!!!!-!I[rrI`!!BUB\n!!!!!!!3!JIrlr2q,U2rB!3!!!!3!JIrkr[lmr[crV!!\"!!-!JIrkr[rrr[VrjK-\n!!33!JIrkr[rqrrrqr[pq!!-!I[rkr[rqrrrrrrlprhi!P2rlr[rqrrrrrrlrr[[\nrP*6rqrlrr[rrrrrqrrllrj3!I[rpr[rrrrrqrrlkrhi!!`#!rrlqrrrqrrlkri)\n!\"!%!#p[rqIlrrrlkri%!!`!\"!+Arr2lmr[lkri%!!`!!!!$@rkZ-rrclri)!!`!\n!!!!!T'B!!(rrrhm!!`!!!!!!!!F!!J3!PC8!\"!!!!!!!D@`c-J!!#Gq(!)!\"J`#\n!!B%!!`cr!2q)!!)\"!3+!!!%&\"B!!\"!%\"!!!'M!!#!3%#J!!$\"4-5\"))!!!b-!)!\n#J!!3\"KB8%K)%!!!(*[m!0B!&&\"H&!)!#J!!4\"aJA&4-6%J3\"!!!,GrhB#LY&K!#\n!!S!!%JFE'4F@&4-6&J8!4XrrrqBGjrq$!!)#!J1!!\"-)(K`D'4F9'4B!'CcqrI2\nr[38PIB)!!J)#!i!!%3NJ(K`E'4SH#J&Rl2rkpIrK)i3!J!1!!\"%+)b%I(K`K'!!\n`a2rpqrRqqN5%!)!$J!!4#L8N)5!L)`F-L[Vrqrhlq[pKJ!!'#!%\"!!-$\")!!%`X\nS*L-M+4J!6Ylrr2cqr2RrM3!*J!#!!3%$\")!!&3`V+58U*`3IVIrpqrlrrI[rY3%\n8%J5!!!)\"!35!!\"F-,5SU-\"8'F2(rqrcrr[lmrmN,%aB5%J5!!!!\"J!!C$6!Y-LF\n$1F[rr2cqrrlrr[crRaX*&\"36%J5#!!N1-c!a%a18rIrlJ2d#r[lrJ2i)rIpM!4S\n6%a)%J!!V%$Bb0491j2rjq2Vkr2cqrrlrr[hfrj)!(\"86%K)&!!!30c-h$EcrpI[\nlrIq\"rJhrrI[pq2qV!\"`@&436\"B!!'`mf1`fQrr[rr[rqr[rrrIVlrI[prhd%(KF\n@&J@#!\"N12K+'lEbiPG6rrIlkqIhmr2r\"*`!,%KJC\"S!!!!@!!\"F4+3JC3!dqp[r\nmq2[pr2rdF%HLPQJm)3D!!!)\"\"!@!!\"F5Tq+A6IMrq[Vpr2hrVam!0'+\"V-`a!!#\n!!3)$\"!Z!!!8j'#EXrrL!r!Ari%m!!31\"!!S#!J!!#!%\"!!-&\"S!!%5,TrrRpqrr\nlM!`!!`)!!3-%!i!!!J-\"!B3!#b2CrrVmr2r'-!!#!iB!!JS0$i3!#a2(rrRmrqj\nS!3!$!BB!J!'#!!aZ'!1drrIrrTiB!!-#K`#!!B-!#[E#(HErrp\"'!!%$L!#!!B3\n!#6iS#YIrH!X!!!1)!)!\"K3!)&a-&JM8!eMd'L!#!!B`!!JS\"!BF!J!'-!!3&!!!\n#!S8!J!')!!0H!!!-J3!#!3%#J`#!!BF!K`!#\"`F*J`!##!B'J3!$#Im!riJ!!JF\n(#B!!!4mIJ!!%#!J!!!@-!!))#!U!!!-FDQFEJ!!##J!,M!!##!J+J!!3(QjTCQB\nE!!!%*Im!,'3&%K1&!!))#!Z!!!FJFfjTCfGQ'S!!\"JKNaEJ**6U%!!)*#3Z!!\")\nKGh0ZE@TQCQiF!$Q`d,r''YArJ`!##3N,J!!6)RaiFR&[DR\"[150php+LiU%#&fH\n#!!)*#3b!!\"%NJAehGR*bHeJF8-2PckVA`4b%!!)+#Jb!!\"%PKS&mHRCrG$!XR1,\n9dVM1f$L%!!)+#Jf!!\"%QLiD!IB#'84jVe0l-eXE)j8f!!!B0#3B!#JS0J!!6*j!\n!Li5$MR3T2l6MdXl@dmIQEadPJ!!%#!B'#`f!!\"8TP)q(N!#15#@(hYR0dG,@c1@\n8&'YQ'i!!!JJ'$S!!&bUCNSqFEL4AbH,3d0,4dXrCT\"9UE'CR'i!!!!L!!\"NVRTH\nHN!!m-D(Ldmh2cp,4dFrDJb)cC'KRCKZ#!!iYSjfICL4bfH$6epRKjp+!d3R6fG4\n*4(0QCfBEJ!!p-kUITP-jZ0h)`m'rbZhHcp(9dm@pi(JjGfPRCQFH!!!cV+'X3Tl\nMamc,cXlQfmc8em5ea-hKMc0kDfPTDKq!!\"XZU,02K1MEhq,9iY[2fFQYXmh4hGp\nD-haXEQiGJJ!C,,KJBlk9PhUri0(6VD,$dp6KR5-PD'jbFak!!!!2J!!A0S3N1em\nC2GE@`jqadY2HcPa(ZY#VMRSIJ!!##3X2J!!9-G[hS8VKeE'SbY6AhBmD!$4HHDM\n41i!!\"!N(#`X5J!!1-43LdmQV[Y66i,T!!!!#J3!+!3)!!!i(\"`!,$a#!!\"FJcX+\necp2EeA)+!!)\"!!%$\"!-\"!!!*\"`H%!!XJYmE&dYAJSLF!!3+$!!8\"!!!0$a#%!!X\n3Sp2-dq,(9!%!!J'$!!)\"!!#!\"))!$&S2!CEJbpcEJ\"3!!J+%!!8\"!!!&\"!5$!!V\nDY4[$eZ5X13!\"!S8!\"3%!!!8%\")3!#68H\"lhCBJN!!!5&!!8\"!!!&\"!5&!!S5%!4\nV,!#`0`-!!S-!\"3)!!!8%\")`!\"3N!\"`!!!S%!!J)!!)!&M!!-\"!!!\"`B!!!)!!!)\n!!)!&L!!$9`!!#i%!#`8&\"J!!!J)!!!B&\"BF!K`!##!J+J`!##3F(J3!$!l8!NiJ\n!!JJ)#S!!!5)LJ!!%#3N!!!+-!!))#!U!!!-IFh%GJ!!#$!!%M!!##3N,J!!&)AG\naEh!HJ!!(%Im!%#)#\"`H&!!)*#3Z!!!FLHhGbF(\"[(B!!\"J)Q38!%$a@%!!)*#3b\n!!\")MJ(YfGA0ZEhBI!\"9$4cT+#8eMJ`!##3S-J!!6*)5!HRThFhGh54NX8NmT8cX\n!##@#!!)+#Jb!!\"%QLB4rIRTjJQ8N'N959$*-4`U%!!)+#Jf!!\"%RMSQ$JRk'IMm\n80&4,9d*(845%!!)+#Jf!!\"%SNSk)KBH0B\"`L690(@&0$9KQ!!!B,#3F!#`X1J!!\n6+CH5LiU8Ic3@2P40599M49BN+bD!!!3*\"`F,$S!!&5ZFPSk@P9FA,&*35de,Ade\n8-4YdEaf!!!)*\"`k!!!NXS*Q@SAXT'dK9J%d+6%j06cS8GA4ZF\"k!!!!*J!!0,D@\nHSjP*&$955NG'4df!6!K3-\"8iE(&[Eak#!!iZUU5PFamN89K@AQ0cI%k!6!P16dN\n98RTZF(!HJ!!p0E#QV&S23eG36Ne+8SjR5%a36N%p8LP)IR&`Eh%K!!!eXkHa5M4\n95%K(4d4hB%0388!b3%Y8-$q\"Fh*aFb'!!\"X`VVKD+eK58e0,G'0'988U-8P18P-\nC2)4dGhFIJJ!C,VeY'N!X05TKC%P2+L!r8%j6-3B`F(CkHb'!!!!2J!!A1)SL1@)\nK+'*03\"i[6Np36#\"*`p5aPB-LJ!!##3`2J!!9-YrhU$4N5M!Q4P&18$3*!$4FH+I\n42)!!\"!S($!`6J!!,,aF3@d!V1P\"1883AK!!+!3)!!!i)#!!-%!f!!\"F5@$Nd5P\"\n265S$!!%!!!%$\"!-#!!!*#!L%!!J856Y$6dj41`k'!!8\"!!!0$a'%!!S)28C,6P*\n*(`!!!B3!\"3%!!!8%\"))!#5%'!$G35e\"3,`H(!!8\"!!!&\"!5$!!T33JT(6P-r&3!\n!!B8!\"3%!!!8%\")3!#4-,!N92)`-!!!1&!!8#!!!&\"!5&!!S'\"3%R%!\"!'`!!!S-\n!!J)!!)!&M!!&!`!)!!!#J3!&!J!!\"J8&M!!2!3!!#!F!!!)!!!)!!!B&\"BJ!!b!\n!!!5\"!!X'\"JF!!!)#!!!'\"3@(!'`iE@X!!!3)!!!!!!!!!!!!!!!!!!3!PTB!\"!!\n!!!!!!!%$!!!!!!!!!!!!!!!!!!!!!!!$!)$rri!!!`!!!!!$!!-1!!!!!!!!!!!\n!!!!!!!!!!`#$rr[lri-!!`!#!`!4XiB!!`!!!!!!!!!!!!!!!!-!J[rkr[lkri-\n!\"!!!BZErQ3!$!!!!!!!!!!!!!!!$!),rq[lrrrlkri3!,X$rq[qZ!!)!!!!!!!!\n!!!!!!`##rrVqrrlqrrlprEM[rr[lrm3!!3!!!!!!!!!!!!-!J[rkr[rqrrrqrrl\nmrrhmrr[rZ3!\"!!!!!!!!!!!$!),rq[lrr[rrrrrqrrllr[rprqBK!!%!!!!!!!!\n!!`##rrVqrrlrrrrrrrrrrrlqr[rc3!!#!!!!!!!!!!-!J[rkr[rqrrrrrrrrrrr\nrrrllrki!\"3!!!!!!!!!$!),rq[lrr[rrrrrrrrrrrrrrrrlpri8!!`!!!!!!!`#\n#rrVqrrlrrrrrrrrrrrrrrrrrr[lmri-!!`!!!!-!J[rkr[rqrrrrrrrrrrrrrrr\nrrrrqrrlkri-!!`!%!)2rq[lrr[rrrrrrrrrrrrrrrrrrrrrqrrlkri-!!`#!rrV\nqrrlrrrrrrrrrrrrrrrrrrrrrrrrqrrlkri!!P[rlr[rqrrrrrrrrrrrrrrrrrrr\nrrrrrrrrqrrllrjD9rr[qrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[[rPJ\"rrrV\nqrrlrrrrrrrrrrrrrrrrrrrrrrrrqrrlkri!!\"!##rrVqrrlrrrrrrrrrrrrrrrr\nrrrrrr[rqq[q$!!3!!`##rrVqrrlrrrrrrrrrrrrrrrrrrrlrr[VrJJ!$!!!!!`#\n#rrcqr[rrrrrrrrrrrrrrrrrqrrlkri3!!`!!!!!!!`#'rrhqrrrrrrrrrrrrrrr\nrr[rqq[q%!!-!!!!!!!!!\"3#@rr[qrrrrrrrrrrrrrrlrr[VrK!!$!!!!!!!!!!%\n!)YIrrIlqrrrrrrrrrrrqrrlkri3!!`!!!!!!!!!\"!\"I@rrcrr[cqrrlrrrrrr[r\nqq[q%!!-!!!!!!!!!!!%!Yrrkrrcprrcqrrlrrrlrr[VrK!!$!!!!!!!!!!!!!3$\n\"rr[lrr'lrIhqrrlqrrlkri3!!`!!!!!!!!!!!!!$!+RrqIr&-J#&rrVqrrrqq[q\n%!!-!!!!!!!!!!!!!!!-!N[rTD!%!\"!#%rrVqr[VrK!!$!!!!!!!!!!!!!!!!!`\"\npZ48!!`)!!`#%rr[lri8!!`!!!!!!!!!!!!!!!!!!!!d%!!-!!!!!!`#\"rrq\"!!-\n!!!!!!!!!!!!!!!!!!!!!!!)\"!!!!!!!!!`#AQ!!$!!!!!!!!!!!!!!!!!'PS-c)\n!!\"1\"M`#!!S-!!J)\"!D!!J!+&!!)#!3'H!!J#!J-!!!%!#`Z\"!!)#!3'F!!S#!J-\n!!!%!$\"-5#S%!!J)\"!B!!!`)!!!+6!!J#!J-!!!%!$4@!%J!+J3!\"!J'\"!!-5!\"J\n6N3!1!J)$!!!\"!!iA&\"36%K)+JJ!(!RL)!J\"4q%L3!!!3!J)%!!!\"!!mC&K88&\"-\n5%JU#!!B+!#'irrpDM`!G!`-%!!!\"!\"!E&aF@&438%a)5#J!$@J!&HIRrp2p`MJ!\nH!`-%!!!\"!\"%G'4NB&aB9&\"36%4-1!3!pe[rjpI[rLid!(`-$\"!!!!3!5(aXD'KN\nB&aB9&\"-A%3!8RIrqq[Apq[pYM!!K!`-&!!!\"!\"-J(\"`E'KSC'\"F@'\"J&!'$Vrr[\nmpr[lrkF!\")S!)!-$\"3!!!3!8)KiH(4`E'KSB'\"d2!#V!rrhlr[Mlr2r0#B!!!!+\n(!#!$!`8!!!%!&53J)\"mH(4`E'KiD!!L&qIrlrIrjqrhrkKq,!#!%\"!8!!!%!&bB\nL)5!J(aiF(L%-!%MFrrcmr[rlq[lpr6f!!!%A!BB!*`3%\"J!!!J!B+#-M)L%J(am\nN'3!CU2rqqrlrrrckrr[rCJ!)!J%#!3'%!#)%\"!B!!!)!'5SP*53M)L%N)`F!D[$\nrqrcrr[rpqrrkri`!$)%!!J)\"!B)!*!3%\"J!!!J!D+bFQ*L8M*#N9!$(*rrclr[r\nqrrhlrr[rX`!2&!U\"!!)#!3'!!#B%\"!F!!!)!'bdS+#FQ*5SM!3Z2r2rlrIrqr[r\nqrIlmrp82#4B4%JU\"!#`#!3%!\"38(!!!#!\"`[+LST*bSX$`\"4i[rmr2rqr[rqrrl\nqrIra,!)C%a-5%JU\"!\"J#!3%&\"`!!!J!G-5`X+LS`)!!IX[rpqrlrJ2i\"rrq\"rJV\nr43!9'\"88%a)5#S%!&J)\"\"`!!!J!H-bdY,$!Y#!&dp2rlr2rqK2m1r[lrqD&'\"!8\n6&4-6%K)+J3!'!J!!!J!I0B![#c3D!$R4rrcmrrrqri(q!IrqJ2q!rJVrf#)''43\n8%a)5#S)!+`%!)$Fa-$!U\"!qDrrlkr2hmqrVlqrcqrrlqrrlqrrljprp-!\"X9&\"3\n6%K)+J!!$!J!M1)!b#$-!6HRrqIMkqS$j\"[[prIlrr[q!rL(rrI[mqrpK!\"d@&43\n8%a)5#`!!!J!N16-c-MB!U2rhr[rqJ2m%r[rqr[q\"rK,rrIVlr[rkrhF!(KF@&43\n8%K-,J!!+!J!L16-c13#-rrZ!rJEpr2lrrIhrJ2i6rrlkqIhrrrhhrj)!(KJA&K8\n8&3b#!#N#!#)j-MX\"G[rhr2lrr[lrr[lrr[lrr[[hqrrrr[[mrp3c!\"`C'\"F@&`f\n\"!\"))!!!#!#)j1`CJrr[qrrR[dHlrJ2jrrrchqIlrrrhlrrCf!`FH(4XC&aN1!!%\n!!!)&#!!!!J!K2a-RHP8k)5-!4[Mrr[rqq2EmrrrqqrhrVa-!#`m,$aBB'`m!!3!\n!!`)&\"3J!!!)!*5N!!!3VA33dm[rprr[fqIlrr[cmrqCA!T(ph,5&8LJI%!!\"!!!\n$!J)!\"38)!!!S!`!SLF6drfFLl[rpr[MirIrrrI[rr*%2!\"YEETM'l[lrE!!(!!!\n$!J+!!\"`&\"3J!!!J!Tp@&-KAIrrcmpr[rrrllr2r+0!!#!i)!#3)P8`X#!!!2!J+\n#!#!&\"4)!!!3!!3!4e2rlq[Rqrrrmqrr`E3)!!`%!!!-$\"!+!!!8\"!!!$!J+%!\"F\n'\"J`!!!J!$XVrq2RmrrrqqrlrUKX!!`+'!!-\"\"`!!J\"H'!\"3)\"3!!!3@krrElr[r\nqr2crh8S!!31,!)!$LJ!3\"3#XrrEprrrpqrrjK`S!!`',!!)#!3'(!\")(!3!*!*[\nrq2lrr[[prm%X!!)$M!!#!J%\"LJ!2#!#*rrVrrrclrqYM!!!$!B`!!J)\"!B`!$'I\nrq[lqqrlrRa8!!`+0!!)#!3'0!!U,rrVmr2rB2J!\"!ii!!J)\"!Bi!#A$rprrjH`8\n!2311!!)#!3'2!!CDrrqk)J!+J!!!!B`!!J)\"!C!!!!G)qe-!!P!a!S!!!!'+!)!\n#N3!$&\"N!%)%!\"!)#!!!\"L!#!!T-!!`)!!!+!!)!#!J!!!B-!!J%!!)!#R!!&!J)\n$!!!\"J3!#!3!!J!+H!!S#!J-!!!%!!!%!!)!#S!#!!S-!J!+2!)m!#`S+$J!!\"!3\n!!!d*#D!!$3S+$`!!!`)#!`!!$JN*RJ!2#JS3!!!&!%*#!!3!!!i*#C`!%3X,$`!\n!\"3\"\"E'Sq!!3!!!d*#B!!!`%!!!'6!\"),#a!!!!8!3h\"NBfXq!!3!!!i,J3!$$J!\n6$j%!'`X,%3!!\"3\"&G'KSCQ0V2J!%!!!%!@0[!3\"#`cq3!!!5$!`4!!!&!%ChDfY\nTD'CMDci!\")!!\"JJ!'Tc*hNb2!\"d-$\")!!!B!5(TZEQeVD@KQBfXp!!CC!!4JfXZ\nXk&b1!\"i-$\"-!!!B!5RjaFA\"ZE@YTD'CKEd-!!$+ak-ZEcq*hM3!I$3d5!!!'!%b\n\"G(4cFA\"ZE@YSD(\"B%Jq\"hYV5P-24j9Z-!#%0$4-!!!B!6S9hGhCdFh&`EQYbELi\n!5mAKcYQKYY6JM3!$LJ!J$3d8!!!'!&#)HRYjGhCdFfpbH9!%(ClLeX[FX,,@fki\n'J!!!!BF!)!d0%`!!\"J\"5LheqI(YjH(9cI@dI!@[9hFl1flq`eYE(')X!)!i1&3!\n!\"J\"8Mi#\"IhjmHRGpId-!0VILdFr3f-fbeY(A-S!!!4!'KJ!R$Ji9!!!(!&D5Ji5\n#JApmIBGQ%!k+hpM1dG$8f,I8cpp9!!S!!!m*#B3!+3i2&3!!\"`\"BPSD(KS5\"IiL\n!-J\"8bq$2d0,4dYr\"dFlLG!-h!3-!!!d*#B)!+`m2&J!!\"`\"DQBQ+LBH$KijC!b1\nQip61dG,5d0r1cXrIQ3\"-FMd!\"!!!$JN*J!\"c$`mA!!!(!&bFM)f-LBL6I#!$FpR\nFcY(5dG,4eGA1d0Uf#$a`B@Xq!!3!!!i*#3!2$aB!!!F!AU#2NBk,Nj*)!$fqiY(\n2dY(4dY,4dY(4eXmJ+h*PCQ0V2J!%!!!0#3N3&`!!\"`\"JSj+8N!#5RA%2%T,Keml\n4JG)#dG(5J0&ZdcN!AR0VCfCMDci!\"!!!$JNB!!!)!'+QPT@6Rj%e!&c4hmr3dG$\n2cml4dY(4dY(5cB8l!KYIE'GQBfXq!!3!!!i!!!F!C+UCQCfLB3)SVH,5cG,8eYR\nEhH28dG,5dG,4dZ2DVaBrG'KSCQ0V2J!%J!!A\"J\"QVCbFRSJM\"RhHhG,AfGRBepV\nMrZA3J0*rdG(9dm,!j6i[GfPTD'CMDci!!`!'!'k[Rk#IRa8i`p['`X'mYl'[ZX6\nUimh5dY(3e0E%YmA2i8XNH@YVD@KQBfT#!!-'!'qaS+'JT455j-R2d0$4dp6@dql\nRcY,4d0,BbDffcp61i&iEHQeYDfPSC'a$!!-!\"J\"TXU#JUb\"[iFmLdY,4d0$4cHM\nQcG,3dGM2V+6&eY,3bqYq%(T[EQeVCh\"\"!!1!!(m)!'QbRUmY@q$,cp(6eG[3jHI\n1dY$AeE'AY0A9d-l6il%M'AK`F'jVG%-!\"3!!'3!!#!\"TX+mm6rAHhpM0aUR@kFl\n4dpLkNCr0f0(2cYr5AJ!TFRGcF@jh43!&!!!2%4N!!!J!CVp3&9p!+aXK!%VLcp$\nBcTU-[GR6d-l@i*%0#'a9H'jZFR\"k4`!&!!!2#K!4'!!!#!\"aK4dU1ek'$c2Ldp,\nCYibRe0E3cp(K[dJ&NIreeVHAHRp*!!8!!!m+#J!3%4N!!!N!EYhcr[pR)Yl9eFk\nIQ-ICdFr1h0Gf$3!E@fZ5[qImri!!#3!!%3S+J!!F%\"%C!!!,!*r-Ic!@c0V8ZCL\neep63cY6KTLX!!3+#!!N$*P%+\"3!!'!X,JJ!J%\"%H!!!(!!%!%F,KbDHRcYM4cmr\nIb9N\"!!)\"!!!$!`3#J!!&!`!!$3X,K!!A%4%A!!!+!!kjiVLQ`0M6d-lBhBX@!!)\n#KJ!'!JJ!!\"XC'BB!!3N(J!!2\"DVEVEE5eY$1dZ'h23!\"!SJ!\"3)!!!J'\"iS!%!-\n!QG1abYI5cmlGdfi)!!)\"L!!&!J!!\"J8&K`!5\"J%!\"`#%dVl8e0$1eH#I*!!#!SN\n!\"3)!!!F&\"BS!$JF!F0R+eG(2cq(&8!!!!SS!\"3)!!!F'\"S`!$&6Ncp,3cYRHJK%\n!!J++!!8#!!!(\"JD0!!Thiml1dZ5c-`!\"!SX!\"3)!!!F'\"Si!#9cMbpl9C!3!03@\n,!!8#!!!)\"JD2!!C*k1#C(!!)J!!!!iN!\"3)!!!F'\"T!!!!XrdN3!!83T!J)!!!1\n(!!8#!!!)\"`H4!!-3&!!0J3!%#!N!!!1&!!8$!!!)\"`H6!!-#!!!\"J!!&#!J*!!!\n$J`!&!`!!#!F(R!!&#!J+!!!$J3!&!`!!#3F(RJ!0#!J*!!!$!!!$!!!)\"`HJ!!X\n)#!N!!!-#!!!)\"`H2!)m!#`X,$`!!\"!3!!!i+#U!!$3X,%!!!\"!)#!`!!$`S+RJ!\n2#`X4!!!&!%K)!!8!!!m+#T`!%3X-%3!!\"3\"'GR4%!!8!!!i+#TS!%J`-%J!!\"3\"\n)HQeVG83!\"3!!$`Z\"!!-&!!B&N3!E$!`6!!!'!%TpF(\"[Dh9%!!8!!!8!*#F!!\"P\n#&T!!!\")0$4)!!!B!6)\"cFh*aEfYe4!!%J!!'!`!)2%&,(Bm!(3d0%`!!\"J\"1JhC\nfGA4bF@pVG8-!\"5i!!5*54c\"A)Bi!(Jd0&!!!\"J\"3KhPjH(CeG(*aEfPj4`!!%N\"\n96b\",8bZ0!\"m0$4-!!!B!8BTmI(YkH(CeG(\"aH&mH\"5p469NF28p6)B`!)3i1&!!\n!\"J\"6MAprIRelHAKfFhTd1!!B590)AL`a89%c!!'+!#!1$K8!!!B!9C!!JS+\"Ihj\npHhGkJ&J1\"MT86dCH2be66d!#L`!J$Ji8!!!(!&H8KB@%JS'!IAZ%FbN!*9\"46%K\nD8Le568N*L`!J$Jm@!!!(!&QAKiL(KS5#Ii@&5`82494-6%T8BM&36%m6J!!\"!`H\n'!#F2$aB!!!F!@jU+LiU)Ki1&MQ`E!6*66dY05djZ1da-8L!!\"`!!%!S+K!!T$`m\n@!!!(!&fGMBk0M)Q'N!#&2!!E6&*,6%e05R4+5%e6+JSj!3-!!!i+#S)!+`m2&`!\n!\"`\"ISC!!NC!!MSU2P'%0#$j868Y06%e(E9j&69%j!&&l3J!&!!!2#JU!!%B3%\"F\n!!!F!BD56P*13!)qDJ5X!+9&35da06%e,9'&(68p%!%*iDR9%!!8!!!m+#J!3%\"F\n!!!F!BkH@Q*@5QTG4!a*(8da-68b!66\"-88a-6Nd*-hTZEfYe4!!&!!!1#JS3'!!\n!#!\"NUTQDPjQLGaS\"09415de06Nj06%a0J%`K6K8&C(adF'pVG83!\"3!!$`SC!!!\n)!'DZR*bDTC8q!\"p28i\"-58T)4dC-68a-68a05c)@!b\"PGA\"[Dh9%!!8!!!m!!!J\n!D,'IS+5SD!`*2e**4dP-89KICR455de06%e-69423!0)I(\"aEfYe4!!&J!!A\"J\"\nUY++MT)dX!#e@9PGHC@Y[FhH\"YAK*J%er6%a36N!r9\"-mIh*bF@pVG83!!`!'!(1\nfTDDPT\"S26&406%T&2cFb16Z&G%*068a,6e&!0%&-9\"FaJ(0dFR&[Dh4)!!3(!(1\niTULQU4id9%P+58P+5de35BPm4%j05de64#Xc5Np,8aiRJA9eG(*`EA9)!!3!\"J\"\nYZDDQX#XN9%b\"64j-684rHd016%a65LNM39&06%TA,\"b!GhCeG(\"k4J!%J!\"r#!\"\nYZD5d14Y65Na-68j44APl4%e,88mZ&M&38%a,694#\"Kk!HAKfFhe)!!8!!\"S!!!J\n!EEDd5\"KG8e445dXiERa&6%j60K!H5&*-5dY58#!!-RKrHhTfJ%S!\"3!!%\")D!!!\n)!'V'@!!I%3F#$`!hH%C-8NNC$$P66NY,6P-c!\"*XA(phGhYiJd`!\"3!!%!X4%KN\n!!!J!GSNL0dGSM43QH%G18c--*8p45dY-8NJE#jErppLmRB+)6J!'!!!3#`X!%4%\nD!!!*!((KmrlrD4Ge59&*(4G#9%a,5e\"1+`8!'9PVNVrRr2q#!!N!!\"),#i!!(\"%\n5'J!!#`#Hbhda$fK18$BA-P*25dY08Md2!!!\"JJ!*!bC4#J8!!\"N,#i)!'4%5(`!\n!#!!\"!!eL8dBP*8P56%Y-8NSJ!!!\"J!!$!`-%!S!!\"3-!!!i-$)3!&\")5'!!!#3!\n0AP3f*6a66NY,6e%c#)N!\"J))!!!F'4U'!\"3*#3%!!!C86Ldc69&,5de53aB!!!'\n)!!8#!!!)\"`H,!!i$5%B`49&05dY465J$!!'*!!8#!!!(\"JD(!!m#!!!\"!$P%28p\n25dY18MS0M!!&!J!!\"`B'LJ!1!J!X5NK36%Y-8NJG!!!\"LJ!&!J!!\"`B'M!!*(e*\n-68a,6e%[\"Sd!\"3)!!!F'\"Sd!\"bY65dY08d%5MJ!&!J!!#!B'MJ!*)P0+88iN!3!\nA\")X!\"3)!!!J(\"im!\"KY98MJ+!!1!!!!$L3!&!`!!#!F(N!!!#aG0'3!!'Jm!!`!\n!!iF!\"3-!!!J(\"j%!!`B(!!@\"!!3)#J!!!i8!\"3-!!!J(\"jS!\"3J)#3!!!i-!\"3-\n!!!J(\"j`!\"3J)#J!!!i%!\"3-!!!N(\"ji!$3J)#J!!!`!!!`!!#3F(S!!,#!J*!!!\n$!`!!#3F(M`\"S1'eV!!!*#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!Q*J!!`!!!!!\n!!!!!!!!!!!!\"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`##rrq#!!-!!!!\n!!!!!!!!!!!-\"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)Arqr[rK3!$!!!\n!!!!!!!!\"!`!5%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!K2rkr[lkri8!!`!\n!!!!!!!-\"!%MS5!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#%rrVqrrrqq[q&!!-\n!!!!#!J!EU[hr@3!$!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)6rq[lrr[lrr[VrK3!\n$!J-!!Qh`rr6rF!!%!!!!!!!!!!!!!!!!!!!!!!!!!!-!K2rkr[rqrrrqrrlkri8\n!!J!db[rlq[VrKJ!%!!!!!!!!!!!!!!!!!!!!!!!!!`#%rrVqrrlrrrrrr[rqq[q\n#\"j2mr[RqrrVrR!!$!!!!!!!!!!!!!!!!!!!!!!!$!)6rq[lrr[rrrrrrrrlrr[h\njk[rkqrrqr[crXJ!#!!!!!!!!!!!!!!!!!!!!!!-!K2rkr[rqrrrrrrrrrrrqrrl\nmr[VqrrlqrrVr[!!\"!!!!!!!!!!!!!!!!!!!!!`#%rrVqrrlrrrrrrrrrrrrrr[r\nqrIrqr[lrrI[f1!!#!!!!!!!!!!!!!!!!!!!$!)6rq[lrr[rrrrrrrrrrrrrrrrr\nrr[lrr[lqq2pF!!)!!!!!!!!!!!!!!!!!!!-!K2rkr[rqrrrrrrrrrrrrrrrrrrr\nrrrrrr[rjri-!\"!!!!!!!!!!!!!!!!!!!!`#%rrVqrrlrrrrrrrrrrrrrrrrrrrr\nrrrrrr[crR`!$!!!!!!!!!!!!!!!!!!!$!)6rq[lrr[rrrrrrrrrrrrrrrrrrrrr\nrrrrrr[crK!!%!!!!!!!!!!!!!!!!!!-!K2rkr[rqrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrlpri8!!`!!!!!!!!!!!!!!!`#%rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrr[rqqrq&!!-!!!!!!!!!!!!$!)6rq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrlrr[VrK3!$!!!!!!!!!!-!K2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrqrrlkri8!!`!!!!!!!`#%rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrr[rqq[q&!!-!!!!$!)6rq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrlrr[VrK3!$!!-!KIrkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrqrrlkri8!!`##rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrr[rqq[q#!*Mrqrlrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrlrr[[rQ*Irqrlrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrlrr[[rQ!#\"rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrr[rqq[q#!!-!K2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrqrrlkri8!!`!$!)2rq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrlrr[VrK!!$!!!!!`#$rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrr[rqq[q%!!-!!!!!!!-!Jrrkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrqrrlkri3!!`!!!!!!!!!$!)2rq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrlrr[VrK3!$!!!!!!!!!!!!!`#'rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrr[rqq[q)!!-!!!!!!!!!!!!!!!-!K[rpr[rrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrqrrlkriB!!`!!!!!!!!!!!!!!!!!$!(hrrIlrrrrrrrrrrrrrrrrrrrrrrrr\nrrrlrr[VrKJ!$!!!!!!!!!!!!!!!!!!!&!&ArrIlqrrrrrrrrrrrrrrrrrrrrrrr\nrr[rqq[q'!!-!!!!!!!!!!!!!!!!!!!3!62cmr[lrrrrrrrrrrrrrrrrrrrrrrrr\nqrrlkriB!!`!!!!!!!!!!!!!!!!!!!J!qp[[mr[lqr[lrrrrrrrrrrrrrrrrrrrl\nrr[VrKJ!$!!!!!!!!!!!!!!!!!!!#!$(Zr2[rr[lqrrhqrrlrrrrrrrrrrrrrr[r\nqq[q'!!-!!!!!!!!!!!!!!!!!!!!#!,Vrq2rqr[lqq[lmr[rqrrrrrrrrrrrqrrl\nkriB!!`!!!!!!!!!!!!!!!!!!!!!#!+crr2lqrrckrqhkrIlrr[rrrrrrrrlrr[V\nrKJ!$!!!!!!!!!!!!!!!!!!!!!!!$!*Arq[rqqIlqR!Z$rrVqrrlrrrrrr[rqq[q\n'!!-!!!!!!!!!!!!!!!!!!!!!!!!%!(hrq[Vkrp%m!!)!K[rkr[rqrrrqrrlkriB\n!!`!!!!!!!!!!!!!!!!!!!!!!!!!$!'Arp2rcGJ3!!`)$!)Erq[lrr[lrr[VrKJ!\n$!!!!!!!!!!!!!!!!!!!!!!!!!!!$!%crrV)K!!)#!!!!!`#'rrVqrrrqq[q'!!-\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!$[T83!\"!`!!!!!!!!-!K[rkr[lkriB!!`!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!i8!!-#!!!!!!!!!!!$!)Irqr[rK`!$!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"!`!!!!!!!!!!!!!!!`#$rrq%!!-!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"!!!!!!!!!!!!!!!!!!-!QTS!!`!!!!!\n!!!!!!!!!!!!!!!!!!!!!!'Pd-c)!!'#4!!!!!,F!J!-&!!!\"!3!!J!2`!)!$\"`!\n!!3!!!3!!J!2Z!)!$!J!!!B%!!J%!!)!$l!#!\"!)!!!'$!!)\"!!#!!qS!J!3#!!!\n\"K3!#!3!!J!2S!!8%\"!8!!!'\"!!%*#B%!!J%!!)!$jJ!&\"!3&!!!#J3!$#4)5#B%\n!!J%!!)!$j!!&\"!3&!!!#J3!&#4-4%\")*J3!#!3!!J!2L!!8%\"!8!!!+\"!!F+%a%\n5%4!5#B%!!J%!!)!$i!#!\"3)!!!+\"!!N+&\")5%4)4%\")*J3!#!3!!J!2H!)!&!J!\n!!S%!#`S9%a)6%K%5%4!5#B%!!J%!!)!$P`!\"!J(!!!8&\"3B!!!+\"!!d,&4-8%a)\n6%K%5%4!5#B%!!J%!!)!$P!!\"!3,\"!!8&\"3B!!!+\"!!m,&K38%a36%K-5%4)4%\")\n*J3!#!3!!J!15!!B$!3\"F-J!\"[!!&\"38'!!!#J3!4#aF8&\"88%a36%K-5%4)4%\")\n*J3!#!3!!J!12!!J#!J!GV[p5!!1l!!8&\"3B!!!+\"!!%-&i!9$K39&\"-8%a)6%K%\n5%4!5#B%!!J%!!)!$M!!+!3-!!R2er2pZ!!1k!!8&\"3B!!!+\"!!--'\"B@J\"81&\"8\n8%a36%K-5%4)4%\")*J3!#!3!!J!1+!!X$!J!idIripIq'!!5j!!8&\"3B!!!+\"!!%\n-'B%@J\"81&\"88%a36%K-5%4)4%\")*J3!#!3!!J!1(!!d#!`!2QIrrprMmrjX!!lJ\n!\"38&\"J!!!S%!!3dCJ4F\"&KD!&3i8&436&\"-5%a)4%K%3%JQ\"!!8\"!!!$!`'&!!i\n$!!\"CkIrmqIEqqrqh!!+h!!8&\"3F!!!+\"!!30'KJA')!A!4B@J\"81&\"88%a36%K-\n5%4)4%\")*J3!%!3!!!`'$!\"!#!J!N[2rpr2her2rmrmJ!!EB!\"38&\"`!!!S%!!`i\nE'\"Q!')!A!4B@J\"81&\"88%a36%K-5%4)4%\")*J3!!!B3!%!%$!!9qq2rlrIleq2r\nqrIrFY`!&\"38(!!!#J3!&$KXC'4JCJ\"L!&`%@&S!9$K39&\"-8%a)6%K%5%4!5#B%\n!!J%!!i!!&!-\"!%$Crrcmr[lhpIlrr[hrlJm!!E-!\"38&\"`!!!S%!\"`iF'KND'4J\nCJ\"L!&`%@&S!9$K39&\"-8%a)6%K%5%4!5#B%!'3%!!!)$!\"@Mrrllr[rrqI2lrrl\nrr[ri'!!\"XJ#!\"`)!!!+\"!!N2(4SE'KND'4JCJ\"L!&`%@&S!9$K39&\"-8%a)6%K%\n5%4!5#B%!'!%$!!\"Ml[rlr2rqrrVcq2rqr[rqr[mZ!!+a!)!(!J!!!S%!#`mG'aX\nD'aSC'KNB'B!BJ\"F\"&KD!&5S8&436&\"-5%a)4%K%3%`J!!!-#!#[&rrclr[rqrr[\ndpIhrr[rrr[cr3`!#X!!&\"`F)!!!$J3!0$amF'a`E'KXD'4SC'\"Q!')!A!4B@J\"8\nT&\"88%a36%K-5%4)5#`)\"!`!*J[Rrqrhrr[lrr2Adq[rqrrrqrrVr8J!$V`!&\"`F\n)!!!$J3!2%\"mF(4`E(\"XD'aSC'KNB'B!BJ\"F\"&KD!&438&436&\"-5%a-2\"3!#!3\"\n'fIrmr2q!rJ6rrIEcpi$q\"[rqrrcrd!Z`!!8(\"`J!!!1\"!\"%3)\"dG(\"dF'a`E'KX\nD'4SC'\"Q!')!A!4B@J\"8Q&\"88%a-8%`S!!3)!'UErr[[qrrlrr[rqpr2frIrqrrl\nrrIrV)3!\"VJ!&\"`F)!!!$J3!6%#%G(4iG(\"dF'a`E'KXD'4SC'\"Q!')!A!4B@J\"@\n!&#%9$`-!!`!\"DHlrqrcrr[lrr[rqqI6frIrqrrlrr[hp3J!$VJ!&\"`F*!!!$J3!\n\"%5'!(S!G$4`G(\"XF'aSE'KND'4JCJ\"L!&`%@&S!9%\"B6\"`!#!J!ba[rmqrlrr[r\nrJ2i'q[6erIrqri$q\"2[rD3!%VJ!&\"`F*!!!$J3!'%5)I(KmH(S!G$4`G(\"XF'aS\nE'KND'4JCJ\"L!&a!@&4B@$3%!!`!0M[VrqrhrrS$r%Ilqrr[dpIcrr[rqr[rkrj-\n!!ki!\"3F(#3!!!i%!!4)MJKm\"(Kk!(3dF(4`E(\"XD'aSC'KNB'B!B%4F@&aJ5\"3!\n$!3\"3i2rmr2rqrS$rJ2i1r2Adr2rqrrrqrr[rZ3!\"VJ!&\"`F*!!!$J3!\"%L1\"))!\nI!4iHJ\"dI(\"dF'a`E'KXD'4SC'\"NB&aFC&JX!!3)!),$rrI[qrrk\"ri$q$rhfp2c\nrr[rrr[rmrpX4!!'Y!!8(\"`N!!!1\"!!35*#%J)B!JJ\"m\"(Kk!(4dF(4`E(\"XD'aS\nC'KNB'\"NC%3-!!`!%Fr2rqrcrr[k\"ri(q$[Idqrrqrrrqrrhrmb`!!Ud!\"3F(#3!\n!!i%!!4-PJ#%\")#'!))!I!4iHJ\"d)(\"dF'a`E'KXDJ\"N1'KB)!!)#!$V1rrclr[r\nqJ[q\"rJljp2[rr[rrr[rqr2p3!!1Y!!8)#!N!!!1\"!!J6*5)L)5)K)#'!))!I!4i\nHJ\"d&(\"dF'a`EJ\"S1'aS1!3%$!\"'Br[llrIrqJrq\"rJlkp2Vrr[lrrrlrq[pi!!5\nY!!8)#!N!!!1\"!!S6*L-L)b)K)L%J)B!JJ\"m\"(Kk!(48F(4`E(\"SE(48&!!-!!&V\nQrrcmrrlqK2q!rJllp2Vrr[lrrrlrq[qH!!1Y!!8)#!S!!!1\"!!`8*b-N)b)M)L%\nL)5!KJ##!(`%H(S!G%K`G(\"XG'JX!!3)!*VRrrI[qrrk&ra$qrrlmpIRrr[lrrrl\nrqrr!\"Di!\"3J)#J!!!i%!$K3R*#3M*#-L)b)K)L%J)B!JJ\"m8(KiG(KdF(4d5!`!\n$!!Gqp[rlrIrqK[m9r[rqrIEirrlqrrrqrrcrhKN!!3!\"!i!\"TJ!&#!J+!!!$J3!\n3&#JN*#8N)b3M)L-L)5)K)#'!))!I%KiH(4dI'3J!!J%!3YErr2[qrrk'raIqrrl\npprMrr[lrrrlrrIrf0J!$!!!\"!!#!!k3!\"3J)#J!!!i%!!48SJ#80*#8N)b3M)L-\nL)5)K)#'!)\")I(aiH(ai3!3%$!\"HLrrllrIrqKrm+r[rqrIMhrrlqrrq!rJ6mreX\n!\")%!!J%!!)!$SJ!&#3J+!!!$J3!8&5NQ*L8Q*53P*#-N)b)M)L%L)5!KJ#!3(am\nK&`8!!`!!C1[rqrcrr[k(r`AqrrlqqIH!rS$r#2lrq[q#!!3!\")%!!J%!!)!$S!!\n&#3N,!!!$J3!R&5SQ*LFQ*5BP*#8N)b3M)L-L)5)K)#%J(b)G$!!#!J!Z`[rmqrl\nrrSMr#2lrr[lkprlrrS$r#[lrq[qT!!)!\"K)*J3!#!3!!J!1H!!8*#3X!!!1\"!!%\n@+S!RJ#BH*5BP*#8N)b3M)L-L)5)K)#)L&!)!!`!,L2RrqrhrrSRrJIi%qrIqrrk\n!r`cqrr[rc!X!!!34%4)*J3!#!3!!J!1F!!8*#3X!!!5\"!!B@+bJR+#FRJ#BF*5B\nP*#8N)b3M)L-L)5)N'`J!!J%!60hrr2crrrk+r`Iqrrlmq2hrrS$r$[lrrIrS*!!\n#!4!5%4!5#B%!!J%!!)!$QJ!&#3N,!!!%J3!\"&Lb#+!%R*i!Q'58Q*53P*#-N)b)\nL*#%3!!%$!\"fVrrllr[rqLrm(r[rqr2Rprrk!ra$qrrlpqd-!!`!1%a%5%4!5#B%\n!!J%!!)!$Q!!&#3N,!!!%J3!\"&bf\"+B!S!5FRJ#BA*5BP*#8N)b-N*4N&!!-!!fr\n`rr[mrrlqM2m'r[rpq[hrrS(r%IlqqrpT!!3!$\"35%K%5%4!5#B%!!J%!!)!$PJ!\n&#3N,!!!%J3!%&biU+5U!+B!S!5FRJ#B#*5BPJ#31*L%-!!)#!$E+rrclr[rqMIm\n'r[rqq[crrS(r%rlrq[q4!!3!#486%K-5%4)4%\")*J3!#!3!!J!18!!8+#J`!!!5\n\"!!%A,S!U!5NUJ#Q!+!%R*i!Q%58P*#BQ&3)!!`!2NrcrqrhrrSrr\"Ilrr2crrS(\nr&Ilrqrqh!3%!\"K86&\"-5%a)4%K%3%JQ\"!!)\"!!#!!j)!\"3S+$!!!\")%!#\"J[+bX\nU+bST+S!TJ#J8*bFQ*L8Q+\"i)!!)!!&EMrrcmrrlqMrm&r[rprIrqJImAr[rmrpF\n6!!%$&\"88%a36%K-5%4)4%\")*J3!#!3!!J!13!!!&#JS-!!!%J3!+'$!V+b`V+LX\nU+5U!+43S+#FS*LBT*4%!!3)!)lArrI[qrrk3!2m&r[rqrIrqJImCr[rprr!Z!!)\n\"%aB8&436&\"-5%a)4%K%3%JQ\"!!)\"!!#!!ii!\"3S+$!!!\")%!!4J`J#`(+b`V+LX\nU+5U!+4)S*bFT+4S%!!-!\"RRerr[prrlqNIm&r[rqr[rqJ2mEr[rqr2p4!!-!%\"F\n9&439&\"-8%a)6%K%5%4!5#B%!!J%!!)!$M!!&#JS-!!!%J3!K'6%Y,5`Y,#XX+bS\nV+LNU+5NS+#SM$!!#!J!rd[rmqrlrrTEr!2k$r`Mqr2pi!!3!$aQ\"&3i8&436&\"-\n5%a)4%K%3%JQ\"!!)\"!!#!!iS!\"3S+$!!!\")%!$KNb,5dZ,5`Y,#XX+bSV+S!T$LX\nT&J%!!`!8RIrqqrhrrTIr!IlqJ[mGr[crP3!'!3!,%aFA&K89&\"88%a36%K-5%4)\n4%\")*J3!#!3!!J!1)!!8,#Jd!!!5\"!!%D-S!Z'bdZ,5`Y,#XX+bSV+5SX)!F!!`!\n!B1Rrr2crr[kIralqrrG!!!%!!J%!\"Jm9&aB9&\"88%a36%K-5%4)4%\")*J3!#!3!\n!J!1'!!8,#Jd!!!5\"!!-D-bm[J#iB,5iY,#dX+b`V+LdS%3!\"!J!V[[rpqrlrrU,\nr\"IlqrmYV&S!!&3)!!JN5&K88&436&\"-5%a)4%K%3%JQ\"!!)\"!!#!!i3!\"3X+$3!\n!\")%!\"4Sd,bm`,i!Z&5dZ,5`Y,#XY,4X%!!-!#B6irr[prrk-ri2qM[m\"r[q!rJ6\nrm+0\"\")%!%J3@&488&436&\"-5%a)4%K%3%JQ\"!!)\"!!#!!i)!\"3X+$3!!\"B%!!4X\ndJ$#!,i!Z%bdZ,5`Y,b8-!!)\"!%MDrrcmr[rqKrq%rT6r)2lrr[clr[lreANE!!!\n$&4B9&439&\"-8%a)6%K%5%4!5#B%!!J%!!)!$J!!&#`S0!!!&J3!%'c8a-$'!-!%\n[,i!Z%#dY,b`@!3%$!\"URrrllr[rqJ[q%rS2rJIi$rIlrrSrr$IlqrrhlrIhrd33\n!!K8@J\"81&\"88%a36%K-5%4)4%\")*J3!#!3!!J!-'!!X+$3!!\"B%!!4XfJM'!-\"%\n[,biZ,c!L\"`!$!!&Ul[rlr2q&rS,rK2k\"r36mrIlrrT!!ri$q#[rlp2[Z%J!\"&\"F\n@J\"81&\"88%a36%K-5%4)4%\")*J3!#!3!!J!-%$!i!!!@\"!!8E0M)b-6+!-B!`$bm\nZ-LX3!!)#!$2(rrclr[q#rJ$rKrk\"rB$m\"IhmrIlrrSrrJ2i0rrhiqIhrp4i!!4)\nA&KD!&3i8&436&\"-5%a)4%K%3%JQ\"!!J\"!!!$!`i!!!@\"!!FF0c)b-c)a-S!a%6!\n[-6%F!`!$!!f1qrrlrIrqrS$r!IlrJIi2rIhmqrckqIVhprRiq[hmrB$qM[q!rJh\nrr[RhrIrqrImh!!%4')!@J\"81&\"88%a36%K-5%4)4%\")*J3!'!3!!!`!!\"B%!!4`\niJ$-P-M-b-6)a-6!a+3X!!3%!8Z$rr2crr[rqr[hmr2Vjq[Ifpr6epI1!p!IhqIc\nqrrhmrB$qM[m(r[lrr[Vfqrq!rJVmrd8!!3mC&KF@&S!9$K39&\"-8%a)6%K%5%4!\n5#B%!!!'!!!!&J3!J($Jd0$-d-c)c-M%b-6!d(!!#!\"q[rrhiqI[iprMep[EdJ2@\n\"pS$h#[Mkr2lrr[rqrIcpJ2k0ri$q%2rlp[MqrrlqrrllreN!!3dCJ\"F\"&KD!&3i\n8&436&\"-5%a)4%K%3%JQ\"!!)\"!!@\"!\"NI163d063c0$-b-c)a-M%c)3!!,I$rq2R\nmqi(mJ2f#rSIrJ2i#rIcpJ2k-ri$q\"rrmp[ImrrlqJ2m(r[VrH3!##aQ\"&`%@&S!\n9$K39&\"-8%a)6%K%5%4!5#B%!!3%&J3!9(cNe063e0$-d-c)c-M%a0#8\"!$VrqS$\nqLrq(rJ2rrIcpJ2k,ri$q\"IrpprAkri$qJ[m)q[q(!!)*'KFBJ\"F\"&KD!&3d8&43\n6&\"-5%a)4%K%5#B%!!J%!\"B%!&4dj068d063c0$-b-c)a-bN\"!\"lerrf6rJErr[l\nrrIcpJ2k+ri$q#2rqq26ir[rqrS6r\"[[rS!!\"\"aU!')!A!4B@J\"8,&\"88%a36%K-\n5%4-*J3!!!B!!!!@\"!\"3G168e0$8d-c3c-M-b-bd$!\",[rrf8r`IqrrlmrIlrrSR\nrJ2i'rrlkp2Emri$qKIm'qrqp!!%&'B%BJ\"F\"&KD!&3N8&436&\"-5%K-*J3!'!3!\n!$`!!\"B%!%adj068d063c0$-b-M-[\"3!(hIrpNrm(r[rqr2hqrrk*r`[qr[rqqrA\ndq[lrr[k(r`ImrmF!!!3C'B%BJ\"F\"&KD!&3F8&436&\"-8#S%!#!%!!!--$`!!\"B%\n!%Kdj068d063c0$-b-c))!!$(rrb5r`IqrrlmrIlrrSMrJ2i)rrcfmrIprrlqKrm\n,r[rprq!*!!)B'KJCJ\"L!&`%@&S!9\"439&\"-9#S%!#J)!!!3$$!`2!!!&J3!4(6N\ne063e0$-d-c)d$!!!ZrrlNIm(r[rqr2hqrrk(ri$q\"[rmpr2eqrq!rSEr$[lqrrc\nlrq!,!!)@'KNB'B!BJ\"F\"&KD!&3-8&\"8,J3!-!J!!\"!-$!!`-$`!!\"B%!%\"dj068\nd063c0$-e$`!!R[rlN!$r\"rlrr[cpr[rqK[q!rJRrrIMdp2RqrrlqKrm3r[rqqrl\nrUa`!!3!9'aNC'\"Q!')!A\"KB@&488&JZ\"!!8#!!!&!`1!!!8-$!m!!!@\"!!mG168\ne0$8d-c-f&!!!KrrkM2q\"rJErr[cpr[rqKIq!rJIrr[RdmrEmri$qK[m6r[rrr2c\nrh8X!!3!!\"4JE'4SC'\"Q!')!A\"\"B@&4F,J3!&!J!!\"33%JJ!&$!`2!!!&J3!2(6N\ne063e0$-h'!!!GrrkrS$rJ[i2rIhmqr[kqr[prrlprIlrrS6rJ2i+rrlkpI2dq[l\nrr[k(raAqrrhlrrQ)#`!$!!%2'aXD'KND'4JCJ\"J&&aF@&KF-J3!&!J!!\"33%K!!\n&$!`2!!!&J3!A(6Ne063e-cFG!!\"BrrVmqr[kq[[mr[rqJ[m)r[rpqrhpr[rqK2m\n-r[lrr[[fp26hrIrqrSIr'2lrr[[prm)Z!!)#!!NC(4`E'KXD'4SC'\"Q!'!-A&KJ\n-J3!&!J!!\"33%KJ!&$!`2!!!&J3!0(6Ne063d0b%!!%Arr2k\"ra(qrrlflYV'ZCZ\n'Gdj5krrprrk%r`Mqr[rmp[6dpIZ\"rSEr)2lqrrclrqYN!!!$!!-8(KdE'a`E'KX\nD'4SC'\"NB&aFC$)%!\"3)!!!8%\")J!\"3`-$`!!\"B%!&Kdj068d0bB!!$,dfmHlRSK\nh@%Bd(4)&JJ!&\",2rr2rqJrm%r[lrr[L!p!6irIrqrSIr)2lrr[[qrk%A!!B%!Jm\nH)\"`F(4`E(\"XD'aSC'KNB'4JC$B%!\"3)!!!8%\")S!\"3`-$`!!\"B%!#Kdj063h+J!\n!!a%'L!!*!3)&\"!1drrcrrS2r#Ilqrrcfp26fqrq!rSEr)IlrrrcmrpP#!!-#!!!\n,'4XH)#!I(KdF(\"XD'aSC'KNB'Jf\"!!8#!!!&\"!5-!!8-$!m!!!@\"!!8G168f,J+\n%!\"!\"!3)$!J!!\"3!\"!J#KrrVrrS,r\"2lqrrljJ23%qIlrr[k'rb,qr[rpqrrjL3X\n!\"!!@IS*J3b`D%!d3&4XH(aiF'aXD'4NE$B%!\"3)!!!B&\"Bi!\"3`-$`!!\"B%!'ad\nj0M%$!!!$\"3S1%a36%4-D-%d2!!-!Q2rkrrk#r`Rqr[rmp[6dprcrJ2k'rb,qrrl\nlrIr$,`!\"!!\"AjIrprrcXdDq)B6dK%3`2&K`H(4SE$S%!\"3)!!!B&\"C!!!!8-$!m\n!!!@\"!\"NG1M3Q+#ib-5dS+$00FT[%mem!\"3#*rrVqrS(r$2lqrrljp22eq[lrr[k\n'rb2qr[rmr2rUC!!!\"!!jbrrpr[hkqrlrr[lrqZ#kM&`c'!X,'`k\"!!8#!!!'\"3@\n5!!8-$!m!!!@\"!\"8G16Fe,#Ja6RQUerIrr2pf!!B!HIrkJ2k!r`[qr[rmp[2dq2l\nrr[k(rb2qrrhlrrf@%J!#!`!+G+HacHMkrrlrr[rpq[crr[lrpFqFEK5\"!!8#!!!\n'\"3@8!!8-$!m!!!@\"!#)G16jVSYEirrlrr2MrIJ!(!'Mrqrlrr[rrr[lrr[VdmrE\nmri$qK[m+r[rqqrcrc6N!!31&!\"X-*%*QMVEEprrqr[rpqIhmrjB!!3!\"\"!!!\"J8\n&PJ!X$!`2!!!&!!!#!&Imrrlrr2Vqr[crN!!!\"`\"5rrcqrrlrrrlqrrhhmrAkr[r\nqrSEr#rlqrrclrr*b!`!$!B)!!J-$!S3!&!3H4A5ReIMrr2q)!!%!!KF!!\"B&\"CJ\n!(3`-$`B,$J-!!3#2rrcqr[rZ[S9(!`8!3IIqrIrqri(q\"rVdp2MprrlqKrm+r[r\nqqrlrVKi!!J+)!!%\"!B!$!!+#!!i#)%f8I3!#!!)B!!!K\"3@D!!m-$#N!!\"S#!!%\n!L[r&K885J!!4\"3!dl[rprrlrr[lrrIIcp[crJ2k'r`Vqr[rmr2rI6`!\"!j%!!`%\n$\"!1#!!J#!!!6!!![)KqF!!S-$#N!!\"S#!!!''i%!#!%$\"J!Sjrrmri(q#2rkp26\nkr[rqrSIr#[lrrI[rqS`-!!-#P`!!!B!$\"`!!!3!0)#m`RJ!9063q!!!,!!!#!!%\n%!`%!!J!Fh2rmri$q\"[rppr2hrIq!rSEr#[lrr[[mrm8a!!)$RJ!&!3!0)#m`S!!\n)0M3P$3!#!!!\"J3!'!J!5crrlri$q\"Irkp2Alri$qK[m,r[lrr2[rl@J!!!-\"RJ!\n&!3!!\"33&SJ!&06)N#J!#JJ!4!3!,`rrlrrlqrrlhp2RqrrlqKrm+r[rqqrlrT4N\n!!J+I!!8\"!!!%!`1N!!8&\"3B!!!+!!!i\"!31errVrr[lrqr6frIq!rSEr#[lrr[c\nmrpK'!!%$S!!&!3!!\"!-$TJ!8\"38(!!!#!!!#!+6rq[rqrrlhp2VrJ2k(r`Vqrrh\nlrrH\"#!!$!D!!\"3%!!!3$!ki!$J-!PIrkr[lrqrAhr[rqrSIr#[lrr[[prl`T!!)\n$S3!&!3!!\"!-$VJ!,\"!#'rrVqrrlhpIcrJ2k'r`[qr[rmr2rSAJ!!!`'K!!8\"!!!\n%!`1Z!!d%!(VrqrlrqrAjr[rqrSIr#[lrrI[qrTX6!!-#SJ!&!3!!\"!-$VJ!-\"!\"\nTrr[qr[IfrIrqrSIr#[lrr[[mrp%p!!%$S`!&!3!!\"!-$VJ!*\"!\"CrrcqqrEkri$\nqK[m,r[lrrI[rp(F&!!-\"S`!&!3!!\"!-$VJ!,\"!\"*rIlmqIRqrrlqKrm+r[rqqrh\nrXb%!!J+N!!)\"!!#!\"+i!#!-!1[Irq[Rpri$qK[m+r[lrr2criP3!!!1P!!)\"!!#\n!\"+i!#J-!,Zrrq2[qrrlqKrm+r[rpqrrmN3i!!`+P!!)\"!!#!\"+i!#3)!)HErq2l\nrr[k(r`Vqrrllr2r*0!!#!kB!!J%!!)!%VJ!'!J!@frrkri$qK[m,r[lrr2[rm'd\n#!!-\"TJ!#!3!!J!5Z!!J\"!!h0rr[rr[k(r`Vqrrllr[qU(!!#!UF!!J%!!)!%X!!\n&\"VlrqrrqKrm+r[lrr2[rh%S!!31S!!)\"!!#!\"+m!\"J-!82rkrrk(r`VqrrhlrrZ\n(#J!$!DJ!!J%!!)!%X!!&!J\"$rrcqK[m+r[rqqrcrb5i!!J1T!!)\"!!#!\",%!\"3)\n!,[rqrS6r#rlqrrclrr\"S!!!$!DN!!J)!!)!%XJ!&!3!Bq2rqJrm0r[rqqrlrU\"F\n!!J)!!!+R!!8#!!!&\"!5c!!8\"!!lYrrf\"r`Vqrrrmr2rF4!!\"!i!!!J3!!U8!\"3)\n!!!8%\",F!!Y[rrB$r$IlrrI[rqB-(!!-\"!!!#J3!!!U-!\"3)!!!8%\",B!%!%!b2r\nmrrlrr[[prm!R!!)#J`!%!JB!!!+K!!8#!!!&\"!5h!!i#!,Erqrlrr2[rkei!!!1\n&!!8#\"3B!!!+I!!8#!!!&\"!5i!!d$!*[rqrhlr[qH%3!$!SF!\"38&\"J!!!Td!\"3)\n!!!8%\",N!#`3!KIrhr2r91`!#!iS!\"38&\"J!!!TX!\"3)!!!8%\",S!#J-!E[rmpRJ\n%!!-\"M!!&\"38'!!!#Q3!&!J!!\"33%Z`!)!`\"4rl3J!!)#M`!&\"38'!!!#P`!&!J!\n!\"33%[!!'!3!cB!!!!j)!\"38&\"J!!!T8!\"3)!!!8%\"-%!!3)\"P!!&\"38'!!!#N`!\n&!J!!\"33%`!!\"!31A!!8&\"3B!!!+4!!8#!!!&\"!6H!!8&\"3B!!!+2!!8#!!!'\"!6\nJ!!8&\"3B!!!+0!!8#!!!'\"!6L!!8&\"3B!!!+,!!8#!!!'\"3AN!!8&\"3B!!!+*!!8\n#!!!'\"3AQ!!8&\"3B!!!+(!!8#!!!'\"3AS!!8&\"3B!!!+&!!8#!!!'\"3AU!!8&\"3B\n!!!+$!!8#!!!'\"3AX!!8&\"3B!!!+\"!!8#!!!'\"3AZ!!d&\"3B!!!)!!!)!!!B&\"I!\n!#`8&\"J!!!J)!!!B&\"EF!Y`!,&43C!!!)#!!!'\"38m!!0&48C!!!*!!!*!!!B&\"6\nZ!!89&4N!!!Q\"!!8*!!!B&\"6X!!89&4S!!!Q$!!8*!!!B&\"6U!!8@&KS!!!Q&!!8\n*!!!B&\"6S!\"8@&KS!!!N!!!%!1$N!!3!!#3!!'\"38jJ!A&KBE!!!+!!!\"!$CTD68\n!!3!!#3!!'\"38j!!C&aFE!!!+!!!\"!$CVBQ&T03!\"!!!*!!!B&\"6L!\"XA&a`!!!S\n!!!%!0faMC'0KD68!!3!!#3!!'\"38i!!G&aFF!!!+!!!\"!$GYC'9NC'0KD68!!3!\n!#3!!'\"38hJ!I&aFF!!!+!3!\"!$K[C@CQC@4NBf&T03!\"!!!*!!!B&\"5A!!!#`3!\n,'\"FF!!!+!3!\"!$P`J'F5CQCPC'4MB@Ne!!%!!!N!!\"J8&*3!!3%#`3!,'\"FF!!!\n+!3!\"!$PaJ'J8CfGQCQ9NC'0KD68!!3!!#3!!'\"38NJ!'!J!!5#F!!E`!#aJA(3!\n!#J%!!3!kFi\"T&QKSCfGQCQ9NC'0KD68!!3!!#3!!'\"38M`!)!J)!'SVC53!#Z`!\n,'4JG!!!+!3!\"!$YdJ@SAD@KSCfGQCQ9NC'0KD68!!3!!#3!!'\"38M!!+!3)!!Pl\n3ZpTF!!1k!#NC'4d!!!S\"!!%!1h9VE'YVDQTTD'KRCfCQC@4NBf&T03!\"!!!*!!!\nB&\"5+!!X#!3!ZUqLZYZ9Z!!1j!#XC'4i!!!X\"!!%!2(CXE@eXDfYUDQPSD'GRCQC\nPC'4MB@Ne!!%!!!N!!\"J8&)F!$3%#!!apeq+cSpAGJ!!#Z!!Y'4NH!!!,!3!\"!$e\niE@jZE@eXDfYUDQPSD'GRCQCPC'4MB@Ne!!%!!!N!!\"J8$)8!$J)!!%M#hYA&MY$\n3hCB!!VF!#aNC(`!!#`%!!3!pHB\"[(fjZE@eXDfYUDQPSD'GRCQCPC'4MB@Ne!!%\n!!!N!!\"F(J`!3!J)!(CVIeFr@KlRAcYZP!!'f!!XC'4m!!!X\"!!%!2RU!F#\"[Efj\nZE@eXDfYUDQPSD'GRCQCPC'4MB@Ne!!%!!!N!!!1\"!\"!\"!J!%CY,GcXrHNTRCd0$\nBYEF!#aNC(`!!#`%!!3!qHi&a)(\"`EfjZE@eXDfYUDQPSD'GRCQCPC'4MB@Ne!!%\n!!!N!%i!!%J)\"!$@ciG,2cZ#PIXr6dG(9a!be!#XD'Km!!!X\"!!%!2hebFh*bFA&\n`F'pZEQeYE'YVDQTTD'KRCfCQC@4NBf&T0B!!'J%)!!!\"!J!4KG[CcY,1hlTbYpI\n3dY(6c43!!E)!,4SD(`!!#`%!!3\"!IR0dG(0bFR&aF(\"[EQjYE@aVDfTUD@KSCfG\nQCQ9NC'0KD65\"!!m\"!J!!8FIIcmr5cYh,G*R@JY%$eLB!!E%!5aSD)!!!#`%!!3\"\n!Ih4eGA4dFh*bFA&`F'pZEQeYE'YVDQTTD'KRCfCQC@4NBQ\"`-3!\"!J)!)k,JeFl\n4dXrBfB#!bG64dY,4cpXh!!+`!!XE'L!!!!`\"!!%!3B#!GMeeGA4dFh*bFA&`F'p\nZEQeYE'YVDQTTD'KRCfCQC@0RD%!1!!-!\"fV8h-l3dY,3e150G+rAd0,4dG,0idB\n!!Um!#aXE)3!!$!%!!3\"#JS\"h-hCfGA9dG(0bFR&aF(\"[EQjYE@aVDfTUD@KSCfG\nPCQaA(3!\"!3!kXq(5cp,4dY(3kTeaP01\"d365cYZ[#,!!64XE)3!!$!%!!3\"#JhK\njH(KhGhCeGA4dFh*bFA&`F'pZEQeYE'YVDQTTD@GQE'Be\"!!#!\"L-fpR1dG,4dY,\n0lDjaLmV8dG,4dY$@aaX!!Di!64XE)3!!$!%!!3\"$K(PkHRPiH(GhGR9eG(4cFR*\naFA\"`EfjZE@eXDfYUDQGUEdi5!!)!!PV*hmr2dY(5dG,-km&bKmM9d0,4dY(4ecB\n!!Ui!44`F)J!!$!%!!3\"%KATlHhTjHAKiGhGfGA9dG(0bFR&aF(\"[EQjYE@aVDQP\naBLJ!!!)!,+EJe-l4dY(5dG2-jp4fK-A@d0+!d362heF!!ki!64`F)J!!$!%!!3\"\n%KhYmI(YlHRPjH(KhGhCeGA4dFh*bFA&`F'pZEQeXDR\"[3JN!!J!-H0EEcY$5dG,\n5dG20iH4pIm,@d0,4dG,0iAS!!ki!64`F)J!!$!%!!3\"&L(apIAamHhYkHAPiH(G\nhGR9eG(4cFR*aFA\"[EfjXER9D'`!\"!3\"'[H(4cp,4dG,5dG,1f[#*HVrAd0,4dG,\n1hT`!!Di!#adF)`!!$3%!!3\"'LB&q*hemI(YlHRPjH(KhGhCeGA4dFh*bFA&`Efe\neE$3#!!)!(C6Heml4dY'!dK24dY$8q*Pe[0I3dY(4dXrCZ3d!!Dd!0adF)`!!$3%\n!!3\"'LRq!IhpqIRemI(YlHRPjH(KhGhCeGA4dFh*bF@pcGNm3!!)!\"@,1hXr3dY(\n4J0)6dG,4d2UXFVRAd0,4dG,3e-iM!!+Y!$BG(#-!!!d\"!!%!4ib!JB'!IhpqIRe\nmI(YlHRPjH(KhGhCeGA4dFh&aH@BQ!!%\"!$1YiG21dY,4JG)6dG,5cIM\"F,ABd0,\n5dG,4d0Y\"!!1Y!$8G(5-!!!d\"!!%!5)f\"JS+\"JB\"rIhjqIAamHhYkHAPiH(GhGR9\neG(*iG8)(!!)!%B$CfXl4dY'#dK24dY,-mp9bVpM3dG,4dG,1i@3!!kd!04dG)`!\n!$3%!!3\")MS+$Ji+#JB'!IhpqIRemI(YlHRPjH(KhGhCcGReF'3!#!!\"1`Z$3cp,\n4dB25%Y(5c1cRHDRBd0(5dG(5cZ#%!!+Y!!XG(53!!!d\"!!%!5Bq!K#@$Ji+#JB'\n!IhpqIRemI(YlHRPjH(KfGAea-`%!!J!MR0r@cY(5dB65%G(5cHAdK+,Cd0(5dG(\n5cYkK!i!!!!1U!!XG(53!!!d\"!!%!5C'\"K51%Ji1#JS'\"J(prIRjpI(alHhTkHAC\nlI9!1!!)!#'[4hFl3dY'&dKR4dXlHrC1DfG(4dY(4dXrB[\"3!!3%,%`J+#kB!-am\nH*3!!$3%!!3\"+NSD(KSD&KB5$Ji+#JB'!IhpqIRemI(YlH(U#D53!!3%!1V6KdXr\n5dY'&dK[4dXrBrkD8f0(4dY(4dY$6dLi!!`!!#3!!&a38T!!b(aiP!!!0!3!\"!%Z\n6KiL)KiD'KB@%Ji1#JS'\"J(prIRjpI(YjJAY\"\"3!#!\"D)fpR1dG,4KY)6dG,3e2q\njN!$AdY(5dG,5dFrG6J!%J3!&#3!!'\"38SJ!b(aiP!!!0!3!#!%Z9L)Q*L)L(KSD\n&KB5$Ji+#JB'!IhpqIAYrK&iA!!)!!9E(hmr2dY(4KY)@dG,4dIl0Mp66dG,4dY(\n5cZ&`!!-!'J+!!!8*!!!B&\"5J!$%I(bB!!!i\"!!)!6*D*LSU*LBL)KiD'KB@%Ji1\n#JS'\"J(ppIBCe-3!!!J!TSq$9cY(5dBI5)G(5dFrjhj,3e0(5dG,4dXhJNJ!$!#0\nV03!\"!!!*!!!B&\"5H!$!I(bB!!!i\"!!)!6CH+LiZ+LSQ*L)L(KSD&KB5$Ji+#JB\"\nqK)43#`!#!!YdeGc1d0,4Lp)Jcr,ZQX[9d0,4dY(5cYZ`#`!!&Q0MD68!!3!!#3!\n!'\"38R!!,(amQ!!!1!3!#!%fBJB`JLiU+LBQ)L)H'KS@&K)1$JS##LQ`K!!%\"!%+\nkiG(2dY(4LG)NdG,1krQQaYE3dY(5dG,2eXFI!!!,@fGLB@Ne!!%!!!N!!\"J8&*S\n!,amI*J!!$J%!!J\"1QBf1MBf-M)Z+LSQ*L)L(KSD&KB5#JBU!3!3!!J!ENGhAcY(\n5dBV5*Y(5cpVqYF(Ad0,4dY(5dG,A1`!$!P\"VBf4MB@Ne!!%!!!N!!\"J8&*J!,b!\nJ*`!!$J%!!J\"2Qik2Mik0MBb-LiU+LBQ)L)H'KS@#KiaI&!!#!!4Ic0l2d0,4dBh\n5*FrfbElAd0,4dY,4dFrI@`!%!%&ZBf9NC'0KD68!!3!!#3!!'\"38PJ!Z)#!R!!!\n1!3!#!%qFMj!!N!#2Mik0MBb-LiU+LBQ)KiH&KBpj,`!\"!J!`UZ(8cY,5dBc5+G(\n5cZAD[YI3dY(5dY(5cH&p!!3!-@jPCQ9PC'4MB@Ne!!%!!!N!!\"J8&*3!,5!J*`!\n!$J%!!J\"3RC!!NC'3!*!!Miq1MBf-M)Z+LSQ*Ki@0LNm*!!)!$hhBfml4dY'2dLR\n3eZ$%e0(5dG,5dG,1hTi#!J!LE@KRCfCQC@4NBf&T03!\"!!!*!!!B&\"55!#dK)5J\n!!!i\"!!)!8*k4NT+4NC!!N!#2Mik0MBb-LiZ+KiU5EKm!!J!!5m$Jd-r5dG'3!0)\n&dGR0dY,4J0)KdG,2fEN5!!!6CfYSD'GRCQCPC'4MB@Ne!!%!!!N!!\"J8&*!!!!`\nK)5J!!!i\"!!)!8D#5J*-FNT+4N!#3!)q2MSf0M)b+LC1&23)!!J!KQGr@cY(5dC(\n5\"G(5dY(5dB$5)p(5d061+3!\"#&eZD'PSD'GRCQCPC'4MB@Ne!!%!!!N!!\"J8&)i\n!+b%K+!!!$J%!!J\"5SC59P*56Nj+5NC!!N!#2Mik0M)U3!*0I%3!#!!CSd0h1d0,\n4NY)&dG,4dG,4J0)PdG,4d0Y(!!-!6h*TDQTTD'KRCfCQC@4NBf&T03!\"!!!*!!!\nB&\"5-!#XK)5N!!!m\"!!)!8U+9PTD9P*56Nj+5NC!!N!#2Mib0Ph`X!!%\"!$LaiG,\n1dY,4P0)$dG,5dB,5#G(3ifJ!!`\"(H@Q\"DKGTD'KRCfCQC@4NBf&T03!\"!!!*!!!\nB&\"5+!#SL)5N!!!m\"!!)!8k5@PjH@PT@8P*16NT+4N!#2MCD3!%d(!!)!&)AEfFl\n4dY'AdJ(4dB,5*p(3fRm!\"3%#0PYaFfeTD@TTD'KRCfCQC@4NBf&T03!\"!!!*!!!\nB&\"5)!#SL)5N!!!m\"!!)!9+@AQ*LAPjD@PC58Nj15NBk6QQmF!!)!!&6&i0$2dY(\n4Rp)$dG201S!!)3%!!Kj)Ch0ZDQTTD'KRCfCQC@4NBf&T03!\"!!!*!!!B&\"5'!#N\nL)5N!!!m\"!!)!9+DBQCQBQ*HAPTD9P*56NC'EL6X!!!)!*k$JeFl4dY'LdJA4dYD\nUA\"5#!\"d,-&YXDQTTD'KRCfCQC@4NBf&T03!\"!!!*!!!B&\"5%!!`M)LS!!!m\"!!)\n!9DHCJ*SBQCQBPjH@PT@8NCQCAJi!!J!*FG6FcY$5dC,5!0'0dJr4dY(4fZ$*LMN\n%!!!\"!\"KZJ'SAD@KSCfGQCQ9NC'0KD68!!3!!#3!!'\"38JJ!S)b)U!!!2!3!#!&@\nTQjbEQjUDQCQBPjH@Nj@IILN!!3%!3,MKdFr5dY'0dJI4dG$2cY(5dBh5$p(5dFr\n1e0rDXQNC!!!3DQb!DKGTD'KRCfCQC@4NBf&T03!\"!!!*!!!B&\"5!!#FM)LS!!!m\n\"!!)!9UUFRCfFQjZDQTQBQ*D9Rj9,\"3!#!\"Q1hGM1dG,4LG)-dG$2cXl2dYADhqV\nId*!!dP(4dG,3cY2Ah,!'!!PQEQYVDQTTD'KRCfCQC@4NBf&T03!\"!!!*!!!B&\"3\n!)b-U!!!2!3!#!&HVRCkHRCfFQjZDQTQ@Qk&['!!#!!0FbYr2d0,4K0)#dG$2J-i\n0cp,@h12UmIImr[rbdp'2dJl4dY(3eG6%[-[)%3!%B(#!DcaUDQPSD'GRCQCPC'4\nMB@Ne!!%!!!N!!\"J8&#-V!!!2!3!#!&HXRTqIRTkGRCbEQjQCT)dh!!!#!#kSi06\n1JG)5dG$2cFh-cY(9fq2Umr[rr[lrri$q\"Ir`d0$5dBc510(5dG$6em@b[p(9c\"d\n!!&PbE'aVDfTUD@KSCfGQCQ9NC'0KD68!!3!!#3!!'\"3V!!!3!3!#!&LZRi#J%Tq\nHRTfGR*UJRed-!!)!$AR@fXf!cKh0cY$8fGrRlrEprrlrr[caj0R+`m6&e[[rmG(\n4dY',dR$4dY(3dYM,V+r-eG(3ebm!!&&dE'eXDfYUDQPSD'GRCQCPC'4MB@Ne!!%\n!!!N!!\"J!!\"!\"!!)!@DqJSU'KS+#IRTkGR+#'*3!\"!3\")[Z,6dpMFi16Tl1cZkZ2\nGdF@kUk#9LS+!KC1QZ-63p2radG(5dBV5,p(5dY(4f0'XRlr@dp(4cp`q!!\")G@a\nYE@aVDfTUD@KSCfGQCQ9NC'0KD68!!3!!#B!!!4!\"J!!M@E#LSk1LSD'JS*qHRTZ\nRA!!%!\"k9h0E,bmc'`EfcUk1BNSb)J)85KSU0NCHU[mrAfGE9p2radG(5dBV5,0(\n5dG$@eV18VG,@d0(5dFrH6`!!2RGYEQeYE'YVDQTTD'KRCfCQC@4NBf&T0B%!-!N\n!$`%!!3\"JXD+NT+1MSU'KS+#IRTbQE!!!+FcBaF6%`,fmZlbq`-2(bXh2dG28eGD\n!e`cBeY24d0$`rr,4dG,4LG)[dG,4d0AB[C'CapM4dG,4dY(1i@8!!$9iE@jZE@e\nXDfYUDQPSD'GRCQCPC'4MB@NjJ3!)#!m\"!!%!B,'MJ+36Sk1LSD'JS*qGTRJ!!$2\nDcY26e0@#eJ69eG66di$5JY%-d0$4dG,2lIrbdY(5dBM5$p(5dG$6f-@9L,EBe0$\n4dY'!dKl1i(8!!#YhEQpZEQeYE'YVDQTTD'KRCfCQC@4NBQNjJ3!$#!!3!B!!!PU\nbSi#N$U1MSU'KS+#HT)-#!\"l0djA4#G,5cqVrmp,4dY'(dJr4dY(3dYM-RRkId0I\n3dG,4JY)'cpk*!!!KGS\"[%fjZE@eXDfYUDQPSD'GRCQCPBfXfJ3!!#B!!\"a!\"!!)\n!@V+MJ+31Sk1LSD'JRk12#!!5ap64NY)+dG,5cZIrmp,3dY''dK$4dY(3dGI3UAk\n+`GR5d0,5dB25\"XrGR3!!'A5!F#4[EQjYE@aVDfTUD@KSCfGQC'`h!!%!!!N!!#i\n!!\"!\"!!)!@V+MJ+30Sk1LSD'ISCJ3!!Lkep#8dJI1j2rddp$5dBA5%0(5dY(4eY1\nbJhZXeGA3dG,4KG)(cpUS!!!4F(+!F#4[EQjYE@aVDfTUD@KSCf9Z1!!\"!!!*!!!\nC*5i!!\"!\"!!)!@V+MJ+3-Sk1LSD#KRKS!!+VDd*(5#G(5cZ(rp023dY'%dK(4dG,\n4d0E9ZSYdPXRBdG(5dG'%dM,4dY$8[!N!#@acFA&`F'pZEQeYE'YVDQTTD'G[1!!\n\"!!!*!!!C&#8P,J!!%!%!!J\"DXU1!T!ZMSk+KS+8P!!#FhFq3!0)*dG,1h[redp$\n5dB65%0(5dG$8eVq8G)1heY63dG,4K0),dG(5d-lL[JX!\"@CeJ(%QF(\"[EQjYE@a\nVDfTTD(!j!!%!!!S!!\"N9&3!P*5i!!\"!\"!!)!@V+MJ+3+Sk1LS+Na!!#*hXq2dJR\n4dXrEr[E6d0,4Jp)3dG,4d02AaCajGk(1ep(4dY'&dLI4dY(1f0f3!\"S!!J\"FH(&\nbFA&`F'pZEQeYE'YVDA%k!!%!!!S!!\"S9&B!!$#8P,J!!%!%!!J\"DXU1!T!QMSU#\nV3!!!GZ$1M0+!d3M5cpMppp63dY'#dK(4dY(3dYI+ShpcMElAdp$4dY'%dJl4dG,\n2dH'k3J!\"!3!ADAD!FKCaFA\"`EfjZE@eXDR-k!!%!!!S!!\"S9&B)!$#8P,J!!%!%\n!!J\"DXU1!T!QMS+j1!!\"NiFl4J0+$d3$3J-m,cXl2dG$@qrI8d0,4JG)4dG,5d0,\nAcUQ%G(kTdGE3dG,4KG)SdG,3cYc9G!X!!`!'3AGhFh4cFR*aFA\"`EfjZE@Yd1`!\n\"!!!+!!!E&KD%!!`P*5i!!\"!\"!!)!@V+MJ+3(SDjF!!\"3hFf!caA1cXr2dG29epV\nGhq(Ji0I4qIM8d0,4JG)4dG,4d0E5X)PhH*6%f0,3dY,4K0)TdG,4cYAJSbN!!J%\n!*@TrGR9eG(4cFR*aFA\"[EfjXG6`!!3!\"#J!!'aB@KJ!Z*58Z!!!3!3!#!&UbSk5\nNSDeU!!!rhpADhGrJiGlFemh'YkLDKR0P4NRUr063dY'!dK(4dY,3dpHjMAThK,(\n8eG$4dY'%dLV4dG,3cpr(9J%!!J!28hplGACfGA9dG(0bFR&aF'pYGM`!!3!\"#J!\n!'aB@L!!J*58Z!!!3!3!#!&UbSk5LV(J!!#h,Z+QFL(CN6ciZ(K%'JJ!'\",Rrdp$\n5dB$5%0(5dG$@cTpmHAbEbYI4dG,4KG)UdG,4cYMEL\"B!\"!!$1AH\"H(GiGhGfGA9\ndG(0bFR&`EhJp!!%!!3S!!\"`@&iS!&#8P,J!!%!%!!J\"DXU1MUi3!!!34\"iN!(3%\n%!`1hrp23dY(5dY(5dY$5elZ*HAQ*Z0E8d0(5dB65+p(5dXr4iEBk!!)#!\"9GJ(T\njHhYkH(GhGR9eG(4cFR&`H6d!!3!\"#J!!(\"FAM!!2*58Z!!!3!3!#!&UbSUQ3!!D\n+!\"i(%!!\"!J#Qrp,3dY(5dY(5dG$@d+*pH(kLcYI3dG,4KG)VdG,3cYc8FJS!\"!!\n9L,@MLi\"hFR\"bG(GjHAGfGA4dFh&k2J!\"!!%+!!!F&aH1!$NP*5i!!\"!\"!!)!@V'\nQQ3X!!3F3'bFd38eABh#$R5`!\"!#Brp22dY(5dG(5d0,A[SahHT,!ep,3dY,4K0)\nXdG,4cYEJSLJ!!3!!9qArrIrmmH$-Y*f*HA\"ZF(0fGhCbHcm!!3!\"#J!!(\"FAN!!\n!0L8P,J!!%!%!!J\"DXk&fHiL6R*kKSUHc`Y(Nrf%!\"J#)rp62dY(5dG,4d0E4TAe\nfKDr6eG$4dY'%dLh4dG,2dH$$9!%!!`!jbrrprrllr2hrr[lrqZR5YCQ#FQYUI%!\n!!3!\"#`!!(4FANJ!d*58Z!!!3!3!#!&UbV+bQSD+V[0$Qp[lprh-!\"`\"jrpA2dY(\n5dG,3dYI\"MR9mRXVAdG$5dG'%dLh4dY(1fpGk$`!#!J!+G+HacHMkrrlrr[rqqrc\nqrrlrppkpUd-!!3!\"#`!!(4FAP!!a*58Z!!!3!3!#!&U[SVE2jrRrr[lmq[pr!!J\n!D2r@cY,4dY,4d0A5UAaeMlhAdp$4dY'%dJV4dY(1e1'T,J!\"!S8!'``N3QD1YY[\nhrrlqrrllr2hrN3!#!!)-!!!G&aH@!#iP*5i!!\"!\"!!-!FIrpr[rmr2rqr2q3!!!\n(!&(rfFl6dG,5dG(A`j!!Fi'YdYE3dG,4K0),dG(5d-rIbed$!!)\"JJ!#!`-#K!!\n8\"\"j&G+I9q2rmriN!!J!#'3!!+\"JCQ!!X*58Z!!!9!`!#!)hrr2lqrqkqK8F$\"3\"\n!q0[0dp(5dG$9e+alGj[)ep,3dY,4K0)+dG,4cYMGMaN!!J+)!!%\"!B!$!!+#!!i\n#)%f8I3!#!!)D!!!['\"QD!!mP*6S!!\"d#!!)!L[r&K885J!!@\"3!cm0r-dp(5dG(\nAaT&bLVV@e0$4dY'%dJV4dG,2dH'j33!!!T%!!`%$\"!1#!!J#!!!9!!!i+bQF!!S\nP*$S!!\"`#!!!''i%!&`%$\"J!RkH,,dp(4d069VRYlUG(@d0(5dBA5#Y(5d-lFe()\n+!!)\"P`!!!B!$\"`!!\"3!)*c-eRJ!91MP%!!!2!!!#!!%%!`%!!J!EhHA,di$4#pM\n)NA5@aYI5d0,5dB65#Y(5dFl9i+)S!!%#RJ!&\"3!**c3eS!!)1cNZ\"3!)!!!\"J3!\n8!J!4d1M+dp(3e0D`Hi1heY63dG,4K0),dG(5cp$Jae8!!!)\"RJ!&\"3!!$``0SJ!\n&1MJZ!J!)JJ!6!3!+a1c+dp(4f-U5H+22ep(4dY'&dJV4dY(1fGZ'&3!#!Tm!\"38\n!!!i,#k3!\"4%4&!!!#)!!%`%\"!lAZbG23e0HaIBl$f0,3dG,4K0)+dG,5cY,KXcN\n!!3+J!!8&!!!1$!bQ!\"N4%4J!!!B!!!)!Sqr+dY$Bbj1!X0A9d0(5dBA5#Y(5d-l\nGd@N(!!)\"S!!&\"3!!$J`-UJ!!!B!!%3)!P2$+dG2BXB'DcGM4dG,4dB65#Y(5dFl\n@hjSL!!)#S3!&\"3!!$J`-VJ!3!`#%m-V4f-Z9LVhBdp$4dY'%dJV4dG,2d1$\"63!\n!!U)!\"38!!!i-$+i!$`3!Gqr+e0HbLDM8eY$4dY'&dJV4dY(1fYPr%!!#!D)!\"3B\n!!!i-$+i!$`3!CZh-f-ZDPmICdG$5dY'%dJV4dY,1dq'X-J!\"!U-!\"3B!!!i-$+i\n!$J3!9ZM3eV58Y0I8d0(5dB65#p(4dY$2hXeK\"!!#!D-!\"3B!!!i-$+i!$3-!4H6\n@bD1QcpM3dG,4KG)+dG,4cYIHNaX!!J+N!!8'!!!2$!bZ!!d$!$EJeEHM`GM5d0,\n5dB65#Y(4dXr4iEa&!!!#T3!&\"J!!$``-VJ!-!J!UfFkVYG2@d0(5dBA5#Y(5d-l\nFeRB-!!)\"T3!&\"J!!$``-VJ!,!J!Ic-@[bYI4dG,4KG)+dG,4cY6JT5X!!3+Q!!8\n'!!!2$!bZ!!X\"!\"@ka,l9e0$4dY'%dJ[4dG,3cpr*@3)!!J'Q!!8'!!!2$!b`!!J\n,UFl,eG(4dY'&dJV4dY(1f0b,&`!#!UF!\"3B!!\"!-$,!!\"35FfFr6dBI5#Y(4dXr\n4iEBp!!%#U!!&\"J!!%!`0V`!)!J\"%j-l4dG,4KG)+dG,3cY[9EJJ!!J'S!!8'!!!\n3$Jk`!!8#!$IDcp''dJV4dY(1e1#P*J!\"!UN!\"3B!!\"!1$V%!\"3%!*YA4dB65#p(\n4dY$2hmP9!!!#!DN!\"3B!!\"!1$V)!\"3%!&-h6dB25$Y(5dFlBhBN6!!)#!!!(!DB\n!\"3B!!\"!1$V8!!`c$eG'\"dJV4dY,2dZ'f1!!\"!S!!!Jd!#+8!\"3F!!\"%1$VF!!VA\nBd)$5%Y(5d-lFdfX'!!)\"!!!#!!-!!!LM!!8(!!!4$Jkf!\"!\"!+AEcp,4dY(1eH#\nH)!!#!S-!\"!J8!!!)S3!&\"`!!%3i1Y`!1!J#@hFr4dXr3i-9-!!!#K3!&#\"%8!!!\n)R`!&\"`!!%3i2Z!!0!J\"rhmr4cYRDJ3i!!J'(!!84%43!!!LG!!8(!!!4$Jqj!!X\n$!'lKbp,KX$%!!3++!!84%43!!!LE!!8(!!!4$Jqk!!S$!&[GfY\"L!`!#!B`!\"4%\n4&!!!#*N!\"3F!!\"%1$lX!#!)!4qZ6'J!#!Sm!\"4%4&!!!#*F!\"3F!!\"%1$l`!\"J%\n!+Nm!!!+5!!84%43!!!L9!!8(!!!5$Jr\"!!%#!C3!\"4%4&!!!#*-!\"3F!!\")2$m%\n!!!+A!!84%43!!!L4!!8(!!!5$`rH!!84%43!!!L2!!8(!!!5$`rJ!!84%43!!!L\n0!!8(!!!5$`rL!!84%43!!!L,!!8(!!!5$`rN!!84%43!!!L*!!8(!!!5$`rQ!!8\n4%43!!!L(!!8(!!!5$`rS!!84%43!!!L&!!8(!!!6%\"$U!!84%43!!!L$!!8(!!!\n6%\"$X!!83%\"3!!!L\"!!8(!!!6$a$Z!!d4%43!!!J!!!F!!\"-3%2!!#a%4&!!!\"`F\n!!\"-3%,F!Y`!,&aFE!!!*#3!!'K89m!!0&aFE!!!+!!!+!!!D&4AZ!!8A&a`!!!U\n\"!!8+!!!D&4EX!!BB&a`!!!S\"JJ!&#J!!'K89kJ!+'\"FF!!!+!3!!!3'!!!8+!!!\nD&4AS!\"8B&ad!!!S\"!!%!26i!!3!!#J!!'K89jJ!A'\"FG!!!+!3!\"!$TcFMS!!3!\n!#J!!'K89j!!C'4NG!!!+!3!\"!$YdDfTc1J!\"!!!+!!!D&4AL!!XC'4d!!!S\"!!%\n!2(D!E!aUFcS!!3!!#J!!'K89i!!,'4NH!!!,!3!\"!$ahJ@d0E'Tc1J!\"!!!+!!!\nD&4AH!!XC'4i!!!X\"!!%!2AL\"EJpYE@aUFcS!!3!!#J!!'K89h!!K'4NI!!!,!3!\n\"!$ejEh\"[EfjZE@eXDR-k!!%!!!S!!\"S9&GS!)aNC(`!!#`%!!3!qHh\"aFA\"[Efj\nZE@eXDR-k!!%!!!S!!\"S9&C)!\"!%!!\"N0[J!P'4NI!!!,!3!\"!$pmFA*bFA&`Efp\nZEQeYE'Tc1J!\"!!!+!!!D&4@5!!-*-8JE[3!R'KSI!!!,!3!\"!$ppFR0cFR*aFA\"\n[EfjZE@eXDR-k!!%!!!S!!\"S9&Bd!#3%!!5&20NdL!!'k!!XD'Km!!!X\"!!%!3(k\n!G\"TcFh*bFA&`EfpZEQeYE'Tc1J!\"!!!+!!!D&4@0!!J42&Sb0eBR!!'j!!XD'L!\n!!!X\"!!%!3(q!G4adG(0cFR*aFA\"[EfjZE@eXDR-k!!%!!!S!!\"S9&BS!#J3Z69F\nm)P&3,`!\"Z!!,'aSJ!!!-!3!\"!%'!JABGGA4dFh0bFR&aF'p[EQjYE@aUFcS!!3!\n!#J!!'K8-K3!-!3!!'NG38%m35Ne30lN!#aXE)3!!$!%!!3\"#JS&h(RCfGA4dFh0\nbFR&aF'p[EQjYE@aUFcS!!3!!#J!!'3L'!!X+1&*15Pi309*,8$bi!#mE'b%!!!`\n\"!!%!3S0iHAKiGhGfGR9dG(0cFR*aFA\"[EfjZE@eXDR-k!!%!!!S!!!5#!!m\"!!%\nP69&-5'BI'90,6%p#Y`!`'aXK!!!-!3!\"!%1%HATkHAKiGhGfGR9dG(0cFR*aFA\"\n[EfjZE@eXDR-k!!%!!!S!&)-!$a0\"8Ne04QFe!NT16%a14`5e!$!F(#)!!!`\"!!%\n!4)9kHhYkHRPiH(GhGRCeG(4cFh*bFA&`EfpZEQeYE'Tc1J!\"!!%*JJ!4\"M\"36dY\n14Q4-!$945de-68X(Y!!Y(\"`L!!!-!3!\"!%5(HhamHhYkHRPiH(GhGRCeG(4cFh*\nbFA&`EfpZEQeYE'Tc1B8!#ae*8Na-6NGHB3!C8B*-!8i1X`!a(\"`L!!!-!3!\"!%@\n)I(epI(alHhTkHAKiGhGfGR9dG(0cFR*aFA\"[EfjZE@eVDASf!!'!!\"301e*15da\n15&Ca#!*%6da068a-8\"5b!%SF(#)!!!d\"!!%!4BPpIRjpIAamHhYkHRPiH(GhGRC\neG(4cFh*bFA&`EfpZE@Y`F8B3!!%!!LG08%Y-68e+6hdC!#e55de-6%e,8aQa!!X\nG(#-!!!d\"!!%!4SU\"IapqIAemI(YlHRTjH(KhGhCfGA4dFh0bFR&`F'pYERCH(i%\n!$K9\"8Na,68a06%L$,!!86S&-\"%e,8%!$X!!,(4`M!!!0!3!\"!%H,JB!lIhpqIAe\nmI(YlHRTjH(KhGhCfGA4dFh0bFR&`ER9[1J3!!3!,0P\"25da06%e14)0$!!a'6Na\n06%e-6NN*X!\"0(4`M!!!0!3!\"!%H0JB+\"JB#!IhpqIAemI(YlHRTjH(KhGhCfGA4\ndFh0bF(0i9\"-!!3!#*%Y46%a06%e-6N*p@`!*3e\",68a06%a2%`!\"VJ!Y(4dM!!!\n0!3!\"!%L1JS1$JS'\"J)\"rIhjpIAamHhYkHRPiH(GhGRCeG(4bFRTU+i%!%a0!8Ne\n,6%e-68a23R4c!!C\"88Y0J%`%5e)I!!'Z!%dG(5-!!!d\"!!%!5Bq$K)5$Ji+\"JB#\n!IhpqIAemI(YlHRTjH(KhGhCfGA*jH%F+!!%!\"Lp28%Y-68a068a24'Q)\"3-q88Y\n06%a05e)Y!!'Z!#`G(53!!!d\"!!%!5C!!K)@&K)5$Ji+\"JB#!IhpqIAemI(YlHRT\njH(KhGh4fIQ%GJ3!'(8G56%a06)\"0%%a14PfA&3!l88Y06%a05e%jX!!h(4dN!!!\n0!3!\"!%U4KBD'KB@%K)1$JS'\"J)\"rIhjpIAamHhYkHRPiGhCqG$J$!!%!$6P56NY\n-68b!64&-6NP5RbS!19*,68a-68Y24!@[!$BI(L8!!!d\"!!%!5T1'KiH'KS@&K)5\n$Ji+\"JB#!IhpqIAemI(YlHRPhHhp9%3!\"!!-R69&,6%e-J8d46%e,5k&$!$C55de\n-6%e-68X0V`!-(aiP!!!0!3!#!%Z8Ki#)'SH'KS@&K)5$Ji+\"JB#!IhpqIAemI(Y\njHS*Y+B%!\"aC#8Ne,68e-J8d66%e04CaH!$*55de06%e-6&!B!!'Y!!XI(L8!!!i\n\"!!)!6*@\"L5@)L)H'KS@&K)5$Ji+\"JB#!IhpqIAemHS&q4JJ!!3!)-P\"25da06)*\n0%da06N15HJ!Z8dY-68e-68Y5*!!\"V3!d(amQ!!!1!3!#!%b@LSZ+LSQ*L)L(KSD\n&KB5%Ji1#JB'!J(prIRYqK@-E!!%!!#\"*8Na-68b%64*-6d+&N`!R8dY-68e-68Y\n5-!!\"V3!d(amQ!!!1!3!#!%fALib-LiU+LBQ)L)H'KS@&K)5$Ji+\"JB#!IRf'H6B\n\"!!%!$ca56NY-68b%64&-6d0hTJdJ8dY-68a-68Y41`'!!!!$UJ!c(amQ!!!1!3!\n#!%fCM)f0M)b,LSU*LBL)KiD'KB@%K)1$JS'!IS5'93m!!3!%+dj35da06)90'8a\n24@Qb)\"K86%a06%a06%p&\"`!!!3X8#3X-TJ!R(amQ!!!1!3!#!%kDMBk1MBf-M)Z\n+LSQ*L)L(KSD&KB5%Ji1!JBT`*i%!\"aP%8Na-68a-K8dE6%j(AEJk%90-6%e-68e\n-68i6!!)!!!S!!\"N9&D3!-L!J*`!!$J%!!J\"2Qik2Mik1MBf-M)Z+LSQ*L)L(KSD\n&KB5$JBQ$438!!3!+0P&25da06)C0$%a1595f93Y568a06%f!6!04)!!#J3!&#J!\n!'K89SJ!a)#!R!!!1!3!#!%qFMj!!N!#2Mik1MBf-M)Z+LSQ*L)L(KSD&JSH0C\"J\n!!3!\")dY46%a06)G0&Na15df[FJT26Na06%e-68Y5,!!\"!4`$J!!&#J!!'K89S!!\n-)#!R!!!1!3!#!&#GN!#!N5'3!)q2MSk0MBb-LiU+LBQ)L)H&KBjp0!!!!3!52e*\n05de06)G0)8a06%LMM3p,6da06%e-68Y41!!#!#Ce1J!\"!!!+!!!D&4@H!!`K)#F\n!!!i\"!!)!8*q4J*)JNC'3!)q2MSk0MBb-LiU+LBQ)KBb-93`!!3!',Np35da06)Y\n0)%D@T\"Y&8%Y06%e-68Y33`B!!\"KXE()k!!%!!!S!!\"S9&C`!,b%K+!!!$J%!!J\"\n4S*18Nj15NT'4N!#2Mik1MBf-M)Z+LSH*NR-M!!%!!\"a(8Na-68b+654-6N@&Y#d\nr8NY06%e-68a15`i!!!aMF'YUFcS!!3!!#J!!'K89QJ![)5%S!!!1!3!#!&+KP*@\n9P*16NT+4NC!!Miq1MSf0M)b+L*+)3`3!!3!-19&15da06)T0#Na15'#j4$P65de\n-J%dB6%a3'3!\"!PCdDfeXDR-k!!%!!!S!!\"S9&CJ!,L%K+!!!$`%!!J\"5ST@@PT@\n9P*16NT+4NC!!Miq1MSf-LSq8C\"8!!3!#*da45da06)j0*8DIC$965de-68e-68Y\n5*3!#!%GhE'jYE@aUFcS!!3!!#J!!'K89PJ!Z)L%T!!!2!3!#!&1NPTHAPTD9PC5\n6Nj+5NC'3!)q2MSb0Pi!a!!!\"!\"9#8Ne,68e-M%dT6%j%Fh`h8Na06%e06%e,8M)\n!!J!eH'j[EQjYE@aUFcS!!3!!#J!!'K89P!!Y)L%T!!!2!3!#!&1PPjLBPjH@PT@\n9P*16NT+4NC!!Mib9NP-+!!%!\"c*36dY-68b265P,8ha#6Na06%e06%e,86d#!3!\nNGR\"`EfpZEQeYE'Tc1J!\"!!!+!!!D&4@5!#`L)5N!!!m\"!!)!9+DBQCQBQ*HAPTD\n9PC56Nj+5NBk5QR3J!!%!!\"p*8Na-68b4639+C9\"+68b!65&-68a24`N!!\"9[Fh\"\naF'p[EQjYE@aUFcS!!3!!#J!!'K89N!!!$#)L+3!!$`%!!J\"9TjQ!QKbCQ*LAPjD\n@PC@8Nj14N!#DM%%#!!%!$ca56NY-68b4639-8&0+68b!650-68a064)!!!PPGh&\nbFA&`EfpZEQeYE'Tc1J!\"!!!+!!!D&4@1!!`M)LS!!!m\"!!)!9DLDJ*XEQTUCQ*L\nAPjD@PC@8NCHDC\")!!3!%+Nj35da06*00\"%a06%e-JNdM6%a4(J!\"!&9lFA0bFR&\naF'p[EQjYE@aUFcS!!3!!#J!!'K89M!!I)b)U!!!2!3!#!&DUQjfFR*ZEQTUCQ*L\nAPjD@Nj5IJLk\"!!FB4&*-6%e06*90!Na06)*0*8a-8bS!!3\"-JR&bFh0bFR&aF'p\n[EQjYE@aUFcS!!3!!#J!!'K89LJ!@)b)U!!!2!3!#!&DVRCkHRCbFQjZDQTQ!Q\"#\n@P*fA83F!!3!*09&25da06*C0!%b%63e-6&!b!!)!!MTLHRaeFB\"b&R&aF'p[EQj\nYE@aUFcS!!3!!#J!!'K89L!!T*#-V!!!2!3!#!&HXRTqIRTkGR*bEQjUDQCL9QU&\nd(3!\"!!%M5e&-6%e-S%d$6%e0'S)!\"3)J6A\"mGi\"b&R&aF'p[EQjYE@aUFcS!!3!\n!#J!!'K89KJ!T*#-V!!!2!3!#!&LYRk#JRjqHRTfFR*ZEQTLBSj!!2J!!!3!52P*\n05de06+*0\"8a-6d%P#B)!!``dBR@!FKCaFA\"[EfjZE@eXDR-k!!%!!!S!!\"S9&B3\n!+#3M,!!!%!%!!J\"BVU#KSD#JRjqHRTfFR*ZBS+&M$`!\"!!8Z6e\",6%e-Mdd$6Nj\n06)p0+%a-6e*,04J$!!!\"!\"ThFh0bFR&aF'p[EQjYE@aUFcS!!3!!#J!!'K89JJ!\nR*#3X!!!3!3!#!&Q`SD+LSD'JS*qIRTkGQTbRK#X!!3!!'dC56%a06)T0J8i(6%Y\n)4d4,68b065T-68a-5de48%-U$!!!%A*eFh0bFR&aF'p[EQjYE@aUFcS!!3!!#J!\n!'K89J!!-*53X!!!3!3!#!&UaSS#M&k+KSD#JRjqGQkDF6`8!!3!-1&&15da06)4\n0J8i068Y*4dC'5%e8B'Z$DdQ463a-68a,6Ne14!-!#@jfJ(-QFR*aFA\"[EfjZE@e\nXDR-k!!%!!!S!!\"S9&3!P*#`!!\"!\"!!)!@V+MJ+38Sk1LSD'JS*bLU(3D!!%!!LC\n-88Y-JNf!6K406%T)4N9&58pBCA1$Nk#UX,fB8%b266G-68a,6dj!28K+#!!%ChK\ndG(0cFR*aFA\"[EfjZE@eXDR-k!!%!!!S!!\"S9&53X!!!3!3!#!&ZcT)#P%k5NSk1\nLSU#IUj-k!!!\"!\"9\"8Ne-J%iF68a+4d9$3dC-9@*aJT1NXE[#`EkiXl#iN!\"*5Ne\n-M%d36%e-5dj436%q68j0$J!!AhU!G&YcFh*bFA&`EfpZEQeYE'Tc1J!\"!!!+!!!\nD&5d!!\"!\"!!)!@l5PTkHQTD@NT+1MSDHQB3`!!3!(-9\"258P(484&58pCCR@&PD5\n[YVLcVk#2IfTH@e0RUVL55dY06)Y0F%a06%Y08dBU,NK36%a2%J!!9hadGA4dFh0\nbFR&aF'p[EQjYE@aUFcS!!3!!#J!!'J!!%!%!!J\"FYUHSU+HRTU@PT+5LTS`Q!!%\n!!\"j(88e299eQF(b'M*15Li9eC99!-#%4\"J%%$b!b1dUBZj0,5dj-LNd[6%e06%a\n56#SI29&16%e-84S!!%eqG(CeG(4cFh*bFA&`EfpZEQeYE'Tc1J!\"!!!+J!!q%3%\n!!3\"FYkLTUDLSTkHQTD@NSDjI!!3!$cj899CBA9TA9%Jp-L-B$`F#!3!#\"JS1&#B\nl5P*989#C[j4-5dj-LNdX6%e-5e&3-\"3V6P\"-6%e-5e)K!!\"$J(9fGR9dG(0cFR*\naFA\"[EfjZE@eXDR-kJ3![#J!3!3!\"!'1hUDUUUDQSU+HRTU@PSUea!!!689\"*4d9\n!1cJe0$Bi2%&%4dT06P\"4J9)-8e&06%Y*NEk86%Y16)P0,da06%Y28MN4'%466%a\n06%e05e)Q!!!jJ(9hGRCeG(4cFh*bFA&`EfpZEQeYE'Tb2S%!+3N3!3!\"!'1iUDZ\nVUUQTU+LRTkDPSkap!!!98%T068j28&&58P&48%p16S\"0Jd`,5da068L+[jC05dj\n-L%d26%e-5dj6348*-e*25da06)\"0(NY5,`!!,S\"fGhGfGR9dG(0cFR*aFA\"[Efj\nZE@aUFck\"!\"S*!\"%\"!!%!AEQTUkZUUDQSU+HRTU5VL3%!%%k@6!P068D$[jG15Nj\n-Kdd26%e-5de54ad!(NY55da06)*0(8a40J!!)hphH(GhGRCeG(4cFh*bFA&`Efp\nZE@ae1i!!!3%+J!!C%3%!!J\"GZDQVUkUTUDLSTkHPUC8)!!P+68b563T-68j&I,k\nC6NT16)C0%%a06%Y-8NXR!!Xp8de,68e-Jdd'6&!l!!!DI)\"i0AGhGRCeG(4cFh*\nbFA&`EfjYGM`!!3!\"#J!!-!!!%3%!!J\"GZDQVUkUTUDLSTkDSRK!!\"8G16*00#%j\n&GEfD6dT16)90%%a068a-88i[\"3!T8&\",6%e-K8dr6%p\"!J!5H(TjH(KhGhCfGA4\ndFh0bFR&aF'jh2!!\"!!%+!!!E*c!!!\"%\"!!)!AEQTUkZUUDQSU+HRT4X!!d026*&\n0#8a14@klR%p+6Nb&63p-68a,8&!f$!!949*-6%e-K8e\"6%e-68F&!!TdI(PjH(K\nhGhCfGA4dFh0bFR&[H$d!!3!\"#J!!(\"FR*c!!!\"%\"!!)!AEQTUkZUUDQSTkDX*J!\n!1e\"-N!\"0#8a14QHjRNp+6Nb%64\"-68a,6e%m%`!'-e&25da06)903Na06%Y55!8\n!\"@eqHATjH(KhGhCfGA4dFh0bF(Nq!!%!!3S!!\"`A&`!R*c!!!\"%\"!!)!AEQTUkZ\nUUDQSTV!c!!!h88b263P-6NCKYU\"35Nj-Jdd36%e-5dj534S!!\"p*8Na-68b&65G\n-68a,6P%i$!!#!'+\"HATkHAKiGhGfGR9dG(0aHci!!3!\"#J!!(\"FAJ!!C*bF`!!!\n4!3!#!&fjUDZVUUQTTV*#!!!`88Z163P-6NGEXU*458j-JNd46%e-5de545%$!!d\nk8Nj,6%e-K8dR6%e-6&*((!!!!3!CFAjlHhTkHAKiGhGfGR9dFR`r!!%!!3S!!\"`\nA&i)!'#FR-!!!%3%!!J\"GZDQVUkUTTV43!!!R8NZ#6BC-J%X)6NP@VU4458j-J8d\n46%e05de555F&!!)R6&&,6%e-K8dS6%e-5e\"2,JB!!3!'4Aq!I(alHhTkHAKiGhG\nfGA4p3!!\"!!%,!!!G&aH%!\"FR*c!!!\"%\"!!)!AEQTUkZUTl9I!!!N8NZ!6)\",J%`\n268j28&&58P408+QR8NP16)&0%8a06%Y465d*!!!63&*05de06)40+8a068Y08Mm\n5!!%!!#KaL(jpIAamHhYkHRPiH(GfG(j!!!%!!3X!!\"dA&iB!,LFR-!!!%3%!!J\"\nGZDQVUkLdEJ!!'P*06e\"489*589\"158C#1MFZ+\"iIRkT558j-J%d46%e05dj40Jd\n!!!BZ6e\",6%e-K8dT6%e-5e&,)`%!!3!3@BH$IAjqIAemI(YlHRTjH(GfId%!!3!\n\"#`!!(4FAL!!K*bF`!!!4!3!#!&fjUDZTXhd!!\"004N-l0c!Q)aS6%!J%!B%!\"J+\n'V9**6Nb!63C-68a,88SHJ!!''N956%a06)90+Na06%Y186B+!!-!!carLAprJ(p\nrIRepI(alHhTkHAH\"33!\"!!%,!!!H'\"Q+!\"8R*c!!!\"%\"!!)!AEQTUE+*!!!$#38\n$L3!F!3%!JV*65%j-68e-68e,69)i#J!!#6946NY-68b&65T-68a-8NBC!!%\"!\"G\nNLB+\"Ji1#J(prIRepI(alHhTiJN)!!3!\"#`!!(KJCM!!2*bF`!!!4!3!#!&fjU,#\n9\"SS!(JF3!!!\"!(Hc9%K16%e06%e-5e&,)!!!!5&+88a-68b&65Y-68a,6e!a\"J!\n$!\"@*ZDQ4KhpkHATpIi'\"J(jpI(alHB0#!!%!!3X!!\"mB'Bi!15FR-!!!%3%!!J\"\nGZ+bI#`!\"\"a!E+$C%8&aSGBLL,J!$!'bd98K16%e06%e,69)k$!!!%6a568Y068b\n%63G-68a,69*#&)%!)&IPrrhrr2(LcVLMMi&iGRKmIRpqHS4$!!%!!3X!!\"mC'C!\n!!$BR*c!!!\"%\"!!)!AEQRHS#0QD+PU+UZZFI9j[pK!!3!BE4@4dj-68a06%Y36#-\n\"!!BY6P\",6%e-K%dY6%a06%a45LB#!!%!1F[rrIrqqrcprrlqrrVUe,QILATdFi9\n%!!%!!3X!!\"mC'C)!0#FR-!!!%3%!!J\"GZE+cVDLSX-$5jrEqrIpc!!8!9V4B4dj\n-68a06%e523i!!\"a'8Na-68a-K%dY6%e-5e\"2,!B!!!%!#R5RXFhSq[rqrrlrr[[\nmr[rqrrIJ`,\"(!!)!!3`!!\"mC'C3!-5FR-!!!%3%!!J\"HYULkdHMjrrlqr2VrI`!\n'!%Ub@NC16%e06%Y365B\"!!ij88j,6%e-K%d+6%e-5de52K%!!!'&!\"X-*%*QMVE\nEprrqr[rqqrcprj%!!J!#$3!!(aNCPJ!Z*bF`!!!4!3!$!(,rrIlqr2crr[crN!!\n!\"J!hVPe'6da068a-8Mm3!!3U69&,6%e-K8d*6%e-6&&+)J%!!B-!!J-$!S3!&!3\nH4A5ReIMrr2q*!!)!!KN!!#ND'TJ!,#FR-!!!&J-!!J#0rrhqr[rZ[S9(\"!3!+kK\nJ48p-68a,6dmT!3!C4&*05de06)40\"da06%Y2863*L`!\"!3'!!`!#JJ!1!L\"0P(d\n!!J!#'J!!-\"SDQJ!2*bFm!!!G!`!#!)VraB9&%S!!&J3!)U0M4%p-68a-8N)4!!X\nh88p,6%e-K%d+6%e05da53aF!!!'4!!-\"!`3$JJ!)!J!!&3!!1#XUR!!+*bBl!!!\nG!J!!\"KZ\"!\"F\"!`8!'CeQ4%p-6%Y28#X\"!5C-88a-68b&63P-68a,8%iU!`!\"Q!!\n!!B!$\"`!!\"3!)+$3eRJ!91cT&!!!3!!!#!!%%!`%!!3!5P'P$6i\"-#e*%%J!93P*\n05de06)40\"da06%Y18MX1S3!&\"3!)+$3eS!!)1cS[\"3!)!!!\"J3!8!3!-Lfa$6da\n,6e%X!!Bc8%p,6%e-K8d*6%e-6&**(`!!!Cm!\"3B!!\"!0$D)!\"6Si,J)!#))!%`%\n!\"S*Z3dp-6&*&%J!K5e&-6%e-K8d(6%e-5dp3-3HL!!8'!!!1$!bN!!85%48!!!L\n#!\"%#Gh\"#6dY18Li!$Mp568Y-68b%63T-68e,69*\"&3!!!D!!\"3B!!!m-$+B!'4)\n5'3!!\"`!!!3\"XFN015e0'%J%Z8&\",6%e-K8d*6%e-5e&-*J)!!D%!\"3B!!!m-$+S\n!!!'!!\"%\"!'&c3de18Li#'NK56%a06%b%63G-68a,6P%i$+3!\"3B!!!m-$+X!%`%\n!!!)!9A0$690'&3Xj8dj,6%e-K8d*6%e-6&*((!!!!D)!\"3B!!!m-$+i!$`)!6A0\n$8&)[#LC288Y-68b&63G-68a,8%mZ\"U8!\"3B!!!m-$+i!$`)!3R*%9%BC&d066%Y\n068b%63T-68e,69)r%J!!!D-!\"3B!!\"!-$+i!$J)!0Qj)8M%8-P*25da06)90#8a\n06%Y45b-\"!!'N!!8'!!!3$!bZ!!d#!#YV68BK*%T55da06)90\"da06%Y2868+T`!\n&\"J!!%!i1VJ!0!3!KD8`e)6e668Y068b%63T-6%e-6&*&'3!!!D8!\"3B!!\"!1$Ui\n!$!%!'@9&+M*18%Y-68b&63G-68a,8%iV\"+J!\"3B!!\"!1$Ui!#`%!%eXm,d956%a\n06)90\"da06%Y18M`3U3!&\"J!!%!i1X!!*$%ik2%p25da06)90#8a06%a555!!!!'\nR!!8'!!!3$Jk`!!J&380)8%a-68b&63G-68a,6e!c#+S!\"3F!!\"%1$V!!\"3%k6%a\n16)G0#Na-68a-8N)@!!!\"U!!&\"`!!%3i1X3!\"'91!6!&06)90#8a06%Y36LJ$!!'\nT!!8(!!!4$Jkb!!-88%a-KNd(6%e-5de52!kX!!8(!!!4$Jqc!!-16Na-K8d*6%e\n-6&&*(`!!!DS!\"3F!!\"%1$l3!!`G,68b$63G-68a,6e%b\"i)!!3F\"TJ!&\"`!!%3i\n2Y3!$\"%G16)&0#Na068Y08N)8!!!\"J!!#$3!)T3!&\"`!!%3i2Y`!#3Np-J%d*6%e\n-5e\"0*`)!!B!!\"3%!!`!!#+-!\"3F!!\"%1$lJ!#ca36%e-68a,6P)k#iB!\"!J9!!!\n)S3!&\"`!!%Ji2Z3!-0e&-6%e-6&*)(!!!!B8!\"3N4&3!!#*m!\"3F!!\")2$lJ!#J%\n!,P&,6%Y28#m&LJ!&%K%9!!!)R3!&\"`!!%Jm2Z3!)!3!S8NT08N!4M3!&%K%9!!!\n)Q`!&\"`!!%Jm2ZJ!*!3!K89\"-*!%!!Bd!\"4)4&3!!#*N!\"3F!!\")2$lX!\"3%!'PB\nf#C)!\"4)4&3!!#*F!\"3F!!\")2$li!\"!mG!!!\"NJ!&%K%9!!!)P3!&\"`!!%Jm2fJ!\n&%K%9!!!)N`!&\"`!!%Jm2h!!&%K%9!!!)N3!&\"`!!%`m3hJ!&%K%9!!!)M`!&\"`!\n!%a!3i!!&%K%9!!!)M3!&\"`!!%a!3iJ!&%K%9!!!)L`!&\"`!!%a!3j!!&%K%9!!!\n)L3!&\"`!!%a!3jJ!&%K%9!!!)K`!&#!!!%a!3k!!&%K%9!!!)K3!&#!!!%a!3kJ!\n&%K%9!!!)J`!&#!!!%a!3l!!&%4%9!!!)J3!&#!!!&\"!3lJ!0%K%9!!!)!!!)!!!\n8%\"(`!!X5%48!!!J(!!!8%\"'h!(3iE@X!!%!)!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!S+%!!`!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)Vrri`!!`!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!`#0rr[lrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[lkrii\n!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrrrlkrii!!`!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!`#-rrVqrrlqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!)#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrqrrl\nkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrqrrlkrii!!`!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!J!QKJF!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!`#-rrVqrrlrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!\"!`!$ErIS#`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrr\nqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`)!1-crrr!B!!%!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!J-!%*AmrrVqr5S!!J!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#\n-rrVqrrlrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!-\n!!&MNrrcmr[hr1`!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrr\nrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!)#!#@hrrhpqr2hrIp2!!-!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!\n!!!!!!!!!!!!!!!%$!!ClpIrmrIEdqZrmrfB!!`!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrV\nqrrlrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!$!3\"!e2r\nprIRbqIrpp[[rI!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrr\nrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!#!J!@RrrqrIcdpIlrr[rfqIq4!!-!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!\n!!!!!!!!\"!`!!BZVrr2hhmr[rr[lqrqrjrkN!!`!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrl\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!`)!,F(rrIhkmrI\nqr[lqrrlrqI[r[J!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrqrrlkrii!!`!!!3-!#SIirrhppI6prrlqrrlrr[reprr2!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii\n!!`-\"!%VFrrcpqI,jrrlqrrrrrrrqrr2hrq%*!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!\"bUrrlpr22fr[rqr[r\nqrrrrrrlrr2Vrm\"3!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrqrrlkriTMmIrmrIIcqrrqr[rqrrrrrrrrr[rim[rk*J!\"!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrl\nmr[rqrIVbq2rqr[lrrrrrrrrrrrrqrrRerrmi!!)!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlmqrlfp2hrr[lrr[rrrrr\nrrrrrrrlrr[MmrdS!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrrlqr[cqr[lrrrrrrrrrrrrrrrrqr[rmlrhrB!!$!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrr[lqrrlrrrrrrrrrrrrrr[rqrrEjq[pe!!3!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlqrrrrrrrrrrrrrrr\nrrrlrr[rip[hriKm!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrq[6qr[Jm!!)!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)c\nrq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrqrrccrI[rB!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nqr[lqmrclriF!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqrr6jqrqZ!!)!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[l\nrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrlrr[rfprhrd!i!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrl\nrq2AprqSQ!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrr[cr[hm4`!$!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[r\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrr[rpm[hlrf`!\"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrR\nlr2q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqr[crZ`-!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrr[rprqiE!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\npriX!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!-!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlprii!!`!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-\n!M2rkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2r\nkr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[r\nqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii\n!!`!!!!!!!!!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!\n!!!!!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!!!!!!!!-!M2rkr[rqrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrl\nkrii!!`!!!!!!!!!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!!\n!!`#-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!!!!!!-!M2rkr[rqrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nqrrlkrii!!`!!!!!!!!!$!)crq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!!!!`#\n-rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrii!!`!!!!-!M2rkr[rqrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrqrrlkrii!!`!$!)hrq[lrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrim!!`#+rrV\nqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkriX!S2rlr[rqrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrqrrllrk'Hrr[qrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[[rS!#)rrV\nqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkriS!!`#,rrVqrrlrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrr[rqq[q0!!-!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrM!!$!!!!!`#\n+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrqrrlkri`!!`!!!!!!!`#+rrVqrrlrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrr[rqq[q-!!-!!!!!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrM!!$!!!!!!!!!!!\n!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrqrrlkri`!!`!!!!!!!!!!!!!!!`#+rrVqrrlrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[r\nqq[q-!!-!!!!!!!!!!!!!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrM!!$!!!!!!!!!!!!!!!\n!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrqrrlkri`!!`!!!!!!!!!!!!!!!!!!!!!!!`#+rrVqrrlrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q\n-!!-!!!!!!!!!!!!!!!!!!!!!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrM!!$!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrqrrlkri`!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#+rrVqrrl\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q-!!-\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrM!!$!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrqrrlkri`!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#+rr[\nqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q0!!-!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#+rrVqrrlrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrPJ!$!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!`#2rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrqrrlkrjB!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#\n@rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q@!!-\"!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J#9rrVqrrlrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrlrr[VrN`!$!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!\"!`#6rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nqrrlkrj-!!`%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!`#4rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#4rr[qr[rrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrlrr[VrN`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!`#5rrcqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrl\nkrj-!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!\"!#2rrcqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%\"!DVrr2rqrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrlrr[VrN`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!J#Qrrcpr[rqrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-\n!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!-!P[rlr22qrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!)Erq[hdr2rqrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrlrr[VrN`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!\"!\"frr[qpIcrr[lqrrlrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-!!`!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3\n!Crrmr[2krrlprIlrr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!&Irr2ldqIrqr2hqrrlrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrlrr[VrN`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!\"!\")q[hqp[Rrr2cqrrlqrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-!!`!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!1[2\nrrIEjr[[prrlqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"!#lVrrhhpIclr[rqr[rrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrlrr[VrN`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!3!LiIrpq2(lrIrqr[rrrrrrrrrrrrrrrrlqrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-!!`!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!'rrq[R\nYr2rqr[lrrrrrrrrrrrrqrrlqr[rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!9Irpl[[rr[lrrrrrrrrrrrrrr[r\nqr[rmr[rqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrl\nrr[VrN`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!J!rrrhir[rrr[rrrrrrrrrrr[rqr[rpp2Eqqrcqrrlrrrrrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-!!`!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!#cqrrA\njrrlrrrrrrrrrrrrqr[lrq2,krIhrr[cqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!'2,rm[Mrr[rrrrrrrrlrr[lrr22\nfrIcrqhU2rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[V\nrN`!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!,jIrkr2rqrrrrrrlrr[lrr[Ecr2hprm!X!!#4rrVqrrlrrrr\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-!!`!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$4rrE\ncrrlrrrrrrrlqrrVbq2hmrqPK!!!$!`#4rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!,lrp[Arr[rqrrlqrrhdpIhpr[q\nH&3!#!J!!!`#4rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrN`!\n$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!-!TrrkqIrqrrlqr[lhm[Vpr2r63!!\"!`!!!!!!!`#4rrVqrrl\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-!!`!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#0rrM\n[rrlqr[rlmrIpr2reHJB!!`%!!!!!!!!!!`#4rrVqrrlrrrrrrrrrrrrrrrrrrrr\nrrrrrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!(IrqIErr[rqpI2mrIhrYL3!!J)\n!!!!!!!!!!!!!!`#4rrVqrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrlrr[VrN`!$!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!-!A[rmp[hrqI,jrIcrieF!!!-!!!!!!!!!!!!!!!!!!`#4rrV\nqrrlrrrrrrrrrrrrrrrrrrrrrrrrqrrlkrj-!!`!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`\"'rrh\n[q[6erIcrr*-3!!-#!!!!!!!!!!!!!!!!!!!!!`#4rrVqrrlrrrrrrrrrrrrrrrr\nrrrrrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!$2rrrIbqrhprmSf!!)$!!!!!!!\n!!!!!!!!!!!!!!!!!!`#4rrVqrrlrrrrrrrrrrrrrrrrrrrlrr[VrN`!$!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!%!(rErrIhmrr&[!`!$!3!!!!!!!!!!!!!!!!!!!!!!!!!!!`#\n4rrVqrrlrrrrrrrrrrrrrrrrqrrlkrj-!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!1k[r\nkr[qV(3!#!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#4rrVqrrlrrrrrrrrrrrr\nrr[rqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!29rrrG6!!\"!`!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!`#4rrVqrrlrrrrrrrrrrrlrr[VrN`!$!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!\"!-ArK3X!!`)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!`#4rrVqrrlrrrrrrrrqrrlkrj-!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!H$`\n!!J-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#4rrVqrrlrrrrrr[r\nqq[q6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-\"!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!`#4rrVqrrlrrrlrr[VrN`!$!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!)#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!`#4rrVqrrlqrrlkrj-!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#5rrVqrrrqq[q\n6!!-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#4rrVqr[VrN`!$!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!`#5rr[lrj-!!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`#2rrq3!!!\n$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3-!TUF!!`%!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"TBc!\ni!!$JN!!!!!!-DP!J)!d+K`S!!!!8CR4jF'T`-L!!!!!!DR!b)!!!!%pUF$*S!!!\n!&QPSC()!!!%!!!!\"!!!%\"`F!!!!!!!pMEfab!3!!!!!!%!!!!#*MC'9Q!!3!!!!\n!!!%!!`!\"!!!!!3!!!!)!!J!!!!-!!!!!DR!bBrp2re%!-J!!!!!\"!!!!!3!!!!!\n!!!!!!!!!!3!!!!%!!!!!!!!!!!!!\"!F\"!3F\"!3F\"!3F\"!IpN!#-!!80bC@&dEh)\nk)%TKFe\"PFL\"@CA*cD@pZ)$%Z16!`,M(r8J!-!!!!!3!&\"!3!!IpF!\"0!3%K)8%K\n)8%K)8%K)8%K)82pG!\"3\"3%\")5&\")5&\")5&\")5&\")5&$rA3!8!N\"!5%K35%K35%K\n35%K35%K3red!&!0!3%K)8%K)8%K)8%K)8%K)82q3!!!+!!!!!0p2!!(rNpq#1\"&\n2!k[0YL+j4lrG*MZVIi-T!Nc\"r5#0qMa\"f4aLY5`0d'EXSl'+aki0,lBk$dC)MA2\n5J&jrH\"fTJZPc@MNNc&arVMe-0Gdehi)`%8m$eCj[L38@#$KBrP5+c,+j54EFeY1\n1DJiQI@DVcR)F#AhaLNr%pE*4#HNIbQ['Aem8(0GTK)9S\"!r@+p'2'jS,1d\"42pq\n#%\"&2!p8)mVlQ!aF#[(&)+La2-\"+Zka)S4)3p`Ah@4KFaCj1cDlrP2Kk-0ZDP'aM\nch\"V2NJ-Hq+()BeKBka)5CZ2ZAGq#D\"'(KC6DfC@dDef955LIq49AUAjVm\"5)4XV\nfEN0$hLQqP*pDm$NljU6#\"G-4T1[m@Z8+RMlfF5!2ZhEdeEZIYhe9+'f'%lAS[PV\n9-#Brcm$QIJHcmd)`5EpX*,AL0&iTh2403!1#9$pk+MHpY\"*j)*YKhNmf)EmLm+l\nf,&rfAhY!'YB6B'l,*j4hIjj04aFN!Bb-Vc*e!rH+,8r3#C@Q`D0`!V##IU\"`\"CQ\n*9S3j@d1e&q6Ui#Kk-d9'G'&9rhr8SE&#4,41lm%3D@UF3jb[R+,Uk-fN@+(hcjc\nX9f&b8,8)Vi+*AJr2l49MdI9EKaiIq[%065Fmh*0pGa8331j'*#Ra1[j9!fV3Q,,\n0%-(1cm$kIJJ4q#+!-%P6CYlYV3l[D4CJI33*GM+(MUm'*UDXDM9aiYVk#%(@+14\n\"L(TY@bV&9FaMdVFK4hF2`cKehRI\"$2!!d,mIXJESJBlE8pAQMQp*+ejbebrhUG!\nV*Ya*\"U'fCN)b(PA@160YrK+L`pV)6a$8%lIVV5`j+G)a#Z@(\"#Tp&q,2!NbbQdi\n$H+k#\"V0*ThTXf*9d5-ULXH6(`b!kd6F)SF1MmH32j\"6B95hUKRXTm('pmm-SGk$\nj5h+Da4PR)4+0[c+FNMSrapTh2`1ir\"!!'Fd%[S[K3lHX'*%b1H`l#FlZ-JK['q0\n%Hh(PBEKRJ(66dXlF$kb&d1%H&!+58*(GEPQB`@8-c`KUmQYBV*Zc)\"JCPZZ!r+X\n@PCmXRBBNDMPR2&%r(\"D5D*L!c)T(ci5e!BjSa1Drh,CJ#-e3!d,1j-fMCGDFI!+\n'HY,`hU#IVcDVlYhb0r'V[C44E-8M8*Vc#8JB)4U8Ej4FAVrV(Hl2c%[&[%KREA(\n'N@&QDNhGZI'i0#Q0&mA2`3Cq\"p(i))!KVNH$e!Lrb-[6KjhPl$44[pmNHVbqpGC\na#%Je*I5Z)+a4i1Mh`+L\"Ur4TPM8b'0`\"[UB18A&Z@!b1Xd*#+f#B2`%9bkMK9,D\nHeDZAC6m[,4*)1$3+4%FZArepB*e-\"-C8'AjTCp`hT!m'd5)#Z0Cc,X6\"mdm'M\"h\nqX'UYkTNr,*cG+4kCcHP9',iXYTk9S$,\"GfD)+8SJU9B%4%-ahLKp`43*jR5Ba5K\n48r%(pNci5ENE0EV50l%eY,Z,0+5G%`62`UHr1YCqGML29MmNrQ0rcDYb336p,1K\n(qTcp-N,C+0\"H5#G)`&kNG6`rYq#8RqRY`f6\"i5\"bm(6,E)CJqhbIh6i\"iC-D(Q6\nZk*FQiNlTmpq+LmYirbC0D*4IkpFC'`HfPLSkP%3b,KQqBHl`['kBa[6%F$+K[[R\nJL8b&pAKVmrl%CX@L5Y-e+m-Pf-4562bf&1&&FI&(J)RZ[Fa,8Y&Ke0!Jirc6EEA\n-&AcTX#(e!jH`X+mld2[FAD-8\"`HMZVpjA@CE@hNPaP1,$V@93j*q-2kpN!\"Vi-'\n(ckYkN5PHmcE)PIZ'[(9*qF6K`3ehJ[,mJ+(c[Nf)T@mTF6k)U-ZV9hD0LXGHm+H\n0cUb`\"riN1IpQiLFr#aci$@)eQM'ZVcILDM4EGLVQd\"lM%Th4hBCKrXE2e*EFXNZ\nK`9c`AlRBAJHD0riJhX6,MV9\"3TNcKINFKKY),ec9m`YpK(c'-b1NT&@91J1$Mr[\neSX6I9cLhfmilQiI)(p#VG11TTrQ`34)'k`RPjQ9F-BXTRS5$\"RCrFRe[DN[9VF8\nM11TPIR[3U-0(MbfXcPEr@RYC+TM\"3%PBVc39\"DEr((0RM@`H0mcJYblKZXYH6M-\n(H-mX*ZmVTlZN*`9(JKd$GL9m&5e151,ACY$()VXfPcRr$P@#%\"'1GL!,f46INHP\nQ+IL2HG6JT'8iNbXi\"\"(AGl6*mQa$[a!EQG%@r9J1\"ae&dq#P@1RQBFf%0rKaQ+@\n((92(Zmr#Z*q&K6mlC)j#VVh)UHa[*FX@*RlL$b4MBXFdl*UN4mBF3N4hN!\"Xb8D\nb#qRKB&ce&2ZYGDJp6h%BX-ZiqfLk%'-h#&a*Z&VVfHNk\"c&Fc2H08GSHd3(CD&k\n`4[K6MEEbCAFJiZ#b64##`Ze('*!!@iMIp1Rj%UA,ApU#ZSZq9%K$lTp3L0pBc0#\n&9`Cq0C6Xd6Q#XI[GRdE#f\"8\"p0LP!1m4Z&E#e)4)Nc&#E#jCPXB8mQ!3RBFcpp#\n1$Z&S-birIhmN(ie\"dNKh30'YDFH$GJ&4K'MUAV#A*jZC#cMrGX5jc\"6aeNhSei2\nUG&NZHM`IibSRQJMQk[$#pe4r5@kX`MmbkP&,1\"ed'!C-M!&GUA-iH'TPNhVU*Le\n\"Be95(#S',NBhSQ9Nh8e,jE$5JbDT4h$F8L)H\"`UAePQEKZ,G06DMLSB!d(QBpjq\nfLD9FhLkF5ccD4U)-GHc34j[Aa-I1$6L3!(3@U6'9AU6#Y@fjV4iE3jbHQRarRVR\n&lSbiLDL5Y3*E1AE64jCQed3(%39kYDf2i3pP,mHG0U2'0m+$8efKlRKh)HIN2bQ\nf(iDq8@b*AGbP2G$AKRBNVAZ6`2+%fpeNAZNEN!$cUL4@ST6E*DB+E-29X4E(B+`\nd!YB-R&erDkYaRTf85Al%VR8NMVLP1!%ZE*KGqE!$-BjMkRHC5%b\"$56V[D,r,8*\ncqYieh,+crE#M,U5J5T+C0(9P@(JqMf[E[8hIPE(BB`DJN!$HKiJf[mac0BP4ATF\n+UpA,5BD@J1b(k3SmX\"4kdNLAC-IkhA$YY(e-9ap3PZR*54c@Kmr#Ujq&C4q&R)j\n)&\"T&-!G5-0-X\"NeIK!(cASf0Hh[D41A0I`l2bhC4h*Rl*,jRPR5!6J@pUN3N*'a\n8MH61djMNL*&',Kj[$f-E-S`V2l)rK9aHTXYZqYP'jV)[kQUC&XaQ!r6!JVA4F5d\n-[ArZK@b$@MBSLqhC5qd@%Vd`PHL+h@c56iZN#T!!ShXpkpVrJ0LMq,2@Pjj+rY[\n*-T0lM%!A-F01UTCFM8MHqZfjdeZl-Mk1P$pr4%[(i3-JiGT0%#Crc)dITCm*P5D\n-21hYR#iY3)[D@HjJ62BZRf4pZ'EA8Ymcf'iiK\"dHiQPZFGpC+cEr1`1pra)V8B$\npZE-[ASc8TQSUmrDAe8+Kf`9k%H6Y2jeCXheEdG[R''cT&2M1peA1ILk!(FApU\"&\nb[),HprF!(4UZVSC2[d$!JkTIq0HVqImjerS%mB-9*-,XTLNZMNF%eHGAcVXD12*\nj2iQVYjmNVQdY+Z`hE#k3!&Hhkf'aaFjUI3,cVT6JHY%[U5kK'(d#pF*33XSd+p&\nJJm(NFG\"`,H%rkQDj*&lH`(!BAh[Hkal+`X*f(Dr(Vq*[4-I-b0,cXRiek#[+[Di\n%&YZrd8mB@U+(r93293V-TX[0HKdfVZ#fhqHYN!#I8fQ+VCCfX\"53!+K8jJSPbP,\nkr(e3eGrKjaCCjPMk+\"kYALi93DF&11kN!95a(klk@)k+l%k09%ij1U1keB8pqh)\n[V)8j9G`0'+mUjQ'%*&TQ'He*lcaZ(20lQ%X[D6r2`TLIK68IK8)l1$,1*TKa#rS\n@183FiHl)Mf4J)H-\"Ci4YFGp$bIb$DACSdh2*9Z(bUj*rNJ5K3Bm`cQ[H\"HFF4BV\nm%Q-fFPrNMPe\"20m'X$KmZV@U9dI%jTGdSSNq(a3+9!Ahjpm9*iYCrEYBR0\"Z'6b\n1UI4cXiafi$I4H1MQ2hX+QQl4HLriaPMMG0lfS9Ci'JIkTb'[hD&3-H62mkbELc[\nMMM'Z0ISfM`B++*94VAeiL9389LEc'`1P$19&Br*[68UZ(heJDDNZ(V(mrP$$R'X\nG%[Pb`XRXNcTpkqY5)2dm\"1EMQV8[*)d3D5&BVE@`IUkrC#)l%f5RYZJEfPDk@`(\n&k(TfY$RSreX+!F[R99$UYQN!q0M,QM!0bh+JJ1,S$*,dA0J0C+de5,JR%M3$lKc\n-jB-)\"eRPNbT-PF-A1QL3!+2UH+&djE\"'[6G)f$5`f`V'+%4T,PU0([SHNRkY2AQ\nR(m6A2!S9EC!!l42S82X#-'lUE`*jB'9JjVHj8&aMm[8#ScHq6irD9J`kJ)A6*2-\n*X%&83`M&j-rC+%j9B+Pk+j5Vk'3Uh+H'acL,0[VbShU-IV&aA%$iIC-K$I1kFKB\n\",arIXXjjN9S+%&K)HLkqcR\"8G*@TqD'f6V-rcm0`jq'l-IK[q+JAf)N!,(5M56e\n-M+3X'MKehP6A(\"#Im'Ar$T&\"cCRQ%)ANX(b1l0q85h('mfNr!D&IVG4&N!#IUF[\nXa1r#d0f`9A+SebFkpm!E\"!!L+Kl#0'D9,eR'hm6bHU@Tkh%kQL-N3c1`LMTArTq\nBASc`#jEXe!4X$3j\"`A,c[VIJ$iBEe$bjD`5\"D@lMGP8\"aj5B1li)V&5bqfp6L5i\nKUq%&#RqBr8F9q+kU2VYiJJ60BHFlG0,J6qXC)@PPV*V$32VAN4\"pFA8$PkQ(,4j\n0`NfUTD3+Sf5Pq&'J3IYFbi82'(h3QJe[4)I2m3kpajRUd)eYNFR0XdiY%$(J#5&\nHb,(HX4cTIa[U(+ilV,&e4fH(i`KaB,#4Td6iCF4e)R6L)r0#PN6ZqX8hH'Di'j+\n$Rbp216X8MB#p,8Zib!Q4l14CI3jkhY$fa%h1%HqG@mM#+,82XRNE!1e`YfK%r6$\nG!iibbCeS`aGd!jXKqe2[QrVciC[lT8L1+LrpIBkH!2%*d0hJ0K-mClB5aqEY2B9\n@30*,T-a*P!lEl*U@[mEarU`@Y#h61#Xr!)eE(NqeIbQ(0mTKq,pU*fl24F!Kj0J\nm9X8HQN1j,!5MS-2$jrQ0rS&'f,Rphdlc&`cC\"NlVhel[kT@jkq[2!4[r6(ieH)d\nHXAl86[pp,!E$@6-41)+\"5bUFQ[5a!R1$NAd9p'M+f0r5qRMiZQ8X$HpBMD18U)D\nf0BP8CkLT1m+RE)ilNr9dYLhRU4DTX&@qIJMr-R%AhQ&N!@0#kBrYc(qrMZKk)pp\nMSDdi)qfBkJ)UGGb@TGFN[pQRFZ#Qp5hAbK#1Xdr&JpY19Jd-r\",&MGTlJXJ1Eb9\nNbJe4$Jm%L2'9[K`*L(28kr$8#Fi0q(JUXRVBh,YNPXB)9\"ar$ApKFCTS8pEcc@%\nkM-VFP\",5B0T9X*[C#p$pZ3+'IPmCke'lB)5jSb-,EPjqbcZ3!,U`MLXK&`$21TS\nLkk*q,-Z\"RcPaH8MpbYJI8\"dhBCI-N!#Ylq'Md[baRli1b8`e*Gib-`X#[jFk1NH\n#1K+02S4I@q)pMpQiq6cISl*JhMP@qpl)eNdE!QZ(6Pdq%9rB)N'[r9-lM9U)b9T\nYrQe)`FCAGMT4bSf-C1L2!&K-XUG8eB$IDic@%%Q#dhE)cP'2eAliBX(-3Ke+YdG\n&M)[Z8lb&P,qLZK5`epFdaiC1NA-aU(G$iH@RVDR)[EMQJj2\"IDYAd209QM5a`c$\n9cZ'TIi8@pVi83P&P18&SZ2p5FMebU@,+*CULm)'d&9BRa-,I4cHZ9dEZUc8kR5C\n8%#-BF63K9B96a%m0FcQ$bRP),klSpCc1J1li2)mLGmfFKlX!')id8hf'fiMaC3h\n@PPR3#8!CV5aT4r#i*X8FR,+Ah!\"cU,[5c4MYGaN%QBq&6+a[qj2CSp(epUF#HNH\nbZCVc5HM2D)I4MIXSr`S62hJKhrb\"dNNrV+p&MU#M6Ijf,01h!MB(CK(UI2l5,5K\n,AE9Gf,+#HrG4Bj4)kZr\"'i03AerFi3[0df`S,bMM2C9F`i,VV)NMl-XVd`SjN!$\n4$EK9$I%$26((IQ*UY-ZL[d3fJ29@5H`R30b!J5'1pRKh,!S0qpIk%6NYfpEcM+Z\nqADZVY95$br`13U[Z+)eJ&eQ-JbBTNE@K6cDj3leQrA$0%A,GXPliNj&FAKLdb+d\nYhUEm)c!j9apA1'KDF5IeISAj9FF$P(Jl5HL0ChS@6h6q,d8B3T'Vqk#aAAE4AZr\nI9qNm0FFl6Y'$cNc9FZ(mhBD,`NcMd8NS!,@*)q(h`%5VLLK1-lbPEIBDlk@BNLY\n2YLi(\"Ba#Nk%)lJC9h)H9dN#Bh$ID`\"$'4ICm0JcUGVD0eR9S@,`+C1Dr&m\"l[Ub\n\"F8HfU$0j53T#SB5Cd%9UUP0pANBZ+b2`DbcUjB%fZ-GkUD3Icm1K#IKdAaq(5`#\nS+2X`jZLX+VJhF*2e8cH+P88BraKKB0HMAH@!\"-XRk8I)Ph3kB9F6RKc*JlELXm`\nmE2TNBMX@0r5\"[pPfX6S)eXqlhmed*b53!!'cAEGFE[)!q3-\"d+MDPEP8efm`bc'\n1i4k*-dVB)Cl#erCC2!RPT5i-X'#*aG(GYf0*YLiLAbGc,E8H!0Nb3)kU'&i*6H[\nCAJK**LjAjVjbN!$EPLIJ+h(Mej08k3AGm`4[#XiqL4#JN@@A*1NQ2b0fRCc46PE\na\"13,j`SeZqC'VheIhMYY!(Fia[[8)q)@+@bMT5d9fCSUZH!C2SKR(UB(rY0D(C9\nZ3-flG*6(kX#9NG!r02e%A5M*-5pd824Pd\"a05+'X26MlQ!YL)jVE8q!)GrCpG3r\nKmaeki1Z\"#`X,(@$h94[$P81SP9S,F-pS*\"iaYZDb8\"2FNJ14DrJ,TN8k$E9fJ[c\n(SJ+(#D0N3(1dMhU-Q41VmVpfZp[5NRHAQHX5CfYP3@b8B&h#B5DGPF#6hC0(VF,\n+0!INf-b*DHqYk((FYYGi9e'4i[9hGP6FHSQCd-DHjcUL8+Uf)dFk[D\"IrRidhfK\nJ-A0mFJ\"1(RZY#Z$0THQ$#NHB\"CN2kVY)T@&mZ,h#ra8j,[S9*RI\"[V$`Hm2*`jP\n@6hN+k'G&P3F+CCCi@6F0DPDj\"0JiYQi,5#GpYT&`GH5[)TYT5E$`KLT[lBeCP!\"\nlPk$$pG[l!bU$FZ8PH4*iKa1b69j,&3(T5cFF#280RpNHC-QYC0rkKp[GX#p6KVj\ndJc9JMCd(CAPLL,`19%*`db+V8ML`qTd-@YkI@01J19+KZ62$AFihj#38lMiM,Ed\nI[%hEcYVUhTBGPq`V8(A'@d0R9S+DAQ,11iX8`B#(6&fk`f%[R%X\"LFj9KLfG3K,\nJ'UE`mqL!\"9cSmQM8'GF,+I`Il[PmcX38[4)-$QB$F%4)LC6-iHeJFE9G)1J5\"QL\n%+'3V)&Fc*k!9-Xfq,9R&BIII'r[Dd*J$K#6L&\"[i+iq@[XBq6mJ!aV8!LRD8jmE\np5@9ahVFbEm1acYi8Z(r)U9j!$4pij,edI&j*XT!!QIfP0)@fqbF+B5S1QQ(39(k\nrQY(XKJT&XdIQ+(l&faS)'q3-iEZaDI3CXdGD*%#f\",rKhN5,VM0M,0EDm&$X*fc\nlSZkJfU!1,p5!1BI!ZCJUQ`Mi[BdKNE@HKU8Hl-I,NABhGhLq(0iYllR,aZ&$H2B\ne1ZKNNEJ8TR[4-6pr9A+E4f$)9j!!5S6c`KEPJdlkG`-ifP!G)hrANEii-XiTaSd\n60GQS(XH)DM$&k6cEr1h9`1e0c0f@RU&NK[XApmTJLYZZ![a)19*JJ*HBC$G+Ga+\nSUUM[-X4jX-QT65U,l!kM9Sm\"LFQ(K5D+XTb,*m&%Bk8Z4IZrTIR5miRMa`+GT[%\nk@JMp,%VQ!@($UT%-L5k)X2[[-IF!eq[HU+!VaVadrGI-$i8GbZ90`c%,pGbjmIa\n#VrXINal,jS'S4M$`q0[$'Xi%L-)8f$pqqAfUcrSVb5R5G@l++J*V5@cTcfAlDGX\nP!b(ZaaZN1MYe-RY'CH\"*YqB&9(eBlX1[U[*6[hr(Xi$dh6M&)XKhBeDLhEDR!*K\n\"hIK,1KLmU#kNaHP0pA34a2BjlAE03bMQ#3mPI0%*3`U\"2U!REDRbr8[-QNr\"4pY\n$8eji1l'TCE$k\"3@`[\"[*B$brelc$%#`YmKM#ed*V629rJ3lG'PLF6VedLZ0C$cp\n)CKQeH*pPTkXMKamN+$X'&'DS',5!SRCU)[J*U[Be\"0UCRPZdc*f+d4&%Lj1AVLH\nX&hAql)q&3XmRr8,C*K)%NVSF-mb-cAqC*e`1E,23HM&*F'*9($YbYJ[j*daPG\"a\ndXJKLmQH28TBJ([NAhQXfFB3qrP&jRcQcV(EB2*lT)+(+CG6bcSb0k,&'EG$F)A8\nP28VPNjr!@9#(Q02lFf2-4Ke2[qKNN!\"`k!b1Ue@,Y0(KjAkNElINcr!Vi$$AI5`\n6f-h*,,l)cMfFE6-\"*)[Z%S&A+bFdl5@,hYUfUCJ)KHE1Q2+NL*fl1eca998N$Z%\nUXm2LfqaM,0`rbk3GX%fD&HB-c%Zj9lc@r2D2&&-ci9cIa3M16EHk!PiLS5Z`r8'\nCHpJ4,Y[TEhp6kCMXYdL%p5!k5MkHdciN+60r(Gl&\"T1C!e@DKf,T&DCD`Ubl(96\n,jT!!X$e[5#9Z,5U#GdB*a(kdm6(UKYCEeL@LG#`hhmN%6iLe45JN1\"2)rNeNj4H\npG(E'3abh3h(1fk+Acm0mCq(3K(iG'i$@[p&G#HCJaMDGH4$D#$J(FY+iK0C!Z9k\nR[+SLepRaqMJk-1c&UA%P@EKJ'NCb@rZK2Kr8299-8R(&JGFPKcM\"p5l-&43,kMN\nq'GYK0\"N)iH-5Il,\"-Q!UafDNABTNdM91k##q'm*)!FePGD(Q3K8fXJ!%McF5mAY\n$pbLJVa%q$EHUr2b5I3pm#LSpHE&5+bEF5C4Bip\"bdh,LqAHH+bEHMQ4)QZcLIBT\nPU9fd6bNKK5T$1A3DZM@9MlJF,\"RIBX&J,j8Qi\"+\"mIZT9i2)()DT'L,C[V[*H$)\nLRcZ59!2aSVjpBMIQ2CL2@Kb[rLBE\"ilcTMfh6-fp4(pkTp4YbJ&6bSF!ip'AaJ1\n+*N!\"*0)PJ0UachKCF32!h*!!G9D%K62[AqBdi90`%aMQM4LYYX-q+8k(2RElJ6(\nc!25d5&6pe`m-Bj'9r$-k[MR,fS9DKRC84k1aLF,AfGld6*rfX2+pV%mE1YpNCp6\nfH)iBl#T-i4qNBUr2m06HTJf5SjBpm!Ql9NhT*bNQ$@LQ\"Y3DQ1'je[TSKDqr%dl\n#,VS-qTTqr1(p(368DMVkE+kBa#Kr&TqV3+Z#6l,+,q1LHa$)E%*5dPr83l+lHIB\nS3cbNk42N%2f*CXeA%eKA\",Sr*AX&RmTQqYbGebXFjUqHKH3lG2p(5Zr'FG)'02S\n!rFKG[ilkkkhV5j!!-YF4@U)\"DlphFY8*4ZPMQTh,dmI0'XGr(\"ZP@0!0@5#ld81\n[EMAlhph'6T(aabIZcqI&AKZj&rH--U6)83Z3!&iFbXaRViDC-,icaF$c\"(R`e@I\n*(2CHc$cjL+Ti[6,-e)9-6\"k%F(#aE\"Ajk$8(ZVXX+`BU,N3-'@1d#plj&Aqc,D5\n'mcb,b--49m-EmB+'H`Dh%PI4h)JN@LdM,X&R1X8FP2,&Vf8PqN1D3DdI8Tq2VIZ\n-d,QZJ[2$iPXiSe5b3U#[EK\"FMkhJ+fEd$M-h`TR\"YbmleDKAZd4,GCfebmPQ,[4\nP@mL\"+pJ'ei\"0,%-!l*Rj9r()ACIqiGHLCqA93AdefKBM4U(*4ENBrIq#MVT-Md0\nCClBT*USekClZ8lq%Rh$#l*3jd3cTEYKf5[IhFR$U@YDFr1@9',#%#YSccBj'EM4\nD\"p-8U%8U'j@[8-DMQRk*j0flR&F4%HS15b6XaP5$4iEDUi-IF\"N[9#(Ire`0Re@\nr5Pl@Xm)8A\"%)rc@U\"kCS24B@@M6fI-rl$k0c*iKla$B\"PZ5A,AUjCPh2f%0eFJS\n$Jm)4IK8a,P-Ic\"H`dI*icQ#EkVZjjh'`%5''J3LAHeRhTfh-$19-Q%CJ(5d8eL6\nQC@`h8*)e`5Hf3imk)2k6IH0%phUU+*kd,qQDALDfJq%!DjGMECf&G1AqCk@a\"b6\n\")+l'\"-h'#Xkb9,-L)Cfb'IHiGS1`6(S@,BRBZqF&,hFi!Pp#km%F5Q(-PMG@Vj(\nGESP)ii$mFQB4H#rib9G9SVTLpLLBF[hMQhlTMdGK3q$0L1cDm,e4$CSj(!E)YQ&\nhG*@l`5#[KmMKP@iF34jS#`T-\"Z%iX4(EN!$*EkTq@bAJ2@IB&\"Z1,+TdR2)6D!M\nXj)5J+YLq%CLfaT)V[$[d-dH&&rP%I#FBIrBH@l)`P&aZEdmkU21JE(pcU6ID,`(\nF2Ll@d2pa$r\"mYX,('FK[!H)dTU`#`F`H+%rFAX$2YDAK'0Q#!&kK0P)5(1RSLf4\nQ4*!!%dSa%00@Tf0!@Sm2!-&j+apmE-Pi'(e5&,'MK6&kjNmk9p\"A`$AbN@mEJjY\ndip+J\"Zr)JmL*bAqJqJSE@*)%XE)H`&dBh$#L!Hkp'I8$IS(#L6DVHejaJhMHcRE\nr0G'X[(bj0R0p+KV\"VLBq@'$eDr(bhfJ[h%$MlN%JJbEb'lP@(IL,\"lj(-`EVAXP\nLB@$8DkrIKIjC5)QQM5\")Q'AldkM)%XXVJ$@d5Q0BD@ULZVY`k[U2R,c`#(UKm\"G\n\"ibe-$NPa@jTQ!M!ZIdilVhj9C%cXD#Z(!Kq2HP90,*5IIN'FLI#Q0S$`Ai8MBSk\nD9!$ZNT!!Fkf,DR#A'C%FIRE+D9AF`S8l-paMmJXZ$L[1fFI-)bFf!bpIa$Er!pd\ne!PLqP9*fL(P%'J5p-r6Xr\"1%Rf`*Y\"+!55\"DFlYF*E(ZZ@1UEFr$6bIKTT(iDG\"\nN6&1-FG6dI\"-Lc%hD1!NJJrCm9RNQ8@r+E6\"R`+,kIRmrf\"C8QUGal'G`)`DHaH`\nG65cN4M#EHDhh3Pl2Cap4!ha8k+KJCIa28,-lpEHXCZ)@3HNYS-(rC\"1JKNUHj\"r\ndNV#'HfT344``(6+%Qc!#+G&a$P\"XS25%0I',)K%4%!1N9Lr(I`f'0RfDFi`[q*@\n@UYmHH*mi\"p8iS8j'R8!((FLambR&jqUjH(,9h94%bahX6(2L[JYBBIDAf+'icS+\n#B-LUAQZ'm9b6B,iIlE\"b)+fM'Y9I-M,5V8@aqD1KmNK#,X3VjGS[-H)TMq@560h\nVd*pVe*I'h\"N5jXG,DQGIV\"&A'haP@N`idFY`h\"lCGqeTeJ63T2U9UeSJVD(N+C&\n[KY[hYRIMDaejrMI(DckG1$ah-BqLrD0-T@9rK!D9\"G'\"j3Ti5U#A$0Xe3%PR!lV\n)LaAC8!\"dKQrc\"QVRcpMjq\"e!qZ'6%l%#GD*UTU$$R2EL@0j%&#)ITDSlEcK8DY,\nK`R'Gi40!B0KZXjY*\"hp#mYdrebE8j9CX!EFDKG0VM`\"I#&rRS$&3Qbb#iM4%02m\nBSQ'51[NL6f%lm0i\"6d[4qh+86brHIM*bZX2-bi9p[AY*AUQe$GGE@KaLaSLQ'GM\nTYV1-Ab68)m`rYJ331XeQ8Nr*U3q\"MPh5e4j4e*6'pldX(jm2@-&'J0YjFTcQDNj\nD%0paYRJmY)4dpbCre0p025q$KEZlSf9[$-6kfL&3ApKch1@)pV(20M!@djZp'Xp\n9+9+NpR9%XQiAld0YX3NiLiRhfZ4fS[HU&CXNPJNE-#G1)E\"SBlPFCPh3IAE@&E\"\n5PdD,PiPCcIBT%2UB%[pDUlE-cpRe!LR`!Y`jZCqJV-mK09Di!L#F1rR+`QcBciM\nH11hPkcdISmcVcHeXj%jZEdG3VdSHK5K*'+6`[B0UTrER\"K4GU&Gar8c9[4Xq!$G\nS@DRk$8`HPX-pdb@k3K#ri5$Frh!Gm0N8hFKIiB(&E+9#RSHHqPDSS'PD4-AH+IU\n6Y*5aY*b-21l\"@jaE$D(CV[*R8##@eHVb&4*!)@2XHSL[\"KrHjTm+Vj'#k)\"KcEZ\n&`iIiDrVbj)Y16DA+8Y%F*,efN!\"Fc+Dk&Tk+H0#B1Y`0GT!!B%[D\"Kd0YC(9,,B\nVDV8,@jDr1qGmVjDqYJP(`\"kfhqN(-R3!KPj\"rGTN[c5*hh*4,8Z3!,Yh*N0BA@U\n-MG*1,(KT[bCUrJh+c08\"@Yc@jXFe(2JXbZN'hFr$d2jq(T!!dr2e%YUlQ(ZMS+Z\nAC[[P4+A3'0&C3KC*2`LL1Uk\"IZ$0RAEDfJ5@rI,JrYk@eQV(6IHYVb!CkNDJ!(r\n1'1J0+Me'!L-!M-2VSRJqS2'&A&#Pk0BjKB9qBdANJLpf#@3&PPX9+dXjUU[SmCS\ne043j+[`2NE\"C$q0-!TiBp'#BAK9PeVlIm55L3IJ'MX4I!@b3!%PY\"C33r\"eGfC@\n',#YP$`HH'f8hDqR&&!dMkFD0Z1`3\"p65Mq'&q$K6!U(KCNG9RPj3&8KY,dpY1a$\nIFmAaKKifJrm-c$NQjd$M*hqM$(4-Hp0,,,G'-D`Nf[kJ@TGq2bf82US'p%,r&B$\nIVUJ6c@pX%addi6$##8CH,1YI[%2'LS+Z@X#cKpBSJ4lA1pVJ0bVkc6HVSY(RX&+\n,IQ1Z2[QV)1N#fA)R[K+Db%G5`NX2UMhC\"dj',FUc@4G02aQ(*\"!SC84[$RqdbSM\n#\"DKZ,TEr2A!FIH0ML*F#M%efjeHkdcGRA$0cm9YJh4SHFrX-AN8k9pX%#BCB'DK\ndXR-(bb+XG'6q&eCb(9,j-aV,$fbXbVZI+Kef)FGajaJd@baZJc-Ek6(X!kH`[BU\n`ZMKQ1'DmjG3Sm&!VHR*LFlDAc96@34bIfTk)IH+8iV#($!FEP'1QHZqHiE)IjM0\nq2lEeaAbchV(UN4RklkPrTYpKXrcEPGL5ZSZqMbL6VX3-Za[@!`5a0#*B,0A)HL1\nKMNE\"d()aU3RM#HGTqe84(&CQL'lqCbD`[E9#ekmY69GdZILM%Y()d'*4h1-rm3(\nNTDZKXMLJkV+q[B`1kjM$Ap-M04lcc9A)IRjG,YE%(R)H@Fhr$8*G8%TG@M$L$HB\nP2*NaLbP!NfP%[m\"R)Q\"MpSEhF#D6q+(CceJ[&I02$P%T-[AdI\"Iha,H-p151F+I\nD%B#),jkq!3[#jd*5bE2k+F0ZZQ&$6eEL*-,G5,0%jY2MDbJ$PY3-P,d*cAk)JV!\nQe9Y\"crml-J'Yri*aAA26,9PIS$IT[%\"NaM3m4L55&H`ePkaIdffU(Up#&e(Sbbl\nR\"\"YeM,hh\"dacB)q@*)S\"4,q'a(Z`HIIDSF`d&%P25Ym&5SS[+&9,Uqk+d5VB6I#\n+)P@Y11a`i!PMl16TR0cLD[$R%ep2)K65bXm6NSbpXjcP@!D'MXKA6jRp!C,-rS!\nEdA$@e40CP@[r&`Y`6D%Gj(Z3!)h&9!@mT1[a9B!aJIpq3ZFr(!j&B&cGaLahTc$\n!pU2Q9[f+k&)c0UM#,Ucbl`&r6A&(MTa9!rZVXC)Bq\"`+fl,EG8$$QKYG*2p*X[C\n*BVIe1Xm\"rh6%h%B33a1KYkd`1jE5qS&UccbP4#%Ye8cH09TJqB14Hh6)4NFB9q!\n'+,mFLR`EPI`!KKqNeNB8\"a+'KdP8`$pR6jmNhY(X6`\"VaNifl-aBTrD\"VQI'+JB\naLSVLiL5IX5Q@4`f'RrKEYM@mmEh6(P)9VmQ5hLr[ijRp[DI9DqR-(CS65Xdp3AB\n0HM&e1Bki@+p%R-MdKcq%mdfjpq21PCK3qVldD-@SJf,0jTFi\"#k2@@VRF`Y&b6Y\n&Abd1G4i)92%eAh+NPcb[9L&,#UFjQEDVCc$'raTA)ZZ0RcpqTkEF\"'imAi-Z+a3\n`#MM%F&$*j`#T3d#H85k+MN))MHZ12Eq,#QlbGFMK$GQ,*\"%p#K9E[aJAfG*k)$P\n\"6+l9\"2m+P1((k,hpipcSd8SH3[S1Fhj#LD+dB)&0cNaY4A6RE,R`)0jbh3V#cZa\nY1D%CS&fLDUYe!f6khJY4k@jc[#\",B4'BD+Yp2eb-9bC`i&hr9cEbq)RNPdLK0`Y\n+-cPb+,2i%2*&)+!!QDa9fVIT-0MSh&CiNlT(*pY626)eki3qfqlDF0fHfML)pN&\nMGh!PX1bm'29jBM,L#a1Y&hppJ2C4+R*hd6eD9G$42dZ2@GTN2XD4N!\"k*IG$DTq\nIG$`&G(9hAbc!dFlLY4Mf#N4r6QH-cTH+0L(1\"MA2l#hP\"TY44K-DHR-*j&bXKY4\nbU2bA9e(XQ-Nl&6c\"cp$j'ic+T%f0NY0rMUE6ZMEL6Q83B$j2``\"kbhZ*JaQB(\"i\nU+61QZSM9XN'KiEI@I&&DeR&5*K[hN!!3i#qpKGNE'kiJU0m(6p[dB$%+DBP&Jm'\n$U1Eaif4[ZA(#d-9$p%c*+Q#Z\"Zm*mm0eN!#`!L6kRQ(jLR#D`,a635c)6-$MU,B\n1Y(I-)X`'S,A+&5cbmE+XdG,,d0MjJb2V9I$+JEJS59lJZ')2Em3X[5(eBNbZQHN\n@hYT80YRF8#1eri&5eIh6me#MfkCT[P)kJBj-EihE&a&Z)Di[kaKG\"kCEBAdqP$4\n@-aY\"NNeF)PA@JYUR#3haa(p@fIMKD96f-'m!CaKQ[P&S)R0GlC!!JR99id&*Q[,\n1q18hU&ZL#-@200Sj2aH5pQrCP[@eBd*p21b@c*I%Td[AkT%J9,J8lPeM-K0Cj(m\nU`X`e6k@P@PMPEPh'eF#`h$iSK#T1`bi-SQJ(S9mGXJ9PK1V@jYG'BihahH['l0a\nCeVqC40llC-r''k,1(1(DiCd3`$$Y'L*BdpKQS#9'hb*HfU3rdlD6e$NppGU!Ap*\n`FK)''(frcHV2E`'$r#fJJYhH9X-C*V0fP)@dYLC%c6q\"Y\"h*a`'#QAa5\"p+Y53J\ned%IF#bj5ql0rIMHj8b!1V3ZfK+R+&#3Tp&2j`k)pG3Yl%%D3!\"%ai,%JblCI5#[\nM`(rEda9S)4\"fi$A-AI2&bL[m((%dF&IGX0(X8&9XU'8@akMr*j&E2Lar'!Smr)X\nC)dMKH#1k%5L)K!Ufm[T5Zae*CbKk`lV*Bjd!JXc4YlAfpLAS(e)'DAUKfTHTY-M\n@!Gpf9I[-,md`EkFVS&)4XAVBZp-SkDErILBDJ##&i2E-jPl*%S3qUjNVAhi,!Fc\nC`VPe*`Dq%C!!H3KP&ha+JEpQ#6A,&8BRj+FaH02SFP\"Y(,rQJ#@hYLPb66\"[%\"8\nlX*&KEDVQbQl+#0,I'cbi,&aI5J4b,kdQ*iQ$k[ffpRd[d@!B2r4TEmABTkY4rYM\nM0T3\"eQ&XL3lfl'6M$jB6b#1bD8Gc#-lb6Y-Ghb@5PGGkI#UpCS'03iLlRMI#Yl6\n*[B0rLE4+FA0SN!!M9VV0@h@erMA$Uq\"&qKI#FRHqbJLa$j+h3V6D&%k0YQ#JAQG\nI&HB\"dMZaQ@CTaCdG)fk-iH*#'ql6Bim,HcdqJN-c43l*qP8h*+@`H!Gj2[+9V4e\nV!apBQ2Xl@aQXq4qHCfML,p3rTHSdfd\"BC96G!GrN,L4&+dlY[4Hb(qAhNFH#!&e\nK&IRVMFC%#-`aQkqT%9hj%lm`0lS,pj'5D0$ZR)Xi6B1EY+U1#r$%MBXZhHR*Bid\nbm[HS42+%+SI`29BLjFA-9m2Cef-5!iq`1am+RM%a)*r$[lTm6-H4&0Cd!hC[!h%\n9)#qX+$PhZmk#U#AIcP*MNd*`Cq$MK08p03,d!(mRRhK60PDi4P16EIfL[p5JI6`\n&X2D*YH8iQ,YejQ`8!hNlU3,!0e$$$`bTdAerS+ZqIlEr&r@Nl%\"'pd,A@)i,+FD\njXUNEBG9eI(A4ab@RMIRB*(4lRjq*M#XEiPK8i+qpjHJbM-%!K#(#f`HAEdYG(kT\nGNRh!@@mkN`[\"!UAlbfi$GPml9P)B6C268FIU#HDFGp$34bdS,Vb5UP*)'I#2N!#\nh6'#LD-+c1)`)TpSN9#N6`hM9TPk`%PRP2GM#e#Pc0D#hKDET8-4@C*!!5$ajFUa\ne#0EXH@#rCJ'dmIN[pRUCZU2jIR6S(HN5X*IXrG'RZm1l$f(k\"J%EKRrQF*CU1,P\n!fqX\"k6J`h4KIN!\"8ZE0+0TEf$@X+)r*[!NHQAk@Z\"@L-)(N#XfDj'+BH4hHmb@1\nJc4)Rd\"C4fF2@Q))XlAQU,V1[!VR(keCr,ICPBdNG%)QK'U@LD))qfM24Y4%ME(+\nZrZ%pBSI,mmCl1Zk8fi-AC&D0bGbpekh8PXHrr%K0BM+c#`)4!Em`a#MjUT!!CPJ\n'DCV+lmFR`hATK[Y9F\"J2ZPb)BK0qM`D(8iRj*RDfH@2ZBi+dpN*eG(9,\"kj#Q,L\n1-VRSKhIRFr#IiVfG1f9Ge$Y\"fHAlR%!qe43MSAQP$[ED[NHF2l!LRNP-4ZqHm&E\n1\"04'+pR\")R$dmHc'@0\"8JfZ!ddF-V5!,mJEACMTNLGI4KT1FS#A*DYZ2+Ja`C+k\nLbZF&i9!5@14'r56E),Nk+U3h1+PZpYM4BQfqD-F%qlRM!9(eKe38F(+L6H$l$HC\nK8LSU25a6pVZ8Ul$p$+33pV**B0L,!$39Z-4E3&R@VKZQD!1$S@4p$-lhUm2Aqb0\nE)U`5h)Bfq'&1L2C8I+lC+Di`ZXqCB&YNU,&A`b3Bi&@@TM`5`ammd49kj20!apX\nm3-)*J(hm(k4S5D91XNf5iNA2TqH+F@*08'*F2NAK8lr[-r2JLclY4K00LU`A2qX\nhj&0#91[cXjEA\"#Y!e+J5P((`MfJcdV4qrHfc0,*Z,hF\"1(5iT)$mY5&GlmJMhAh\n3rb(`N!\"D!EAL[9Urc!5mYEab`8KAYKT$M4D8i@5PK+CL*%d4cTPXTmpNEbP5%mr\n6R(i9c5CG8(CKIpa'(-X`Xred6UNI'%T+aMC[!'KqrJR@1KZj'M`8FjaPdF'CAFU\nc)m+q)FJ9QkG0[Z#qQqZ@c2L6-RP)a\"A@Y,SGTk#5ecCGfdl&25d#XYpa-f6C*kL\npj5PKJqhE&lJ#ciT5`Jh5cj4*Ip0N3PIUAh1JF9AM%DMkZA$A*2!'Drj9QM&Tcm2\n8iRiHY&2cpK6`hq[Ke(&#IFZ6DYb-VQ50,NG\"(GFMb1+q+)2E&,&10%ClpUNZ\"$Y\nf&bdPqALMNFC8UjGeS8B5la'\"cYS)C4&4Cek02(U+X0$hU0fX(J5`*Q2ia2b&JYa\nc6Xf#e)X2h639\"(U5Z'fL*`2HMG,Sf,a!9L4H5cQQC[a`T%T-l+[XXR&9I*Hh2c9\nc8MF&Q,6f1k(Pp,mTY[NKHB,Va#&icJ\"YRf$-`PjBhiX%pIDhV&RXCX6'5bf'h&6\nNYlB$a3eaib$LTm(GY*@qPh3jPdNZr`UFmq)M6Z0BUi-,0MG-PMhETR3&`Ibk`%`\nL)p-$KqcP#lrEU89Bk6eRA$G3PMZ'CJcJRc,$'S@+IfBU63pGjVA%DKE\"JVGZF#8\nhIChYdlSb9Am[VZjT)eij!NUU5BlmErHfPk@U@GE5RTJh[!R[Bj(ldCSQUYXm!6&\n8*pbirercm1N)rRSKhRHJ-SaUTYcE`H#i5Hi3rYMlM\"ep@\"3PqEJYdTFN$ALAJLi\nrB-UeBa'-EdBB5X1U0cSFqiirTH5N*RX-qSMpdU4h69@)3\"ld3ZZ,!L6JHD1YqSR\nK9ANG5MR2+VD'Xffi!C!!'3A1fkRZ96`(BKkd,RVbir,D*\"3IK2Y3qL4,RFcJP6p\nHJ8MJR-M$LM(\"DlP[NMc)VRJrULJeGkV!NrZTa!Y6RKbcDr#M-Qf$Yqf2PMQXa9B\nrDlAJUr(QJNh)Chdm((LbTj!!a@emLfZq68hK`i,a2(bF2,PjeqV@&d1arbD[T`m\nXDp38Y4clQMM$J%\"#(Q94%#rpfi(%R8k%K\"AB)YF5jq'3!*X&[$efj4&*4L#HN!#\nkl!Gr3mMLdmd2H`GkQaF%P2[DLH3@8Y`VU0[8(qMGa3rUjN99I1e9*4YPlh,UVr\"\n'GddP2*STpM*ffarei-lpN!!fppP!(db12#*Pbad09fpjA4H8Iba@NcEh3ZrMcC3\nX\"6!jDH[PZj@dZbIL3QJIGJGBHXMNIC)+e(J3l9E96VmC3EN!TG!S%eD,*PRG98b\nkD0E%NpV!pY9`)MPCEr8Phe6HCCTZT%j#JG341a`\"6Ld$@p,%5l8S(J`Jaib+QpL\n[01q`T'LBE\"kU,a$m)&mN@fl[ZZrBr'+d-FC8kmU4ELe5Kd5TXa2BBhIV-*V9KIS\ncf2GbXd)&Z1,G##H\"pTGd)PJDHU(KjmHK9SE%ba0Y%c&$Ma\"@paT1323p*5'hRj1\n2NZ16(PbT3!(%f#AakM8#q#fZdjam#j2I3C+8pZ+0S@Q`-+#Q(\"m5B9&Q+pLccbb\nGF`083dbqHHLX$@2d'5A%Smk\"L%EK&@[@AIiNV6'eq@Ba'iHkAIpZF!rH-EMekZ-\n#V8MA2BL$3#G,lq'%i4TmIYGFKFYLC-4YVpaU[L1Q!fHcYhZ$K#c$5KCkQC`AM\"5\n*Br\"Dlk[1N!#D&Yl91mcp\"l$5\"EcM60m[bLbe+RE,,SaB9PkBVQZ#-ZV&2P3*rNZ\nrD8)#RiqXVfdq2c@Sh)ld,Ve3FRVAT`TfKN3&)Fh44h`*8fRJVJl3IlPrY[23)5f\nGjli%)AGSPh,#HB+8,9%-j\"VS*VP,Bi6id,24,bTkmQ(pGhGrh2ZE1JJQE62`8Up\n[QF,+*cL0!@LJ4&ISE\"A)NP`F+F6&*a)&Ki0T&XN%,JFLTCI2bRcZZ6iLDTPpfq%\nKTULcqRa5VcG0@6%,UaM%pQB!qAJEiVC[2A+G,@!plV`#h3-[kpP2c-HqGBr6D4*\n&#0S-KPBkXMDZT9T*IkAjpb43D``q@\"HT9CUdbP5E!TF&QSpE3LdD*8ZC'FE[pGp\nm'0Fe2bjrlViXVh556KPSk\"l2pbm'bF,$Dp$B@m0-f-aqVUDrr6BIl9I3e8P8llU\n`,-RGT@r`E(ZEaP4L35jLfRM\"@X5R&k&4*-bXi2A\"\"EHTc9Y4+M)5`8djp@GJh@h\n'F8K$ilZeY5r\"ZiBK23Rkk+@[4aIZ9h3$1aLSERDZ2)R#`fK#MG8p-J2hj1Na61X\nLV%fU0TY3S)FR9NL,j8VR2ULdU$P0d'Uh@&8rAD6lV[al``,mK'[-@6U6,C%PmJ-\niMcZ93C3h0K'haHk2bb(0V$2RX6I`LJ0X(1DiQ0NN9)hSVUmMe`!KX5QA8IkI(dS\nI%6k[QljHQ'!f[U,HrRq%PG9[@V$$j\"*q\"L1RGN\"%e1#6M8ah!4ULk(m&p,GE[d$\n'ea[iC[m$pU!b!fB!-l!dUH+DZra[M+(&rc'-,MQShR&`)0X!c+6[l9kdN!\")j8N\nRFDZB&S@p8MU#T'f6!F'`)KL5BBFe8ALZDZ0Da[cl$45&5+AYFkm9ppDP0AQqqkd\nBBcMDq!lG)a2LM3PGc(U,*@-KihSA(UKdbD%qdT)*HK1J5`J0H@SZmmhi)KMK4ip\nT,)k*Ghp'E$NRidMI*$r3'G,3#Hk'iNej!Tall1YSh)KR1SB03!HMcT35k9Jmc+Q\n@!@M,Y)+r9$)$#LAFZKY,D#F9X%fY!!p1-*YNAS(6q#F2lLALN3ifBmr1\"YEHU-j\n1r5@4,&,0VZXpGl3ci2'HQmX8'b@DP-\"`'q6\"2lLMbL-*[ETH[(['L1(@\"1Z,9b#\nD,rh+i'GhRr\"$A@lT-d$IH3J`UaE-&ihSTP@!&3A`!Uj4Q59QaP4@iR3*JG2)6fX\n[`!bqHCPqN5G#P@PTcMhCPE862-1GM)%Hh)M%@),r)ePXmfZKpQBaUb1*iq9I#JK\n$&L3meS6&KGl[qf329K-L'jGJqPX@QAh++kEI!IcTik!1hr+Kb,KAd3Dr4R#BicT\nLNdq\")pKDc$dZ%ZYY!C2h-RlZ%2hG3#TkiP4P6Gj-5V[BL&#6hpCk#,$\"8R$DZF*\nh8cHB\"DI8RcPIpjfU0&Bh)!k8(5P#Qpq\"Ci`@N4EaUcAiLLGNb+X0Y53R\"KV+lMi\n@XS8#K9XNMVKYY@$*p9QaK2l`cmh0RYG@482r@GcS@[[HadV1QVEZm0$4eGHa0k@\nZI!12#NSi3)k8$6+\"Q6CfP1VaYXRffU+c9(R4fD\"`ND%adX)!q))QJ+p&a0aDHj%\nJU5f5KILCd,i3'V+a15JpmPk0Z$`)[YeM@+YGA6M*rc$N5J&Tf8lZe[J%q1U'dL$\nqURj#mCfk8dqQ)Mr0VSYJ3SQM!ABbaY6j3N'*a2Dpc3*j&\"AJL6biPE\"1cc9qS\"K\nV#B4iG'8H'[0UfBdK2J(`30NV0%!'[CD3!,GP9k'pCa*3p!J4a[M85$kb,$e4d'D\nT1T88UMA-rBi6A+FV0fN+C-%V9+JVEP04hHq4#QlMb,03A@%!+0`!Im@Nfa\"A'\"4\n@mfd6[j8SGR\"J1X6%M&cRqJI'j3fle(R&Y(GCBQ@@HdmNk[lG$T)Dmh)hkfU2*hj\nj`b0\"9`NVYFd2l88b$9V&5,RNKjebQ,P3rJH[)P)@dK$5UdHbbC+%k9#P5ZY!U%I\nF1HaNdiU2\"B9E550je)(l4SZ!SD&@@5h,Tm4D$06jLQc2cZ1aHhTf$D&DK!!Ce[Z\nC3JqpH*rl%DX\"f&4$E8hDcS9$j%a'pSQB6Ie)$qa'@&hVjje\"6!\"cGJCCPe),X!r\n,B1c\"Gc8&6ZJ,%$ep`YCBG'`0HFm`TTV&F2X%\"ahRI(dYC,fZh)a'MP1X)Hr(5eU\n5ih'e(a)k(m`V62#V4JhV6p52l\"Y#m1`R!6K9!bL6AjS(Um$kVHmKIdpSar0,U3h\n4!C-Tj[@DeFSVfK`b[aH\"S51cZRejT*-*fb8F%Mch@[f4G15(5cp5-@Bij'#'S&U\nEaA\"89$@*h9C2Ir4TEmABTkY4rYMM0T3\"eQ&XL4XY4Lq\",b38B\"S!B+I@X$DD3U9\nVqKKXi#k(drU2pL`'eqiNH)5i2Z[CeBH0)\"F1-01`[,mGErJdEckbfheBC-e[%j1\n$Xe52`-AZQ$CTQibde\"4b3#PRQkVT05[GD9eh,DMCepp&mF-`-TeDK@6),h3he#%\nATlX$8J,3B-jH4&#ZZhA9\"8-(,fm3NSFMJrdm1T'MFZhpQfdq%QDcf$JVj)AcdPX\n1q0BJB#58dhr@$Vcm@PZH%!d-H4C[TaUF8\"(l`2l0Fb)l6$#3!#@KSfY2M$$KGXU\nbcq3-`GY4#jB!CHMI3rZHMkiHQi)j!*UYKVI%Iq-jXYGG\"%cAHDLU-V#YY&cY'Z@\n08[*CD8XPNN-XmmA\"kmN8e5p3',,`3*8(,@*B80GqQYVdNm'V-LV-J4`#iQ8)Xq(\nRhFlfPkl&*X[05FhUR\"HeZN+24E)EC3[@A*C#`l61h\"FSKXB(#4iii0qf(C@2m,8\nrEVDZhBdI`2h#iPr!I+fm*MNHaFY2i%*4&UiBQ,fIm(a)q6%E2MqjL6)15j`%)9i\n@-55AF!3D\"V`ZeLKIeG+iKdj'[\"@P4)P`d@&DI+d0mD46rAC&(4Q`ipMS5j6Q&V#\ncH!BX[2(h(c8Ia85Q0e&aqT%b1j1M1X[I0)LVD)q&'emj8J+KJ+9ZUK6JDe1UK8e\nf-k$M#ZKjiERr+fBr1*-8lZ5c2'Ni!JJhbf6%0a+[#Cd\"!fYb%6+QTDV8VBX3mdD\n%E$%Q[U$r6+ZdlU0bV8Y[U+r&[TXTpY#$dEjc`#4acE0jK'lim5j+P,P$a-EMJ6L\nekb+[#D)6E!1bUK`CIBa-jLA*XL$fLrk-5VhT%0V48$FAZIZiDU%l')S5q+lN86b\n1B(),35D3!$T,66[jN!$#dqGNU@2`Hd9raC,FK,*RKe2@!I+K%6XD9B2XkkRh@p+\nKN`@'$(,dYe5$#j@Y1kX9T`,ZNXr[0B5[+NDFfeVh\"UfK$chiKJ,br4Apd9SVT@%\n,K3l3K3FrFFDpj48GCjB*eE'EK'lmbC-e-qrfIBqL%3R!k6bJBrHQDhqVjKM+dR1\n5qC4mVXDFj*R5$5dp2QHZ$9qY[!m6Q%6E5r'NlM`&BQD$3S0Pr-XL(9!U9'6\"rU6\nE5hT8ZCK(A6iUC9$pBccK+`reLrdm1QK![mSP,L18PP@I5qHSblUUBpaQXS4`H9P\nqrch16D&`YZBF'UDm)Gq8ij'Z1\"q$,k[iHTmfB,hqK*0YZJf+3-P`0!6ALNja48&\n2TH80PH('(lejS-3+Ipj5,TejMM@+A[pc`qM\"cM)dZcAlCQlFie&d,UPBDJh`jSj\nBYd@1@'8XG,62RZ\"[h(VD)bmL5a9GqPJMSUSDSfI#5[h3ed@GR5BJiFk4V46GT+S\nMa`NB`l@[ICJ%Y8hUJ4-U1-S@(@%mSS)T#aQIX%6''Y3[$V9\"k[Bd$mHK2&ZXD'a\nK-%A2\"5!kaa82aeMq@&2jhdkjD1aU$BVpPkLbFY3Jl(md,Gj\"UQ3f5V9R,arP`\"m\nRdZ9eFbch&c&B6UD'-G@C-qi(mEf)hmr&5VF1%I*KC@4)pDS0eN0RmkG@'A(kpjC\nL-GkDRNqAiqeZhq6XR4iTJh(J!9mFRNPDD*h)h41,'@I@fSBHZ2\"FeM&ZFd(jdf*\nfCPSZ0X,b$`bmK*C)0rpZLa2qlHdpeZlAG5d+q,f%K&NKq5b'1!6%)`5L56-Ij8-\n\"rIlPE9Gb(,`dHU%(GH11\",Z3!28,,UYd!,+%G!2dk@6kXeK2N!\"4)CL(`m%`&a8\n$l6ZF2XHMIcE$ab`p[pDSQ1SG+$$d!TQ,*RBjQp(Zak9[qCQ#RV*[-k)Qj#MB9AE\nbpP$TBjV\"!42Q0Z&2He[%cFNUER',a[&lEa+e`mS(3FGfffZ3!0U\"heBeh1UEL1k\nL4TqJe*,rEIpN3&K@iLkQ%aAR[Y)5,UXb@f#GQ%eEHblYMcK`8[cLMMTrcRid)dB\n@@I`Q8@GUh`+#L!2aRX#PPMaBdSI'@lBjVc#*M-)k5V#L%KD!eQITX5S(9(h8EdD\n+i[R@qPZX14bXQUehB2\"L`&mHUX1\"G*&rc)B6YmiD-lJ6Tbe[ap[U$6m29@RjqZJ\n!fKTI'bbrr[(c2[Fc!LbLe5X*j@,4mI-``REH1PCi'[pNfSbp$ekTc)2jMZXaVaD\ndH,\"-D(GfAeHBFfA*`4j9AREbpkDY!(jCRZ`rjQ[VZRZH[bXNXTEj$piaiKl4#SA\nY-Z853+QC#Bq%T+\"-[Z`2aq49MI[2Lc6+SSQ!G*fb&QHED`XjAZKf$$D5\"S)dLN6\n!q5ej1,-2qZI-MYAX&45@Zj!!54(\"N!#a\"h6)%#DdCDbZkL+a8@IF'H$#8*'&b2i\n8i1b5(@-*+SqEbY!A8pIU2J&+'4\"1dYpV#$,drN#BZHhPFV#@`QG'0,&pmmE'RqJ\n0,`$YqPJR[Zl,p5H*#$lkGfdIXM8hhR1a[krM[Q@F(NhRBdIZM\"bb(b94!IkJQ[M\nT3$QJBk#6)IjaXqr2p)AAc23!mXqlb`b)&DkY+aEeq`q88U,\"2S!TmN2LN!#JIhB\nB8X2LH*!!fj60G-51%#1mPPUT@MIYMQN\"6C!!GI$TKdFU\"!h`MS09GE&(YV3p`03\n\"r*-9\"`Y``+'AFN59dT!!TDYRIedTp-3UhZmAScRYc+,T4dj*e*MQ8+r(T*'8L$N\nYCd+@9ST-(0U+5#RZ2G5U0L%cIEYD!3VKQ@Qr9+@jJc[f#cf9(PIaR()Ne82$BIF\nm0185US`GH$3lp[l[DQXLN3YdXUqcqT1B60fX[2TSH%C9324+cPE`N!#GYj!!)Zb\n22qKIlTQZ5Tp%Q3AN8(RdeaD6,eraBJ8Vl-EI\"iX)k-4FLe&GU+-#cC*AVq[cXcf\n$A[$`AK+8LYdUd4qXTfkDh+$B)G#S6HSMpFVN%ME+*%Pl+-'L@V)IMZPZ@UKZ3l8\n!p5k2a'4`Sr*N96U9R)Q,(P1hG'MZ+a8[Vf-f#*iJ)C`$rD9mF$4qAHF8JH$f(e!\n*9A1UFC4cV!3Cfqk\"`JdAbee*@-N143kAIJ\"Z\"6i+!(M,+f20@Lh[P'e%2pG5QL6\nBM[Q9@SrE\"d!hLMJel&B(mE%(2\"CkXIZ&-MK8MPJbjVFj*1HQ!aU+\"9[55@9ALFK\nN8qFj2[e`VXLYLTVhM3P2l[QIVJN3SMNK$\"!S*)jbP&\"jClD*9cD$,1I-'Rm(-T)\nVeZ#NbX\"SB-!\"6@GPUp,fad1e5'ce6ZM-4@3\"DFHj&ErQNL)LGhmdk(&kJFQeFc`\nGKG`5bf@5KG(lT+0N2Ij8e9-U&heN%@Db9ah6YQ$9JEXCRBj9p8&N@LE&XCHAbq*\ni5i4jDM`f`8#\"Hd2Y(RB-d$r3p+K9+ESjp9XdE*B+dV9bNQTqfeR5%a+D!JGc+aq\nMe-U3!2)J0N3YY4CA\"ZE'9kdmK!B@1aTH08H*)BIFYeEdDPKdcYjNJ$DIcZPp,$Y\nH@Yj+\"5`FCj8&0a,YPa$RdM\"RliIeDiBMCepc9a+(ZCb0,BQm*\"A%8!SVS2ASUTU\nDIFS%6)U!j)3Bh,bBDj2PJk\"9l')Gq5lTM)IQX'-k8l4lP`4i*5j`UU[q#lTF6)Z\n8ac)hHkQr&aJ,9'ja*%&Ydl!a+GJ*)YG8a(+lhaSlmppa0$Sp%$%#C*&`E6fR(Dl\nf0PYaXKaYTrLZ&SLZA3j8@Z$N)rY%I+YK1q+ELYR6PP[ppJDBR)h)QPj!FBfEl5D\nE(k0@BS(KbH`H\"Lf4M,AN3`eCA&l&ET(FAR'@Pm0V(c0D3`C9T'Q+UfP(a,)`#Ii\nlV!If&#SHYjqPCFCBek5,@@YNZTd*iqP92p$R106kEd(VlTDS@XUl%Q9!1S-!#Gr\n`DqMfh\"pDB!lcY5)3CZ-!$5kBF'FUhpjPl,VmcH`*G!aZ*Upp,f9X-HqKUMcT1',\na65B[FQ&bXI+N(@-CPCT1D0Fl6iSDX&i3M3mjJ@4p'D%DJET-3IF%+E)r1r9`frE\n09BD,-[+(3\"TfkGF*e,4hEAj%H48'TP@V-[5eNK\")E$EmCi`0Ehf!5E)F)d$!)15\nlFk`\"C06fU-SfeVFUAfjp3a88bBb8F)KP4k6(#\"E+$&&TdBXiL9pAlJ4QhFUbqNm\n&[D60k,FpB3c\"K[T5lGCr`&QX&IAI@d8'JA)BF6JrZ-Xcm80[[38dA!,1mP$cd[4\n+1Lk4[2--E,a6CMJE2fPhF5I!k&k&I!3%K4,819dVMa[iG!J3kJLppR1f!k0cY\"a\ndm\"am,E[6,&`l(9+2VC!!@@%Jf3V#`X\"9Q$I&SI51)1[-jpPGL,BdS+'85+8E44P\nr[pE8$GRkN@mJ)3L%)VY\"Je8R81N6&MD#L2#2NY8KYkiq*,5\"\"K#T!Le`Hi#2RBK\nh##,a(!\"*SE[rA1pEZ'Re%b9bKckk1hiFIrKFlJcAZ6hhDrfJ0c9k@&XSA*k![QD\n4L1!dY@1A-c!,qC8bap&N,FaB6I,`Ld\"JNp,'[FYTD293TLb[KJR1IeePEU0!-6A\n($f!,382SpY0T*a%'+%fKB#T+E4QfU09rN!#S\"&BX`A[Y&Zqpef,jB6P#NrGDaYN\nB)U3)#l4[A'8U&4%,P6)8jEIUk4+FX(dZl4rC'9Ub@dULK6eakUAJj[B&)QG51JA\n!'&L5qq2!P+X&f%k-ZU1PJpqSGfVQG0qPd*%9MR3Gef1,ml[lEp2!NUk@\"hLle[E\n4C[09paXr!Y$4j18jIjHakB4YSG`1#PM51(DQ--RL!$\"165Xjq1+S-[lXQidpq#c\nND\"JEm#)2,(Y6+fP9#5Tmd9d(iTk4$#4C$A0CDM0f9#X\"iUS9HeH\"pQKN%ISE$ZG\n!bPRe5mQ8[RmU-UC))$*PZT'(9fVFf1U0X+ZCXV\"F1VbrT\"BcD`0l@!K#0iV@pYH\n#lL&d#G9V526qRHp%,d84XkV#0i#Fi*jYBeeE(F)r\"\"eJDR`E2QYDj0KUPVda)%A\n0,6!qARdrd+#Q+4!h)Af%[I2P@IaLFL(4\"G'\"%L)N(@[U%'k%8&X#F`iFdFf9RKe\n$'56BC`R)412M02$%Y-49E(mrCRaeGi%C,!U632fjlXN9k1hQ0$l(99VA%1XeE9Z\n+AjQFL\"ID5q\"@Gk9Kq'YpBU%M&0%Br6cSd\"cPTMiDfJe'q3iH[F#'5(F@CA#9+Lr\nS(kX4A$YHE([Z@LJ*R8km$62&jlrQr8!cdM*[8-S'DS+UMY2,`kYY\"8\"a(KBrhc3\nF@(c1,fXAm2b2c,AA*TU4b$FrkA9d5Qp),P6I5IMeMI*p+khjmfk8#q&f2,#mIY3\nH-69Z@D4FrFN*m98[q[+R6-Sf53NeY[Hi+Tl*J41+HGG1d[a#VVicJP9Q+@QPEbC\nYE(hj)2`Bq#G@jTC94S\"6Y4iUa1q0Tbb,$-YHb!j'Q)4`l6J[Ve-Si6AhDBP11GN\nfbA8)f\"3[Hb$%QiF$Hl'Leq*qAG*6)k8ce3#q3lN2@XDMkF,+PCL\",i*RE1#4QHG\nL58`YG+qZbT3H8QJ`MKZl[+Pi+pf[c4Yq[deVbDl!-Ac0QY#!p+'NXR0ai*P@+(l\n$flYe3f2BRj[6djN\"dFN@SI1PKJN8J1CmAcP4QR$'SC,$6bf*U#e@3G6[Z6TMM2A\n!L-K(3IM+SA$&1G3Sm-YQXbdaP*@T(eeNU0\"-aVCrq-cd0Re8HNE9%eKBG!V%9i&\nHD!1\"r\",2q6!!LKrZ1-BD)R(pbL63FRrdD@r&f+HV8IlBicD8!GCKE)N@Id4*2&)\na5J+BFY0cjHk2X#I$4kYS,ZHL-e&qi#2lN!$D!MNqRP\"lNK3J*8+j%iliVpL(N!\"\nASK%IK`QJJm-,)DD@2m*@i8DK%4kaY@dGBCY`-UqP#$QjfarG6Ncr,['r*2aGXcA\n960K%B+c3GXF)V6&IrZ5ifHkSA`!l*e%8&pR`RrpM6T!!'I+I#X%ZCC6M6e%p41-\nL''S2ejl,kFIY2Kli%EG@$L2M,48qFP*bU*!!LM5Y&Um9)G6ik`fX98LAdTa+-lE\nUMZG*VLId@KIci1lf\"j+82l24reCj'#,3#ZPBV-#ISZArGB13!\"J,+a9*q6LFER@\nFTLV'mVE#AG4LL)+c8Jr,$f2q`TjQE8Kp\"bkBSeDMQ-+KYFcieDehAjI,S39G-X$\n\"'bE&%HbddRb-$+eCDTlj#(HD*UqAkC46YVdTE5FUU0@,%&r66-Y-m(q%EkG`!j!\n!qH,%IT&djhm(LDMcD\"8!elep6\"I2kqlE2j'pmG5'D*c#0lI&%VT\"`Pk`#R)*BK8\nV9)ALR4VLB0-j2eMp,I`ZS9G9H8CD\"pAA6ZAa4PRV`eA(YMQlU&dZaLa&r(E'95E\nKQQ(54HGECV6#IYCJ8RBAA1#)ejKqH0%T3GZdKDqp&JE#pCrmmX3M$2lq5)C&rQ-\n)2kjqYX42FB&MJE3DZjKV0T&rE!*Ef(*-C$9N!5rScBpEb$U)`Y\"6f2!2P*U3!!e\n*T2B%fPTNll,(dKkq9$GZ9'8d9iZ!`DBMM&0'!@FQTi[LSNN3jRcd*+pFrXIbU,)\n#H)$RV1hLaHjQGmJeUi0PNBf\"JX6((8ZpfYicX!iCEpNVp)SrG&3XTBa$ZEiQr$M\nKBE2A2)\"IR9(#bIPLD9&')Qe&1IEGUG%aT3Jl)Q(dF*cUIdR0fT%ieP+L)Cc9jX8\nX0hq#'1-K)cfIf+PP8J36A4mP4)SPM)S2NY!Sjml0!\"i9k0QkUT'29q'#Z42(S(X\n*RZ+keTiH9H++VmJp**K&SK&5f)4Lim(I\"LHCc`L,dS1S9f3a,29FmDqN,RVX3)F\nN1G[&U4A(6,Q%S-3)r`GEaRl2B-IcLaDM5dU9H2P'Nh+hUFmDmm'A[jZ++b6QD[#\nVS)XjY#K%qj'Y$m$r$@N((IVJMS35h36f3)!B9QlbAQ3*Be'r6kDK+\"+pk#9Se#+\niQd9Yl[)b)hqpeH)#k)#cl8\"+*KTbVZ*ZmTV,8`K[[l)59&F,fLXA0Jm(R(!Z2M$\nFk24L\"RUKLi1iUAlD$X#c)P(MrElj6H6YqTMZk`P9D@H,LkiIm,)\")rdhZ`p8\"&e\npCeERq)9,3c01*TlDG5USa!M()j2SSJp+X\",6\"*)$LG$j22NN1L&-5k\"EUG!Aq(a\nD'eTY*fQilNjk,@62iQjVaSZLLS$6lMKBd-A6pr#c)$Bk!3rXZ!+!5H-6B#UcL+B\nm+P-)j3-BHAPMllldDq8q\"J\"Al!TFXT2U&idjHmY,P(5BA-RR-H*LH0UK55r\"hJU\nhLMY4@ICkH6X(pFU1Xm(9XHH%!daF3&Re+IHqr*`Y4(+3!'LTNpcT9+DNe'-#qbY\n1QdS@L[m6TB#Fi9Uiaid@HcKZmlLV!KjKEY)XDD63lM!VTCN3aP%q&Km%@d$9MD-\nlrH`M,C[&VD!e9T*2@ETZ*hKGF'Ua`fJ)8lS04\"Aa'p6B8Nb)GJ)AREPQ9h,ID4I\nBFNjNCGPfjR\"BImr(Ud`9jk&BV%blUNc$+@25SLNp`kIV,%[9l4LVri-4L%d03+I\nTUCZ%N!!PANpDiTiPUJbIfdfBP*l#h&$DjS[*,eI9I0)i89A9VHI3&3e&dHN2cCD\nZB)3N1HN62hmX-X)5KlZ23Y2,pA*Dq`2(V$+)$UD@h!#)kHHrrTq\"ZBjc2PiU`Bc\n'VVK!(NNii\"m,G-Cm8l3XVeRe$HI9AlETX9BJ6YN8cAp6A``lr1A'&P$I\"%0dkDP\n5FKV!H&S+[ReE8Lfp!I+iC2bmr*CRc,[+dIDT$pJBrhr2`kFjq(5l2ck93-S*&k`\nhiki1A`ZD0$kXYJ$1!eedXHJD*%1%BNr8jVGTNp2$fM&R!\"0QkL@F,BV14`3!Mj3\n`r1D)l4)QhaZcmLX%1fcerJrN@P3XRPf%ZSiBCqM$1U8Z2V3J*Zc3lc&[Bj!!I3a\nG5D(qK*(appr62)a[MqcerHIM,5Fi0T640@m@,l(JpJ)2UcbGKSUkAL)qAAVXQ`l\nj`iCCGM'9Llm&pN)hYMNJ&H#,hf!ZNKM3UFRA,N[(Hh,\"Gpdd6E1)IpB2H!+HreD\nA'@!0G$ccj-05CPFQ3h5APJ3Tk8YTeJ20c-S[TNX&`Zem#`N\"bZcf-cK&)ebhrL#\nP-C+&DRF$35RXbG8)MF3\"+eZ0EG1$RD3XLP)D'U5+@U\"69eG(2'\"V9c6!1'Cherm\nEQ0RBqkamR**XjQB$N!\"J@*QL[84M0\"Dl2@K-Qd5kVUkqD*D'K+AH(eM@289k%*c\n+9B`$&5U@X,pj+dPAaFGKe[RceJi2-`lB'@fS-$X0!J1dqK-1c\"cSZ@T'PUldh5b\njb\"I\"k#pdYA$Ri$hqk(e16@FSUF[+R9j!Mc@6NZc\"(6BLqfr)SA6Uj)Ff\"jhd+8A\nC*arcpDHHSJ`bDhm%Va\"ZCLE$dk-CQi3U'fBfaE%C$d#HN@h@4La!,L0CCaNeLVV\nmR*HGm1F6U6YCr#p*%Y'#f`,VSjBAZCYDLLNjMVM-\"\"4J@6GFf2#BH4MqG[YFl@,\n*PKPN*d\"QYfZJNJ29jH*K3k@iL'!`2iKVSb$p6CM3Vf4&8`*b%pUX\"1PMJel*&+a\nM3-`LcNKc%E3X!+ji6kj9GfHkVec!N@F`i'Cj&31TC[(9-0@l$%f0LPBCL3)\"@,+\nAb4VR*Em&3Vek,5Y[1LQANcf0\"JJlLB%aYbQ`-H4PX`BG#UF+l$f[8VCqC89KkSc\n-JYSflNi,[eVi4JYGE%$K[2[r#@[ZAa9iPDT4PT0%Y$aDl&I@IiKb'm\"IE@X5fJm\n5qKmTSIF2L)G&Qd'N%HMe6SQK5X$i0qJ(8DC%&`Ga2,2+i@Xi@8d$m-!2J20bp!Z\n6Fk8D6jQ0Ck,`kPcXcU+qXNd1Cid,G\"5Q316)PTBq01F3X5&+JdY4h%(Rk!B&MUV\nHrNqp3HEFNK9KAU0RiUaYIpVpDESpQB5iT\"+*#*%G9BMM\"m9*Sc48V)VPkjVNh*r\n'90QZG)mrVVX4354i+V3r)5bjp64dJ!%JdPd\"FcEEpmIqJ`83aPM53+8P#qB!MKZ\nI*4Uh5Q-Z&VCZjLjGp!\")R$FA(r1H'rAA!`p1pbAC%)aBmKHe8k#e9d3eK@h`8'S\n[22CjPj@P4&NDqHR`)K6Qr$&A\"2mRP$*JJT4b%JQhbR`D!i-\"59BR8r8+FQ++U5Q\n-R9hUhbc@p&qI,L$!2XGTQq+9jFQRHBa8C+aCk0RjIajHM%2&1d\"-bP*ECAHZ12K\nMiT,JU)2\"a5E%CV`HElAf,ika+FIEe1da&PX([dh)&-id6`K`R2SFS+\"9cBKIDIN\nEm#rBE$jY93FUBSIqZ\"13!*1rfU\"YBr(QX!qT0`h#BA8rP!Qc$hpE#T%4diISh@a\nER#H2-&G)9mV1NPE4kQ+S[9d[SaqF4*emc&aK+3SU39C1F'VVRPSAHMcI2108\"$M\n`MVLPDF,Xp\"SSZYAI2@dM5%c9Zaaf5`mi,efBBf44q(8ZH[jik4Y[T(A$`GaMQD3\npTVmFSf6BK3@+AXJk*I)J-'BYd89#%Qp(a-,pFm9UIaJHKFQJYL0+ZA6XpL32(#h\nbp26!!93@V6[dK)cG8Z\"rUamSdMBY8lhd&E4P0G!p,G8GPK'Z-r85G3KDiCj4i&)\n13ZHdPqUC61f$66[lX%P\"rh-T#c&%56qfDVj0%*MD'AFr6JRGcC@9[E%'l39V&RR\nkp61@hf`B(,*\"A4$-[2V+6Q0AZeJ2*diIZe%jd959T+1M(mRjqFUAGlM\"1c59Dka\nFbd2YaH&Ei6KaHrK(*LCR(S31*CE#\"[Qh%Q[XKNU@%+alFC!!!pd9AEMDKhTMP,h\n,T6pdEr4@iMk8P325I2f,5VfDU[e@@d9%9f\"'`HbkC1@1&[mqPZFaKdfklL[E0'\"\n@iU1+PDR@SU&,)FPF5j)ME+FTeDQ*rCk4(!b6!lG'1JQ#Tae+$+A(I1Ua89H[Pc*\n%MMH[9((1a[cTTRD,!36kUG06jRT&'am5DT19$Q*je9,4dZ\"Z-1\"kDK$DRUclX$T\nq!ChPiTF`2D8XZdaGYMC4FP*LSfTk(+-k+pbh)2aF1`Md*Ka5c%c4mDmpNBp%VF1\n18\"qC3r,AGR9fk,,A'l9KAE'+0S!F#[DkR!12d4chDAXm\"qfX[BP@GLQBaPCP$3J\nN,U(HC[bM%$PVcMIM1KmLCcL6Y1B&)3#5Vm1j$[XE4')*aLHZTVLrja1lmVel&(9\nhJeJ#aJ6%\"QqS`-&(a&(@rb2f*!cD56CL4N6Gj(h)qj%D*S1`3mQ$5KBBc*!!dQ\"\nqV2p\"VY2NqVTf[Ykjrd1ZfqhSIbqhVG[Yl\",lHc(q(6INqhYjRfpV2mqc6qI8#2K\nVlGb3!'3FTh(J$`MZ#EX'Bf16Aj%,ecrfkeG$+jXccP1GC[[C8@!#2`!l)&P\")D2\nRQR**D\"j(KhFIFJYXC*HDara-hcj'b&)S9iBCZCR4fk\"\"%j-PC)IfL'cCP84HaV,\nkSJq@$iJJG)hEd!dZX$#)Ra[-2U$D+k'jKT45Fr38TaLc'UPP(3MI1XS6!qaDGTV\nQhL6hU1\"fJMSq9!JJrc)`,M$QCM4Um1bf+63Tl0*cJKek9dYXr1Q)5b1f%[i8!G#\n%VjQj\"e8'ZHKLj*!!fcff*HXXYV[FTBACblGN(J+0`4!%aN-U`QDd4'jLT24@rCa\nZ'bK@HKSTqe8LNq\"G8`0'ZSPTBl$YMBYdaa4T,FVYTRGTG06b[M&(`@STr(1ZNF$\nZmrm*-BF#)fkc+S@NNaYdmAG$$$iaY#2Xb')D+1qf3#c!Hc(YM@bXDdHeX,IS-KJ\nXSh+YKSKh2a!r8S`rH%!@pB2(3l*6GpDhHClFi6i)rIEf5@mh3[T`-N-4p14rlk!\na9()U2Gb8MKm&lUU0JIS9U!C3pDM,V6JTk%YKFRm&G)d9Z%QB#HPc4Hip&A5c8FY\n`fc0)&Y!HV(B![4X[[MaUFT(qB,1h%P2m'aG!,aKqp8G*M\"3(q1ICe44DKN58$-c\naC*Pl*QCGjcQ-\"b`eAAM1aRCDlRIH[ZUMNp8,)`fSfEahqALN+ZrEl$U[(KN)I64\nXi5GD19QFKr4m4l0eS1DrY5G$f$Yj*4CJCP1&mFK3Z'JQ!h`&[G0aYLLB(K9e%`a\nf)!`kJfVNdm&BmDj6[QRlRrbVk#&J1j!!)pNAQSqb6X'BeiF*Y3cF%)`i-VdlQ,)\n#Yp3bK3C%+Z)V2XpCEV+`9fV*-(4\"kC!!bp[2q+S'Lj[ZVIQJ3rG9%b'ASh%*0d@\npqU#GF31U5jR65(pGYNeF#J1A$'J4Y`9[%ZR0AD5D)a\"4eaq\"kde2B9#@835J'iN\n3#!BBi02eDBJ`dRJAZJ)CLUcECKf4\"HP6JDY\"1CKj4ck4br`Q&2ihIqmc@X*N5b&\nD)*[TlK5q8U5%U$[8(J&ELX*\"jklZHY$l962%4KlAkl`&#RI*Cp\"Q$+ZUhKIkKii\nQmMc2R`1#iYl+qc`jAVBH-eRU41aFZ98Fi+bSXL1cA&9r2Q3aLX!2dHi6Zr@4G!5\n\"$!0KET0'e@Rh6%R'-Sral$XK-Lee'HNC[Lll82XY@`qK,`l296A#e-AJ9*MmE'G\n[rarS#XeYq4K1YkL(65jaE8jKM$D%8U$AU!b6@6)$U,rAm(SEi\"ZBr`h[a[mjq+\"\n!R3@f34RDL$*Q1Z)eXEV5`@YM%S%PSPi,i@#Hp0dJUSErGm1aYUd&j'IbK4KV*+M\nd6$m#(M06%jkCUQhh[#M8NIeP\"Jif4aZ2r$BfPfk#LAF!2Y!699-5CXS#R)IC63b\nBK[)IbM6Y,MXS,&*!JZI9'Q3biPf3!%dhHJ+JkKRH[l(!('0bm[TFPPT`LiaL+36\nVKah4+#Z)q1V9GVqPBCQc-$@8bXiT2#C%6Aq,Kj*h-mIKSbX%+')VD1*TSA%QG)S\n$',1!846*DpAbDB%DR0qKKM)E(Mem+*qJ,,Sic%PG+LT$r30akY6U1!cPSNH$`VY\n$MHkXJ`2J#ieP)Qj)h0\"L#qXF$rQiRSAbL'VChi&3q6iM6J02IjVqcDNbP8pc6\"m\nGBlZS)*!!\"25+GG&RAU+84N&A&R&cP$Uki3bE,!JmTiQ($FE(9@4@!S2(dS`BS!!\nH%eEImeHjXp'Uq+l)Q2mm,DZLlPFYF5c3656b'N0(#L3l-q!DPe'9JkNk!H2ZG!q\nGIN0KqkpadIH5*\"APl(R(5keBZ0J`m-&IPE3cHCI%8S1ck3,Q5+G`[\"kS'f(B+@Z\n2E-3-*`)9DqQ@$6P6cR28i#CpI4%XINVAK3de`S)pd'+PH'f1DU8$1p!d8$EMp14\njpR\"[Cj-iP(Ef*H2b6KHh2`$*$BC43Y*j$Q3BIjE#Q3'MNj!!Z!D&#\"`e[9j1GUS\n$i3PE`6pM+UbCN!\"*[kCY1ZABXM9-p1T`,eNHjUV6BklfY%X90e)PElhPUpV(B'Z\nAfK69DZX0-lmPjYGFK6)D6c$+9($GFjMbki1VX+\"i)')+9VAqU&HYS,C&hXY1T00\nH5YC(LLDc2APj$MLdDqm$Mfe9B6qC1[*C[*p)C@SKDT(dX1KYk&8#NCYKl)jY-m`\nI!+8!G9ah#3%4e%@aV'V(%rQqE$D4\"[e\"HRlD2rf,4N'8#eLXBlcRRCjNdm8lqL!\nifMQ'YhY'L+DN'b5GNjIp9[fCHkk4V8,dN6p%N!#0$ebcYr#Pk)Y-PMf$qe&pDD+\nfjDB[jc'%IP'Q5-ReIl93$TbM9hlE!E\"i-Z,f,N'3!#5RrT!!d4p['F`Tl2668-F\n5-L$UPh,`2ZMl-%aF)T2DJY0*ich2JF%4CBdm\"P'\"cdhZ0kSTQADI`E-0q+NF&%L\nii39bdY*5P9A$mHa2d[pC5'm\"Zc)KQ`TC[$b[9'fGf[$IYiplZiZCjNS-%(mpE5r\n-&9lD(j@`UPDZB3qU[IRJrh@%Qq*(bP*99Up![EJMM,+MA9[K,BZV3Mhlc&BL,lF\n*p'8Tq@Nejik+0+iE#rIbTp6qp#XCf&LVNf!'Pj4B)k2(&a(0%+6GL%#&XIhZ$qL\nJY\"9UfHf3!2,)-(BL\"Z&k1fklK0jT#dSmVNc!@hj(-Sd192dYc@mZjiaVDXV[rfM\n1ck$QTI`*V-$SUrY55U,h!a9VM2TIPmbeq'P8&J%lpV`SdGE'Vfr@d9d#QCfAJ&M\nbATD9[Nb)\"2!PTN#c&-l#`!A0[*rk,d9G[C&@XjaiR`$[lj&@34L)p@MKJ9!'06)\nST%jRK3`BC[05*MXHD65+20PfiRq+(XrCp,ZP!l58aJ8FHB`@Df4`RY[L&2,6[Jj\nj\"YTi5+E@\"Y+mj,&Pld')2XNpm-33BT%V2LI-DkA8Yr2Xchj(+T&,8k2mmMl(6l#\n`8SG6C!b1ae0N$)l(8f3-MXG6C!b1ae0N$)qGhi,1(8E'I,ZilC@Nj5%cjK9D6m\"\nb@HHrrdF,@pS45GTD3FB+LU$d&rU\"p$f0k',2`ZJ4[-ZjKRaGIfJH,Dp*jIEV$AU\n8h'Fqj26N4)MKV66T99S32-X@ihX&H4Uf6$`T+Q*3dM4bp29FIfi$KlGS8TI1U5j\nC)flpQhm9&[[EcLdkG@,-,%bZB+0XRedp+4(r-ZaS[J15l2(a(#j(X@#9iZ&UZC!\n!\"8Ph0e4il2Ndk*`NE*bNBbMY$SZ[N[i-`l2#[5TY'#CY5jYah&*kNlXMKQemS6$\nK%&3$SKaKdXlJZ$GmGZMXN`JHdZGdJUBb)Q3EUA6A8q-9%[jB(cbTPqT9hj+AMC2\nS[6KDTmH+H4&Q#A)Dlcp@5ZIPJ[,N*V8[I&91,TG)GiP)mKR0V*DeZ!m[iEp63SA\n'92U+2)eRf3+HZC%qPZARRc,li4LCPYq%Yjq%TLIUlX&hFY1Mlp5H`9UqlqMq0[P\niPb#B\"18K4dc@%b4pL,V8hj2-%B9I&KkpbeDXEe1p8Ma%LHi)3Ekbhm#rRkj32pN\nKJ9dXp1$`Z8`+0aYSU3*d-`FHClrdSNHK&'Kd93)peRD3!+8+bI0bH$J9NGDYJm-\nmeGNrJ0S`#N+H#S)*Z$MS18q[RmpJ5m%)E#m\"IH@)Ja-p4RrDi@pZ&kKXa%l@Nkb\nq[JP)!5A@*d0iEFRqm6NU!*RGkBb![BC[KQ\"S[Nicq,@8D8jBe#*\"8d'Z0mk*F-5\n5miGB4(\"@K+[[MYYR%-5hcFTVAk#2)UdF[LJN02R[h&dR&40Gk1b-\"N5RS%AJUdF\nj+'3LAlrM4+ZSEL!c9PE&2i6cN!!#SiL*E[[ZHR36C'\"bN!$'q\"aPIG'4!%S@2KF\n&pNb1UFQjdr&JIM*3T0eR-jY*FR([K%[Qp\"EKG&YcZ6Jl[38iG&UQVmH@rE!V6q*\n$&Z4+M32LaJSS0pr$h(6[AfZSMHZL'3kDr15YcaX4!dTK03&f!IefmCZ\"B#UjR!9\nBlQpr$FIh@l+-pL['BA%pH*KAZMYG[FlkN!!p@U+@&hm6j-KDh5*e6Y9!Jqrl0G5\nKjibc[dL![F6kdj639ac$,ZYGpb[YXF)rpmEh2Ekp6ML\"KFZYFGb(c6IGUk$Q42[\nmjH&cErMfq+fSIc#rNLQbQ8,kl(CDEl\"KNVIDe)C8j&CRI09pk0H0GQ$!5#jF$Qh\nUVqcaD@*a['%Xj+UaXqHJLp*r#N,\"L[%2bk2'kP*iQNf6S&Jb@Mkl[2iDdCZEIRL\nD\"Mb-kj+V1[h59CS3Tm\"lBQ,R*'qR#erS@pV$m&ZKIc@cekF45+2l[F0jA[A$$'B\nEJl'EJF)McRIER+13!#fmeqI*5E8LFCfldMd$'IY#j`pLMACCN!$GQ[-qa[M!*-!\n2r9bMh(jI,UYN,[`GJ5r%PJRa3UBBQ8SkZE6i1-[ZMZKLf[IS%p`kfKHGTEcYB89\nNf+IBAm'RJCIFr-!&+f5A-#lpP4aMeF$K,5ZphB21hS!-AF26ejN0TCF%DfM#-B`\nRVhh5`K31laYIaM0V,T(#kD1Ue(Gm84pf0(0E#@BHXf4QK`J,Qr)DQJGE\")!45)$\nrGKb0dVaH(q(Hj$Fpm)XDk4Jj\"cQ4mh)0L!6I8K6\"k91\"Aq6@'le+cB3qCDdBiJq\nBd2D`r[9\"`l5#(H'ID((03mBEY)'ZaE+!l@fE5m3H0#q0\"KXFbD5p\"NYYbGihRfD\nK0UaBNK2*mH(SEST'I\"bR4aBFN6c1E!-Uhp#0jX-8I9b%pcARd)fjcYVEZ`A0NYl\nZlVm[aMjH[1XqmUK$86EqrZ-3\"J5QQG,aD)Dl!HP8G*pY9&FT0RRE3'e!l\"C4$VH\neJ)HYNVPDG@T%3%%A(ZhSl`+AC+1f,b$d\"6A0-)ZYfR*Er8HpGNU,((DCA&qbmm4\n!S,S,'2ZDS3NSf#YC3rM$p%1dIQJF@U$*S(pJSd$3e2+F$DFkZX3SNqRehX4R,,K\n)4hjQ'\"[k)M36rFV'F%4SP,fb*jFZkYqmT*(+b(5VC[MLZrRpBejF*IQSP\"45E)N\n[pb*MfX66fqQhG)kbPQVi`i!4dj'mrfP$MAdi(TL#VcFldd6J6Rl'U`B%X2F534q\ni!UR#QUhHjGXBK%X6bjSUkF(d51rXNS+U\"B,PPhEjBh`K*C9)B6D`ej!!hXEGD[\"\ne,BcHeB0!90DDlahMGaQ9%$6988)P*mX3DRpF[#*\"&jc$Ei9,KCPK)U&!L1U50@l\nDZIe3!ZMjSHR%YUABXp9Q*X@2r)bP6N$VARiQ%r61EemfVerV[,@Y2A\"9*FlKh8,\n4Ak(-,$qAC@JCED\"dDMl04T`)NDP*11[C*D)f3aSl#Ck1I`bf`h+LHSi&8r5\"PHC\nkpUq1HF,YP5fMkkT)F4d'f[cUENJF!d9H#YcU%)+'E5ml5m0bK\"GEHc!X`PkdMBN\nZ)E-1mcqMVrV#SNfLl(BpTR3&!K,0F[+\"l6BrD,C,%N8e(Z``,F\",P69iPQX`SPH\n+YAG+83I5,V1m'EY)[&m%YeQAUiNAa4!*BmV`bXIXScdKZF#RbcFF#PE,TJ-j3T@\n9&3@M-8kdmf1GSrKFP3F-M,%UDLj6[b2Rk(QTAFPH5K&d)jQ['+KJ3XLll82Cb+[\nM5VKDTG8AHL5Td)4rdkaGQeibAFEPCJP\"j#$)T\"KJV,3N'B[Be$25mFTk&V%)f3(\n-L(`q,8Nl+IJ*,HU$pRR3fhi0QLkqGqX4rPQE4!')MMSZ!h$1qc(%Xp1RjE4mi@D\n+i*[UShp0[3\"9LZ4A[44hmd44ip8J2c'IIX1-[EGJH&5rd8P,Z0MAVc5ir(*aalp\n&KHT@T#fa49hH*-q`HaX6EJqBjf#qddZ-lrN&kjkK%pAIFKhX,LfHVlILV-+!PZb\n2CSRk4deVN`N#+MAdq8!,lQ\"[@FS0#lpF(d24MU38A2[M+ac+Y4UE4QTNNVC8Tq\"\nLb9p#'1VpQcS0jIZFHI)PPk,YSaPM\"Q2UbL9mQ3j4aP&64Ge21pVF[&\"HECHQjpF\nKTCY)cB\"jCp(NYS4j'+qQm6RSj)\"#ac2eI0N@EF0Hr2Zmq)(r8,-l!#CE6e8qR8a\nN8JZKq)NL(T0KeK(61!0LBHSIh`J+j%6,2@ZIQA#D([P#GB0e\"a1KBH`Y'90Mr)h\nN#T[PM1&IImMkdbdR&`Kd14Qq5FrL8lET,Fr`0[V9G0B$kUAk0r'e4&9)p&ae&0R\nM&f)05QQ*p3KI(rpb)HXQ2@,RMQb#XUY5m4m-D`JN9XH,)q804#)-BbFp0m12bH#\n$0bc*i2D9J!jPGZ0d)-kX)`,*-rb*1jZQQBiLY0G5eEX#!TI'@F$5#0mp2LPfk#X\n1%qcL16M-@!i`la9,lV@T-eRq\"dp(E1(UfLjkI)+kh@r-`l5FebVZ`DJ&k1fSER2\nhc5S5&GfGJpI0\"'Ml3l55dFP6@Rr*kCP9$9ckUpc)B1Z[`3!(3HHG3HZP'i#D\"jD\nJpJU2BY+G,`%Ld@S'JN[a\"J$@90m)p5ml*&C3HkH5h0DKbcAbUE)(SI(@jC86+T&\n6P+Ef+h(`I)`iNF&1TAbN'QaNZXSr4Td5MSqIRACe'8A3,fE$dmii2$eqh$I$QU4\n$rRAYAKB&VT1kb@F\"mlPS-,+eb)Er22G(S(`-*9VZ4#Lh)4ak*`U(fa%VbI8UYNC\nMe&2!VUBmp$'R1CBBS!HNREX3+-fkch'1ANI2bc1N&N%2ljTfN!#h*cABY0#a)32\n4iXGC!'6lh%mFVT&Eh`ri89H6#NLU9Jpf@)c-kc+[qf,bFGdLG6i`E%-\"XQpKEki\nrHh(UFa&*3K[H!iNr5c'I2,IV[$m91V#kdFE6k*hf@'J[-i!BU8RJ(rSG`f$+)Nf\nJ`XrB-9(FhIfPL0J0)E!-MMNN`#X[,K1dFXp@d3SqVqZAdTdiV'GZ1*h@XS8%La$\nR'bUIE-fR$c0J4H2,BQbmhE0&KDErEiikR-qHT,*JIbj18+e0BXkpH+ilUE(k,82\n@a#m\"\"2FD0HLjr'&PR0HR+iIZ,`B(LN8@Hm-bE+Dc$\"2r,Z*!5`$AVX(%`c#RKhB\nRV3!`hEq\"I)(`4D31c%5%UPrY$Q,\"jjhk&*N3b%b)5AD,EmlbrhN$,YGk[pbX4'P\n9,ABqq5mC-0IQSLQB\"r)&T,[(4-XQ'c(E)qXLY,,CX`6JhK0&'$m6qm4maY+`&9D\n9c[Jf2A[RdaXIZ8`TTZ@'!#r6el1i*L'aJ[QLR6iF#HR)dB&YfhqCME4rEXm4*90\n'5@8CIa1Z6ji68#d\"2Mfmp2+cd'`ZP39a,PJmfR2R'f[0,HhaFIHCGm-RImkZEpB\nfJaI9@h!lp\"`D%m!mP8(bU[0E6rm!`2B'!(DCk6&N5'kAp2XH6Bh()[hLkId%raX\n58#Bha*Iq,Ul19-P3)pL9Q$Z`qKiCj5[9BYFqpDe6SaEEr3r5h,irA5\"3#+HCCP#\nGp-kZ$P@$P@(e2NfB)fc-#BQBpKr&jRZ$@ie1r\"6!j!r1l@22P2DAmF,i%GALChF\nNmJR!6L,$YF%,%+!jAMhIiZ%8Th#ZV-'McfMbR+IkFA%[DFIFL8YV8r!9qrB**Yp\nUEV+ap[8kbjV(6Ml%Ir4lR'\"93#Umkl[`UVd@8MJ+PhBeej)`ZJK-6R`2NL2+laY\nf@dG3%EF6f'M*B02TR6FrHK%!083*9\"M'&Nk81pM[`BU[6XlFB66Xl$#h9)m9!I8\n-8S31J6[ePpN$$IfK+PK&TlPkhQdl#LCIc&\"k,@5NMV,f[&M*D6H,SlVbG#Be6iA\n805@,AC!!f%P-B-hXmHfJU8&lIb81%f`!U'MjeNfSBUT2qe[f[Hq(plL3!-%i1H#\nZCdrHQd*GH3ZD+0Hj$[hHf6dU@R'Yq,j+L$m$3FdL29+&4EellP8e#K)#HkC@phl\nJa4[d2l%KFE`8rBrEUb18HVAd#P9aA-)PR8$)LF3&mQK4C[08DBYSfUb$Fa&cm6[\nXPYhZ\"lHlcJ-DrHi05b#VJreSH!'NVJ%%VmebMIA0IU0ce[m*CYM%M)S,VVJVDe!\nDi9!\",6l-*VV@hqU3!!hG8GKDGZYHU)U440K!PX3J5arEb3cF#DmG-IGjf8MKlh&\nZ461c5B6IU%l-ic&Tqa4E9QZ\"Fa,(2S(EM*qala&BLjl'ec$Q@-T'[eM8l2(VJZj\n403!a*PkDYk#Q!cLVqf1lY)C-C(5H`1k$MS+SC,(%60!Nqhr#3[h5L@XLG+i2$k2\n'#f)1U#cYAL#3!+B0a1+cJFZ+XL&64%`63Y1D&-Vk!j!!4,dT$HhAF\"dA@I`UbTZ\nS-#D`Q8I\"lK@K-GHXSCi$QCX@KX&3SPJ+-rRCKGQcl8j9jIb4a6fq29V\"#02r4N1\nLAENQ4Q6'P&Za*+rHUf3bHVSj)Lr`411D*0eN@8m60f@i#2\"pHfK'`3DAl!PG*p2\nKBP#`$q9[eEU9S!AE[6#$$&-UH98[)$Yie$GjR%N9&5TIH(%L(G9pdF&jlGjp4+(\n`S%Niple+j9LjC\"S)0%2&GVr`[kKe)NZQaD1&bhi&3CE)\"%1\"UICYD&F13hH'Q()\nCGLPjqPDcDLBkS+R8mkS&+8#l$jDrBdXL8+pYM-EZpj4K4kfc%A8X9H0&EBE$bbB\n+fKHT0YK%%\"E%Naj)FF9jm-dL0)-j4\"hfG-Ch4&\"k*$9(qZ%-lS(E9eLaUpp[4i,\n@h8LLRqa(R0Jj2XDSDfS(i2'[hP!jKZ85N!\"d0C,pA1N6aVc[2RGM[djK)kq,kMS\n0%i-EGlQ5b5QhKikd+C[UhEX3DkL6rKKrkiAUl5!68Ip-F-Yr!bZ+%p(a$lrKi1r\nJB04d'\"Hj0j4ma04KL1J-,jA0e1655[9h4BL%VUCNebpKHNfB#k[C@dlZSQYmT1,\n%kK\"5)Ck3!+IZiNKr$jb,q&X8#E3YT8@*`%H*eMUB%HdC\"qMUm6qr*52fY&8*aD#\n5&[T44T`S#rK1*K\"b&E0U9Z-NX@i@qUHXZl$R13N+4GYm4DklaYJ6JY`\"AYpA+TE\nqH#U+Z(6JTJM4f@V1V6r(V1hk!R,XNI4ESFqZc4fY9#lAP5cUU3*Ha-pclD*hF$p\n,VB'Gce'aR!bCLSB#MF%iESpUcU,9`dmNl)-FrD)K#piBY@Dq53#9`C(!cfBVDRP\naXAdmNAD`K03RU&AHDlfS@5L,SP!iK\"\"q4aZAK,F!mLl60(iFRelDDb@He6DZb4b\nTpcGQB[c+T'*T&(REj5*p)#Vb\"l,r--!BPXU)4U+&9d`pKf&KFZcX'&`SHcR`%@h\nHFl&$T@d4-!*YM[hEF*!!81kqC%fkfa%CpKU2S@e+0JBj*jG1Nl-1ap!N2arr2'e\nQ[LecmI1&C%TT,9qk%@#%a8mX1'bG0i2HR(IVlDK%P6R(VkpH#jK%pCp*d9abA01\n!%F@ldm&M[FcLa!Q\"AE&,b-K96+[+A[0Qf4MFkqmI[FTrAKJ89VL2[GMkZ*ek5*H\n`bRBfb$+%YZr0YX28ZmP(b`)N,T03jm-cXa$Xd8D8mPQ3!)([c9V#-hLk(8D9*XM\nV+Fp-&CRJbN+qGVNSl)Eq3)5YKQJ0k5lQUkK-6Pm\"'HKH91`EK0aLVSlI(`LHqM`\n2Q%CY8c$ia5ZEAT&-1!5S3p[C5h9Q\"CX2j%Yf@8d!FPDiE#qTU0,jJ+J8FITSeVZ\ni`42)4R1Sk#)Sa@C[,Qf+e@@hHPG9qrd20!64b(&*4fiC`SGV$mf@X\"kK46l%[Kr\nPjbQbQ%q&M4ahZKN6LZVTAZbT81pc4l8%K3pTLXV2)MFb'jq)qLjP-ff)Pcihl0d\nXMC`AN!$(R%,K4E%F1ifP9lC1D)LT2P[F!\"'c@DIX41!lE5JR6k'+)jmrFqdA*$B\n@IKM@JT()*Al3l@@+kj`i`b!P3G*GZVBD*l''QDaN&RLNc34`G!-dCKPpLYR4$a%\nqABImmEqTL#Hc&HDd(Zhl4k1!Fh[!#e#$l16R,2Zia4c)L2R(cTl@2NrT!\"b#V-l\npR+r+P`Sl@Xj6I96)kkmEH+ji,!k'KCBC-QBfUZ)%!4r9FP\"0bp*bU%(j6baU`E@\n-Z%4@rA0hqPa&-ap!ArGK(@5$L*Ur\"9i9TSFePHS,KVFrY1lNhKq!M8I#$VKkNG+\n5VSaNI\"AL3eM5hhVA9Y*L+9YY9''Fk[pciK2KHNE8fqH++U%0#Rd`2mG2dL1aDPm\n!(+SXPQ&dH[6r0'l1c@40S&SceZL4'1GCp`UXj5XVb)GMh2Xq\"6drDF)9SjP4X3c\n&$1bjp@$NQAH3!&S3&N\"p%&[DMl'hU&3RT+S1Fe1ZeReCV,f)b,lai1IU#Y\"B[ZI\n8Bi`&)kJ#F6'dl1NE%ZhD)J+$@iCNr&M9BY#$CZ5c*8Ya,,d#R%rH%FejpjVcirS\nBk2piPa5Na8H0,,')HVlM'GpU$#1p[5(`2dIf2`6+Q@Zc$kh#JGFHpjdP5aTC6HK\nY*iil,kH88X)Ye!c''2\"rMIVHJRV,6[[KUpp'e862I3FD,)q#U+LhB,6NjMF@#4Y\n*XLXVL1Z0,9KYCpD4Lb3VAcV-CrX+bjk\")p,Be`8j*!KX5YHIrK)B'2hTIZ158aZ\n\"8G+PP'3Ac)*+PIXeH`cRDH-UkCFI02@S!X'M4'6GmM*0Tmc&(KR2R&R'a9PN-L+\nJDfF\"P,XI4qASL\"e+cIjRPB$4*FbjlUm$%hAchep2NQIid8L[p#5i21$bTC&dr48\nj(Laq2lV(\"JZ0lZJ8#a!ekVH50#Q+Q\"r#l%+X#0A3$GHD2B%91Ld'%'L0\"Ta$2bV\njA%kjV#Pm$*lq+1B)CQcY08&K8ZPf%)'Zh!mjiNkUYrbk$%[[5JJ0Ze,Eer\"03jG\nY!pbdf+fKa4LFQq99E*bC+SJIqU\"q`@mXjT%$A3Ui@Ik)[rAH,0RPKk3Lf[mPH%d\n[hIS+qmQBPCl+!UqAQ,ZkblAcAFYHEYQIc8d+e[F#M9C2%!iG!UA`Mk#%Ba$LZqe\n#9A3M!IG(M&CHXNiBTGGFGfVpjME010@m@G3@*YXdGlcaf\"V(\"+feP4MAA$aC*II\nQ`%ic-m(\"'LX0QU'arCV'L(Sj((k2@mJkjpm`r!AG(@QIe%q`6K#VceCrZkR8RqC\npRcE62mZ`VcD\"#VA\"&fB,,@qldZ#4)Aa[8pBJ))8ceHR'Gl`dDSlccd@!k\"cl(0r\nA9ldbClplkM$HME`R`G\"PBkqmTBaejSba'NjAkH2l25iX5GHpD85(LJl4h9GV58B\n'1+!M4bj3E'C0'9`+\"a[mJkZj@Lbd[qiAj-'64Qqdc2L\"Kf)8*pMSX*k5[cU,Qk6\n+2$UQ5m@fPNHKldL\"(E)BiGaG)e)hTJ%c\"Q[m+KPED2XQq3Al9K6K(81SG3kKeH\"\n0$lI'qSUB#%V+b9,bEA!9I83JJ(!(dJSqQC!!JUH#1JE`baLlFDj*Dah5CVkC*@)\n)Xl8dJ`Tq9afJ0m\"&-l6M*@0PTP(A9SGV2%-#8U1I#e,&eJU#R4\"eU+@l+Ki&8@,\n1+0#0p'146K(hGVPfrd++2M2`1&hC1qbIHVU&TG1TR++($K#D%kR*Cb-R%C!!2$e\ni,JJBqKdm4CLZL8%XS16ar+J1dR5ld'G86TdBJeBlfcDAP33l[JjKLE%AHF1+rY2\nGf1ZEbaQf)4L)Kq5jGfbcX3AkCSZ6DhPA6BQl@m6amlC%c'd5cQ!eVK8dpl3S+\"+\njYYZ!jY,q2K$jC2TXp4qT\"Y#+HK0LYddq!q+3!&jJJ0-i6*V`m$QlHB,[r55bN`B\nNVd6Ar`1MHJhpcfr4DK[arP,UT+Ej80XkKcF,*2(eY0-aGm)a9DKqql8m6EKMSHQ\n4krppTf4eTTJ$RXMc-80Ib84M0lb4ZdFc,jTCLBCC&69M-!r4S`N,2U$9&l$5)DR\nS+*Q&010dIq9R$(G&`p(a,p1jT44\"`B[CqNAE5-%UX\"S)bdqm32+N)Zqa$18IMa$\nEhJaMSph3-SGC1[,QQ%)LDIm2j2Ul8VlHpRq(FKIEe0CIEhir`llIiGmAm1ZR*p[\nIYIKk2AmqmhqIA3$iD-Z4r0fHFF%r@b*0%X\"b-Ef8`4QZTb4`BC!!FN4,1NBIc6G\np`dQ(I&9PBXDHHEX18pZ2(0+lkZYFZmTbrLMLR&&G)X0%rMG#h!@h4Ie8fpd'$8@\n'5FQSBSFbqF@!ae-pbKKH**!!FXS-TYi(c&rdV,qiK1!0kHq!m+pG2aJVDD1$VQ!\n'$lR,%DZS[adPTA2`*4l9epbKLRF[#X\"q1ScM*r!)1h0YFKDp$VhY3Y\"1IlK6[Bp\n[8K*,IQh1bReMbBiKR[X`,FXKYlpY@d1`$2I5#ar&SYF\"CJ9&hQ%[k5c8aTkEQ!%\nlNeIC6pR9V'i!Gq'V84QU-U+jPXC@A,b0jcZ6DGK,QdNB1C3m3qarefR`[Y4h-c!\nC`9ULLPY,P*5(T'ddSCa-jAQ6%*QU`\"\"!PPK+'[Z+Q'%d,Qh*BRSi!pX,cT%qj%I\n$QHJKGm%4,p6K#99`,8S&$!99A!#l)H6MF24L4m4j$q('VS!#-8fb6c\"P)9ea*LC\nBKS1)VaD@Yc(pAANqLl306i`R@*[*Ph+h50f3!$%!Vi9Jfa2B@I)eECQemfD',Nk\nhV683)UTJZb!eSXl6p(VSC3ELLIp@C2%PAaM3p%6#BVeZFMD1Y%QD0B8Z`NlUZX'\n,JCU8YU$dH6a`SQQ6l)PFR3PGE\"LBXY['C1b9GIXHGk80&2LbX+q3!\"0+K\"M`DaV\nb\"Ub1)`l1&k[0jh,i(jS,1[pPb-)0p4TD[X3YV$N,b1L!90L@`AE)B8ZRY')&A*U\n2l'1ilEYG-Lh$&Q33ciJIAMQ2fFq9UR$E2D5'(@Gem,X9UqXER4+RJj)dm\"Jaa[B\nN[BB3c[C0F`4)!%)ph%4P8+!&GhJq&&UQc+1-GP'k5)\"SRU4-`hAG+V$3c&N2#Cc\n*hhm[qieH$6meI#MCiF,qL-'#RFC3PLlFJm3@VebU+bN64Sa,@,9FRV&KT)II3f@\n!BK&1*0fQ9djRl45\"jPYXml)6X\"HQZ8dlXVHCa#V56`$4D24Z5K'+CBJq`Qb')[Z\n25r!rdja'@6erHY'4j6eDJk5S+F@XmiD)cjVh`pG&3Z,@H4RFXN*FNkQ'5SX,@&#\nlPh2X*pGCjf26Tf-*[M6\"NJ1e!kpCE,K-6X&iNL8V2eAAM%*bB-N[mUV#\"Fahe[c\nIfq)V2XpCEXMp6-B5'@(aD(m(YB3YK4a[0RYYk$PG!VC1ZJiVKraI\"c-#Sd1@h-R\np6L!har1m,bSEDXH`A+m,0UMk)Bj)QiGN`l`i3@0IQ%UKKMCCA#NSC6G4kaq&cq$\n-85#PEm+!pE8$DGj`'q(%!F43MDFEFEKlU,*k&TQpZ[d5#6bJ0ADNlaLR9IU@T0-\nXNVU$`LLBTZ9e*[AQqHM@#iLPF91hrCD,9YE8JAXVlfPG[0UVAjFj`fB9ZHASf'r\nibm9j+5Aq-D[%94S*!U#VcI3[KdL9'IJ8k,##GjjcD(VdBf9NZDBX\"J2S%peh*@%\n3HX@iFp6Y)CH+SrfEdk+#,!0MMD+LV,1*JK@S1c@3!,QLbFVB)!J@id&dqhZKqXC\n'`ph'cZdTmbHiZP'f2QYm,0)4J!04\"pqCVjB6P6[mi[iNcc632k(dAcE*hM&3KfA\n%-AXMNNN*2AP)1h)(LKbB8@1aDAdmp[@Bica-ll##MX@qJ+[r8(@Ci8\"q1'PcLl+\nIX`Uc+bP,*8BcTR(VZqHZ+P2S#dCjCYcC'%`Y6NL\"mmNf0CDF-b&qZ!d4lcH3!2j\nbVdjI2ff5+HR-@-d5q1lbDF(QYL#pLHRlI#*UlkLpqdBJ1'0(Ja')Y'GT*N0V&65\n%r$d5#YL)TCl@'K5Xp0hU!9ZM$*8IL8Fh,&Bl0rCVF-ZiJ62L8p(TBY`TGrKTV([\nV!(2'@aQ&daJ#3XVq$lPANXKYhTY3P!+%pZqFle!BAQqkFmI'AD'\"CYk\"ep*j'&A\nf!5B9GL,aRdaR+PZ-ALjm'RS35RcA(V[YID%bH$UI10HeGa,3lP&qf)YH#JVHhLM\nZhbdH&1#XRp3D`Er'#H1@N!$ICrG6Z5q05m3p*af&M&$E$p#'\"%52Q243CZ8Z#*8\n85JKcb*!![S*ZqmaPSAD+[[&[QkpkhE)%3T!!cRP3LClI63Vh8QjGr$il0JMRa'E\nK`J0JF*C\"AP2+J&NIQIM6)A*'JCL&1E,LVrHE*Yh$ZZ),0DmL&%QMMEi-qJ2bePV\n2ALFqH9UmB&\"AU'`D!RqqAS4JJ5Nff+Vj\"0SJ!P`QpPp6`LB36GFD#TRL0YCCdS+\nL#E%hiklBI(+I3dZ,`$EcmUU%k[p(`56Q`qVe&iUYHjL\"4KU$Il1em5IbpSiYMJq\nmqMiq9V(,%&9CVXp\"4f@[mQ!)eRje`aZV)`l$l-m#&CPjc*@VR8k*Fkh30fZ+ZCl\nZC&Ah!P'rKlFS0ED&+8)EVa2aeck,lcZNh\"me+-Ci&`M60m3RV@hmQ[%3TZH664p\nHiemah*,NBbrSX$d31Il%ieqD#Hp$Y*G,e&03NhZc,qN#jNMdjCa+'@NU#XdCbN+\n9llTliY$A!Th98r45@bm`hN1a#EJ069Q'0ZfDKi$0BHZr$[3c'M-`Y)96S(B1L(6\n6KhepQS#3!#DV'B6RLK(M,IB&B$ijQ$QV@m#`dl@QaAe%,RJUb6dBU+BCFCJj5q9\nH`4eCd%JC'rbK*++BUBVPpE#r4m2H@B-m59BmA+\"F+kLXb1qa&5RCra!!Fq(3CQa\n)cdY#kD0lbaMq+GrU#mm&I98mq,hccFP$ih&5Y%D)'k%d8Ti4*riX\")Vl6rDr`RC\nZ)DlB'IU4!e[E%LjrpSj!6*m%@DApp+S+k&i&kP$lZS#+r*5eTDMp46*'F2Bec28\n*kAjj59V)j(HJQi0Qq!YQKR989bb4@R#2Sl1VHQ[ZYjci!,93H0XMJLq#h%iKkDP\n1Id9cPcK4qJmC40VAQ6j&1%p#iZcIl!dV6rI,lFrfqBjcIV0N\"LmA(C!!d-84SUl\n`TLjlV!\"(Vkk!S6+dipE`EZ3RqHZemI-Sm9a)K#j(FN+$q%km!QeNAleFc*Y4`ri\n)BcXicd3J\"KE83!FAVAdi0q#iHeNkI81#YXqPL![EbK+Vr,p`bHE&$ib3!)0af6Q\n%Jkcfj5aI-\"`jf9S\"0*D,A%fAkr6,iGBV9+)GGachD#!R%aNdNB$6IB5U0!',-j!\n![Ch!i6+Nf)f8T'2(6I*SMRU68+iHi5*$B*YT,HEA`NacpY[`DFk`AG`(bl4L@mN\nhi3(VFEGIK45-Pa2!i5kqiH#$5$*mTXEV'Q2X0hhXcM-62KKiaSRB$$%i2)i+cL2\nAP$rfdG9RUl`qZL+DfJ8(j)2SY&FEIK\"U5*F0U$VFJ5j92IMd!S[$$lbjBd\"LBYJ\nR086''AbrFN&[AN'DJqY\"iUh9F98e1$%-6`VKh6#jr@543-iiXm+P9LqqmXVNh-I\n!TH,R$6-$F*%ebYJcAfhXb1f0h##94,lqr5D1@B%N4bp#-$Ga0@6aGFb@[-NB%fA\nhX3&6GGf-er5fYb,8N!\"a'DB,CEqrlqR5Q,p-M3e1GZHeEAqdF6Cie0S&e!8'J'2\n1MPb+`!Tb(`[f-jA4YR,%V(-!SH(hfaD*-8eG$V`-pb,3BY*hTQX5e'K!h\"@C6\"Y\njU#JF*j6Me)YjPJq3!(kSJ'r%-AU[M`pRR@0*8qe1+#B&3MFGVR2imc,BQ$Qi4jT\n&L***Zj+%VcNDV-k1T%rafXl0U$cT+H\"1q\"1@Y$!ADp(&hThEIiSa(5KiV%NKdY9\nK(f5@@lQD'd9c#-dA1$j3Qm!'%9H,D8kpp')!!jc66qVI6()U,Gqf3'i+G[e6%Rb\nJ8$A'D,DNlS#rqQL*mJBHH`\"G3TMB0cG,LRpKmkmU#U[r$DIpKB5+#UK&6mMa&&Y\n0B\"AL\"E&-`6e$)Y)hp0KG-HT@i*RcBjM%@S%'\"`EUjGpNEdC9MX%\"Z&DYq+fh8!J\n-[@$V8!C+23B-%G4QGZS%!E+XHq5Z!DeDAlbSf`)&A\"[*b-5Mf@r4Y)Z8@V)&SMd\n(YkPD$IprmUYITd[1(6@hLa(rHU296j-+ZfKV%Hb%dk'IT6ZR415EDMUFE*9bR!2\naFp\"MhSeU)L&DVNiAAZ!jbiLlpc@`4BRNk\"BBBVVaXjbA9HF\"qB(0AN9Z-@6`TJ&\nJ#4iP9&K[BK,-J$IHKGq!5X9FDd-ijmN0-bU#JdNCCrS,U9UQc*5G#8Df03SqVjP\nG6$AB'K60#!j,U$H86DfFHRUSF9FlK,B46Rj&P(R+e5G!3DRaqc0VRJeJUh'*Q3E\nYcrp0jrT\"Dc5E69'cYGSMlbHK8VcK51NdIe\"&L!ra!`k$[cNJ!#1d4-k0G3FK[YN\nCpN\"jMXXZV-'McfN-i#!NG!FKafRS+69d'CHAN!$3j%lb2'NYh1lf#eSBRJ+L`qc\n!(+('f2AG\"3UQZY!FHXNX-A,Bm8P#l(KT2fqB9,mcm+1*`'BSikihKD%3efFbbmI\nP*e-cpqc`8lh4%mMeDG@bR`I`!E!hp*dRQmfYeHpXYamb)ciJD9'2`$-Y+U$2JB[\nC3Jjch(UcG'Rj[G8!Er)hN!!)!XFN+UNfAP*FMDFe1Me31%TESGS%*jSq+f!Z#R4\nRaDS'mRG6RScH`fR&NS16i8p1+PY\"SNeL-`1[lV1l5!Xrmh*i1\"@4eUemU\"iNcY1\nCJP(5BS`r&5Ge8H%ZM9U\"R*4f45Eb\"V*djRYZ6E(UleS3BC%Pi1[eT02lmZk!ZPh\n6E[@qKpmY,PP-Ikr'GKrb\"pbJC6Fd'V'deL[h,*@)Sm8\"KS2&Kl\"[l45A`,8XLD&\n8NpEqb9UJ[ISj,FT#DXdcJ9b+@BdQGfT5)F#PVHZTlcCMTf-QQ,@3!!hU$EaQ\"RU\nc)BeN@!I0,1#(HjA1q'@XS4b3!\"Caq$C$)p4AHKM4*j+`q6dBUXKDUMi+C(JA4Kk\n,5E0MQ3qhC)kB$T-A$4V,d'2h$8K5r`fd8jYLKmpi0%0G\"j*6a3C`eNca)3YD1U4\nIcSb'p$2%fAa*i633aLXZ805rh$+6$4F[8bPjVrdZVJ&4A*%[rVYPEhHZLcc((ri\nJJcjDb5i)@BU(f)!@Sdcf0[AMD3hXqIT*)9&G6DX58L1P3\"ad@8ZP#QI)!d4LbBK\nR*3c%!h2bjNm$+I(TZ4JjRh!'HD(e9UZlHE(cX`U\"qSNB1+jaDf,5mG\"NC$c)lNr\nC2aJiVe#aP1m!9jLmT@0f*Y2`a5fLZifj'5d5IlpZ1qIVqDET3pIa&l[f[ZKNLA0\n\"4jD4MGFK+Y$YrTK0842JL*BD*Pe%Vcl``beZ20'h#)MCIG[&i&#K0QQZ%h#l+U-\nqKkd,l3`23*XdZ6D$1Jcb%[9A\"p#V(1H+A8amNLcka*kd5X8*3QK#bGV2'FYYY*B\n@*[XLN!#le'NBJZpDCaFha(RrIF*R5D8USU%eZK5aPe*lbSTATC3e2AklRC9BHRk\nm3KCVbTmG45rbAEQ#bfHj\"LAKjj,fRX@%%@5A`&SB$be5mNBmR#f-lV[2JmMV\"52\nak\"hfr@kjERPJ,I%6*[NZ6KCbC,(rGK0ZXfBApHj3T&NiVD!AVP[69%UlBlE2\"BR\n3j@FqLFSDTHP,L'a$1\"'SJ9$\"Hp(fqU'MKZrK5dDhRB$H08F5-5a$pR$G0c6UF*[\n@IDUiYZqlm6RAS+HL$@1(H#B-K4\"D23\"',46CQBqR)$#T4i[c$*q'#,$be4Q',c2\n[2%rCbF\"TjRkNjjMe*+Bf#PHf89D`&'SLV9#mhmAB9!3JCBh4Kd#aACf!Hk85c#U\ncfjTJ\"cQS'8)G&BI00)b*,-r%5b)aNrl*S3T6P'8)M9b&UB+p!$&#H#kY*L6iCEk\nfQUbN&I0%A'Mk$i14j)-f#QCKjd'#Ei69CKqJZ[pq0EUXjH8,`cci$YChb92Q1ah\n[18HJm,l3Hb#V6Gm+KhT*IdJBL%2fe9Lpp`kC+lpVH4mq+1QJe*qkXE`q$a'q2dK\n3\"6dV-ZRk3&ZX9kkHQXZ@&\"r90%hm)2\"rkS(L0$iNhjfQA+TI8r-$Ee3fUq*4JP$\nE@kaKM#AXHHBq5YKLNVk!)f`[R4ImS@8k@9Vq&Z@Lha*9H+XL0r4iA31K2((N\"JR\nZr6bY)!EkZ5D\"m@5+0AM4YZJSTX!cY%[kZHEmD\"951`SLpiLYULV!4fXYFXET%-'\na,S'Ufq+lja-C'-[ic-V+T\"B(pL+rhr!,i$hl@J4@42M[FCi((Sh[fI2fNIBDP4f\nMZ'@KP%\"$eNlaBeV',@UQN9SC\"Nb4(je*'@p#K0C0r&S%j(1RdGKUD#Y6`'$fQ5Y\n\"pSjNDjhe#U#dXi[B`dpLG-jQCT%ak(b`jNdpZM,9Z1HCHNVNkMZ9VS5HpBbD5VL\nMKk*S8UrXU@6$XAd-2B+U5J0\"1cL,qTiDG'Y#d[Dk&`RA[k@(U-C9$GmUP(%&UAj\n`AXa\"\"6f@`RdXeQ-IAqc2)dIp814%)9!p)08eJKe\"Aa92KhV!L\"!8ErID6qRJGFQ\nmbV*!)SM\"LP\"4Ekjk%HijSFN`!jZV2Tm&@5VBjaC@9qJ-V!'hMS%iiK(DiR'FTAD\nHR1[32CMH)9*kjCfEFQ('mFNRYLqSX!DdYeRr2Ca,fEhDQ\"kcAAi)V\"Y'KI@+MT!\n!`F%`R4+@09-MHVh[[6R!)6l$Lh9'Pr'k5HAMch\"KL3m8aEjEBHc**4S&LGRBbDQ\nM3+!`0E(rDGBHP!Y*X00`cF[Dk\"16Vm[r&\"*F84ifiH$M6%+h`\"dGqD`ee$I1i2(\npE'$(Da3-jM8\"0G%GR2$MQqJ+`f+-Qmb2aMd5[q5d1@fR(B,ck03V[*cZbC20aj6\nJU+QN#jT66Ae#Le&Sl-4D3iC'YeZh'Kj)m0j35bm,h!U+Z()!3N#F63-%lc&04R`\nYQ!\"`AUrFeTXppH92E#*%mMEb@d`LBrC,b,fe!jVDEEbTcZ$C3,CMPEq%%@ZfX`5\n8pShc*&perf0$62HkdQMKYc)!458qfZaZh)5)&m)K[d(!KhUGhULVEM*JcNi`hPC\nkP%j'42mJTD(VQDE@8A6\"Ak1(X%Ak-ALGe2J,5Lj$(+IlPq@jk[*aCcm$)m,T&4`\n,PY-haR%+f3c+HQ(h`P-$JZ3`Ek)NFR'J1FY%`[+Ia0$B-,Sac4J&0N$!#!MVHB$\n@)KR*5reLe-!-MlBUG85GfF%RG`k\"'01\"MM@%J&F6Xi+b43#*8ZlN1+1G3S%pXpP\n@B00BQpFBq0'Z%PKN%+9(L0%p9hX*qU#Z@l(rGXa48`Y9j\"1G#qc-'@P`qB2PJ3[\nY1@fcNkehr'p5@KS*QB)a1QbX(5M-J[RP+H2C`EKi1DV,dQB(ei@4MrfrcfU%5#f\nL(RK)lEq,iX+iaF[d8h2CD*!!BiPjNmr4CBd3,h%PEBCV6%Srk6V%mZ-A*`,8dqh\nIQILCVmm3EDp+T%%)Q``$qU-YQ8*5Y3f`dRe&6Dki%'(h\"pVA*CrhR,3)cABFPYS\nJ$+32lk%hTU1#r$$H,AB$4rEMC'aT`*m92bD[KRIijdP9!00(AfAE[Ia8EGRqf1c\nI3&C&SRZ@qa[TP+ZIbCITQ9H(hhq-EM4`QR(eRcdL@UkGdQ-%#8j'lramPQDjbAJ\n'0LP#MjA)R0R`V5$-#,H!%M+1)F!$BSLKPcc,!28hmM@#3Jk`d8T-U`VF*YcepCb\nFrTGB'+Uke2V[UG5HXH23QCm9Y9BIdb%8pbTmGcR+k4Y2A4H,YI#$'I#LLhQFBd-\n5UE5Ra*XV&`rDKHQ[(R*lTpXPIjN(Yh2Tc'QXX4m%l5+Q'-Q+$frThp@91eT`T2*\n4-q!q,Q(YU#ESc'Y+j2!D+Bmh#'p-j$%Zh!pS1LR5KbcC$4,Ebe@Y!)Ib'%'+6'I\n6eKfXXmJUjA8R+k$`+q5QdFJ`2CBDY$3[M!$CLUrqM*)*4#RajhA[IjAjFJi!0Cj\nk()M'mDHZl$I%U&,*(hb*G%f$R\"PqkSi3k5V2dVC6cYlpM(1Q[-b3!2DrhD6pHme\n%!l(GNpbaQKT9!86e$1X1ickCl`8$N!\"&dq)4RqTFCC!!KDTLU!Ec8l1N-$%d#pm\n[IqP\"$9TUM%8iQFMl%`(*fB3Yd4Ll#pVVdq#ha1aj4Hi+6%DjrXK@4'M!MFTrRSU\n+pQqIFYp1r5BRfh'UjrV1)VB6MEBq0AE@N`eG(&1[h\"Lr&b`+hJe*XC-YRp4B)D-\n*!mlSITA*deqM1lQ&K&%8IQ8p@k[bKb9GM1l[-pB`pJYj%-r-D1pif+6DS56jecD\nXh*ji@882))0rce63@NK6@B'&G95DlbRlabBGUYE6hm%iMc,UPH&,Hl0#GLB3Pj9\nZAR!Q3Ip5hCJYIGbDdSV#U(*6!&r&2Y$Y5b+,@hC#HEFVKLJ9HlR`4P,DHRTjp@C\nDr\"&BBPJN'I9SNra&emG,kelD&V%(ae+l46jjcLUE\"3dq2)U\"59cX3iI``$-dXf!\nIbSFqb90D1f+a&Kp%ZmB2h2KVER!CM0DU!XF*EYIPdF2jGMC86PcjE&4m&q-J\"0[\nH)c(\"Q'VjZ[h*[+qFSpQCMME59ih-9+RD')LNKBkKNVfZ9a55ZYX[\"[-JH),2$al\n\"mM*L)+rYam)\"@mYPi18kFmp%[c4*H[YRKV%YAhNBQUpbQF,TrVGLNe!e,)#AE@%\n\"XjMZI'AVeY(1VmpMMb#8F@j03%\"EA+4-Celb\"Ra'UENZQ,6%'F8!)0-\"h\"@q0`!\nT@30[)%bZ4pBaX2j55C`TamAhZUKj)r$32rK49j-+5+YFk-KYqDX\"\"Q#MB-1hUXC\ne!@LlT4XhSZV3&HMe*rcIh,%h4-*LR'5+fa9lEqV*Ifi4'hhjmf0#jFidkH+hMXJ\n!YHVE%l-'6KJG#V*ldMa)-+,Cr3A&ackqVBMbT#581X#qjl\"i$J@!k2ESki[J@,r\nTP#FJZGa0fP*qCT!![RPbKe$3G#a%#A!3a-Q%4PcrHL0QcQ00rCJSJ$*M`*NS-ch\n*SCPq%\"QAjcdVi-VfMC!!NT`MkR8MI2GcL3dp1F6B*qUeX(Ei\"@U5-'9[(%Lf`@!\nZ,TpZ\"Uk\"-cpeTH$0NKb\"(FLIA(\"+d+E&-AA'UpZS3(3$!JJV58J)S+!#C!AqdqL\nlN!\"VhCac%6Y$h)ZkG9hE1jei+lM9(0ql9`bU33Ar@,2Y$Q-A%$8qFkk1jMJVp@,\nkBpR[PKpQS!B6KFkEdTG+(KfF8R31jK-DEG1qF[R$Jd*6eYk4%!l5kkeV*-K4MFG\nMbp96Q8N2M%m,GA#+0A68lU!HCYrCXSDBLMaY!\"JZ#&i6cqMJ5+`k0T[06I2lq\",\nEG+lq*SQTNE'&4YD`kp,JAP(BF%E8fiL4bSDBJ!EBY'5SX32ZRrYZ[`SlAj'%1GU\n,Xe*RJj3dbGINr2UE[hRq4&R23!##bXP'''(2,qfp(UJ,bRq'+LJ5'a*m*)S+93p\n*r0bhml+M1IGKS[JH-NJ[ZcNFekAAFc@iLr&D5TrYcCG*I#[X6bTM(*eYCL-pi))\nGRkFGDIA*S8XF[bEVl*[+\"Q*9*XSCJpi#[YkUh[afX9*lU+%GGCH1CE)`fG#&rbh\n&I-Q4pM*[@G#k2(Yqj4h,6Sqr8RX6f*iC0#b9-1cCh85j(iM+I6`GrM@MQMSEQUp\nX5@TcYS3QD-[q*[mVhm+9k+TjYeq[`20Ja,[E-i#EQ-f@cQ!YKEPV)q-B--+Z(A9\n##q!8fP,,-N,+VF#3!+Q#Z*FX!m3fFDi#Zf!D+8HZ2#41NhdlH\"&NLdHZZPHY3VR\nVXeD(F2prp*()6+8#e0%K&(r&!hlCVkP5@f+C\"cQf36Q,+F[00Ti-C$jkHJ[ZC))\n#j$[-DVrfcQHQGA-(ZYZ'QQ+HXR8bZ)NQE*BL4hYk`1S'EJh(diKTfASb(6`ekP8\nI'Q8PbKXIlGDiEE5PB[,AHXYZ+Z`YR3VbCGCrM*pHPGehM&kcQ@Gr!f12))\"\"Lfh\nA&Q*&BR3$4)R`LN,59'M'#TLkD(6N&P\"0@L2+(1[*j\"Q4,U8LlSk@-V6N8RfUck*\nM1P)4C'%%iY2HF@+eVB&BHc1U&qC$j1KZ&[adEl-dQCmp35r0@0VBA@MaDT`j$'K\nCS(Reqie#-Yp@0@+HXQVL[@M9c&5DJ(U@h(Xq-(pe)#\"be9CQlr(X2[8hHm2-4pj\nj[JQDKabKE6L-%hY*0CX,XX,,[@[ih&Bl[BD!b@SafPiDp*!!\"rRKHd1[@+UA'Q`\nTZXHrD\"'j[3LSE,ZjlBV6-iT%&ld(qA)Tr6cYV8SqEBZer81-0Pk9$LCPKY'+%U%\nmV0C95prI4R1reHU-f&Z`ZQU-DXJ%XFTjMZZ()TEJm0XCdUb!HJ89Ef%XG8A[R+G\n(Rj2Dm1l,(fT`e!AI*V`U@Yb$IEde0%b4@-PmiLkjB5*,cU*JcENNXcGA!CU1818\nlRAXLi1D)Q8(,fF'K6Z'-6T%&(,Sid31!X8rfiCbRZDd9(M#6[$X5NaEND,Jq-Xq\nZQS\"N4JJ(0`r$8&`l'-`l`52H!e`La+cPj8DDHIZ$N!$CC40f2&j!AGQ[cQaUqDp\n5AeV)Y!24-'G`B4h&$-Ap9N%M&-8f1EmHP&f,RmTLFV+Q2RaZ54E\"P9J+&Y63C5I\nbP[I%(h&&AA%'1KP2#H0&kDh6!JmLINd!%G\"B`jblcSk4Y6aCT-**YBp`K(aRV)9\n+Fp&Rqc8U@T`\"AI2#C6#D0hf+mPQGYjAdC@T+dd(K$8'VbQH25aVCB!-LH28Pm4f\nc85)4ih68ib$r*4$95U[(2,YV``HbX`C(2mFKjRXc[2pS6+PS(94eJ'BF$&La+Y0\n6cZ`H-`)6+0d3bJYeEjilXLcfVI(`5hXbl$K*,B8IiaQ-Jmm9+DVlkTb9!P(MXl,\n%963H0@Id9\"LmMF3XkeSS5R'b3i)6djCR&fflc14B3G9UXbem'K9#TUBP5#949m\"\n1ZXJh$\"*8MLX8Y#X5SN$N3[+-6)Y2*)`[QKGcU83P8hll$cQ'c[2UGhbqVB&\"S+c\nBh,fQ&8lATB9M5Y#S+Vl@!Bpi'TRSq2eIAjScD2((eNp*U`-pA2%Phf,J3*PLKCX\na(Y$[I-0M\"hpT*fRCK,qQ,*Qc-haEacP1Sd)8flQ3!!FM@p+Z-JTQ*&H%DJkP99*\nZ![L-M*3H49di8+AGYZLGm`+qlcZ-)MGZQmUNT'8X2qik'dml'dTEpVdm$[)FLKe\n$4VG'0\"`k#qFD4006ZL@1k&Pk&[X1XQeqfPF,'ch\"*\"4JY&V@VQDf2Gqh@A`[Ifa\n9@QhcrHY\"aI&fR2(kbZ,0X8-[)C!!DreVDkXr(8al`m%FKA'$XN#kj6S`Kd!PEm2\nC+@ErID5*'m9@HiEZNa%MT'NJR$N$CPJUR&kamMNl%Mi$'jF@2l9S\"845#9E&i@!\n%AD\"QNCVBl#b&J)[0*K6*Y)PEL,`E16rT9qEC34pBiE[C`#U*Bh[$CL21B$)FhP$\neQ'mL(QA)Gepj6`@1JJe%!6*,9aJLpHN!*NPEM0[#b2hlGBLfZIHiG)-Kic65r&V\nHf@2Lqi,P'K$)rE2SDA6r-phm*bkS%q*\"BGr(@SV$cSj)qf0GpR'KZNXEhMdB8)C\n[CGp8I#0PZDbU6)I4#(V6NE)9l56Y1`*3lN3F'X0`VLU@3+4V'iHY`P2\"6(a8akc\na+dEC0JAm0k4cNU*L!DcKl4H!!RGYN!\"HL6T`&Y-G+*V@fi*EM['c,hN1med6j8q\n-@,[Sj#fl1@5Z(10F8qJ!bXi(*Nre-$f-Y%ZeacJehdm&if'i20&c0!2!\"V)lbhH\n58jK@C$E!2A1k%\"-@EQdlJ#qaBR(k2Qp1)*(ak&RXXrY'1[%SqJRiQ#)mi#RQ%qX\naYTpqSAijPM6SMk&JcZeYSMTFm0VbD!L,l4*bpfA'hAP1+QjDl'ckGIF#LV[DL+5\n11!j*8mAp2hiV6eH1K',,,qaG'N'jM-H(deC&YCL3!$[6GNiALPqp#8Y\"$Tc01f[\nac-4M+!Ah,ZjdZC1Y`ZF42FH!L!ID%6$ZH%!dqXSQm'iBP4,PC9J'd9)dhID!ARH\nr[6cDPhCGc)'M)\"hDffLFMFK8BIZfe$E@f2Da8b4'iCSj54ZP,qE[%S*BC%#56J(\nUh#eJS6DH5f(bZT@f4e`!amI1h(3*YMIDM8-MpA8hf1rJ#2eQTPq@XVBIJ`P[ELT\nK-p[cU+VHTAVVd5eQ9Hp-6mbCY(c2$PC+DG'qX(@p[6TMjCG%b$XP(F)88KUpj@M\n)r9kZJ\"*Q03kYM'ZI+6`lNRLNJmfG-`K4dX-@&55[bSB[-d3p&8Yb[kcN(Jj&`9U\nr)`N*L-fRY3(EA261hp,H2Mj`YVp)@ZD0MqrC8i-M11pdLFF%Tb&MG8Z@3,F$SDp\n80KY#2Lfp[fk%S*)Z#-Dc)TKd+fI#Q$iIRE`'[AY%jHbe[hJA1B3\"\"2k@4SqQeQ%\nd3PqLa4A#13K))`a+%EMc!V-fJIQ5qijhlqR5hXQ%%Pd%9)A0Hb+JdFFEEQJXCi8\nZea8K@bKdiP,%8FP+HGe0f$fMfNIh[Td,-,1#%,9B-f0$K8*Gpa8bm)SmV!kY$S,\n&K9NV*(paL(-m5p5m&6*S%MA5\"f-&)i*e'MbIL42#Y'91YF1rhTkr#9d9D#b3!$d\nAZE8P0hr6\"VND*@0cB#b6cEA0T'Zk)afZZ2+SC-3LU`NYM&8P'Najl9Vad4%C-3L\n@5PejVi&(fm593p,'4qN!)H!(h0Jj*,(YlLGqV3HR+QF,%1D1F,RV-L'&'T@hM41\nGYdrb$LmC[3H$@TlT@e(S5G3PG1K,\"(&92bLJVeN1',F4k\"Brlq2(qIYkQ&TCZFH\n2M`&hAGQadLbZ58#$Q(ec3YM0RbdmAqp*Y+E\"3d``4G*-KKI*S&f&Y6+pCfb)J-L\nm'8,0)fm1P(NEG+Ai,PG'F3F-6Zm23NT0[aP8,5r\"AiIVCFRB$Z%IX)Rc*NjLHD&\nR+lCLA6H\"0a[kS'LrM$dFMRK2R68ZPa'ZIXC!9k$NT\"R-)LMPT5m#l1RMHVi5ZiH\n&pcYl&k%(\"p9hY\"U2+ahk`P+c@+F![YKRmG19QE'R,iE(hbPX)b8fNT)2dAPTZMm\n+A5flGbScUB1ZQENhlq`[[$8l!Q8)$h&bf66C-eApIDV+DYET5!!3''$-qcHdTMA\nD$+IG1)b5A0*\"IPm4Bc#C@2pca6'T+PFbb8b,6f8AK@m2!pNQ`M6Ea$44G4e0kp[\n+p&CeE4IES6SUTa1@k-Za,kR9eILe@c[%$A`&RTB((+MXK16CiRY4FBUI2CST`Yf\n*K2j&d1Y)HXYKLXJPeDUT\"E5YbGImM&\"SEhL-lerMBe9#E0N3aN-DL@5$,Y&ChF(\nHm(F,F$GbkUjJNXI+JTkfVK[iAM%A6E\"Em38k-19HRZI4mBZRRGANHG)QUf)+d[P\n&4Yf6Vi20GpLI'ChB6bTCc,PT&r*#ERm8TTAK0Z+\"4+$N06GpMdePTZ'djQZFfR'\naTq!J'6ii*1hU4jhRH(XRbiY-+r(-i2KhZ)5A`@2l*LR4F'Slbp%m8rma6(&[Y,M\nKpUM394f'-F8*EMY6NHl3[p\"-X2'$F+c-2G0IleZMYK30IYQarI-(2ZhB6Tr9ZQ9\nSiCBIGpKG+Ef&6BbRcr`PX*B)Ea'IQ5465bDRE)a$STYXa3qF16d9qpr,fd*Qil&\nkV18!h$X,pmkQcVVITaR0h,Z$62dUrPjNh4qRj0MfQeI$Q,GPLQ8JNX(#pZ'F!a\"\nK*Jb4Sm`X(U'eK4+VLDXdV@P(N!#-KKmrhHeJU#H!01*HeNCBY1+ACe9IS*e6BGa\n6MSAUl)qQHaUrBf*Y)2\"RMREi4@frml5[icpc8m,ml`e6GXE2ZBm5h43Z9#4i[ZN\naY,)*X95(*9LjmarUf-CYIQMr92[Y'E2J2EhN!'(1HPEREBac6$dBGcLM,Am35Pk\nPM%9BbI%BiLhC([[q1SPmNDcR!f5%pmi6UpLLH'3j4E8CYC9djV,H#b9-Ljr'UAX\nlqBcC3D9!qPNeCLj18'cL5'[((IKdkN`iAE&rjRfI0Y-rbl#[0S%+YF%ACJXYEl[\n5i*%KI'p6e+jcdHMCQMHrQ+N0Y#MF&D'@'@'@*q'2@j3h6HV9*CG&+ReMFaP$rhJ\n*ZSeRrcr3\"NFM46@j[TEfBqj+`HY8H'dS+*Td*FjCiPD8a3p&TFM#qGYMk(9F*-T\n$!`NM`LlF`k#rPCFGC2hQQN)\"Hh(qFf$p@-M!jFrFip2%j!@Kd`'\"qY'ZqIB3T'm\nYRVa6$(-U&pqTl2FaaBe1S9!&&G1I&hp@(C2rHN3Pm-jM8A-8cdDJ&Ti4)ILCTi,\nrJ)X\"LJ@8RE*KI,N3\"N2r\"Cl3aQqV$eXL2'Z,[i-,,GCi`+UHb8A0F'%l$l6(E@b\n[44&efL6C#-\"L9I[l6baf*$*Q0d-m-T9!&#[r6-0'HqHFaELq&\"+QAr+F83iXVV\"\n&DUkdc629BVi,&0JkhMP%U`[2T8-P#eU[&Ub8m!eqkZNKM!Sl9'(6RXReAh$BYK9\nhM@52QS%j*iP&[j,U\"KH054TqZQdfUS`,qjqb[k3B3,lVS@E*m[3N*8+qAqqPem1\nDV$TI9NeaL(I\"R'Y#F4B6lCHkBR,LD#\"F$Rl,$lb+$0*0mecKEJbfaDC2`#ZhRF@\nNbEZ!3#QZ!Xce&HfZb8#Xj@T,E#-dJ%I9[hR3X(kIKLd9YQ-rdi[f2(T(C@'Ke8q\n`BE[c1N`5i!-+S6T$jcj4T51bjX-5)SKDd3Jc2fCC5JK9T'11FYire#Lf+03qKJK\n6jIR\"kB9f8qTcZD3`HD!!02d!ZY3kFSKi,k-C(PM$2$d`&5#,DbVPL1K8Je(4biC\nRbPJcG#EQRCMf[e*E!J&*I\"cZbp5\"bbQMKl&&8@LJQU*Mp*X08(C%2l$9adeAPKm\nL%!I)6hRqa\"Yj##J%M$$2HfH[VZXD[,#AVU!Rf\"SKY2pc()640E9aLdTIFeE8Q9h\nP0!9Np4Iir!,*&58`!!PNfQ`89N%MB&)#j0N(mdrYhMPj-9li[pE([9LeTKRp4F8\naTGIIj2Ul@ElHkRq(E[IEe$CIEheI`l`IiGfhm1Xc)qV[E[`p\"hqIG0r2Ur$iD-Z\n4r0fHF%d`lKlTY@hiG2Qf-BEFk'Kih(VN&,XJTcE@6k\"j8'@9MMA56j8Hjj3e!D,\nZR1jj6B1$YSi1eFclkJ`%K'-'3$261J0`[Ff[L1FD&'dK4#Sj#'CcH#![2\"rRf-c\n%c8Q`dXG2ZV@K9aG#h(qd[LYHq2&V[*[a\"*5RLU+QfZM![8JVM0b@eIE8lPD`1'8\nBFP&l1'1+k'E8)50r20bYTS4[#EpZJ`Xk!D%*Gk9)VAP91h[EIJ*TIRr)Zcm(5TV\nQq\"LU9L'eZG%LY`'IYaq,4#1-B1Thr\"XmYU,A(-cj!G,KjcZ8qcK`HkE(TZ4JjRh\n!'HD(e-'CpdJ,0e+jFLfYUM+I+H@!i&rcmD,IPJd`UC!!4l&3C1jF%Q,TU*@F(RP\n,*UX1H`L+**R%[@f5mZj#Hq*[kX-aa@JlV$f\"p-kqfQ@'HJKGm\"P1bTPNI2!GY\"[\n+V86XH[mFpQV1q9[*m`V@j\"SU-je$J!r2bb,plLSJKX`8VpX+U5TReb0ZI\"'CE`R\nXr[i+T&rEM+5\"0JTVNJHDE393ahkqk9J\")22+AjZaqfiKc+@B+qT)d\"JPVPb%-f*\n1![!lZ3)U!1KGK#X2'D(#QCm0,RM+044)MG'8Fr)fR*r52dR3i[Yq)5CZi-b&a)A\n-lc,pU`'TIG\"D)e0m!$G\"p%k@B)G,LSdrq!XH)A(rA2QGYAX#dNe0eTRU&kPiIiS\n5IpSclkq'`kI5HfpfLUf&\"kbaaAAPBAE#[,p`,-N@2-8CK9%V+SI$TS\"Hf-aBFPU\niSB,3&eX*cAmGQ#2993)5VP,`3m`De-hf*i(Gljbi0`8NdV1p6#T+HcNkeMBTCh,\n-!lpiVmK!5aFqE!`dlD@&m\"$`2QiYS4h0-I*6Cr38QVIc0KKSFUq!hk+2[5Y58Ef\nMK*Sf%K2i1FTj6T%62Tkbi+[V@DG!0RAqCiK5!F)h)(SE2NE#Y[F2QpdrQ$@k*iU\nVDM$\"4%!NFqU8a6KSGmD[kC6`k5!V%4CQ,QMbA[(%\"aS#pUV*1Qr1rC!!VJkca(E\nU4Be5*$rqYYfbFbm,2*5!Q`l(Ba$5&8l\"QKjeq'e$bC`d-`f8)DqPB'H`CXa\",b-\n&28$pppNUqLNZ5ASR1cQV18NH&dVpKUS(,%m@HBR&qXcCID6dFd,IkHiP&5\"0Y[i\nP9#r#lX+)fVr\"AVV3C0'bUDJGUkEAhr-e!*J0YZXf9Z[()1P`,i,$YEpiAV8UZ[F\n*RSAZ4Fi2$dr`9VZPpe!N%m`(h1VU(F%,'V,60E219NFEP2h*+-FXeG0Zl'hfhdX\nLpPJHALY,DjQqTaj0Ll+-#DdCP-5Jcm$f645j2r*IBj9!!96+0FAKaN0*(P)6bVd\ndj6%'HmT3[jLIm@NhSkkdV1RFA!#Z[&ZG1-AMmN5EN!$P'lEPIp2HD&T--kP''-b\nE*EPHja$eCJ8#42@,0pH9RYlS43F%3VCJrBJipDS@CU\"2e84aqp4N9mFT5+T&f%9\nc*BYAX\"irVN@-X&PLX2(l%+rXF\"\"Ke*VF,iYcd%Z)bLC[!CTRZ8[r#G$lXrcfIVF\n(6BdK,,PfMBk\"Hp'1e`Q(mYRJac)p,2N#JC)Z1U3*-3J$R5hRNA`X,)8r@ImNCcM\ncK4ElcPqAeJ$Z#d9F-0T&pY%8[B5Qr2++HTZi6Y58RbG0M%6ZQ#[ZHE'2\"kk6Hf-\n&Q#6+-b5Tf'clC$5em&G#3PL((eR[-(SF&J6UrY*`f0c+)TeF5lNETpcQH4b@TRr\nDCF#SBD(BP!#824r@UqNG#fMLJYfdDQa0G`h+`QK2(c`&X'IZHDPqedZ4fIbeU8T\nPGqE9VMam85C(iEkep&B$E%Ihq9GV2$!EqjBe(elA,-`E)+hrHH0#mbqLDSCk5pl\nS#HPViI$Q3M-6-98dl'#MlJ1V\"1Fi)e5XJ+@@lU0ic%(&Y,0-Rj&*!B)#45YIYr#\n$I1L&\"DBq&ZmlAeN02`FH\"GJVTVEe3q-[8ScBqKmrUV2-PAq0MB2aViNM8F#l@FJ\nqimK4SC4Bj-RP%+14h0rb'aBkp41H$N&h62l%qd4N$UH@%a-9GiQ!6B!q,B[,rR-\naGPDP!VjBp6\"Bi'Q3!(HRE-d@riKXH5PEJ,rV&KRVP9IIIiAMG9A*Jq)$-rC6rCf\nBLL[hF+5RLVP0d+U5XpS4UVXdI#2iS6!Nkb1JB$6kIjaTYNC*mF-pbNpPIDi66&E\n2d*81\"X1(,NGN-EKTd#'$,P+r\"Nd)HAKJ3r8FlNqkqh2)e%Ki-0@m*ahXG[Um!SL\n55DL5dCq[Qq3bekj@lUEh3a`Q#MXjRkSmK91-h61@&)`L[XfQkY46\"X\"jID[iS4l\nBpI%U!3[I(1cBURmZLD#APKPV*91M(j!!T*82JHVK9I4!-&,[q4[J2&rJl25!D)#\n5!`!ePl6JDf)F4V$9&J&B'elPIqN#jX1Q+1qk8E#1(rD8+U@qCTkL\"Y#+EZUF*&[\n1ec&DHjC`PQ22ma+6hmfcCEB1id%ZL&QB#3UY6LV+PdpJ[Fh+qqrKG[03*-FJd+P\nJf1E[r8Sm&8Z'irXmNUURmhX,90HXa#HR'kfA5``Icckh&AGLYhe\"0QY4LRQ1b\"+\n)1VX85HX#VrjmpG93p(KGT$JTcSIH`N(UkGlCfrZ``R34)b2eM-kH\"LR8a)ak[jb\nf40c8m@ccM%k+2qc%80rdZ(9`6i+hjZk3!$!F!+\"R9CUhf3,\"Mhr1S0Sj6Teaj9h\nF3X[iBb)N,5AApbT$#05[krlP4h1'DkM'8f6r)ZUX'90T9`FE'c$fCh)kV%L8cX$\neFRKkcf@i8XbD*G&eQBjZD$4&FGUYJRKHi*R22YrKS1-R0![p\"c6e+TQ[!FPpIVr\n1NSmTC`F$Tkpr5S`0NB88@6,mR++h5VT1*h*YPeJpr6qiepJDG(E*d-YeJ(ERp%K\npd-mQjUh@K1*-&&'+b-X([$!K`@$,B(THNL839D)2%5\"0Q)RZh3D!JpGVSGfCDeq\n60RdMRTUIC'hN\"dXU-Bba88rH4'1cT4f+\"C!!%Y%3LE+hHa52FYMPHSM4`j9&a2K\nj4LA*S*Z-)hN(M8Mj\"Zei,b$$,kkdZ)d1BKGNFkmAAh84JcN6H!)FHe&!P1kC21J\nIk`5D$MKS&Y'LL\"e$Al,UY)@p2F9D9rA6@E*CXQZ$3J6d[b+QJmIr@Jm&Ef9\"Ifp\nRm9hIHKJAQ'8$YRDBKp\"ZiKYre#+[C91r+(XG2Rfj1C)@mBRD@VXCC#!,ZN%#S3c\nFY@L8i0l3BjK+a\"TiXpG69%fVaBT1qTpjT4kG)ML-3K*RdV&3B-*FViFp8aKhB5P\nAE6e)86Sp%lbhNeDf(+JK$a*DY\"!*D$1+'0fT3da+23qBd#01i9510i2CbGqI#rX\nJ-Y6'Q%mhRS`6T*)PcDb-R)!8KNN&daUIa5*($9jeNl910'Tp[j3FFS&DLGrd%$k\n1Q(dF5)cKXUhkQV3D`JS@C4eQY1dS9SR)CE2C!c&\"mlHfE)984AUUGKlJQ2'5FbA\nm,bqLH$AURS,'S#!&+4!lV-,#DeB*T-Y+mPEd6Jqk9XJlV+K26NBiBJFMcEKr(I$\n,&M6Z01lR*Sk%+rmCeCF@42PqBB&([4$@0XeHEHFPMRk8'$MM!9$$aA##0Q6QN54\n*pM`[aCYQK#ElP`@4de+EGYQQ1aXD)I-Vhc%H0b@e+8p0K-1Z4,@r\"PM2[ESU9\"6\n@$b35XR1ALMSLm8Ar,a2[!)$*VC!!8Z!G6Z#UDS(I&kSi+0GR$q[E!4heFeR$f1&\n`+(M(kN+9c'V1fIPBTiDmUJQeLpcch\"4b+-ML1LHl$D3iC2Eff1RE1K0h1p'X@dD\nYKIpMXc4#Mp51[`rr)l2alJJ\"E'95DjM5!RZTfL*4k6mkYD5PpR[HIrpUI%4dXiV\nm!r@hPQeX4%d8[QGVCSfiUlN1L[bFLeS@M!k%fYBAaUqJSrXpkhZ`p`%AYLMY302\nDZ&*TF5bTh$5GlAY*M)&rU(A5AifSFR(aN@!$AX,aN!#rXpL0fFh1R,!%Hc%+qF&\n`-Mc8i6A((cjR0ZL$,Z(MbLL9&K8dqTb!2jSCYRTbpb&C9##rf'C$QYmQ5r8iL#A\nTQ8h8'Va$d*BlKQI6hI$8KKl0F3UH'*j#H[5-R+Sf54'HBKpf09Kk5CP3CC%04!b\nT[bA$Ab-ZBfV$L%eFTpqRcU8I#+UT4RZ,!Y&j60ce-@2*`iMbeHHdMbeN+JIZF3i\njDC!!)1G!D`FR&3r$2\"1S6i5CL(qf99GY0MjZAmjceh2KFU,THFpMDV)b,DV#UcY\nXP5H9Ell*hd'c)k5!1dD(K4ZbdhIE!286XRaR+0jb`\"a1CNHdN!\",lM)CF*qHEbp\nJUdRQ`SPMJ5lXPNEZ@U-+fp'$4,fN%3eM)BmjDG(hkNpLH\"1d%VdMH+`+mMSqGlR\n'mDAH-4-8b(lLeA4Kc522cq2BCe,)f)mrc*T,BdUf&B%Naf$RIcAP&A$'XA[meme\nPf5jGC3FflQm`#Y[`*fhpCCFlB-#!QIJL!fF+EGHK,8h%Ge2r3$d1!q6qF!ZkphU\nK(PD2(q!q'bFFdUCJ2b,0q8XhE0151QIm#VF$&!`3`Yc,JUFM460JQMC,EeH%+ES\n%BR+KY5VcVL(V0dY&V%k2eFVcPP9!cA[L@EDS0GLbJl0Z9PL8*&dl!i\",LCQ)GHb\n!b6Kec([RmM+B5j!!kkr@ASq3!*`a9*BZGZJ,rN1X)'!SHBrR+\"D&kq15`#caj\"M\nC04EfZY(L!pdY+1VX4`hDi&cmA#Albf8IeVHmj\"4arS*UBCjk83fk9(&`b\"9CVBi\n`H$$cG28k5Gi`I5A0jc(6aC1BZbFJUc(\"HEAPk8dFl5JhP#hGBYjDABEXJrV4pmG\nm,B4YmX1PhVTS!28[bMR4+PF@GSk$'B`m@SBhVULZ[pVHY9k3!+DiiE[9%8TfqpE\nVh0JDK\"Xpc!,SPQZFQ9!hpKCcA'br$[`d'T+GKP3LhZ$+UE(TZ4JjRh!'HD(eFH`\nQk3&P$@HNc\"ba4XQbHfN$e#6PLK9SAJ+b+#NjBRlDE#+qjV!ke3UcMLLL8bD+l@i\ne!k-b[L)6CZkRQSrKBf8Taqj+IajQc,4#`H(ImDjEFC!!e4%q#)R[bJ1'`JB3Up1\nU%A`Ze1*@B6X#a5LlbmlP*E&H`1e1RD0@&QS%M28LTj'DY0+(T4bi6XXDrL,#1&S\n31Hd)Dj15bA9Vdp`)j1!R8RZG\"630mSGQXj)K5'cLS&CT%U-mT,XJh9m1+J9b4i5\n`E3[R3\"Hm9(plr3NGfiG5('%!rJblmp8fHHZ@G%\"Ipa+INSJ@5YjP[VYr0M+Y828\nT%Yq+ZQCTp@ZLm-G#5-R`8q9++AU1G!h50811%P4-X)DTXh$+bq2QZ%-IY\"FJRL#\n94a+ea`%Cp%!EbM3p$b\"`[`-I-ZpD)@56L'0CVUHFSjXLBKfSr4J-F-Q2)9J%e*r\n$j4MP[e1h8D304a@(CCVH!V6%dT3#kP\"HX*cV[9'ZrU\"dcmVdeEi5G6b9XGH3!%p\nF029MBV1ALXRUA83)l'bF'P&PDS8Eap[a2E*[N6@%3P2RqY`MP\"qPD@@6q$8e&JK\nak-5XCZFIUe[%c$CJ8!&MY0V5E%r14J`RN@U+1hj'X9PVd\"-0jD$C[8j1TL6Id)F\nIKGQPMd0X-E@+iN5bbTkF6@1h,r2U44#RV2&K8AF`$biRlpBpeL0lE!`BA9Mb488\nUpC3Y)Sl0U[c@40'ADU%j2r5P+1M$UR6l*qhk'6!'URei5UETRG4eBU+3!#rTJhP\nkKFXlaU9ZHq$J%U+,K-dfX%IG!Q%l9F'-H0L6lm+m2PHlc-KjcIT)BI&G1f()M2!\nbBm+[Q(e1-0)0,jCdaj!!bSBXTCL9j*rc!fq)GFYamBINc@(#5\"fH(3UKeZ(DppN\n@+@RK%iT&cV2CCrC#YpeGiNFXS45Rf%,)djQhN!$Q@*Ai-MY'hUkVJSL$8URPE-E\nifK!pZV`qjH4KJFHrhHYMJ\"Q+pJl%j3aPFLZ3!*@VV6b8221Kh4-drC@UL'0NKFC\nKTPLLrJJrS*2PFb'Ic)h`Kcr60,BdaX[@NL(VELD[lGFiqj0D*c-i%BmlM!9**85\nI3,HCl'MrC(e`(YC#PBP4Gjj4'i&4NGH3!(+Z#b2(P[e*,JTr)q+IQRASr8d&Shh\nr3`Gc%Z'(%1R*bHAFN[($&Q)3FAd)dkZ`Yb8G+'A-%1dMMLL*qhk2EA88d8bUh2b\n$B%&KcS,k%S'GA`Mp-R%#2dm9QN03phl%bNbQXp*DAl-+k8Yq$HEmDdr6VY!91rA\n!q2L3!29R9U3k(SGHP(iE+UHGVFY)M8X+Tc\"jC@9R0hP#Hj!!hKNBbkdXQ4Mr9YL\nk%)MMqcYbDr%`44GJ+VpeKU8DQ*fCGZb&hM#%2!X5K\"f*-MZl*R5%Sk&QKUm3+[N\nlV'`[NI*(9*3e)IB3'`K$bC@!-AlGcH#XU9E6**E\"\"RCjiB0'D$&dLJpFI1r(k4!\nmN!#3!$`)P(N2%!Jq0jS#cd8\"r6N\"h)*JJQfQ55@*j9$#iijl5GpR,l(5Ppk8+iQ\nNEcfpX#D[VQL#KAS(&FBA,4kYMh1i4KA*8M6eCUAq#`KdK'kF4IFhi-FjC,)LiFj\n4mmFq8imPQqa'K6eYS,c`j,aG5S2FlGY&CfA,V,mYjTPCeim0d@+GS-0e1pcZlj!\n!i@S82irQeai4GZF#I6#jKqF06AdLXVPh\")+(*TIAP08l9&#ja)[Z65)4Ik$h%4!\n!FUG5k3EqIH`Y5dlD&b@\"G-Qq,&e1jCUJQ02-m0@CH`[8X6m0+DqLJKMV+AXERac\nN`!R1l+fm#1mY`iT6APV'!E-hSU#V2iMQc8(c-G)(dZfFfH$Q+NUUa#C9qf0d64p\n\"QbV-mCc6r2K4VNVN&V4%Va%2,XN5aF'Z'jV5RPNQ*CG$E5BX2aeME''B46ZBGSP\n$CK0,VYNrJG2V5)IZKI!m9p6F')rH((kM&a##0FUe%IGfdX4qNlMNeDKUBA8hLBR\nG+ISe4QU2a@UDMR@hDC%-0UJp8T4IY96GB)VdMc#@2(QA)FB8rZS@H+%DqfmG+e,\nQ&e+TJS@L)0+5!Tmq`&SI%Fj0k9IL)NlmF)$PAhS''!q05VlI[@YmBQr8fP&Lq-G\nP`9ca$l2YGZN2))2jSImS31TAV\"i&\"[ldq0hL+e%VGkIT1X6c#,CMRbK,mRe(\"HQ\n6iM!4*cRcF%[GS*-If,MiiiNfcT9C81#GcHq@\"[8b04bE`)`fPbbb+aN!h(a5)GB\nd2STd4m\"haSkb*HA498'EIU0XVBcQBL2CUCTfHN-X\"Im(e0Z#-1X4$bd'(iGr!Nk\nK48Mh!q)2Dr)Xi#$F\"!I[AQ\"INCG5Hd(%FYDC`6CBhjccr(%(4fEF(GKieK*3Nf(\nQ0G[L`GM)6H9!Ei&8IrUq*DHbb+,aB`GcCMmYHH,hl2%J&$#TRV3KB[&Y$ID)jT@\n,NaC634R82RpNd0C+eiR,5dDA`#T-L)`TPXrdXp5\"p#Q*2kEdQ*hX2`DikRBpIlr\nfVFefZDhK*TKYXG)KB6l0e#qa1MZG!&a$6'pH@C%#U&$aK0UjVLf+Cp\"rA)D2(!U\n8mA+H)Ufb&18aSTaq`U%-BRbT%S`'6pEeNB&m*Mre+jVRTBpJ,IPVNA18@j6kd$m\n+0P'M!'Gd3\"'rf4@J6Lr'*(qqe9!XG\"8B&%@(94F-,Ti2e9-$*#-I9``T9JjLCCN\n\"AmXaCfXA+34B)l&YMTcC(KEhZ3Y\"`+IB5&K$@TTRj%**PYjaQH0\"m@1jb@KRhlV\nr0eK\"1q[ZcpaQq3HRAS)$[reZ6T!!R)Z9#L$lI6hi3)pB$G,\"p(&Vi1CE1pK9Bcl\n8C,A8q5(e2jLC)#$,Ue5JcfT6VICd64jT18LbqQ$!M3jR9,%$2S+jXqCi5e6r(T1\n5-lcFi1G8()mk4JZf*jeT49cj9)95SqV$ZS193I(DK%hVZX2-I(20+!IKA`lmMKh\ndk$'&J%f[2SbIjrlC0a@B9Z38Z9ebTdcNi(5!ElCha[CJ)IRmTLZ(\"\"Yc$#+!EK'\n-KL'3!2pIrB18Zpd$3@Y4dkq'rL+&Z1d1Hm3+dP#F516UQ!EU[+X!6LAcXi%0#e%\n\"!ipF[iF%C!`m3!')dXN)EI%DUd`KkD%YEM5lH(EU#\"Z6%[0%G[dQmQ43+c#!aT-\ni)TQE'1'l2R*BCbq3!%'#fMDHf[p&eY(%keQdG6PTpS*PmPhdY(SkP-aEV#Ne@#)\n&Fb-#rbPrE3ZVZE1j86TF9IhDKVla!#+PhpiJi3JCe,prrLTHEbDdE`\"0qD\"bh@e\n622!`fYh0D4'%'(N[bR,l405lVVL6(1%r#0TNVm2pGj`ppQhV#X%'4)rU'eAq)pU\nB[,hq`BAaYkc1#aicJeB!VNr$cSZ3!-l8lYMrBmVVprjrFa&$lfUGD@$QdNhLq28\n+'-j9TfjbC\"@)\"EN5CL,*l%2-ZkHUk9JpH`ri89HN6,%H!`8)p1cV(9KU09JBD`E\naEKDc5D`-2-0[+DiF&6E&#AHcaZp`feJ*Za[E8843-''EIQSLrFQEdA6HIKif9RT\nq8fH,BHF#G(B(m`)+B+ThYcBR\"+ieUl8D)f8B,(j&R0K3d3Zdrf05eN0!K`Ej+5V\n#pVehXqTZMTp6'j00$r5ArKJUM(XLE-!3*Xb%LQ,)5+[C5E%(lQ\"F6C!!F$%VrCY\nqZhBq%e'YHEd[K5`Jh)h-[aH*9i%'pRpE*TSfmDE-`Cl0!XbbqC8e5!&aZLPFr3a\nrB2*@P0[5lHJmeXZIq%kZJJ-FrIV*-Z4Y[qIXd\"A4@fLF4Cmk5$354hl)1UqMa-[\n%+rp8SdqpLGQ3!(K0U*,P%*5V9eR)m*FER$KEXT6PBdkpp01rF6R@X'\"JCk*$d3E\nTXfPiNXTP`6,2[eLPc1)$4*hb-JA)J@-BJ#Dj0NLhm)BaJ-$a$[3024MZjUpaT%b\n)UJQ5rNlJ@J$5qmY0&X2VCr#@)r3hilD%0VE)TSCBfiMd6l++P#VFYRr88j!!\"DT\nD&lbj1*!!,e4JjQY+R&Hj*`Pb6JAh)'XN,6i'd`B'#c&+HTNH2QpjPhfBI'(2SFZ\n50ILCFG,5lIKlaiDCIi$IR\"5KjKUGrbZUa!'B'Ui#(IG2IacZfC1MZaUhb4&VE%0\nP9Qbm3FGE,LEX&YRR)H4R#R#55HcE6P[cRhl$A0*V3j@1JPZSL!(!JEXNe83rQ+L\nP4280G34M-Cr9#edCL58-p)KML6pZi1iK5i!+Tr2L6)K,\"-`-m&1,&T'4lZNF,[E\n,FI-L-q)%h5VmN!$GP![r9drX@MPj@+8@-&`TXG&DFi[m!@S4Jf[)9jm[Zi0rEMr\nQV-L58r-dq8bFU6VFAh#MpIMNFDdj)GdK3VN#CT9!dYXEQ%$3C`AkRX(ci%K8Tj&\nPBa,\"91L1N@V#0Bhp3Q1%4q$qXY'\"a,6EhXfjU&l+`!$Q$&S`@6Fc9RiJdI5$*Z)\nHFLIT*H#Fd@AL69TM2$SJBKmriIma('NP\"+a6f[l\"R!DPUZ-k0Rhl'Q+(%Z-Ae6p\nA%6Y#lM@84DC`P*e1q3lTaXd,K9TUcLf'KIL-lh2Umi''hqfd5CM1D!Lj$$*,d(L\n-lc5@rL(TRpTr5PeT4eCXQKmB9[Zq\"M8,XH$a'1-TpdqPSFHKcZi6jpi6E@bGKCY\ncZ\"M#Y8T2GUC18NQjRaE6+4ES&aZ*,BV6bI[QZ,NX4h$iICr[qiQbXcM[UkMl1N9\n4aQr!8lrp4b8bG&QL+DQmQ3Ej'qYYq\"\"L-JD#Pq#[P+lFKH25I@@59#*6U[`2i@A\nKNN&4A(\"rP@hkah&EK%4qBJ$f#f[[T+KB1@2D8h8R#k[&4l,18l-E32Ff$58A4D5\n-ZA1BR24Df&Bfd`%p*k*MfIbFH1r'+Q@+J5BH`4B@JTahHXa9(k(kUe#c0,G+Z`K\nV-MTP0,rq6BTRX)$kASb&PFP,0Q1erY&Fd'p!2!!R$+kG'pd6$VrU2&4,@+q89de\n$Q@``'YM9bIdmQN4RV4S0d0mD-PdZ,13&a5)T6hkrXBZ+-a@8LjYk,X!!ekLFj#I\ncV-)em+ViUcPeQITb(Cm00k(,q8+'IUA3fM1Sh%SEqIcANcZh1N-mhAq+dP)ES&G\n*\"f*`cV@eK\"b1Xb!TPY-VQcd-SkkTeTh*if(a5i#1H1(c8CFd(GQLPD6AMB6N,kP\nMeA[i9SaMVa[*2-qa5Lbj!d4MVFE'5KSZLdLSRKlAb1+%D!16$Z!#El$N%AM1ASH\n,,fem261jb$1hRr#K,fA8Ve4f-KZeM5kDLIN1+Tj2H-aj'bEj!j'eU$-r2)8dq4D\n0NHKrfLc-2PS5FE[`)iTQrc&%d1rp!$b#'Yr[VXbP8L4*m##b!&TmKD$fR'3!Xqc\n0V*D#3DG!'1cpDKlqJ#`$(6RbCh3RliS&+KHAYq(fd4aI3kUB'cCJPCR(&GNa0('\nhd[`LVK,RR0B5(1qHjVCJ(8-f0#6!V3aVZbQ6[eJ$+Xmr(+!2`a545e@[K\"$!A%5\n9aZClYT9b@#9Kfe-h\"i!@me24L%befKd$,hKck9`B3pXK)qKC*A$fhT1!3E9G-,Q\nNQpqf-X)Hal`KB,8ehk'#JEQFBq9BRUE)5@%1bMMR`SKQh3D-,`JE#5keK\"1bQ\"0\nSPHfZGchNAmfl2)SDJ'kX',qGTJ(A!c1AN34!51R\"-+\"Ia\"!`lTDd-c,@AF,4eT@\nT%+)ISUF6iMV4b[a`Li*C\"1cJU+Eh',m\"IibA0-4ZS(kHbE+&U3S8lrlH&a`e&EG\n%L'%M(iN,m`+qli,TISqC9@1eDYVM5lb&+jaGcR@TB@Q'(Qk(*$-d50Td*IJV`c#\nb@+Zm[Nb#mHRjZmS-qJ9&P#iBk0%Aah-LliYC&rY*4mcfaY\"@lX0b6a5k@1DL#&J\nXrYjDXB%QKaE[[fc&1lCINA6`I`TD[G`5E@8N[4SmTS5ES9,NJ4fUJF9QL,XIGbV\nYZ@qCGkC*5M)AZH(JL#b*cmYF*&*d,KVkZUUq+jN,UpR,*NCaEMPL6-M'%)jfVJ1\n4HL\"6i`C2VJEHImQ)Aih,9GEpf$`U(rUUQU[i4%!ILJ340\"cTZ&91RaL%[0HTHmY\nNA+&feJKXCl[IF,D6Z!k1@CZmDUm\"11[0CUA15H8XfZk-591d9YbJ,MJm5F0``UK\nip+krVjPD6FaFe,h1IAX'IiN!`JR@6$&dDhrl0&b3!,(9e%,cXhV(AmI4,C%qqL3\nJV\"qhD(a%AZ#!e\"\"@2339Me$#G`*83cD0,K'`d+&Xhe2h,fkNP)DeGB3Cl)f9K&X\nXXVk(qe$'MR)X-hE!-+lS,)9Q5kj59JQ@lc01-3Gr'6NjAB*-U,Sir`$Ql91-rTB\nUASYV@!lcQPHH#lc3M2%fb&kkkU5+3+bPMaNKh8iHf6*SFNqfDFN83L295V5eGQ*\nBSZNhe$(d@TJ`k&Ql+qba$NZSSbXLC,R)PhVhhp+ZETJ*m$1S02CU!Zk4M)Ar0Q8\nU[R4!LJAZ$1*5A#FLNHb$PdKJZETl4T`fJKEPA0[FViD2V8ATZQ`U3\"UJEGTYmL*\nECVe#[++-94CFR@1qb5Hrp2@\"da@`X3)15'e%2JLAfriRiKf0GH6r,eMr\"+$$bA,\nGCAe$)\"01KZ55XerJJBqma`U43RJma8Mr6XHY6(dac5#5hrp4qjjCU'VdK[VN%G9\n[bB0,e@alUMQm!'`MeGqrAAp3#%[e%DB1)5&)ZS@![\"hE!Eb(*TlJFl9f1GBZ[`L\nB8@jHF'BlY3FF,#$rDf6d',PKA,[YEJD%`d[J0d\"PBB8,ZCba0P$5NbANRaER(2%\nN`'ESRjENR-)1p4m0''ZJmFr@fpL1`+C*fY#rUBcLKQZGB\"Gj52YjN49kl4SUi\"&\n4Ylpa&4!DXfp@CeRY0'j[F\"G[M-%RCmJ#8Qp\"M@\"1KbKAH0i\"32cc0kNp%J)Bha-\n,aTmFH8#0km3Ej'G+ZYbEApdV4R`%28,L#P`K9\"J9jh\"R6#6J3,p!BL9MDCfkJY3\nN368@+AGR&3G9D%,XUT-Z6+Q1B(l`lP%G-\"PbP#mKT4#(&KBVj*Z0L,2!V9QiFpj\n+De&dP9hI-XKX31M`DCFdEbTI,5JbpeDbF0Bb2S!k8QUQTMq'$I$fkBJ%jMZI6Gc\nd$N+I\"IQBZ*iIZHHF10PUpmA\"c!d9D4FlHJ)6-\"[%DMRILd,XiGi*(K@IHKE5*@*\nV!Lm-(qN!)H!(jCCl(#K6p1JjBT2GiKJHk$2'D-di\"@U8ejbPX&QC*mh6,5Vq15e\njpp5P%'#ehQ39rQAY5)6c5k-!f(*6DT[\"Mc%mq9S#GA5E'8*`YdJD[0*)S'!0[q`\n,k&i(e`42U4$6bLES21aD4e05TR#2KPhT-VM'Q(!8`KJ`4RV\",EpTSrG-'6j-e5(\n[B`@!B$h4%'M!!D%%5T!!h[aY3B&FD5$1#Q3f(FEbfqaX2fZT$eUJcrRfYY3l0DK\n`C6U2,UUc+AYe\"$,+rdCTk`rkqH(M,a5d9L4,A(2&'q*%JbfP&IaIV2Ij`I'SrKa\nZZ$fAkL([dR1apNHZpLq[DANY0#IMhpJ+bCZKeX3#eb*1XM)ZJX`arC9bpMGV8ND\nPE-0Ve5j3Skd#\"\",eZB$0V'5d`53l&amh0+&r%Cr,'*qHkkr)pI,Y'fUfj(&9eKG\nUTJ+B[Ta*X&!%-\"'DUDD%JR)Gh1-44LSir+I#),!dMqD\"(pceLY[--&T!ahc6S%h\nY6*LI%*!!GhpV4Rpi0G+BCG8UKfZL8&&qjP@GGlMaja($*Y'&XAia#Bdr\"$A3l3P\n#2@Fkq2JkTQ`hjmUa,,QcEl!pZ0AVhV(5CHE0pK54#L0RY,K55S1%!c$r@3!YKU[\np5&$X2-eN(q\"0df@,l[J3EH1N\"dJ)br9#HeV@U!S+a3L5+Cjb)K5*i5q2Y(Um6))\nCKTJ(flbZ6VH\"rMVDrEGa@EG,@+20DbX!KAIHJjRXlJ6hVQf#0E!94(QQV&!5jl[\n2ql@8(1fFpHR4Ij2MhZZCd%6eQ#hlV*e1r+BfVd906pQMGIZbbbZQj9`UZS)N564\n0NahK,qTY@2IfpFG0+q2k1FkN8Y'#\"bBahp5kiAh*qp(Y$,%U4Nq[r'YI$,q1hDQ\nFBb[*2)RV1aqKcXL[QPZ!cGjj\"mBbpAGQ5k-hL)jZ-(J[B(mlj`jpU*(ZGK!-`jh\n2er$!#D[C,6(JU'db2d[9)R0[2mR1Q\"6'baq3!,*HaD&$4fPQ2#KZ2AD3!)638cE\n-!iriU8!9dTRF&V!H[(-$45Rd4\"[N8(P[[Cd4Rq8-jTJE29Jq&D1fUXre2q0!XYZ\nTL08IG!UGr0@qdm3*EJcN'S@V[)c`PI26aLGmjim2q#9k51*ZAia'N8Uf1pmTUkm\nK!\"iMF!Hh@,c@LRUj,RPX0r2iL3ImBiLB2J(I9q*H#Db[25Qhb*KNHp%2UiJFe+b\npU(J%I9l2[+aZX-8X%Q[e68Ybph1l'3,rIF6DP\"5VjRfI0Y-rbl#[0S%+YF%ACJX\nYEl[5i*%KI'p6e+jcdHMCQMHrQ+N0Y#MF&D'@'@'@*q'2F+F$T6GK3-QZUIb)U6r\nk$cY9-Ke9!%5($Gd#TTY\"l(HfKSc&6K+3!2b%ec#i#[T\"[fMQ`BLf),r&ZicFkeI\n22GfpUQdZhi3DedYi,T3k@hUKqm48&@-@p`05%%#M`hcM-Z1$CI$X'&9hq#06VIp\nZ0Amf!`@Rcc8+-dUFJc$Y,b28@NarYe8)BD2AD8\"1T6\"JE4kYF)q@r&'G8SZ&(NH\nKi!JrUkI8N3%+lT56c+ArF1qT%((hXHr!d(\"e8T!!cG6l3G-2GC!!LA*ML9%q9@b\nRfd[$$*T(+!4Ib-+GlE5cLM4VB9QiGLdqD@AY#15`JM9Pq4Iq*m)2Yi5+JPb%Hkb\n`D!+#b[`&+c0PJ9laarKc&aIE\"ZJb*8EUlj1X5JX-@()@$QSUfrL89,4K3,PRi(p\nQh6@#$+l4+93m+Y[5HBVqGd3m52@Q9j8LHF6EhDMV2E$10CP0D*4kKlFEK5Ch&Ic\nQCG%ATV`$iQH!5P@@)R+6%%+mH@h1[I,5&c-%YIce+XLLVlC$aH0&#pH4+RD9DFb\n6B(@Z\"I&r33X(mLpp$'H#8iS3mVD+*66Z`30`[[,SB$TFhfCC,,ZFBehep6M-a5Q\n)RhY-50,r-E[*UZ3h$@h\"FLI$bCHUQqcq`DBJQXCC#0\"aE)5)+kmYMeppZr`)efD\nZLj0$3pUk+X!FTdGJ1jSKU5ba5@VUM#!5-i8#&dNGM(-)!6)PfA&8\"#TRj9B)Li`\nGi2'#!64!2$&kcFZRqU)E\"HeH`V#iJEq%&NjEM$&U#-dBQ3BA[e6GRD-e-NE3)Z&\nk*p\"K-0LK+'%!@0[Ii6\"U@ee$f44,,p1@*Q+`R)VM4V%Imm5,dHaK$m`M[!&'i1Q\nSEJ26pkeN8C8rTc#PZ$ibIq2ff&qhDrmhDlpY8CIECPpZbAm0UllE!aIE6YpZbGp\nZfrm&FUf(J0PK#m`R44X$hLHbZ@5V#4N3$LX[43Ld`+r($Y`!$$Pm2A`pK3%-$28\n,'GA,@2'r-RhcKkE#-5U$AJe\"V`DJei03Dm'S0H$8'[\"U$AJe\"V`DJei03Dm'S\"k\nME@EHQrpkDA-&cbUPrcUG6UG6UG6UG6UG6ceN#3@#T,PQPBTELh&Z,F@iYaELh&Z\n,F@imPTZ-*MP,qHL)GNAjGP$d@2GK,l2Ih[6HQp0[KMED@DQlfpfpfpfpfpfpfpf\npfpfpfpfG%MJpZr!q+3(TT-0R`l6mNaqe`aJbdKG*,jj'pje4,)FY'`DXAd6*5)X\n4II*@85IA,kl6`8aEBcPSNS41J2Q-`FUCKm%%GjTq)3kmr$I&dX6Rje'9I0E-H&H\nZlYKbI038$2mp0pVU,EVf65CIH0!YPX`)[T19lU3qm1YKLREZ$kf3!#2YM+\"k8(`\nIbc@!@kX[3%jS`BJZ51ADNqdkSALp\"BE%3iY!!!!!*p3S))$AB!9MINmNP9jUZAR\nG\"\"Pd$FX(ePTalNX2DV9p92G3qlDd(a'%JhrP4UhbXkcV1Sj\",#j5(QAZ%mkaNlU\nBd'8l-\"rF\"c9Cb(T4lMh(Z2M4RGK-p58JX6j6+Ri6NH[Pm0YM@%\"j%k+D!$L#*4N\n)#YA25Y%%mhXG8L`qd-@!6U@c(`0)`m-c,P#UE$m&ZcMNhLGS52H6B%+bZb\"%&Fh\nLKFR8+Ya$)*C4aH2*30fF#SAh3Bap''H%VReJ,5\"mU`LqTQmXp*jH5S[S5iC`J51\n@%@prbJb$QK%H\"kLad[dNBp4'LR$8B\"2haAEC#HfE4Zde%c1#Y+FDB2&EB8BVf#e\nJYB,B!-2YlD(I)d@Z5ieHZ\"Zf%Nr94YhGjd\"i!P68@j6L%Ip`eLVV2hLcj-M-US%\nC+k5caQ%9qLkhfiGrhCfHEB80qHLBQIpUc```IX1['`9@)1ha`)FB8Tj$mb'4Z6(\nUe['\"-92jNK)PpRd+c$*i+S)raaq`i%BL!Bcl&jf,G1'mh,#L-&BBMV&\"mYM6!ZT\n8FS%G`j6@e'Ur(c1)@9De*Y60r3#+$fYEi5eDA4A2m8k-6@cEAaiq(MAl%9pc9LI\nFIqCa[4LEP!(2aZaKQB#Tij4TUfX-3ERl@8mS8!@\"C*HP\"E(Vi4S9a)c05A(!(hM\nIMiGGPN`aR'b5Ir#AG,cSe,@Y[j38PQp1rS'[2`)mXbh8a*-R*'DpXN'de5%Ddl`\njcE2&4ZZi+S'Z0!bPK*fK'rdpq2\"2JV@1eV8-6H-#pEk[L9VIIP*5Jjik,*TFVEX\n-M3J)lkZcL3rimJ(b5jHPe4TN(mLQ8d!Y65H5#TZR+3N3'Cb@-aUFH&lh$c[5+%b\nE)90N+QaD&Zkf1#1$pf2p(Pk%[bp4h!8%4q*5pMqkY24[CChr0if0'6[hrP-m[k8\n!BVLDUkeFDZTKb@16ifS$1SA0F*,%TEbP0(fbhC+ZeJfMkC!!b'L'ZR)3&#JXRd9\nZBUU2SECLdiScPA'6FVd!jZ5)%2pr[G([c!JVUUUUUUUUUPT$bC!!`@YmaeeaTp2\n&`F5%-I0lKT0)'k8YmCH&4qGfA99999998VacSVXRS9-CR5XXQ-RrBZ`KH3`i4a)\njYEM5PPjE$2p-jR-jR20A1(+bNmFcLG$6hf!bPhplq&\"%B)'BdMQk)#D#(GN-C2j\nJL@J#-&@ASS4DB&IMKfi!\"Kbq(b4$l128,&%6EYBmEmbII1(TX)a+S0H$8'[\"U$A\nJe\"V`DJei03Dm'S0H$8'[\"U$AJe\"V`DL!f36'eXH2p22(P@LP`+EqG6UG6UG6UG6\nUG6P')qV8R1&X@FaELh&Z,F@iYaELh&Z,F@e3,@d&N!#T2&'9bUEXdI'BG4Q6$#m\n$-a!lm8d84H+cc-cc-cc-cc29M5IdA1p[G[G[G[G[G[G[G[G[G[G[G[GP@mGLh'A\nC&cK-MF(GM([leEG+lMrIl*ZMk8ck@lK\"RJCArR)iE)iE)hpqeL0He2L8N3%$-l$\n%FfVB8fC&QEMU89*qFkNjF(8lRCbZHLp,b&@#k2pR#FQ&5)CIm-#2\"*16&[f0U3j\n*Fm+qXp)EG&$e)QT8hrSlap9ihLLF'1HiXbGXel@hL3d#[S*c)[52B,+a)85BP+!\n!!!\"\"HYb65lHF-k,44)Lpb9L*r5@GP`dHNDEkBNc3pME4HZB6h!EGa!'!-!AfkM-\nh(iZ2c'X6@S1\"IIBm$V2PIildr\"1&1&1&1%CjkcPr(\"q\"6&eriq%P&pCF&i1$\"02\nf!NGA-51f-iTH&ipqE8DpPVrHmN+FA[0rq['JQ([cG29QII3pYjZ4N8%[rIp+!V%\nLF,eXN9,5`5cNp8\"66Zl`Q[Ga(hSYQfKDqi'6qa'qJA,H5)&D*Y%Y@!mNKB*G))N\neTqJfM,TLrhj%lXeLCP5Ye2SlY2@FP#93mj1m0\"D-A[F*+f+5Di54*CBLr`(4c92\nJS$9T%A4pb2Z4q,&,IrLC%#VMlI(5FY5`AqJ)3-6'%I\"5@GbADQ!bGba*[KXH!Q3\nh[8,r+KriVH,YF+ZPX\"F1)-f&Gi[MX`(l0TfKFEKZ8V\"%Dfp0*83Xb$iMI[TcN3U\nEV%K!0&*$k@m241DpqU$iiN3HD1Jp9V8!dY6a3*VpNL$EmXApCSlm&E22Tq65pBj\n+cMa`5&PA`)!!!q39\"rcP$$G%CCX2#&,GiKI%kEdq%96,()d(jikk,PJ3lp1[,d!\nD'D8I[QTZB'SY,NHPXLU&PNRHPicAjP4aZl5kFFB`2*eDk8%c[iF,)EU$2Uj8X\"(\n!p%MRU+$ArdhAjTrad\"R4$%'`5r,[pU`,+'Hqp#)8(S+,qRPhL4ciT[)1RCb2JC!\n!,SDRhlEZmd+,,X-R2*ff[A'E\"f`iTC[Dl)QDJ8AKp03EQH4k96f-A2Nd+3j%afC\n8M36hC+2CiUX[e93lADX22kcP5\"3*(m-2m[DND\"MH9!lHI0HF-#1C)4Re@ZR%L\"R\ncSf(p42X%q`8(fU#e*ZP5(F&52c[Jh3rK+1'&5&G2(h4A6XeGj#8+IB36pq(bqbf\nP4%fY6HX,p`frq&!Z2HG`F1[#r2Tfpd0FHVb'q2VLEJ-p-9eFfCPDNU&A@*N0VCa\nGH[R%NVHFBHVcL[KHF6CXDB+j(P5L20ZFrfX%Mi$&G99999999@+aK\"hci#A8R8h\n,L)AHc))1EKdkcJj&q@*a*NS`p(RhjG9999999EH6Rl,2YT%M84H\"J'!B\"J'!F\"p\ncl\"VF@hA[@0h2q*d&@mV4ldXUh(`EmCc$2-mcc20!fhZ)VB+54'(F-0K9SAc10-@\n431%,i\"caN!#PbkPCbS!\"6T)f0MDmSLhUaFGaRq1(EJ!'(,iH[Kkq(ViH`S#'&[(\n$iDRB`&E4'pR!m++pU)Dc4[@pCjqRrhpchde@d`K)Thp3)A2XZUUUUUUUUUUe`&'\nLX%PUXe#AHbe[Q$SURhYH1#0D'+iF#)F#)F#)F#)F#)F#)F#'Hked(UphJMiX[hr\nR[SCd2eQ!pAC`ipF%4%4%4%4%4%4%,Y2@P4&lrh,\"S2pR[e2A(X&A)hGC%r56j#+\n&jm+&%4cb35)bJ2FF9'fT3B33(YY$1GRh*X*TeRA-aNp)8V61Y0iHEHDh-r,i&E\"\n4DX!QlhQ0dNNl6+6UGe9k)VkP!K2rIqrKLR6[IfcSq9'bE5Ap`PPd+0*B*'#H(9T\n$h,@kjk8`0C'd1N&R9mQ`-cAZS!qq33RJrIf+@-D#QNEAR+-PI9CV\"k&#ZK\"FCpY\n(a3UYJN-iN8f#XmU(HU3)Gc95IQ5rI6(ZfaYBa2K(ZZGmDf#[*+KbQS%kTj+AETE\nTETES)-XYEZDBEaANdQHjI#Z%FEP--K3dr)+@ET`eejlZ+kZ6ca8G'cLep!h(K6[\n05#6`Rrpqm&l-YNK!*BRlI'HdDG*Ml6f9)PHVCY-e#H%UN!!@2Z&k1&1Y\"dF!5@Z\n)!NDBcM&Ir4+fCCHGQ2RT&5,)Bf@EeN-[rf+kIqAH[r2$k)(I8&6,mY&,mm2#Pmp\n#Q)RI6N0FUSq%*,XVB2lY96Y(H@afq1XC-a*ZjV6Dcj3`LP&RTI&K%BGl5qN6D@M\nKVNP4@&fFjF%bJp#&S&Mfb'!i,4V9+TTDMfAMVC!!ed*T1V0d*h9h@9JVLbC)QCK\n59'[YPAfSFD3J&+6,JiFI\"$ET`a-G4`rXERR(#SC%I\"$V,T3\"H!&p5IpP38'#&AX\nKV$J+bN!EM8cpQIR#5iMIiEr@pdV2K-B9r*2bhV+LC'`Je5edlk\"EYUZ'0i1UN!\"\niiBe9%$Hcmim9c)-5c!p[mI0ILMT8'feX4B1M\"dK*kh0bk5hjXc16ZXN&4V+&EK`\n,GabC-BH0FIm2q9cdlIG)KVC%''mDII[ejb2im#a`l[p1K8l*8XXk@'hQa'!5)GC\nT%iSM8Ll8p#iN\"q!cHELr&#J!FS3MYMe4TbY$0kq'ld[3DeZ0LmJ+mqG`B*!!RUd\n-jC+2FIm0CU6[)D4KJSF(c%2EXUK-$30KJQ!E5iY8p`XIRkc@4YmQ2D[',H[aNRL\nCMIPmc$-'1PF51UUHe(IpZL13!2[cmU--0BCqMC8,8Gcbc$pi)L-M(ah,F+R@#Sb\n1#1)SBf'K*Q,\"3p4P'L#SeJ0kU6kf0EbJ\"Ie02%5H6BI%L`SB@epe[K('4F9GlGB\n#ffQ@pDYEq&!YPRmpr%UIT89H(L!61id93dcN#\"Z![)5#BS*LJQ+#BbJP,i0pM1m\n)!8!IpeL8)U%[rZlc(CEj53PTD@QMDF0BLe9AN`+%K,rqpb1%I4ef*3X-YME#EXa\nrIQV4IblGQlMqVUUIZUkcK)9Ap9[Si#Tf9)4k'+X249M9N5,8r\"'C3,B\"S*D3!'d\nN*!PXU2pZ$'FhLXVK+\"hP3m$ikG06&`0-@8ABdS9VM9K8Xe$q6431%,i\"cacacam\n\"rpPTBc!j!!'DL3!!!!aU8#!J$3U(#J!!!\"4QG(P`DR!b)!!!!!\"UF$)J!!!!6fT\n`-QJ!!!!@D@KNFJ!!!J!!!!)!!!3(\"`!!!!!!$f0[E()\"!!!!!!!3!!!!)Q0NC@B\n!\"!!!!!!!!3!$!!%!!!!\"!!!!!J!#!!!!!`!!!!\"UF$*Mrdrr83!b!!!!!!)!!!!\n#!!!!!!!!!!!!!!!#!!!!!J!!!!!!!!!!!!!%\"`%\"\"`%\"\"`%\"\"`%\"rf3!)`!\"3h*\nPBA4[FMSJ5Q&c8'9b)&CPFR0TEfiJ-5ij-$!Z-Ip5!!`!!!!\"!!8%\"!!\"re`!%d\"\n!5%K35%K35%K35%K35%K3red!&!&!3%K)8%K)8%K)8%K)8%K)82pG!\"3#3%\")5&\"\n)5&\")5&\")5&\")5&$rA3!8!d\"!5%K35%K35%K35%K35%K3rj!!!!S!!!!\"Q8J!!Iq\n6hiA-%9\"4f$$4TMPE!)3-6p,6%X&BiG`8ErYT*R1#P@iqS%d43ZX&9[Rm9,6iq$`\nljLr5)@$CE+*frY($0bZ88MN*FaF3#pEF#iQ,1[C%TFVT)#&T'*A`A#bH\"XpA%Ej\n#5`XSI*88khBCmP'm(PA`e!,U#&KiFfdB#\"JZIeZ4*p%SXfN0m##6M9MGEX$&P6f\nS)6U4e4Ti@jji13l6ZUpbYbI`E$\"lbNfl@IhGidfT%-mr*4#hfcP9IUGD(%-J-b@\n)D2i)4UN'hipJ[X)4GmL(l6`9D%-H#f%$9F&#5@LcM`$eCCLX)0PlTqrIKI!48%U\nq@K(aVU4f-AbP8d[0$X)30VrQ-'If9+%EK,lR+2mb#@4keZF-4\"frHq%YrJH`%iU\nD219D(q)C&8[ZbBNV[MD\"GX12R,1+99DYi'M)j8e(K&KLPP,3qj5US@D#A6Jj@\"%\nd4(l%Ah%R`[@XiPH2U$Rmk6N%l@mpM[1P2Kh[6CibSfC6m&d3ClIJM8988H)9IDd\nIh1PLaH9*c*T\"QS+18+Rf$CM$+@RhcXEfi-AqR0q6PV5l$pLke1haN9-$hd`R*c'\n#4jdiB3eh`'[c,2DQ2i-X`9E)R\"+PFGY$4dL-G)rh8b9[beP0VRphDGHDV)X[aRU\n,B5Z8hpq&i\"&35VjD%I'ZT(BaI+965md3T(mV9%NDQl4cTN-b&kL5qqK0PajNcK@\nk,`81j6+9LbM6Gm&eH+T&UjQ3!\",FM%I`,j+D999!HANP)DZ#U-BMUM\"ML%)F!'e\n`%fE1Mf`5ELqp+,F(,!r$9Bhr+S@BkP!qi#EbkBI@T)b@b1G-5q#BE9mHC*A8(j(\n5\"c#fQ%pP*EdJIAL9YN2(l6PCem9Q\"S849b)p05Lk5hf*!Q2p&0J8l4X2dH#Fa,V\n,ElP!FL308iM&`BAie%NeQjNK+@Ylrd+l-4VaQ+E8fC!!ad!K64%I(Ncq@e+Drb8\n+`fC4b-LH4ZGlhiA+%9!p`lilk1JaEr(b+5'd*VH+'TLfmB4hke`m4f*4l$#qm5l\nah4ajH6-K)FdZ6eD#QqE\"ZmF1\"aZb'D&'JA*ePUmJj3!N%dpSd0jQ)--drX`#C9T\n33%F5mLc,h6ZEQ0PP$JL(`6'3!'%B+dVREPfTZ8I&`6ICV9SmNqcD!@fmeEJ@X@q\npQH+X-ES8ljJ\"18ej-3I3`H6+$JV('&,GK49M#e*93cdpKp%k+N-reeTMpLX%-4[\neDBHDG)9*J5#r\"i+S(hP-$2P&+Hb!jUbAH1i)9-)M5QecXY\"@Um-c)8&Y`#q+)q\"\nb3Rr2`TUr1TCqGD#(Ee,C6r8G,cJV`Ee6Bi[!eSQ'2+PNj1S@HSjC5N%q#ZKkb9-\n$$QhSPqP@a+I8Jl9REC-F$b@ADJLGXXcVPr-#!QE6(irLH0hhP$NV8%JNlYpj#MJ\nUP%f6[($fa189K9%!'3lUEcNh3+`J@Cq\"ZSJ9b8pF@6m[ZN\"c&5MmAE$Z69T5Q-)\n-Cl1Vej%&Y1Rc1f5c\"Z)eh*D#h13(Pl#`VdF1rf-*r(152qF2cX&r(R)e@'a(c54\n'[m'aVVAZY+-qf%[KGI2b`\"qCP8I`f-GjX$elfp&c)p5m\"YJC-ZaVMjGQ#DPTG4R\n`U)0af-BdZ)J&3TU+f6NeNaB\"Q5rZBiP!'P-P#X%(rP5+J-2V3mhbdDeJA1DdrMh\n(AH,CI2)p5pD\"RUki8F+#c)IrETXA#B1pk\"RN5B!e1QKAic'+Q2S!%A1RGZbI`VN\nY!6h!hN-#iJ`'!SEIST'H%3j8\"4!RC#kace'mcdjYlUD`[5!V--qc3MkmR$mih2e\n`XXJlH(B+aThJNCZcM9i2eX&A2%S+UZ#AGGd\"Sfj0Rr\"%4Ac%+XJr9Z\"!cN#rcf2\nl4f`!-amYHpTbphb-k0)&C\"G-qj8lbQTVT@#XbRS,UVVKEmABRI,*)!q0d\"3Fj5E\n%Nh#pPcNf[2XUiSq+iQML-DBp0YGPaZl64$31E-Brcm+V[cV1IRBSKfp)DL'$c9D\nrLNEkIGHSCVQ@d5B3jXDE!i!bh@P*BAV(Z@aP@#VHpR*V(@X'i2&24XZiS9Ipm@K\n\"qpZ0ZcNd5hfmFM8CCEfd5P&2%rp6UKmAEQ82Y#[SKL!aTZl2ZSZR!#bDF2*epBS\nEYIfJN[pZ+j*F0rL1(kaiMQc'CE9r9kPi34kl-mI38C`E'0NQcEFCeBcb+p6-ah&\n*hALT2hlR,,-Ld,CkL)[eI$DRPl#`Vc'Gq%2!\"U9'+NKQ#IC%T(Im4G&pFpZdp+q\nIpM$,\"UNB(fHFUiHJqAIp5ae2BL*dTeJ-qfI3\"b\")'9eDq(3V*hcDp(TfZqS8NBj\nk+f8k!UkFcVf4Vhdh#)Rm30j0N!![UIpm,-+A,M&G+lLmNAT#[Q4K&e@2m1X%eL@\nI[1q9j)ki$LT'd'YA3$1F[JF,6LiPc$5V1&20BB3(Y%6Ip@MaT'h4peP0[,mI`A)\nNPl`)*!\"rGZhF!`2QfedjMQHHhNE83N,5VRQU`Gi4@!phaT`d9mapcV@K+l3-H`l\n2iC5)44'E9eNlk#l@p+`%+pVF6UbYBJaKdl*bE9IMqY+EE(fU+-Rh4rCe`e!(0C`\nJU($$Xb`2p-)4(\"[&U%VNc94AL[h3kTq8J2L'1*cDX[f*FQE`BHc!\"aj,RABHHf4\nG)Hr-1IC9e39QPh!&aL\"8SE*5kb)b'`@R0IUi%3KIGE@EUeQbP!fj2XDHIS@J0Rj\niEBCf@UC5[d\"hrhr2`TqIK9%IK@U15\"3$RfBSKX'5N!#j6d`c\"Zh!AcfR*9NFl[S\n)Ej8cmaa\"[JfbC))UF3qbcaAFA'LLCQ$B)XRSSC-C3MU+UUDrSHB,QXj\"BQ8418*\ndD@,d$+83[&4I28)ED9B$rQ4MJ`AdShF2D8LZFA`fdccJSbdRHrDrB%$FlG)pGZS\nl&F!Kh+)$G11+'3C(@4NDA6)3$*GfD&##AQmUTZ@4e*2[$!AhId4,aq%$)A4r6kE\n#UK*4-8KIFf!JF0GcNPGRjrVEDPcLL68DNBGm45!5CNB9IFp2R`ZA(0e9,NUk,1A\nlJZbelPQr6TpXlFUNaHKRm54Pl'eb[35i6HU,HH6b%(HVU\"FTTYE8p(d2(#CLprG\nX2Y4U(4M&hl[iMG80'GRAC+@L%qQe4DI1S!Y\"m8&3+#F4F6968EKkKXUCX+M4KdU\nm4MB&'&L@[3[ZjIprE$lFV%K@(\"mKUHD&EH5(plb9M92,DAMThqiZeYK1HTG1BE%\n2,64,0aB4[B!PD5hQpM9b'jLKkrCl45!f2HU1mZ3`XJ8I'cRHM8VLd94')K6%*3G\nji,0jh,p3N!\"%k@UABLmh$pD+iU#Ff9R`kF8MN[Z&ed\"[8qVp1c%[f[,VK,%AP1G\nGU`fX*`!UUY)-VpRhlB2MEpKGQ(VKpr*Pl&%)SpG34@i2LXrl4E+kfJ8Q@S$$1aY\n2H&r2`T@IK6-IK6Bf-eh\"eR5Z%C(@ElX(T3D'``rG4I2Km&Y!kFV6`eK#&MC52!0\n#12T,,2%JLh%MX[fj09T![\"r6`DAL+GM-hFLYFGR&l$,RIFhXAJ@f[KaaI,*L!k&\nU!jCrN4BRbHR#%&m'a$4*6#fcd'8$E9H98rKi*&Ha*cjPbU`Q1*h1J+TK`6eT+YI\n[ZQS,)04MEh2M-m)!J56LEc[MMJpU@SchX\"riVrPaBXBU8&Q6#6Zc#&dp3qY#d2-\nMMa'rkH@cm*L+4cC0+i#elm1JqhdBiY+`XR2H!ADJ9Q3Y@I#Nj&jbACMmKIU)6PK\n\"0F!,h&@Ip9Pb,di-,0h[IArkkRLchdc@Yc0r'V@ahaE(00Mh6a0A3&Vpr$1PEBl\nS\"MlZ2IcDd)aSEJUrcqr@DZrb,S#Ki*fQ(dba@pCX-8XmZVliHAE`,fBIB`Hl9Hd\nZm@6Bc(FE%0q)MYA%e&Jp5pf(9r1HCCYp3c+kXHNHS(UaP1XKZMIDF,fcCV$A8D8\n&eTUTBEA@H9E!&ATTe$PXL5JJ(@FHep\"cSiTj8[3LGS(0kGKHd!kkDI*SUJ1R!Nj\nT%C@\"UVb\"Y%SFlQDQeUJ8I'1#8)KHd#F(TKYli*8S+qLb[16Pcm0N*q'dNIKZi+J\nATM(bCU',A5kF2DGf[-f2)%eDN!!aaBB1+[$pNB#N0J3&bF506QAhDID96UljqD\"\n\"SJ,Ypr\"6jEIpiHJ19hrb,4E&iREPq',hLD&SR+M#,6J-e*ci0ZIV456R&Cp2$F@\nLFH\"1b2'\"&*@SS9'VT-Md-I@pH4%cHDIDT$FCpET2T$2@dIa[,4*\"bITPfVc[ECL\nI`D'Vc`DaPJ@eUF0c'a41QI0DNaHFB#+RD(iJKrpUUZbC,M2dFjjmjZ@pPE%L!*)\nb-irmKip@)LiaVB$R5NGRJ@c0)'UXSl4!&`phFUK#df`SF%E(01`))ZT6l#mlZ5A\ni--X0X&rK+Nr@'iXNVq&%#-pX(bR1JP`@8T,pZHep5T6eRh1TVmk@lq6&F,RedqE\n5Vr+QJRmJdN$&hFVG32+0j41c[McN-9SNj$H04DG6KlUAl6,mm1MV+9GLbMN,ilL\naQ04!bGqVN!#cm\"[(EYP%dR52pU5jLmC&63L63YmdIiU5`rcaCVe+91i!c2KQ'b&\nXVrSEE\"kX!![PaJ`cNE0N\"k$$bDA-afQSQEp@Mdi(X1%%HNA!598XX23XiDNj*96\n%R)RRd\"SmV[P[XD9ke+1\"rIDD*X*\"\"eB2h[4[6CNeb@+*lMqhlJGXf(-i!,Ccjl%\ni,f3GI$X\"IcTa*aQ2P!1$%Jm!(cUI1lIlQ[il#lP'6Yh!T$&cd9$+98$`NKM&J4i\n5X0J(Xk*ARB+XmS9jrHB90Y#dQP$(LpSPEFMiHVeMa5C5r,JEbi@3!0KFMk5%q%\"\n@##Dd2AD8L9*A0\"--l$LKYe5\"i,#PPD3kqmQD3!K$f`l)LH6Vc%r%LSq(j1Si3i8\niEGZKIG\"Vl4Nc@r!d%'3UL)U,mT+[l(939#8eQ#6A'8V,d-DMSBkDKk@&#BHq-5Y\n2DBcpqLAPTY3--48$J@MKe'*#[ql2a1Z!!SSX4Y@SRi9f%qlG6eX4+rZ+iYmka1C\n53XjI'bIJ1Pb0qZAR-XM@*U#R*clp03TPP$F%8SX8,KH#H#qJ#$KG[@(d*#Y,UcJ\np!UH@$+`8MP2DPpVUaFGhA#V(ZiPbSl`%rFfN)TS%q4*5d3D-Tq*!DG!&a9V8CGj\n5dT(\"2Hq&&[Dq&K%40M3b,Imd8F0!LJICb$qeqa`LQ$P94%b9mlk6AaJJFI*9*%T\nY4M`L$(#Y8eFUb)K@J69+#QEFJ\"d@35)lUJ3S*!eUP*52b&Se$&(2Vda3Y8qdNLr\nqbIIUh)1CmI*STe0[VZHHMZ21YTFD*HbLUE)8'2ibIMQ)#Ij,IiKrafRZQDhj31k\nH0`Ii!50mDB,3lM++J-PURABbNXTJR\"P6-,[kbKXDSIU,6)2p\"VASpk5#FAISJCh\n5\"QTNi+ZXdN)PT6`2b$85FTMN)512aR[\"MpGBIELr(UC@B-4e&jG&6Jb)J#NRDj,\n@jG85U!KLH!h1ArJYA,VF*m3\"S``+F#KN-fFF0[`$%#Hrh3YYK`I4LhM0Dk\"X[!r\n[ShQ$D9[6#j6RTNHL(8p55MY)V#h`b4dTpLN0rI)+GQU53K0B$VM(5@hJ3jRh6jd\n[D'cS%j6U[FKHC[&e2\"&#KE2hd-m6bH+l@$V+Q8r[bY9SVKR6)X,0KZQ1lN0fT32\n%KjQq,aVck[adRi+l$Ff#A$'CDc31*LH!SXA0[M8\"!I0L6q9&,hd+'VU6!XlDA`,\nm#(8a%Z$BF\"ZQbJfGYPDdreYPaicL4YB!#QP[cK[cPBN0JY3QZpm\"M)`fAMladRJ\n1$mr$HLIK[r2ck,#S+2X`jYmM9)6&0+@fXXZ8K*3@X8PfaEfPHCBG%bIA1eb*NL+\n%m\"G#m62a5KY$2E%d`HF60LCX02U,Z('#G4JPeT%'%59lA\"U@\"*),Kf5lal5R'Ve\nh%-RQlZha6N3jZhbP!`PZ@2cAr`R0hMBXb9ll2if3!*NPaS6L2FME6rK\"C4)(aE)\n+IdV)iq*Nq56i$bc@Q90#FMj,aq$!f`A85K@'KPJa2NDJ4(H1Q%R3dUNG@(*+TM-\nP$%b%,$@[[*-D!\"[YUqN[,I\"Z+fl'rbrm94qmP4eUD8ka\"4EJ16&cqQkJ\"'1%8k6\nbd6FqfElCb-j0eaAdPM&`YlqJ8G`aq)`pA%C8JV4D@DbXClXX@mP(53C-3ZcVAJe\n*0BU$D'+2$rP#QQKEqKjMAUbM)L2j`$H!C\"@I&YXZ++k(93[pLi8f'-T(&H4UFZ`\n`#*150)hC(#XrQUercr`r-URd'chGkLj$I!UBIR)8&)F1dcQ&\"Gl8N`R-j2(hEeR\nE*2P+GI`bL%Jj@T6RY+p(&\"BPP3TTUihcFRc6N!!F'[&Df*Y4BVB+hRM&'l%e'3p\nRp'5+BiEl9+A'4U-eBTlG&GK!dpI)rfFb9Vp!*H)UijN+PH+3!0$Yp2Xji#(ISM%\n'#aSkb[&\"e#SVJPMC9PM&-2&ki+8,2k$$bDA+RUCaC%cTP#%&qKfG9pEF*[ejG%%\nXQYbTj&)rV\"MAdK(,-ZL9Q*RH&,-ehdX@Sd8F4SS2S@Lb@Jrk-[#LM1N[XUfkDk!\nQRG,%#Krp)PA5ljc+a*SLYPa0r[fq*r6KJ\"*kFXZTc8lQ01ASmjhD3CE0i)Q9q+`\nCCaCHfh4$r&ihJ,*jU\"1DijRA`$0hPCDD%dCIGck3!-RqD4B0kK@cb%5$aURr9I'\nk0b@DQ4V!#ZP*a'+aj4IhNbe5'P2r\"EVZMM&XX*`lbYf\"V,*(MCLUdX8@ITrCYBE\n5l4ji6V(cc(1LI(K8I00jjCC9e6b,Z9XX3k5I&Q3Xj-EF$(Z3!%\"c1(NMRqFbTSh\nZID+IY-4UN6kk,!bR(![MG&ie6,q!r99HDU(PNZ9miDXR[E-J@)53!-P5QjP0h%I\npQ!#H[Z[$!ddE(pVJ6U-@[qjZ@hJ*m`@P\"3[Ge1)J+pM5%le`6jKD+VX@rBkSmBY\n`Fd5-ZfG*(#YMha-Cbb3R*EE!NUrZ@,lp4UAj%e`#J#e+0EA2HiKDPbF6@qPjcFr\n1BM1B%Z`rcM6TPLQQ,A[\"%hY%RESA4aeNj#LiGA2S@f'i@E%dbJ+mRd3NqSXXX@f\nRM3c6[@dY5$j(8C,ldjRLjhXdhUKeK3AdiK`0dG&rkFX@YYY#b0B*Yaj5ibLB#-B\n4cQRjB`0bChrA2JSZiV[0l-`&5XI1jDHM9+md`@[53q)Mq`mV30UM#q8!QbNHRPq\nTNXcUNb\"@*NRFQCFBhh\"TkijU2@!aPY)1XL8IPVb,&2i4$(&+#9DFXhS$4#*hEac\nhK5*d\"%\"hDd`32(&C+2F(DB4Vcp)#b8![N!#Va0Z85e+$ZB@+P,jTU\"j&bXY`cGK\n@!h#$3J*cEIdZMfTI%GcSA$bJ\"Z,dJammR[&!rc`T\"2P5`dr6j'i!N!\"Z`\"GEQCM\nLQ4Rb+&iCE+`N0b)R-bUIU3f6-IYl#(@2Kk!YN8fQ*P2i2GcN*i(K\"\"9qj5NaGlY\nPKHKdh1-*Qk`pr$$r(6+Ub4'$rGH\"jcIpcPFhZ@A50k2bYV&0E\"d`6C5,XeVR)B\"\n+6l[+fk39M*2B$#Lm$BFkSNcDTbrDh30fRTIH[8I@1p`CCDYP13`k$LX@2dBj&!G\nj,epqM2LN))[9@2hZbA)YS2IM1T(J2(RDX@Ij1CP@YQRR[IP2)ERQT,@2$\"9TZ\"Q\nH$3r4erSej#-)*I\"hDUrFMQFJC)VaKVDfVC(1ZSC&XXPdcPMUh+`LHC5Zk5XjmGX\n$'1!IflJV0QK-fLrZ1M(iX\"6H*6Ik*3YGf5iGRUPREKe15L#8H+JbVcd$PP-e4!N\n$Fq'GR(lQTJ\"ArAq#cFCCk@)28\"0kAfF*V&*D\"IKk#F9-Dj+rm1ap!Bp390$Hb3)\nZ&3i+LrG(VF5FaF!1m4PAZ`ek!H!M5dRAKDZkVq'M1LiRr+4SZJr2`h@RiEecmqK\nXeVr4A62qlS[phc+&2eepaeq[40PDIMTBq%fPP))ZelGeaHNdR+ppTRY0HqT)PI)\nqd2j\"0M2,%3J1dT@DKcV@![6A1qJbI-mXLPYXK5hmjAAhjZ+6dFD-j9dMRR1XhZ-\nYSPe#4''A[1TR+jVF(!(RV$(\"fA(m2Q`%iefU`hUlUXlK[jR$'&VqZaHLq3aCZP)\n4)e6)3\"Phk*YK!IDNiE02SPR,c#SEhM81iP,FMBY*kGX$%N!\"*V#d-(YBEkG)(KE\nrG4AN@2%%rC+YA,%3kZLXq,NfJdXlYR2,rQHhNLCLAXH)mGP54U!L'PeI9*&&K8L\nY1&kbZ0Y5eEhi`p#iDH&iJ1#,KHEqme&,)#DjDp!N95\"b'jhCkeRL@IZ+QU90MLc\n%E-8)`)j0LkJXQiRFq+`-5MN6Z8Ykad#\"SeXj*,ZUX@DI-rahMM-2Q@f6lAIpCd%\n3*e-Nl*02Q@#2TijEaL`T!8pe+5p%XM6H!,'K11'Y$V'41,'rfFJJ#0CR515%%AG\n*TNiMpZ9p`8d$e3QeS*`QPm[18$VV5EaR6F$!BmZq%T50&2H)IB#MbdCNYBGj4@b\n&G*P1'SBe3TAlRZiEZ$[!&2C9imkePXe0AFL4TmH8SNQ-B$%*dEr'FG)'02S!rFK\nG[ilkkkhV5ieRQ'#l@V3VC((5&bL1drETL)NUl!NZ#lZZBRcXJ1,YM#bK+\"3(fpG\nZVKl#4Nb@%,1&`r*@DS($,J,,rEFiGV22iHp1eFBa,lqa2p!V$#`%8+(p#JTLUm@\nLl%GZkl%CapR2[2p+IbJ+mPhILG'%me)@B)9e\"jCqKbkj@G-SP+Ca4$(fLePIF%6\nKKjY#5@TrAJQH)Q(&4558M2cca*S`4ZA`I'rKY5rG+GfQe#JS-M0Jh$V*9LA5Y8N\n5\"'GC\"PTjPiHA\"I3hp%mM(,N3T9hK8)iI8ZR`YHI@d1D[Z14bUEC3m4j-8$e!#Db\nCdbI\"8RpM3(%dEY&+e+lhCY,)DjL)mA-rR@9Jl51UJl28B-N)[c[bI[j(Trj%(9'\n,4Uba`Z62NK)Y0MX3!hNR!9f8*JfRU#N,G4-lbT!![`%(IELZ%@@6N!#GE5%fRZ+\n!%S8CPSeDcZE&r&cG((AZSljA+9E50Yj2RLRTe+CpEmj$+ND1%dcJNh'+`)RqaBa\nD*8YTl)KTk8'(p!PV-C8)bBC[BSH,(mGEM-hmfadH,Neb'[-bJGQU[%IZ0S4M%KA\n%Dq1Ial2D4Dh-U[[5BdJH5-i'UcX0L1+LP40*0RI$4jbPqZ'UC9%APEUX5Ba),hB\n9RB65`AR`+!NVG!NaiR(j4dcB+%Q!bqE4Z#kPcEkRX85`0MG@&Yl\"SehhZcY0UN,\nJ,\"V0ePB8Fj2RV6Y9iaSlKD6630L9\"rpEfHD(b$NXYI*KJd@pIIl+\"*ilFT!!f1!\nRNcra[6#K6ZX\"ae%SeY++l9&M)N&$9kp1Sh(*3PNZGAdj\"qP@q6FGqhR6bjYQ'28\nXGKKbL$MJq#qR+e9CGTQUpT`Nb3dp)9l53CN2i20'\"m,R,l+SFA9SQHj`+-a5Li@\n@*34,DcCTf@ZpU8#2KblNKYSCZ)hMpFZBC-F!DBI[a%MLie8)3Zar*59ck(pDQ&C\ncdC+h(044$i%hQZm1%klJ[ci@L#3m4JjVlcU&cRA40P[8&bA!Jjbh!6`+dkL'('`\nJ#2c+S!lKY0\"[V43H&[c$aGKY$&`Q9QLa2bq[d80%8cVNR+EQe,YGPfbB%'c#%aB\nHh#RbdSPfZqi%U`2m8`+a#4i4pVd5rA3+IT2D9`D)Hmb#(\"+M&JdSaQ\"&IX3F8`D\n),(PG4[$pJFhfL`p'M6VH4mUJqfB@dEN-(P-jkaD8NR\"k%5Xa@kZDUNr0''SViaR\ni@MCV[ApkcZh5\"eV99Pl*fTf+Pfa,Nif+-'P+)hIa-f4e(CEA$Zd@8\"dEjKCpH)-\n-Z*jr1Q(C4q4XUTqZ'9dpjF#)Z(RZBU'kRhKMMS@!Li6%rf$pEYp6D5@CaJ5[(h%\n(T6iJ'MaD@ki9TGYYENi9cm04*q'QdIKU+'40*%f\"KGQDpT'1lG0fHS4YIh\"0*Q@\n)),QbZ`k3!%%h@[pY*MU$%XBYbjpPm-aR68+e-!!k-ZC%(Yap)hJPKeJ@mVF##1k\nM9eCSZbrGX4`eLi69Y+5iDZCmjp-&4&Gp\"TM*+q11@bAJI!98Z6X@65F1j+M4ELV\nYH1T&aa[kZ%*A\"fqFGDpTN!#0PRR5-5\"#A&+E2-(8%kL$!*2DI,#S(aH%i$4RlL&\n%)%1`r\"Ir&*K$lGm%LT!!i,[+dmD`0d([P0@4lZ$`kKlp$6[ki!1L,VBF`S3JS)9\n1)N[L1iiY3(`*)2F0A!'EbGf!@IdV#HZr2V-0D'E&+9d8qdX+Xq%bC4L1iJ1rU5%\nTCrLYmmSpXipq&Ge#i`a@GcHp+D1P9SRf2k@$&(pKFrIJ(X(U4e\"V#99hjaQCF-m\nr[a-3KBS3i6lUJEZ555eE2f6YjLMXkSG'cka3ArUa@0qP&a)3-H8SkLP@caCp%EU\nDl\"ND,8!'8Bd)UEFY9&R%(D[RdG\"iI,L%&*K1ZPG9YUKjMGr5leDL`!ZHJ@Kq\"3f\nFIM`,0e,Z(,XJkLeN4L-+YpdQS-1BK&l%Di8JPmR@lh,L8FQjla#[&$mcC$[Sh(M\nH!D%2cTGSj$e1cTGGmE!FD\"@IpQ4*hfmh29$3NmJJe%b9pEdiBZf1-3cJc\"rL$AM\nZej3YN5[1[(`GSF1`FlQVre-T9Y`RN!#6-$IIGVK3Vjcdid(N0UEUa&U)6*6B*1j\n[$%4l`'r63q#d8BPU%#0lTY(L0bp'r6SZZq[Jraj#--FVEM*(R1EYN!\"A-B(($f1\nP)JXLiE,c+Y$M\"IjMV@+8)1ZD6I6L6h,TG9mqX%'kHUhATC'T@,HNKe+A4SZAL9R\n1KJeD+`@SZY4`3)$0RLiA0KT'rQ$fCRk0&3lXBC[jli2\"6S+[,JS2FUKVYKUp2A(\nFj2E-NVNYX9X!R#BB'GX%KeQadDrVZlC4aY%C19$!)`8bIX)0d%Km[)\"bPZ+C9Q5\nRZ@dKLbjXBq03LYq@Aq-(h!0e[RFiIIm!Ac'RmUU1(B8[Gecd%Ke2A-S,''L+*mB\n`(36K&Ch+ba*ThcCDB9RU8Scp[3`(Y@f3!&GBQ(Q$05D(TlKPlkplJJm6Y#a*b0T\nm*2mVJC4YT1G5KGZ9iH00(@ZArKd5C6BQM3+#R(-6m[p6V((,$QX'J-6`-5pFI3k\nAAJq%P3Q#\"R)`E)%Af#CPY5+MBL)2)Sj'jXpJrZrJZqSe)`NMb1V3D`4r+Y3lfK4\nSHDJirbI104N6-3eG\"lqhR5UpFJ&S)F1JMU-d84R4cm1lUIKhmcmr4Q$*d0amPk$\nq&J'Bl\"36hDZAab&5$*VcKPHK2Q1+\"35Nm&Qah(Ce9%H%UpHY-Z!DaA'U3$E\")1'\nGLe$I)8q0\"$d0\"lS@pf,pjPGSfTCU--H\"kbX,r9Je(BZk6jL4j8qBdffKZHP(pL0\nFS%`cDceh8[,)eY-1[@B4,@00,9L%bqTJT-M,Tk*Nm08$9I2'DHfJ*qlP9a-i)8D\n$`U,2fE4P,9UN&qiR*GfM-aY*)Jj*CIYQhBXVeDPmamlbD8I)JDSS35mHFb,C#r+\n(5!aPrR#[b*l1IR@KM&BG39Pf!%0ppe'X#q8d5hTRpaP1A9p[3,2$#M3D+D0l3Je\nCQM-#F0BU@$`FmG!5*6&SfK''2QU'T*E8B8m(med!R8GYF#MfD$+EaBU$2F&I5Sp\nB\"hfqKT,B[RK,8)ZLRP$CCrSd#m0SMScMF0VjL[@F0[T%KqL2@`*YM[LP)[p@p(c\n%Tkj4a,ARbl1#I9lqBV,,0[bZ@2jp#6lPrb@i&HJjebBmR+[Rl9&MZ)mC4UYH)pl\nRlYH`@X%FeESG3Tce&kBb`PrF@#4lirV8)9!GVChU`VMkSUdYf9!Y#VpiH#Kl4T9\ncAUKEEmJplmb!1,E4fr+r5#MF`#I+3+a9JdD)1*`di*L5U,S,[AU)BKMYi!2-l*Z\nR\"EYDU@Y5#2#l9d4@JYFYM`mQdplq(edd3'3IkH&8P(9MU%eJ,H9d4%&-`b8(IC1\n#(6EM+mb!*b3%pP5EZ&0mUSKZ-P2MjFbA,Y'DYMA@-RA2R1Q%GFIPS+9bS6F9TT@\nFaASH43I)SiD`9X1$db!KCL,$&SfYM`RQV9YTZJQTjATLRdLpRK8TrQ#*lZ6fqXk\necGr6rhqeB2&CN4%eA9FiBi$A6MSFJfqLeJZD@*(5#,rPDhL5aN5D\"JR\"r`M[p-m\n1h&Cq2*S-iNfNc`$+VX\"BXEC'fBrP#R,XAdShkL)SFhakEi,J5E+B@[SQHYK6SC(\nK8@cqZE*aVee[f6X4!l$2(HXmGe%Qk$P&J$NaXI`-RMieT3SJ*DacHF@q&H-[LKH\n)2FTr#`SP&4VJ)cj-U1`0i+kCD5G'YLq03XL5pJl*j31Qq56)BYmLYAP3+2J%d%Z\n$[+)4$(CE6@TIc,@T&%%h18+E&8)Ie\"&`9)MeAp5T#0BCDNKHd#\"LJ@\"Zic,YERX\nVQRR(S8m9PIkj\"[#E0\"LDJRG'KJZ!1&jLB$+E%FfQfJcQ'&jY2Q$!'6Y8PX%Vp#K\nV+RL6C\"Ib\"d`m1l5abc6aPQc\"P)Ud3QcXhJTZ\"Uj8bSS6(!(C#($+5ae`-8&YDF$\nJi$HTjb0edCrmVr&8$hS)kI`\"0DrID9&0j\"@V@d)X$NR,H8+#5qFbX161pe[k!ZV\n&HRpkJbc4G1X9B-h@P(98ZH%UeVASrMdBEE6hA'V,q'-&i!4h$mYNSN#AdQl\"8-B\nXAP!lXrQ%qM4ZSaJI',KY1!SBb@NjG'lMJ'2Y*)400@DUq@+l&MHShN992bT,1rR\n25L#b41if6PX#Z!BNX2c#rDpHK[!KIAYV$rpjH42@q%NC1U3NpGEI(rJ+Lp'i2&l\nMGG$-X(,K(09fei-mBZS#5qDDA8!a9Xh2I-!E6GCcS9'Ri*F6ER3PXL*X`Z9+N@N\nQ2iiI`\"dd\"00FhJAT#*6VTN8)5!D!C3RjQIF!P$qiZ)QHp'FEdeTDkKAff(3k9aS\n9Y6AVLLVC*@$mr[1#()\"pCAJeHe8bj$@F&dG[TKR(d9h-I)h[0%JcE!6&&rKLl#1\nI1p&p3#f#Sc3l'E3`lVd1[jb$efm'!1rP,*c,2*p+098YYjAQ`NcYXMehC,if$e#\nE&Ra6CM#Hi-9-eb[h%[b8Shpq3%1HLB&NU![%QDPlPX4GViC4hlb*bl2QMaR@0b5\n%iDjM)k,V'#A\"pJYHk*J)2mqI5EJXcbmkDd@G,[KA6)cj3ZhGmI,QDmr0$L%@5Gq\nG6'TP9kEH3J4#9`Y%D$a)1IE[Bj13!%*(U9HYMYc9$8Ddh524EV-rS-)N[\"A`)cp\ndJq12#!AYB2d8,%8,92MVYUpeQE5D%DKN0+CNiT!!9Z%dGT(6HY4$R5q'00)\"c!Q\n`2la!lEh'j`#5AK6Xr`1AJAPRZ,#VGCT&)C)A5J9AZZEE5Pf)8%KPr!GT,Dc5ZFD\nh,@F+'+kJ,B1J&T8b1c*MYLVQ0FYURBj#N!$6P#lSQ4(VE#-)qqZ-deh,cjP)E`&\n\"6lIGMK\"rqBj#JJd2'BM1iemX#NV5lhCkTX&S0d+rb8SFCmN(V0JI!XbAQ92&\"J+\nr4'N0X!ecG2mLj#4'S\"jVSHJMRM6ZR'd#FSm[*&YE'5F02j5f1Klll$CC)p6-A9$\naL#Dk,'D*(A4LZF'%5kqpaM@2i'1!3VX#Nii$XB+EB+f*UPf@2Yc8Bpbj#NA(`dl\nkI'e-i'Dakdja'JfH\"bZa4jbM#ii2IXb4Ib&H@Y**8`CL)l!h9RM['c8Pla8(#ZN\nQrZ$XL9hYmP$N[mSbU6$4IHQ6'19LPrLj!3,YYe!X`cibk*GS0D'cbYQMGi@eaI$\nApL-#ZXkeV5%eH6bFJQL+%`V!&S&mi#(Q@d5f48G8**H1KBI5d*M9`\"@3!&B(&j(\nMqJ!e*Bd,bMeRM[GqSD2M*Ci5R9UD`(ZJN!#dV$Z5(N,D$Ei@%LakSS$iflLJZHi\n9&r+U)1M)F%P[dbZMlU$Pr*V2NH(6eq4JL5CX8GCp3cbl*Ek8HkH'`U6U\"#c[mf6\nf3@BIcI`63kNNr6'iA62+9@P0SBGa0jm0Dh20X`XR#A#rp5-A[b`rhXEl9EB@Qrh\naGpU%2#bfN!#0D%NM`GI!6(2LPQ5#f)0,XZb\"FBS6EP@T@!lPX*6@dbpFFQNMbpB\n%$SSr1#ra@6l&fjb4U`94%Sr$##RBT8liaEM,+'iPCA5cfZqJ\"P#T8VQ*H)Ueh4e\n4kkN,hr)l+(,R6,T6D`F90dHCT\"MjjKrP-NdJIcTC5,9cJUpS2@eP2!CjXAbGm4Q\n(0pM'TS%r8L08jDL@r)5VJ@bl#'+KXAA1eaKId*)Mfl(##&'p\"q`[l9fk1+3VrHA\nbFSfT&H&fl,f99,H5Xrcf&Xjl5(8VTa4hj&))a[!Udlp$A'9D0DTe`lbZNb(TA-r\nd364@@LG0'JBKXl3[Rhqf'!9md-RHmBU84ffQEFM[0+\"r12lNjj6ck1@NG8+5&f2\nk6m,52hHcU#[I)fV81H8bl$UH3c#1SB5!1mAr#8I(Cd2\"'**pX!3$6P+Z)+U!r@Q\n4&TJ*B%P#9`1mje'Pc`Eihj0'Uk'iEq9`F4'AR4E[LpZ5`%VjhJl&*2JYTAM*FLj\n6'Hbf5PJ5c39@C&j(K,9$C%UG0)M)$!NVE0AcFiN\"-FGN-*STGj!!@cIrILp8dmm\nPZ+Ji3NL6k5`Jic`cii0P-'qjV%pL33\"[FB)E%aAc*-b,!m'Dh,*4'PTB3'k#-'a\nE)!Gl$M89ZqY3YI,%,D&icFqRiYYUHCl[K$1M2J(Ap,,5ZH*`@re[4Lrak0#bPB)\niq+!'pA+UM1Tp%q8&hBTD+*4Hjc9`)ZXAJ&MEN[,+if`HI(6`#DVff9q[i3TQB('\nS,N\"*Tfk8Bf(fa'eSB+LL(epe&D+l6ISC,&`r(N'm6bQ3!!aYd#RlNFpD18Z'49!\nk\"f,&c'aq*Qe8m8hE@'RD%&1!mGH6l`J@BTK0Y\"PkUKjFaE!-BKldGlP'XpcNkZI\ne)1-XNSA)Bb-rR2[4DFS[%5QhbJXYpHUX$45[@bmQEMkZBN(hP5LS-PHU-&Ql1PH\n(*c`0E)AU@R5YkK5ECiV*!P2a&IMTARDk56M(,\"UrqThXGZdYl5r8eIRJGU`4HM(\ne,cB'RiM5(p1iXMfA@[2DLmm[5&cqLK'9j92%Yq+U)2J*)C!!K6idJh!kR)2lYqJ\napc5Iqf$qIqCFb51M3IYcYa,%@@q[S-l1S-%PCf%lDlTQ(k,Sa\"e%\"VJYG03QFD'\nj-Z-*)Bf'k0pX@U2l$!ddAGba6LVb$K9M\"k9S,9#5U`2YNTD!$91AV0q#&Cq-Y*S\n4p,DQh(KMM6r-8(VM\"jjKU$+Y3V\"Z-a,+'q2[4@+%kY2eBK6CF1fTb4`+FT!![DQ\njS*6)FPfj\"&HhJFI+pd0&i1@-BDJZA5V@LMMhMm)Sj9QfMBl5%jPKBQ-$*0lCC9+\nR1TG-eiPGCZk8k`TeU#BF2\"5*KMKQ`8+*3F4f'mr$ddTq(UEcmr9mfX!#Ve3ei6a\n*FZ6ZU)j[%5GU3jEX3S%e*5)DVY2RM)GHKji8Mp@0[&0#Ze6XGrG-f#)qpNFZ0D`\n[-YeLl3\"jdY`9UKi(J14B9IhPNAHE'9NjqC&e&[A-b2kKQ8*+p-&`3m1+#cX&\"Ud\nD`rHYQ1AH@Y%T)T-hX*ZhQ)d9&aBCD!iZ$&J6#6%k(Hh53JUS20,','`A%)1`Fi@\nT3a[P*@+@kdZ!-f&Zj[L-ZYTfPLG#TXh&QJ3m)9G1m#q,5CXRd!eGc`DbjK@VG4h\nr%m+V\"eqiq*iecYH49#q@PE2fRBMB'$i'S4(e#%RU-$DLaBF[jF!S,3-Q%STqflb\nM9FCZX[RF)85-4j3Yb2&X`e[`,aD6b54jkPM80k2b383Xj)#ilQNLTea&9TE$\"&Y\nefP5b3(r@N!\"[@JRcaDSNRCNQc\")8'0IEEdNRI!0M9I,'-`$hH9RCp(()\"1PXXcr\naRPlU!hKdlYC&Z4qQi[i6aQVpi'58)+e[\"X1Q*0,hlaQeF&0,FT,F&e*CkcM4e@$\nhJe(&+$Q)TkeS32p\"4%X`5&jhN[8iAK)'L5!VSNmh@(LEcM(NHFPbr,11&AUAh[e\nJD&XDTT(N[QC#a#m99m$k8ALCC4-'!L!+`GZ@LUfFmPfBYAX2i6Kc,[E2N5LCRSZ\n%86TR1Z&(hMGB(&J-RHN3jXq1'aC[hY4%46kf\"YURq3IJp8p#QaL%ljcDc&j5Ik[\n5#MMHS5[UHUmG3cQY*i$Veip4(U4KUc%'U%r8#MLkUjL50@N2'[Pe4C@@Ulhf5J[\nmBp[5NE*Bj(b!b5L\"%m4+B&*0)kP\"IIHU4(CfceaYSL&(FVFG&5#()98CI+-`#Jd\nV@eVmA1%CI%VF4'F330DG8pAUQFi409IN`!#I15G3PrQc3jDeT0XNUff!Fb0RAFX\n&\"3bG!C+3!0&&25\"#)CY`KRA1fq4,!$X#DCC#FJiK!icA@'N8MNe'Er'pPM2Sa5C\nhT@Za1SlD)qj$FAZM5Q2e%#02$h1QKDIMJ3@@VHX*'mFb@$k+h#[Gar1HGUJ+82j\nX3JMKG$ldH3P(MG`)QG1#RDFC`P9@BlUFDSi)-AjJ[P(lhHQJiTq*lQT,PLAFlX0\nIjd6'2++diK+(,&El@UDbFm%5Y%hePHQ(#lM5ld$X-9Qc,5U2MfTD8K[6bq`YP(S\n6a!+GQ#AmrHjc%@bGPH\"kI#(T!qfkBFa6EaeAEA48&dlLhrpMX$!\")%)mIH(IX5(\nSK0*jQ'#S\"I2JDhj'+[T2SccD$)E6&lYI9qiKLRUG4GQaq,1+`T4#r`fC(A1r4@!\nPpNL$B0Maa`3P5*34i`m,)GN8GCV9VlR0)K*\"P1+)KbNS%\"KEbYCrCH@cTACbXID\npQ02MaBNN&3h+hkm(d,jYKBS-UaB8,G8lHce[#cCR2JhNVlDMCVr%f$%B[Z2lD)`\n$Y6k%JbI*Nh0`S*@hcSZ%PZUbY-bejP8MhM+P3Uj'$(MY[dECTAE3'rd1YA&@K2j\n@E-)F\"!$mk(*a9CB,8`T\"8lIdaTH#'H'Q&k--m5l#he8TKCL&XdKlSDrQbLI9ZZh\n`q\"r+hkiP)[R(l65V(*6*V@UP%lKM1cjPD*&0mJLld6CeKY8ZPFe219eEEUjYB!f\nZ`[!\"8\"![RM!VmlNFeh(-8&Y*cm9mAj-[BK3Af9%+X(5@I$#b5DSQG)CmlX)@GbH\njL6\"$Prm\"jmkAX$ABGHjQRZ9[6QNKPhb`q5mkeT4l`1TZ+%MC&S--JE&D9ZjZE`R\nk%XVFQD,5eIEMK)rXdlJJ\"jTChqaC#k+#Uc@2AN3b`-`TlDd$ArdFQUJVDd2G9Yd\nmk'YFZjr$`UMVHL\"DTi0e+1jF'8-,DcX1hA-'aSHBSTi28d)KUK'i8ec6ie6H+Q*\nYNJeQ3UK4rX!UY3[Q-$@G9ThGX`'`K8\"4PL8-JlbjImTqUBA6Mp2AKY+pUd,MSr'\nAMi%p$f6QTD,pjL9aJ9q([,5c42((19A$9XfkCZ#\"U[*'bfK&9[C2LC0+3Z,P-ek\n,-9K4,Mc\"kLQ\"92d!Bb[KENX`Vc)GZTLJ#hY&3K9&Z13SEA-,a)U6$d5DC9R&XVQ\nTi)&mkh1Im2S@[+p2li'XG%mEeXPVl*YcU&f4VSMGR)P8CbB&AMAj2Zf+Epq*6(b\nCdLm!IkU8DR-5-*pB\"84EL[L*B!DTm4`rlbb4M-mfMrZ`656,pqR++MXi#riF(He\nbrd-@J&3SNXl*me,c`$-i'hdE5TQPYc[#YV[T#2E\"5NLD8Rd-%,qRiQpFrZK6VMX\n@iPBI!S&iDqr@HqlGM(`(i[,LUSYQ'Mj@&fNMh1U%'+6h4EI$d91Q6%,RGZHcKca\nUj)%$CE0I[QPDL@mdQ6Rr\"Dp1rhSXiQ!2!#D8[4c`NX8T3JL3!-XX[\"&K`[)V-KP\nFHeCD[SmkLfcHIc-5pN9&)qCjQh,$r5K!YShQcYm$,9B88GJd[dX#QB81klP\"9*V\nSNJ+li$k+NiceA1Z8m4\"S-+@NGAU81+!dAh#EJ8\"Ub0(r9ElM+!C\"U8+-h5T8a[5\n*JU-i`RIEDCYJJ*MN$GBTIk+D-MZ,P8U'FT@2$+`ICmY&\"bJ(h0LUU0GaKAfb&,m\n$i\"L(4VL'FY&3jHc3R![2XBEKC3Nq1MpiPGRP1X2\"YZZK%MSqJaH#-2R2&N8ZD+(\nj,UZ`GR-Tp0F,2\"+XR'cm2UmJR(eli8\"@(ZK#Rc0il'(d0(qh-I**hFIAPkI4bG5\n2Z5MrF!H'lf8F2N)Qp,[4JaK(fJTDLMb&EZVmFD!CAPEMTJ`EH@fBL`$l@+`(+50\n6kQ'QH+Yp1Y-ZZ+4l'0JIE2NJ2'2-I,TJr&I'dKfh\"Ilh($1)9)bIQbfL!@rac+c\nY83QI5!T+RX0SSPLUrAA`X6pX0!5QRq,l(aFSTaBT2f-N02U+A#HeM)mABE5(#Q1\nh%h&01L0[%Q\"Ke)-UDiGjBGlaZ$SU'r2NE,3qZ6mA5TVSP!8JkP6ZXI[$Z[YKfPR\n\"%R8J!0,qNRfpLT5mH)H98HU%UZ\"JmM0LmE(B)K$XN9PmJj`XEfdM1TSIbR04-@!\nQXihV(bXFQF`69)$d0KfY'5%VCGVBf3\"1f0DUAb`[9-c+[@Z%cijrrKTBaUr0BbT\n&f\"M5$f&S+(k@2TAT[iEXra1r9J@LEbhhdR0IEC`EEqH!1-fKeH9Ych+&`#dT!1a\n*SKj$N!#ZDN%cXVa18b283qKX&RU(GPKaf'(3&`)TS0R#[hDMap-QEGiC#\"XjeJ0\nddFhh$#)[!FE4BI[9ehMR4P[pY\"G(!NrA-K4k[\"8k$Q(X\"1MES`c*ELh@5fIDDPN\n!fF`)$di)YU9LIQGMq@[fm%,p5#YG8%DrC$KIU*E558J(Zk8R1GL89Q!6T)E4`YD\nFT6chaj!!BD3)FfdH66)`efD)3$#@9YIdcXbGSC--Pl289DV'UY`q\"j@XZ&D0(+8\n2e&lZ(!qYj5FLeb*6FELC`\"a+908rmUSJk+I89lkEaYbR8VqQSMVLL[K'Z34,2J3\nD0I\"-f8!lKBP'Cj9bCD(EP[-*HEl8\"aJ-\"J+!,rpHA'RaeMRa$9!,jV%Q$,`KJ)$\n2%iI'+$06q!Gq)rMRhJa-B$\"-+r2F608kNI6R-pbjhj*meB\"E@d!`B[AC4fY8RX4\n#iaZU1UQY)jALCB0,#3T0ieDKVEN(lJ@Eeh\"*&)@3!#SCZBE'`9Z6K83F2G0U[@`\nLC3BJCVe(LNFi&TlJ!0+U%k\"6X9+Q-kI3e$G1fAPqVB(Ii0T@'k1\"\"*!!JQjJ6@[\n5TpV*1L`dU!kpm-f,PN(bK5\"U%YUIT1kSaPN1ZU(ALKYVdG+LTM`9`ef[MfRR($E\nmTY@6bMN`0!Za50Zbi-LpfZ[HS8phG5mMS(M1h-%[RLPK,RThhdFME$GF%JRTVC@\nT`Xe*\"+AXjI4iRRUKG6L5Ycl@(A*')@hkNf*58-B2lJ43dB[9rC!!X%*NBif[Ck#\nk,cJXPTAFk!QQpi)Eq8[jXK8@H[jqLLk*$TLkH%hj9r*-66Cp3J8ffNmB1'VF4D4\n\"ca0PRfD22,CH-bfKM0rEB2SC2a(*Uqh30j!!rA*d!Fj\"1KhlklaR)\"Lc'EilJA`\nq3J%Q$hmNE`4VFlar#ICXC,8[5$)SjEUj(`a)lX4#mqSaJpKAk8K-ZI\"8(HG[MZ%\npdH5kSfChG\"XFRreF`5@&fa,'#GS'Ujb9JVM9q@\"T3B,[(3b6*1rqKA9'XQTGELP\n8)X-L!0P&Fk38@$!JrHTZZb$&CZSUD0i!PXFh80(QL4R+B-U,rh-FAhmDTpmpMcl\npEQfj#X0V3mB3lDqMNkd+Z&Pk9A+-8jN)lb*EpjS)5Te*I-AF-Kp0KM(+f)mb4dX\nap159eBZ0-PecVF65c@IBD25r024\"`h223EIV(Dhb1cH$4-FlK[PKk-hp-N'VJAk\nQRS62Z89+d+0eh#I111#+K4+hC6K%QHQSLSE8K4#1TKJ#Zf-R(5c%iVjq&KpQ+%&\nb\"V`[fmb3!'Lhj[C0ALPf\"JrF[EbG%LiMUBE!c3)ld3FcAVUM$j`G2@24,#TJZXj\nNqjrAZ##qp+H[50CK9qJpAIPq*VBH8BQHQT%h[QML8a9Y&EUUdU36J@0emS'j$3T\n!LC!!LhK#ibfUkC,5C4MeL4Q2U8VGr+8!`2)AdqBDF4,mD\"NR*R%9U99,V!-'J#f\nD0J[idQ$lLP1&)GRR9p'+UmiS2#Ke135BVpYQ)R@CZbh0PL1iVac!0mPmJF(`9a'\n0#qkY0Zpr53'XlE,\"FH(a`rTYT&`[8b3d#IM2cl!!1%'M\"*F'Qh9&mjkpP+U8,p8\n@!Z9'jNQflQcr6d[Z(8(VaqAG@hSa+l*M@6A'jRMD3L1Z#A+@Ka[J1B8aKMBD4I%\nGfX0ciACppIh6B82$qHE56l)4$U%2`+%eEm@#'K')Aj*E`eP&4b5PX0f&F\"QX[MZ\n8r3ELJ,\"YZ#P560-EBE-USR9ARF-Q8E-RJPe+Er3fFpAeK3l8f6E8%Gk%VCL\"ajl\nbT3LE2mZQcm3lrcA59i%2Jk%Xaf)U8LV8HMMprhSpiN!RmR2MQ2mm%cV6E!l*h)#\n*Q5N9ceLAa(Ek$Hm5,Bleq3AS[`*kc#P&raJDP`GiNMNC)9hkqr6a6f5fp`\"\",F\"\n+8c)%RQDdmfMZ('K0lQ@DkhhQG\"Xm@(p6UL\"'le3faJNRX!F&lfT[-VGYS'*U-SR\njG!JCLHBZ3HB,kA\"#rMHaHQjG*H,Pb*m#$eqiE))j6(2A5'(*%aUQ\"1AqE)+,IQE\nZ*SZV@KX%i0!f'KD5NDcZdHKCq1pPrJIl-#@VEYLIN!$SMp4e\"#p,p4DY)('K8I!\n6QK!khV'bFAYkE*3YpQie*%#![eB`r2mGf\"GcrMRI$#2DD9Rj'1QpAmIEk5dr$dr\n*qIU3!!$D,,lV#kEZ%lPcTk-P-CGJZ5pP%ckeUa9A5Lf[Kc`MqVC8hZ(8XL$&N!\"\nAkPd@9,E*FL[qFh*k%!Q-PU!2+c(fkMCDl&cdN!\"@0&NU41)d\"1la+FGJmG#\"l2e\np'5['!#d4#lIUb6jcYP\"9m#p)HZd-q-@USE*4H#[B#)JQ09%VjUmX(q0PLdJN-M#\n9mP8heC9j(M$LRhQKrPNLTdrR4M4aB%5Rl50eFhIlAFK4F$EaIQaBAX%mX#Jdr5I\nN*QDXS$GPdcbNDBd`2r@V,5HdeRhd(le%JHeXNBC2NkrMlhCJ)%JU34RYjE%j(P\"\n#lSdD+`F#3L5[AJE*61JBHk**I0+b#ql9BiLS@+B%SeRMA$1aG,`!DCfTjk&58aX\nF@mIDJR%ShEH+Cd5[pqJT'JVHi2c2!-*YrKb$ap%l'LbETcQhDKPh2HeZX4B@DkQ\nKaB\"qS$kJ*a,plhYjBK!Q,qpI3lH)YbKEY2hpMZ(*E!QUd[Y-je3Hqa\"B@qXFpp@\nr\"Lm!P,'[h&10#1+T6VI[&3AlZj6KhKeBi`T[34X0#G!r,m9qre-L3+r4Vh$$QJk\n0%@b)Zd@8***\"H5`01iI8[*ELb8\"8rbGeMT1+`aI*I(bS,CG@c'aX`clG3hRFMZK\nLC%hTk,KFq5Fqf%)Z2bX!Vp#M)L*f[RQR0p)ij&dEMr@`0U$e(bD,-35DZENhb['\nG@4qGi&ZCTV[G@X9(*'k4(,XU%!h90iGNVhMN)T,Pk0fi2VGJQjTkEAE,8Qac2LI\nC*Cl(ec!4q&Z`d(R3`MGAUECiFFC*FT@\"1NAAqhhm)1c%APf)X@Gll+q#lFYbFC%\n(IN,&*'iEGij[%f#*0'eY)bAeZL`2$fAD[3$CS1Qe$f-\"ak23(31(jTQjTrF0A1X\n(,&CdGaZ44S0(pL#!0@5Mm$jVH'1hf-AmqP-LK+8i00@H$MHCPHK1%(HY65[4I8*\n%93mAmb10SrjldqQh)((lk)hd(Fdb@-*@)m\"S)lcc`jb`U+&KPDcNI+I2L6Z9Y5!\nb)J%BQPa6V#(*[KV15#KJMm)IK%`H+IYCh2@`&G2Q,jc88kQq`k28rDHpJXp[SMq\nLZ)l&@`&0GbQ!39A*r4h%3i8S[J*rkU'XU%3KZ3M2G4dAecpD8E5V0mG\"5#'9E'2\nD9YUXME0Sk#d9e*QA-jiHEdLm3,J3XaN&cYHEScbqE!-6Q`kFcQ%bI4&NjrH'*S[\nEPlX&*0#lejQ0Qh0\"YB)(k`mPPamEph9iEcV&+i'eaqQ5`9DI5MfV1*FdRaJ1FlD\n(8Y(1Q9EX%f2f,0+3!\"[%r\"+1j2C2dc%'#H\"N#h0GM'@IM5Y2Y6NllR*'1*!!iG*\nY2*Gk-DAE5kLfiUTh`B1T-@9)S3*-NNaTqZ6ZH\"3AedaK`2j1%FGdPRmpE$\"mmNH\n+)*29E462Ai,I+Fi$m-QYNB+&5jIQ'id2Kc8*,Nb+#+Q-805h%S1p40K$XaC+NFR\nkeb5J1LdNXQ+r25#&,'#(d`qY`@dN,$lQCSl4HHrhN!$lT6JdJ8$m4!$e1KRDR,d\nFl-&dr5*V9q3LPPF*)93CQBL+BZVJeTMQmj-fbSBbRlr`F(68ip4A4T@)H'i66Nh\nQMKY0b`a0Cphe2[Pj6@4aJQPMT6SkR*!!l)+5M6&,ClXdFj(LSjP2Q5qHeBRBqI-\n(Mrd%PLU*'-C4@l`P,jHEqIAcJF3,AUp&+@me'rf[6fAQUR53!2S6Cqepa&dip9r\n4*d*ZLZhk$1!BF6f98\"&@5`j@jk26F[[TlB0*JHHBk*!!NK\"8(EjA5ra0jlPckGQ\n!mI81Q($iN!!qhH,bM%#6VjGIY&Z3!'#baM1imI``X*HD%@#jP4L,dElG%eZ[Tfj\nQj14R1e2LXeQcK5!4,E491FVbGJcM%m(SdpYLa&e8I0CYc`jcE+NEje+bZQEJU(!\n%[@A0JQIjL[i,%X#!Q,1)SfN3VeP,b\"KcJ!)EjbZ#cS@Ck8Ec-J$cYih8DhE)Vi4\nT49`2q!%T!rbcc!&dVXcp2$REEUa#2MGP1BYiJ3R%$A(r&`SJ8C6bEMSI!Hr6am8\nh8!Eh%,Z6#*SJMQjI%NAf9NE@b%ffm0X-E@3G`@866a6#Ph'SATd#1r9@5RK'J-L\n8l0r0#D!5`AC!Gq$S@1iGk2G%PfLT`S40\"M0heC()i`piV8N[L#Uc#T8KLH\"m`)l\n+&8m`@mj2LZ62erb+I(a+FFDfAB84\"IP5m85F40%4reqZR(H0`LdB&#q4NKk#H(G\n@INVIVZp3Lq[ZpXjK-lLGZ*SF@fkDHMr&)Vc1H9EbMmR8XGJ,VfLH66!2r(T\"HGE\n6Zld41LPh1K`0rYABJ[*VhHPQ1)emk4BNF4PKBabXpL&9%$MBVl&-j$DaqliaLd(\n0M\"['GpaHmrB2V[`6jD`'+FmkDb[Apl'cKFKV'jXBbQS6FVDHXmb4'a+&ih2hJe\"\nF)D\"`hmYb\")SQ#P,,Y6+kRk0!a&&hNk!2CImKkBd5jRBMaJJ-JIlrF9j(+UFk2D3\n[kk*j92\"`p4a`+Af0iS2@J0l[&qKFED\"48Xcm,IB)`*8PHq5rrN0#CpbVf(A5mq\"\n2i$h12`q@*ihMj\"daXj!!kR`*Y6fLZiKZh8EK#33KJ('P+!@MEJd!c$8Zm)aeBhd\nIN!#YYjIDZ5MH6+\"Ipp-`@IV6VjUU!)PjiR`\"`30Xd10cS)mRE)`98UDQShL[RY,\nH(i,K$VCNl!lR$58$BijQC\"INd[L29R@BD'MD81k1,li5p`PI[e['[+$hDUa#&T*\njIU2@RTfB+Jr+R``TJqMrDHVrAVkccKqTbVX,reA9BDL(*![ei(qjE4i,5QIkdke\n#2bDZ#`C2f)%XDhAFR,'jQI\"M\"+d#(CEHrY6m)TKqfD9!Xi)B&81@12cGT4GSG#P\nBJY3m2J4PN!#q*ZE['l+cHUIVP+#3!+M+p3k9TLJAp6))SDe00@h$iU-Vflad)U)\nA-\"\"i*5EL9)@lQ&!04r69'ZaICj`54*%#2F9,kiJhe-[ceVfJa-KVp,Je#55X4U&\nafK49KN)@NF[l8Ik2!G*J2#A-V-hIj$80hMU(-9TdE20ZD8fII*LEJ!-FDqb\"#ce\nN5#86[Pl*hlAXP'kXP+\"#a9LJ$(LZmcBQ!'QjJCjj%KZ@hIUp*!P3pb1iYKa$jq-\nA\"(EF&8e@C3QXF6h*'Q0[%3a[''kp5fFAVA4f)1F!+5A\"Sh3H@c&lUZ@kP(haaU`\nA)k`fRXP8*RH!659lhFqJ`fh&YZkFl14eEPP[B8jkMq%GF),fILS63RF[46B3LNk\nQ6[!q%b[b\"@F\"6,CXAm&eacB-mrirmUSV$NLY,aerQ!UZ)kd,)Nibh$iC`IeqZ'A\n@DY'aFm+Ni[mXV@+Mr9@\"$Mr2Dhp'JE80R,aN3CIb0[Uapkei,NZcK--+'GJN*S&\n3i+q#Gflf85C83Afc!qq-%C!!@AQN-8@$P[+C32S3RqchZkbd,)!*5\"TC@k[JYPN\nlE,B%5UXTqX35D'AN!VQ-i&Z8q6@e@EP1&5C#2$-9CkV\"KXZ!IfIM4Nb\"pZ\"dF@A\n&TI\"TTe8P$KR!ZV5BTj&*5XSbQT!!iY6Aa[JUdJaKQ6E@1D()AKH*`DFl`&hf&Kr\n4U#j@eTVa`SBlk4[('e$1`k1!i(QLH&'D,p*8RR%iFQ5Q\"mNp[Jlr4U%[8-(91mb\nH`-Yd*XaIeTlcm*(U1PV@+AU3!$j6BS1A0*UUXIcZC3Q&U#9-F41qV5I49qRLbXe\nCjhAE`ibXickFchFPIEXE%UGk!ZZ)kV$Y%H0D5mDc#85!1T1)'TqlUpY)l14YiaK\nI%hI0L&ATELX@5,1Y*TXafKc%')j$\"3a%P6YGX@8,1r8PmM*APZkeBEP#R,6CQ9U\nJ2UcPQ)YEff+GKpeieS166UeQ[1hIi!f\"X2HC(+96Ya!`d-XNrJBabA1@`aiTHM2\nSJ3*4E22L`hQ&E#krUAqd%JHa#*Ni5UQLY&3e84JjBMm)Q9dA&kb'hL)eJ@9'LBB\nD(3DZL(#a'5Y5+%Pjd3VE\"4U#Fh%,[lRjH'a%R%Y\"lpNB!39pabCf#A1%f$%qSUa\njD#d`CGTc#Ec`\"rK2&(LfB)I!mSI''e9'ZSBEe,9`0jkGVe521LlEC$,QMJj11S%\n)lTNj+h!p&kLEl\"Z$'Sf0C4qC'AP5N!!U1PF+TD\"c#rh+DRH1m@KlJ'&**SC!B-h\nMGEEIi%X5ed!GA#(N)0%\")Sf5Pdf\"QdL\"((h+CX)Jc5HYaHPZpBE!BMV%f04hdC2\n'F'&5)p$LqNNBT9RJcCR3M4H%P%V2$ki-9`cP%`hRNRZSS5TRh!b[c[6rH04DQH0\n!!64lBIh[4P`8LM2\"!TbB`aS&`4bB`km1C\"!'9-A'p5ZE%GCh94`b9hm31bhqA$H\nUK!0lDG`j0imaM&H)J'S,`h&9Ne-DKVRq9*L$Gjk)*CJJip!rS\"DC5eF+ZVlUcdN\n$G#Nd,62i$qL+B*kX1k@jT&[S\"ZGDH1Ir4@BRkmdcMfpD6X56@Z4a`Zf,1-0NHYk\nB1%P8G'A-6\"&JXAhA&2\"bh#(4N69Fmb,XUX'Fr6li3H3BNH963bLiQq`i-L$RrIA\nm`-NA)bJ1kJMbGG@2UK#RbchYKX9D0ZEJ-Z&@X[!$-aYi9-25\"*G%DTYX'eKm\"MQ\n!ZV3S86e#,M3b%B$@INk9flKLc,!hHVIKYpQNY55KfP,Kk@*rNMEZijL\"#p&,CqL\nU6C!!0RLQJcqPli)4GP\"VR(40VQBDeM2PfPh8i'\"&c5Xj))E8J!5L2$*q*hjEG6(\nc!(U9TlXIS0G1pGcjFmaj\"-*rjiqQh-LN#$cqSc$#`'%YqJAM2f&I2P!\"\"eEdD()\ndSMqQd&2demrk34+&bR63kjGQ*'TVZ8jUV#TdQa2@UL--Br*-%\"SP#HhH)NpqHP)\nR6\"Lk#BTIipKA0XAQAf[AT%c[ibTE9eDbq9kI4ERlp&-r&REarb@@`+Pp0MN6b#J\n#R[CI`[Z*h`(k1T6AkATZLTVJ6LV31%T+dkP[@HeRcSL'bBXXX[jZ#*ZMe@c`61,\nVB!r`4Q-1,EiC8h`-4*6bf-EiLPPceDZeeSRQNmlF0HYV#&2p96d[j,f,cm1TDIK\ndm4q(6d#-8SiF,&4K&)HkeH5\"d[p#HAarV5!aZ+EE[j!!pV&(NHpf&G3'cqCmL63\nl)YK+HjH8P-#4@PYM-C!!F$MJRiYkhVelR0j\"G!L(PpH#R(3a2l-%I96*ibA3k'(\n`mGDLj!Gqp#K3f[%YPmJS(hFJ2TT)TTA`3L8h!2LBfi[bTf&M#Sfi\"6TJ64bAcYh\nMKZke9mP*3!M#\"m[2L)K@P8#`H)*a*%CY\"\"IX0NEpY2bF$5blN!!pCmQL3KBplNB\n[5X'3!2$VPrJ!Cmh0dV)X[(cG1k)$%i3p0@\"&MFXh$hHLXdm5Z-$*@Rr9AkCep\"@\n[\"Dl)6LaTUP'i)&T*X2524&b$`e'%V@YmFZp'PqYT(31CSrG45Sq**p!NFNGkZ`*\nN0qh\"rYF-PSiM055TNd*2R69e$KZ190-iL'1&BA3YVN+4YT@(6'M+V1RpGJKl)[P\naP\"2d(,PT[!JN4Y2q!p6mKk`#U4@Dq&lrCe$Jai3dl[pCQ1R(`bK,9-Q`,c!CXDp\njDlZk&cPpFb@CE[SEEc3#,eFF,(1rMFLfbbDL$94i\"4DZ9(Z`@)Y0CM[`YG`e%$H\n)8-Lk9+E-ZKkLQ(r%k)jXDrYbYKL'DP29Y4@bR1`dN5PU#[*bCkM[HfXrh$acD4,\nM`Uchf!K'qp9!'U&@0X#c2m2SYD*)*f1p34DAEbrlf)4HXcU%f0Z$@M6!eHEbUMS\n)+a+$-f32l`%k[Y!0IX$Yajr,D\"(p,S[P+qYP*R)@3j%'HR6aZ0GcDX5#(,UJdTb\n,8Sdb%1[k@Q5Vi)P**ib!%VA*DP[2Q*!!9X#%rGSD%$!)Qem*TFDJmE31FQ*[,1X\nN25K0Z16+lRB)\"(U#+PNPD[eHANI'#le@5[X%U,@E)d8I#226dic3&1XaXLBEa)P\nIM(eeMm4k%)B3Q$6$9N2-&2NBf,c35U`\"cmbcSB0%TPBF1S0)d,`mpr#*k8(369m\nr-$DNMpVbBbPi-TjAhZh-VpX5)DV0fYmLMf!0PfMAP[3F62H(E\",m8N9Bfr`JU!j\nMjl\"d9k[Vm'BKFak[qQ!Nb@ZhJ0rK`I\"j9AGIPZI#NEqNUT@e&-(jDX)h[2%f(9-\ndIMP5kc[5GN6#6M9feLH,GrPckkrQj3)%q9`!)!i6[j!!ATQ!kdql(2L9,kB4!S[\n3,6fKa22@&hra6FB%N!\"*e$AqFNR&,pNh*)8lcIji&6FN#fpL4Dc#eLf,9aLN+%9\n'F$bRF'CiSHV,mXlP6FN!*-6A)J\"Z*0-dNMpJQPNUG!m)hF#c&Tk1[3ZX'P3Q1U'\nfRQMYSSfQCdJZd!+M(*Qh0qEe'ahUiUl%VX%MMhVl&9*S,SC5Y&[(BR6h5bPr*a%\n9,Q%LEN9radZ,K5N#k$i6b+@CS@'dV&m,&19eQTE@\"Z`r*c0XRNqd2Glj2FCQr[[\nIA`Er#`0k$fQRkc+cXK@C#Sfd`))f8UIdqf&+L#QTrb[CA\"aIDEe\"bB9qR(&kZP+\nHZ5A@p,@GSYZ2[8di@qi-+lE%a@blXU[@H@)p)Ff*fe$H\"V*Jj%-H49`0YN[eE4&\n$`IhkphLeJZdXB+YF\"Df'#!TiN!#,%S*Th5cRaNkLRR4E81G5EcBM#jc$)aIa%@Z\n2H-r'(25[&[UK4F5L-6CTFjNPA'%e+hMi4lNYjN5#mTEU-(R2pj-)`UF3#3H1C9-\nQ&'YZJF`i-*ihjfiK\"aTMY$Ud$h`2,L*YP\"2R[VG#-!)SNQ*NhQbFGMiHK#JqYeK\nSMX[E3'FB&)I`NTZ)EmV!!5%IrQ'9II`XDMA&\"UaR1TH2db1hK-#8q-m6bRA(+eJ\n`1TZ`f-)@jf%GUVj@8lQVNCI$G\"!)KDAb#V*`SJ-*'m-$Ql&@pa2+YF&Y#5#[DNE\na+\"5$HG3+h'lVTC!!K3lhcQA`ir3JNm-Z2+aH6karKP5EjCj'qCL!IJI8*SJb[Ya\n&$cp9Ni\"iIJ(KEKU1Qk`'!+AMiCmj0#E$e%5P*S9EqdXE-FhC&P)62dB*rGCP@hc\nBiah,`3c,EB2)*DbX2PBE%8Yd,2D*%@Fm)rke@DlN(dfMh@!bU*e0LNN#@3B5kNU\n[H%MS`#E[d-[2Kh3iYpCjD(91+H&6M@6*UH-NFJ5UUkAT3F&#A)P*pQ'PP8A\"D[M\n9l$IJl#VIqCk2iH$5LeQ([(!dJ'J[8V,@bAHe+YK+%lU\"*Ed,HDVTA!j3NQ@p'5r\n5J%C4hA`r%RTDLFYm'52+PKCbGNM!Vl&!L`V\"c6%,dl3q!T12j5FGJ)2mXP9E1ej\n[9JSRG'!QcN`K,jh1U+eRUYq+mG60p[%2\"L8YmNr[`qdL21AB$GNq@R+YHKQC\"X&\nXe+eACrpelZ&IQK-RC,cr(06ec3k%CP%[rGQIKBH&MDJ9\"`emhM,+MG4SI6iKmI)\nRNZ5acj20%(M0'eC&\"q-9'%@EFe'GYUI\"0ihb(c&[)PPi`+@i1p\"@2K8cHd6a&1J\n%Z$E*0hH,VX[+8)kkF!(N[4dC&,#mcj@\"8l6PpBXbdFL&CY`+Z9K+J9)[Eb8IA!4\n)DbaF+f6M*i4$)8QIj@\"KbrhUjfZ4R9!\"&06P$N,cG''AUQ*K$E3Z)V\"@$TKf$-(\n$ECX#b3!c@BNB1DMe``RlZ0%6(FT#aZ6kYjIiG3Am1V[q'b1I`k22iG2[m1Y6q'h\n12iG*(m1Xrh$VErKZ-20h'(AC-kQml#0rX8dDEE1fK1JfR0B[Nh-qjETT@KTpqp4\n9VbkBD`$pGJ*rGRJYrKrb4+\"E(p5)4c9[f[6k'3Tl3YC%qGEA(@#@e1396iFrr-j\n9hrAfA0CTJ$rh6e++VGiQMp22MmB5RNRRAMIb4pJ&,\"jTTc*3iRR014JLR3+kp42\nRTFSD%Q+p'KP$)k#&LD[2m'dY0eh1cRp+qLM4Hd[M@L[e2Sb-9qYPNJXa9Am6a-A\n'8C4P%EKcMaj)1qm!dCqV6qY,jC+(ACXJ\"'G8TCXc&#4[p&52VI+M\"E&ipJ\"DUe9\nem16(c-D8Y!maTDAe[hV-Hm9jkHPYGV(lFVd5GNlkXlf,fL84NGI%%IfhBkUdabM\nQM&c3Y*SLr`Fqdd\"$MQ@lA&PDaXK-H@J$Jl8PIERm+ZZ6U@ZG#9Xaa[Z&0CS63m'\nA&ilPEQ2Pp+dmC(dI`m0AIFSi9Hq4kMbTeRj8#)j1R4dB%E+3!0HL#@f0`!AaS'0\nMEEjCa0q3!\"83p6\"I+-k`,cRXb!3\"6'qr`'pLL1Hr,91d'A'GLqmJiqI$4)V[K*V\naMecZrHYif2&,9kU-U,G#je2*qCIUi%*hacM`'pl'-I`[Cp$dHD-fdU!![#[\"XE$\n$cDRBEPPH,)D*2V,faP('c[LdSjrL1E2PUPH*eQ`kK)HVFQ#YXJEp@bkB8YTXc3k\np+ep2M[i0AaG#93[QMAV9DLhi5XY6Z6X60V#bG(UZ#rHa9'pSIbc$FA@[ki\"QKrD\n61+5V3m@6QM%#YZ[,HcNr@YVFHmSRCPBBZh6AI2m9F0XJp!i[+5*C2-'23VIbd!D\nbD#i3*Nr(Yd3LBAS&TfJTJqhqT*L$6!qBEB5PcVk3!2[I3ib#ci4hL305CbZCjib\nj'53)IrBHfJ-lcm@2GqMifqN'3\"rE1j(r8(-B,m9!imXNf+$)fb-,)rLrNX*453V\n00@ArBCZ-[r)%1I,XMS-UY42@P&PHX)Q*cdNK-RaIS04-6IcF1b+c6DlKY+k'GB9\niFbf@eAQ+%9lj0qL&f!qYJ0R\"bcfT`5FR`,a!LK6(P,5%eSbI&DfeXpaLp*ANcVJ\nb4K3XU`r1$'U+&hK4pp,$I4PH[2aCLQY6h9H+drEN!rUL66jVSYMa5maX#l-!p#b\nVqP!`lX!Kj,`-f!R24+mqQU$AU'ZP#'I6Q+(MhFYlTi*'31%&ZX!Y)kFmJ(H4jj`\n(9ZiT$JDf0PE@IJH)j(9T(EF(@1`@%[82GMFZam8-T$!IYP+T`Ai-XM9Yi-l!a)%\nmlCG*imM%DSeEdHRX9r&I&Jc#`3!UaEMD',Cr(9XMKSVL0*!!`Re'AD,h$)pM(Xc\nLqi[A264GIDY,@YarM!h(-rLcNP4`15j$ldd`U\"FDIpSrV5,8lD4$fC%JG%G%LmF\nB!KMJ'KP&3@$'GUHF441K[Z3K@bcSLdATi,THfEha4kQe2rmM#rTFRR)`Kq`rkFf\n0Shkc',Y`kJYIA,XJ%$%L@Sl0*2N$Ha`@4d9hXk!hS5Pq5UEN,!h&hi0P9\"Z'Eh@\nVlA84G0eVZ\"JKB*40p)6[%aVQkT!!,\",SccN1FN&+'@A5YXAK'Elb%MfQ$()E4Xr\nNm4H&60HPi&Md[GR!c@@)%C&)Jqj!5KJFGr*BZT@6Y*6U4M9EJc(U\"G'C!CIAaHd\n0M-$`5Eb$YKbD'6CUST!!Qh(TR13!Aae&(fc!\"K*bAl`iZ)2@me&hqI['Z4bIXTU\n1)+XF6CFE'lV+e0G9C4-2CLESd5#c!cST*9[b8+,B!N1*RAlGG*@SmVQ\"Eh8`(8c\n2('D$`pDC'c8!JJSd4da1f+PH-2CR$B-0+ih*H`9Z),Gi[e(@%UYXPBj)pBFjr14\n'E8PUee#K,qF(8BGq+5Dkkl`Fq'K-H'd56!lV`B&F'8H3!2NRlpMVXi\"h$(\"*1U\"\n\"VJX4RNTf6!eM')'DT!m#DaMB11+mreE9#ICQ&P0e*Xlk2A1#2+I`eHkATLKSh2k\n\"p4H+8cKk-q#!bj85UE-`hC90PGf*r$brMI6b9p%C5eV9ffbME92Dk+@fpT&PV-P\nHYVXX\"jI9jidTY+,BpBaB+HSjIIi6G`$22cN!X0pEhZ(mLq025\"hNMVJ`EpS5pG'\nq2'pdHRjK#dH0@dQP4UTV&eTcfJVLr5K9NRjY$AfGpfl3UQGT3DaEFE59q0@jX#+\nc[f,,X$iB(5r)&@`VqVlX'P[SLBr@!8CG,ak'\"-Ke*4fkNBrU\"5Ap'@P8cqQ%jHI\nh8Xdjj-[!!BXP&5[V%k3*9UG-9kkMlmpBi)h[H0bHZEL&\"2A+kpdE`c\"N-(TMSH$\n+K--Bj[cL,emm)1NpIh2jfKfMLRYF1iY-#'P%T8Taph,ke\"4,3NVbACIKqLSQqM)\nH$@lc3AG'cc3`Z,pf4K3G\"e&003j5Ue%X02M6dKUmDCClP))ePd`IdUG#PT)Q**q\nV902I-rS3lGbh$0B2F@8fGILQHS[rIm11YC4lk0@Rlf2&&F(&ZC423Y$ZVYA1''N\n@jiU(ZV%KI0hRQ'AK%Zd#Ae5dPZ%#0)pcmKA%+3FP$dqXAI$Y+IKA(P59(,Njd$l\n\"SBb@r\"!dcKdH\"YR4YQR$3Ql`85\"eF32diCRC!m&3+J`VP8p88A'KP4T0hd!!`X4\n%8K9Rf52ZMr[UY88IQ\"Q6bheEG)+ACpR9$@\"pBUh6ZA!04`iKQcVYQEjbX(1i3TN\n$LL#(0K3iD@3Q4Jqrm589![GebHKSLL#piIhR!TN5SXCReA$D\"bQ`CaS\"Q+RcBMj\nEl5b5j\"!$bLe5,DdNfbH8Gl(`ALMB'(mVSVae!bmLrPbcKirUDFA9HS\"T1fG043*\n)6q62(aGb#kCaJ#U8J)(GLD$85eYd,TJ$1'rR36ZTJE28)[(f2+GYY9DGd+\"D[lZ\n4,\"kf9XF020aHNq5a&,GB+rf5DbfCrL*a\"E*,QLLjXbdqCYGX4ahA*kiZ32'(24X\nrIJc1NG!8P[#`JG`88Ch0mPr5QFMK5PLd,JX&be2k5q)0hKkqcHGrp(XC&&eZD#)\n+\"IZQbd0Q)%VQ2AK8)`kIB*Q*JDbqY`0JDV\"BPa89N!#Vmp942[KhXaA9YY*a$#f\n,r%IPG(m43TLGJ-8hb[leRiDShb&ES+$TSCXZ(RCSSh5H(@pHrI!8MIZEUD\"JNHT\nj#1hj&4!)f!i5+Ka(cX0TqGPFLqPJFJE-h9i,jfA5`1DdcN5$f#-ZJaj+rJahPrk\nVFjJ-`#T3iSH!jJVIZ\"(UJ58TRriErZUd'I#jV[(%-QRFQeml,9`H3+4JRbLMD5b\nf+frZR,59@Mc$+9F)5#EB6lR*Am9F6lFe52Ah0bLG,R)#K+RiY$@Dqd0CVlQ&4C(\n[#BEe5F@P5`pqN!!lQ2@j`CTDMk#)dqHVb+T59!MQ0-Cklj!!*r0HJrHf'15)SeD\nJVp)#UI+KJ-K+!p3jqd4@ef3,KI@3!!UlRZh+%6'[$phUiI6&S-&*Z(*F%P![BG#\n0Y&r(8AHd9C5efM!`UbF(ihTZGlL'dPpl&a-SUJ2YL-*[96qVYcVmQ,3\"\"),NFXb\nf\"ld@NI@!INp*XY(IF-jrcr$M8rUqcaXV5iVG3\"ZM4AF+YaHF(\"D%-4f1Za`D4P#\nbCR9Lbp[2YrV#fD(dqY!Mdf'%FB0\"el[Ue9fii&e)!3pT$hT8M@VkQHhNlf*6@+m\n4V(J'VC4*V$ke2A2F8JK&@MKI$Mjm*%jBV-58H#h,XfPk9c81SAa$&'1cUl3XR#D\nUaHMq2$l,[fK+b8haqFG,8HF40p1)61d&*B1kh6301XJZIAc@0)0MiGlN6Ip@KpV\nYparJ6T2ZUV6q`-N4a$+X5V),RQ3C49D@5N6#L0eV1B26`8*d(5,kAh'Bj[hr%#c\n2SB@JVS22QaV3Q8baMRP&6-1Md\"Lf5D`QiCHYb(qmE+5HUDNq,38k\"G8*@H$R!DN\na%pf3!,4Ca)CdXUp%NG40iJ4ffe0ASdU$41&cBK%iBY[(+(36ES4E,,$,8Pm4G#P\nI$kQX[8FBk)AKQEJeZYpY#Ee%RUA#V2!iYe6+p8IJ6rUd$E\"\"XPfk4,-'C#cjQI[\nAfeYBF+4F8M2'rUV[)L!l593(`6qkSh2i9iS+9UbF[G[ZE(QSPQDl8me8aeTrKDJ\nA*%JRM[69E%K2U*PJbf#if0Jje992Xp+Qlq4DIUjiFN3+p3eZXA%FFe!AQU0*aG2\n+UjbQQ[DTj[),&ZKE,3NYe#@rNdRV35J\"@,G,q1MDbe8LLjr%,,9j`q3D+LV&q)P\nNc9j#$rdU3DpaP\"c-Ca@DpGE$MMPKRLa(-S8(9NFh8I1i#N8bj`L4+i`MPC@49G+\nX[rlY8i6(-b*%HdXd`XYCV&CqX*%DD21r%epL(mG\"#\"mTjaJ@R6GaU%JX$0G*`0h\nF'#$@#Ym'VhFSY)p-A64Mm5HhKX35&[cF6K(\"HfVpR8K8@YG2T#HAN3ED9D*ja#Q\nai83-2FbMk-+Xc!G%'6@e%LRa![SP00(J2K418UTmJTk(Ul!5d6[92aHNdA(%FdQ\nA9SAb&K,C*BJ,*3$+FVVX9D1c$kV4EjP5ckR2+(`FHl'aYP)ND+Cc5dhaiNjU9[Y\nLNVN)jLB3Ki80S9HVGUF+8GeAfFq\"qVpjN!\"IA(ZLNGQ)hLQfpMi(38ZSHf&2N@(\n8bJ6+\",Brdr%LYkTIHCAP!pGS80#b@URThrF!,F@68hU,6)dH&jrchDfL-%@82HZ\nZYfIIpSY6qYbUmqZ6N4UdAp&(\"EZIYjI9Lf`P\"cBX`1*h99,)qSq4Q&,#-#Fe3\"9\n%fN5)10%PUC&6h[V[Tl0%-p-XQMMK(0,Mc&*4%USCdTah#Y)2Uk2P9QHhLK28KHR\nr2Z5e318kl+iq!pY@6)3VXMRf0TIqLlSGL[Z*q'#cKBeJMVE1-%@LFL)(BM%DRb(\n`ZFX5hU9ZUqe,&S\"8KkkK*`hc5Z!JQ1m'&EZNAU&R3QdNH$p0Q\"QlYlBX$p\"lhYF\nq80)UC$k\"RY1(rh1&2`bH+k'`B04'lb3YklFEaV*$R2[Dc8Z2IKZN9d9!S3aJBaZ\n[TbX`R&bBE%U'\"G2c%&XM5[elIq,qme&cIla$bamkc+445Y8G0hl(5K`Gk5h)TUI\nbFP9KF)!%#aC8k*%Er-KC\"CC)G$f%HkN,D32VHe05$m#&f1-UG#e8FkeFbY9-5hi\nk#38@+FJGQRQql(45JJd42@E)90$&[#FM$qQ$%IUNLEfpc,eGhCIj6,H8eic\"`Dk\nX9B9dLS`RAQij0`HbL\"PVeq`&(QPL\"e\"h*H)E3kAdE,5!f-&YMk-AfY$C1*e46QG\nmSf@%*5)0BR\"kZLD3!2!Sj3!`9lIKbh[1d+28IAA1J$8ec*6-L`\"11US[MJl*)UE\n,@B0VZ`0deFG1,JaE4HUdfYmlRY)8MJ*LVmG3e44N@k3NkN)@P8[0%dImm,9e9J%\nY5)6C52FhRkV#a\"N$k!I@1bj9,K#KCY*A6)0ec&AQDSeVU61(i8&\"&MZ88IX$))Y\n%IiVppiG8rbC4e,%CX%H(J8F&X,hV*aF+pFFDpDCZ8mAA&D696MDr)cMU-8F6UdH\nG0hcPkA(VR[VL66VJHBFAX)\"6914[eSYjXbH,`%4f2ImdV)b`rKhC$&65BS'i53r\nQRT)I#9P4lre5rhr$FbHQ&pZ&bUS\"SM+96C50M%,2f92e995+M`Mii(#GKk9-968\n-RYT#i63#*J'k4+H9U0)d8JPl$I@SA6J@RLVKQQLPk4GdmTp0e[Q*9CMfaF%XDLF\n2pe$14H1BNa[%m6[i#Y,lLqE11&5T'6RC'N*-(*1!T0FNRHP-FXaNfRcBd\"%#-bR\n!A\"LhpicBaCaa#J3Fhl8S,Z@C9hIB4#EiN!#Nq21BjQH@mpe')i3NZK90Q&i)*G0\nlDYq*Qc*\"'VTY)JcRUC4p!bb3!*MUj%RMfb10HYK'Nd)Mbej'c$,HHYm'aTCQIre\nCkkmCCQIZaX[NH-*i*eC$2QBBV4pK0Ae9qVU(*Vj2lG6AG95TX*!!PMcDD0\"Z(4J\n\"j`3JZqdF!4SHH98,G0,r8*R#Q$`NQJM9S%NE4E0rIMjkr-VZ0)94VX4#CQjZ,j*\nY8+aaLAUR!*I%cSIPqQjiRDZPiV9*%3B)NXN95Q!B0DVc9l5&F!\"%\"\"C@EAp1*hX\n#90)$XM4QKQP&K`H\"8601e,#%k5he-Zi@$f(Lc0k2`pQ')CpEJbZm[IV,QF*L23S\nb9lkh9hmCUQC9UYIkraMAflPf1\"*q#iAcFRJlL!l,E`ZBPk&hF[AYSdYXV&6M%hb\n%YGd,4jq,iIiq0L9N+\"\"p$RffBFcC[04eXcq)-)hHK-rQhN-H&QXBlEPV2D39KSU\nYU#KVTfGJ00dSZ'3H3kBUST)cp!l,\"KZ0PIRH#$MqUFphSCHq,F%JhHiG!FDirDK\nLXCGH'LUAFi42AB8MeX0)-CYm6r4S,ArG@3(!)d)q%QEXJUK,AbQ0E!J0hqlF%(k\n55d#TiV@,IM%(A8#564#f@FU8\"j!!f)NI91!PEeB85CD&'9r%G@%-6AcM@9ImB6[\n,&ZYH1+\"3DQGEJkZINDSSYm6Z,UBbb'mfCS&hhB6&8F5'6rhl)PI3+Leqej6mbjK\n4JQEY%ScC&9#[KkCd1B$81GR[Fb)ZPRUEX6JqN3'PbL4hflN5edkfTa)Vm6`2(8J\nICC!!Z@QK69`ce'LRM*ARAB%S\"'\"rUYfq!3r*HRHCEqi\"ibSm,)LYRq,+`+S1@mG\n9A**Fc0RC*-C`%,!32!1$cc0apJ$+-XIVCH,-ZqXd#4SF`D\"AXZ)XR##G3-8-6+c\n+VEpcRLUKQ2@TA[(j8l#UrR`$6D`-r\"b6C[R,$3eA+[h9DqGA5H5k1PpMP0Pq2Mj\nlCi6-#Mp0HNlbc@Ek`6#bh\"A\"&2,\"NS)0FlJ)F*q-6UGMP'!bqF-AA+@'4+MUV'5\nD4CkN\"HdY#U-5r95hH+!$mri$8p$i45B24S\"826)e$qlVQ`55!A)3Ye9CSm%[`HD\nZ2AqMR#\"%rMUbBiE8JRA3XAjCc,p$*LAZlbkd9Zi8L@1IiJ9f8**!Li5aaZE3&R,\n`L[a&58l)BL)Be,Q'k-(,4MbqR-$V5kN&$phDVkFL&S6J-KqGmflh@NULL3C$Ipi\nbp@MAEUB[IE*Tc*0!AiLRA[mc69NdT-,m8jNJMi`P[qL)McKH1B`8`LR*!k6N&ZR\nh\"#k6cF5RHcUlT&$ek!)A(X\"09Y`M`RB31``T[2e@bhS8'Pb',)D6`p%*59DAp4a\n@Z\"qqYS[KL`[I#mP)DRGZr,[K!4)p(cHfp$YfN!#he!cc#Lmlp!5,4#dI'q3c)hY\nj#aEMEf1KfAPC5%3!pp%APN#Fri&iPQqV@ZQYIpJ%4BepNqJbF`VmHpSrJ!UEXJc\nLQ#B4FV@H%)5&[I@B'NAkb0,*fm@1ca['#PRkhT95*(HUrPbADI9YrFb+paD5ZVd\n'YGqN2RDqZXp%l&m,8,IaQX#%(YE1IQ1CG[R%EEMiIN+4aUi+I(e+E)4P[)[4`D3\nPL0&IQ+&,'9frr`TZS-ACLe5pPZ!+3e\"CeqcpJj!!XH%bqBZ4`AGE-!L8(iiVR5R\nL@qZ)38\"VAj+dk&KIjRRh5Va*RqlA0\"GmQIR#rfNQfZl%R[6Y44I4459K6ap4,&0\nTMFV0B$,M0%8lJ%m[i88McD%`92KM\"ea0(q5Vk1f$LHPKpKqV(eCHl+KU#4R`[bL\n-6\"41#86Hh$KbqiGF4,3@Lb2Vi,-38KpBJ)1jq[4JV'ei2fbLR[NpT'YBV+Ak6V*\n@E8,(615[RqX)CElC1JaMemZV%kiT5P1*4M#l10Ipbm2T9Xfa8E*Vh+e4DMPiIm'\n3!1MV@Dm$ka,V,4e3&C%+qX$A1Jc2GK2NMb\"QL4bS+,%8B$IF&C!!Fl%hG8A5a)X\nSCQeS\"(lq*TRJeqlTZ&U-cLlJ+8lK!9\"fVA5+JSqN4&CI&9VH892l&\"`kD&-XaKS\n(CrQ6D[4j9,cJp$NXZI$p\"lSIc2b1j)q%Gj-3hCmlSb8CM1INf(EGA`IU4Rp@+M8\n+BKTh5mZ``5NP!0(EK9Udl0Vc(2%T,AYGfka$3EPBBZV4Fr+lf$*I-qKYbJ&1pT-\n`QX$JCL`[jc9aAREr8-qm5!1ULV9Bc#RHS`R&-Pl,D-$A-$*6&I8)[b6a,U9N*rU\nl59F@6#ENKV@ZU\"X-GhQJY3l+!&0B6rAQq8HKXEQpNFBjk&4'8I)r6CqhKER3i9C\nQb1$)bL%T\"(jKhb6j!48`c)5LE#1G(jcc`3*[NC2FDY!T+FYH1LZ3!!'JBQj`%Gj\nSpYe\"@%jL(%&I&UM1TfM*A\"MiAdkk[)ZC!pTP-N'K'[#3!&KY4K,,YQA0X416Q45\n+1U83%\"J6A9CAVT`d*\"#@b+I4$Rri8BB,('4cZG4e4cPbIC02-4YlY9(qjfJ@BRb\nZU60GcBpF!`4fHp'(SLa+pMk605I!Uj0,YPN!,M'Le3C%aqbJ+PJ2faX6+abkpfc\n25\"!BSE\"S[i'[XSEQZl`XZX,c\"D\"GHJNTKi`KqqdN@Jb)6VIf!EY--HBRmp\"+Jij\n+((f-T\"2FmT+CkQbA*dT5Nd5@rJm,@l('ddBhj+-SpG[q(8qYYe5Pq!md&TE@Q!q\nCDIe#Z&4'`e(q0B2jBK'jEp!GBmZVZ6KT[AF!\"J9K2SH8jF`!JELXId)Fr5hLLiD\n!X(fRFVQd+GKC2RAY5&c-!-`8fJ,Br9)H#D@l@PdZ21S[2EQ*#jSm(-MheiTC0'[\n5KR$acQE,bfcR1Ea3\"S,4jC0VXk1+)JES[JqR1`C4!(AXT9bFTJ*h\"G(mHS2e#f%\nQ&+%jCAB&#\"r3,f)PcJhIGMSPh4mIG[&K'X(pDNGeMHK6r)ePN3@9aYJrRGhVZ1`\n9Qj3`\"D(!`m,T-MjcP(BeK[q$Q2*BMh3!m1#SV+i1(aR)RRZNa6G9Im%i#b1fe)N\nrbIV1-,fTH@fE$Q39BG-PPKa0reEjq`jS@-f$C4)#PBZ1e1Z$UJNNHrM[MfHRLeK\n+*m,K%#T@m!(0K5KT4l&jdTTHmr)!8N05aYCQ[Q9il@I2Q!CjVpB-DZ8,9AXVFcA\n6TTY1HMR8U2l0Ae2E9AZ6CiEVD63Ym,'F#hAIh3`9llM4M-#YV'lQNj!!0S`YS0%\n$pX&#IKXh*Jh$HJId@d+QFT-PE)-fPM`9A1X)08EfUM&*!*R!!k0NTU'd%KRe&*m\nKGfMhC6SYbMd1))@9R`l$\"9JTiI1c&9lY@PAAU'NcrC&)iAAjlF8@0Y11hMJ+kKA\nllVc`Cr&$AIaLPhG)p&Pd`bjH0H)*C6q*X5pRXa%#F3q3!,SYGXc,'1Vhl`9T`8U\nhl4Z(DXDr$HS-[M4T4%(PYTJ*lr-ap*1YcTb\"P2B@cHcA3`C)hb`lQ*G%XB[CX`F\n)Pf*hL,6)l6!Ib\"50qI53!-N4rN*!ZP*l5I!ICr$*#iH-5T!!%#4c11KEb$+Q`Up\n$qG)GAUA6qkV%\"A(3[8Z*Q[k#3%a3Nc%KG`GU8@9APC'[LLkp)VJ9R'1qYHpTmc&\nMC\"j8Y6!C)(S$6lkhb-km#%`!$Aj0fJ[5#CZBL\"'E19D-(R'Z%VE#b0Z3!&jlFUY\n@(bKUN!\")-F\"EA&+Nhfap5b@'K#(aNH&+22NH5-2NqVV*rKh0AfpXAm1L(,lHdEq\n(FIpKh\"r`k0FI`l)[iGirm1hlq(5!mqfql()!b3`[f,1LNALGS%Td,+D9rh!'RhI\n5l2\"@jHHS8Je$ZkRF+AN'92Qd4D-3UKE'VCh5cERfMep!3#G\"N!$)XD6Sk%ESV4R\nRH&&aU#CcMF!5Z#jSF-#e$NM-A3Gq35,62bCp1LCb#V*p3C%E3*M+DqRk!QF2rfR\nU`cj#(Pm-PLUSMq6SI)0B`ZNaHj8pm*2QdGIN5HGbEa-)fJ-E6khAImf'#Rkq3pZ\nRCb*ja'1qTq!@18H8X4&*3G%5FhlPGjf[LaC#GD6U28)UTi2%92B@Kf1RXJZ0\"h$\ndUX@1b-0+3&M8,JTk3j8cUp`-TY6&6jmHR6i3X%ZU`PZMh0aUe(NHa9,@19&eAaK\n8NF*U[@Mlc)ahIAL)qZ[q+,!3-k)kq(3!1HdipD152$BSDYN)2&[iY9,CYQ3X\"j*\nEN9d`5EmbpJ&ZFi&a9R\")`ZC19qjp4H$!N!#@Ej!!2DqD\"1*jJpmp+$E+#bM(#f`\nmi8JS@J3b1SR&3fR14,-6MkGq!ZVlM['r`91&SU(le`,pU0QbT2@lSJT,$)H9F-`\n,l2NT-*@d-+hPELL#6KXNlD5C`R-Yd3EqD%TJS'SH'G-2!JEX119UfBHN-C()\"f)\nmJ`BB#YhSDd,EcC5a%[A5qTKH5G4T35icYLTh'UA8e&\"(I&UTJrUI#LZB8+N($1#\nST!P9l`*Z*jpRSShRXd2mKC+@dpl9#h[[ahh`6%HUc[HmK2P-TS0-6D23Uq4p*&k\nRl)$-!TepY4@-bGXVE\"U0fqV!UhB2f$qNIX,!2-Y`6FPp8UN+q14B#S%$93Jcrd#\n51a$C'FH6d2Bf,9DX#-,06jNkR`F*jLDP0[NAI#+%,QC8Pij,X%C!L,9UhYd@NFm\nhqcd#9+cC-Jd[3#c4UCEIB(8MSADYq)CTG*8eXM`K@RZX1bb%VS4iEK0[S(qUk\"H\n$10GfKIPK\"!Y6\"rYa#+iK4D2L1FcpF)!9Nef3!$h*bE%3Ek89aN@f`rUNJ,$8I,V\nDCQUJaB-I$8aQRS+YeQ@LSANKdGP`YNFkm-B`d&T&l-V0Ch1Q,XcI3A'Xc$3%Z+`\nX&683+DQ@%p!ZP4S-Z-P4NeB+b\"X!6a5RBi++dLY3UaEGP$h1,l0Gm(5\"k4fK9L3\nGUL4dQ@fif-0RIem$R1f(qSjIVZdPj[JA[r2C5a$khIPJj6DU8N@UR34&HMe`-T8\nVH)EGlK\"1QHI$q1#3!(N-Zm'LB%q41UH2PkE4Shai[jXC(I4)Fdf(2+%T&STf!a0\ncH&[H[9#%e#aT,eILpCI9mBTK!P,CMN*h[K1%PSp#&SL!)9BE+-Mlc5\"C+!aKQBf\nQDb+Q#hK#TV2m(-md+aM1SCM*@4`+*kP30H2X0Rf)A&Y,S*q6b@HGjU5Nf$',a5d\n1EP)TRcHk%'ZKU$4i(HV*m)i'BF#6&P(2*%c,m,Y'kZVamlJB-!m(F9R-pkU%ErY\nG\"Q*k(8Fe@@JL#2J-REp(S4peRe08cVS+1*[mpYRQ+d4S*bGrR-(cE!qILm2M(`+\nRB8&eZX2@@NSh4)UK!e3C!CQ*3fN[*+#+@Rb0dlb25mkHB-2LXhf,U+K*'r[AiUl\nd&6Rr0k%dK(h3K@%L+Mh,AS[&h&BA'N`)2P$[$R0c8QZd'I*XSVe0l1!i@Zf,rH\"\nZ+(DqleHN!R&h6VkG60Y(dS4bhUrd!Xe!pCf&lQJd@eU6NHVGk!Q88@*jQ+@(&A%\n8++aMKG&Lpjj!`P\"b)kPpB9eS[dZjHA5cXH&+`Iap(b`i[C(&C`9qRFKG@F%Z'-C\n21#[c1hLrY@c*p8`j9@AAdrS6%2X[62629E)m1hhHRP!6G-d0b05kq()-lCIqbAh\nET0i2+RAFTF!if2jE%AcT(a6P,rB'5,rd+LMI&`+S3X\"C*lA6rYZ8k6XrTJUHpMZ\nf$V`E2k`IkX[4*`S2[I`IcbhfFpJ6ZEG&Ri'j0`6U!i[Aq&4Y1SD\"\"*2CL%pJ&**\nE2TcbI0C)qGBbHKUlJJ`+Cch(241Aai41J2mAF10&2AmShMQE3GPrdbRXeB&XXi!\n%I+C6G$1JJk,AZ@bAfY\"J(4CQLTY#k6!!rd2)(NXl(IU4MY!T9aZ%-+F19rh#V'1\n0h-\"(NYmVCHRF9Gdq,Baf3X'Q6jiNlACJP9F)$T31ri$a5e-@fYZh3%J%#R&`@+m\nmYMEPh%\"f0&6U%*N5SbH1qhf!-CKkAdaVS`8PrhmXL&pYScRf*E(lKT8K,jrH*pb\nISePjAR#cU'qR3kBdB2I!'JV\"3,P@),3qUEMQRppN0$UN!Y%H!YSTJj1h#Zi!rfY\n2h-D)a`GhikmFMTc6#RP#IBa8b-1AGjFD,9cl@fYqY0pPXrL[X1&0)19eGUYK[qf\n-pJBeZLZla5)T[TK&-13bKM(+TJbpYr$&eRahCHLN@%U5mAJ-(XB[JC&Tab3AB@-\nED\"\"(3,%ZCMaB%e&L3V%(Dd4R@%Zp*!XE[1HDK%[GFP1S'4em,&XkjY[fh31'fVj\ne+E!RGFcfL3m\"YabB0Vmd6+c26VK2QfH$bT!!pG'd0M0K2VACJK#%*bULm5lN6&&\njfADj)jq[,H*UVdY@+F6f3GZiE+6Id3BT61*A$p3M)qGPfH@a-fIlq3U2Cq,)qfl\nX[fpQ*Sb-6GYE@,VQq!pq$I1m+G5q\"VS[jYGC+S@5@aLVQARQPS&3f,F8BSA&I2L\n$8+0lJGM1F-mL58G[Dp`IRhYfddBGDm)\"`&12aa&kURlMf6iQ$0H552aiRc8ppJ&\nHr&rI9q*&Y63j)k2cq0M,3eXG'#j5Lr`9jcNFdS!K4k@ja4+cf092I-3h2*HXdj[\nDHX1BIlR,Ul!`-lJcpmR''6Lclj@mHc(KMM28DkHHS+if8YJ*-cb%A1[('0p,D19\n-0%kVM&5!Q()NC0b#&p!A61Jq[bCIDCcH@MpDpj+fBX!H,QE\"J5A4SKXB@d,AkUc\n@cRNhp$'SZr[2bJDM\"#6XqrRLEEDjLSVh(''QDdZk@IlUcYpiY#lEFJP2qhc`C4K\nVRDLClUK8fe`PC0'@3EadYYER6@rld[*1UKaAp%5SCPV5*b,lZ-0ckXSdpDkUi,U\n)QPr`!\"j4ra1P)E2!e5%f4r0(1cI,\"&rrIemMS$,P1IR'UGBiVeXf#Vi!,859QT6\n6Ed#6',i[N`pJPff+`I*N6*V*&E3,D5Td!c`IT*-KmFHR!P!21(PINR,hiV\"S2rZ\nDE4(@fqTCXQmG!F!+!D\"f6`DjAMBXR6Mk!c*dbVrMN!#r-ZU(plbQD+1p'&EHF!2\n&UdQ8'HNMb`V`6G)J64rcLrm`D+Prk*6B%L@I`B'Fj!'VA*`3@a*2V9%c$kP*hh'\nCiVVVrbIN`)IA%Yf)LqdDdTAVMk*0f+e'6B-)0&I%(`-r`ikeP([SeDI[6QU#T'k\n2jc,lY#eQA`h[HdCC*5j)r`E2NHq9MF#Hj3%Zppm&40(0CR`RDF5b@I6XN!$@XbY\nG0[f6eIJREeNXbMQlNVpd+2Ye1DT+ZHGZ4XMRkm0FGYX66%i\"VMQNCkh(#b@bh$N\nR(ZIf+Y@Fr,edL#T8P@f,5'RT1U-j30d4LbpEV,ZQpDN(XkMKpP@NbmBflAS,+Ia\nQQJCHqI'&jaa(qkVUSFB#@iV2ZPAG@*N6F+!LcG8#)PrAMQK%q'6!X)VlhCil(E0\n6#3-C3$S\"lSfd@+ZejqY+F'[kMCA68d%@66A-qKrT+qD9Z5Hd#`1BA-Xjib9I(l8\nZ6TaI45dbX6U%3m+NUj'0RCiq-hi'CXIflMh`[r%A%kF)@1l!9CC@'TS&QqUl-m2\n[N!#2Mb(\"Km5a!9)ZdJN@F#faVe`(&dmdH!Z\"lN1jZ&Vl`rZpR#@qDRZ56lj0[,r\nIGLB'Y9q198pD'DGT6(,$iA2*&5K$XBMrJ-mVe++Sb@5`FG$8F%5VFlmL1X+UcXY\nJQYjLD%)GGRSbaNb)1\"HCmpFh-K5FN!$)6VlV)@*IC-rlC[0BphE,39L(J%U\"YPI\ndm-6[E1I4eYRT!fep$3b`ca(p9QBikDTE1,4-DYT3%Y4+i\"\"b0pmeXdU3!,VIFj[\nVYU),\"H#bV)*dEF1KSa0%qf0KY-p%HFD5X8'\"UU8*RQi5*U#!8(h)Q4kl+HL'6j&\n#88YLQIprmfHU6QcM`rCRIeG'PVTV%jUVChFc2kq\"ZQ(&LhbEM2j#9`kkc'*2mD5\n\"1i'Q+T84qNqaBZZ2b1`1FTiL,(cj1Ur-Tqekh6Iq%iNNM#-j@\"QXJjd+e2IT[`'\n\"1(!3EplF0632`d[NVCiPMTVABTQGcBSX5@Ph*\"jL2,`F)[$%kG29GZMZAdJLqj!\n![J#k9G*0FlGYV8-m*Z!kRRRIB\"c4FqkLTA\"&0q!!jUFh\"iMS!J'4963qRJNS0i@\ndTSAlLk0-5a@8fB&#B`ZBm49e(\"CA3mSJUViH\"8c`MpX-YS6fi-)TKQ#Ja5chC%#\nIPfjk&*4A944KcH\"&M[9#r1i%@NL)5)HcCA3*mbS+A!-%9bEK(*8dSY1jjBad*4+\n*EriQCepLfUMe(aDTd9K\"eBk$RaIhrQT,aUBU24)DR!c4crKBm,'Xe[#iI0'0!*!\n!C(%jQS35*'\"mH6[lGhjS,#iI@8AI4ZK5k#34r!,NrDE4GfLef4bPT4iNZ%,b+EE\nE\"(Mqll$pP!%(`E`bD,CZc`kG36J4XP9ikLQeSBp5*6!jL28RdJm8[e394qXr&1h\nFN!$\"D#8SD#a@*Fq$\"#kGM3&iPcF'aQ1-5B+r1qZ6j[[+p-3SNA#i&5ZA!dDP%(h\n9fh-j88JLU+-0R,4i#YTL*fQRU6iaR%a9bC*DRI%41UY0cA3P9m[\"RBY1$dT#HK6\nR%c(bR!me*iBZ0*lJ\"4h%r-QJ)+KPjAX8-GGBiPkF(p\"ALR*QCBLEUqX\"kbE9NkT\n,cIq!3ka#r\"9p)IY*PBINBB$$R,53!((aQ![VUkAd&aUqE@I48F6+4[V[PPHhddC\n5XS2j4-VUIU2YV*L&r'l,*%aRS)G'39Z9QbSNk5+(N!!C*3SNR%%'U,XL1X9r`jD\nk2@lQ4@,!R\"d**6A0ZN$5rfH9M4FiB)bJYU[kX6k8i3CCNjb'IDC!k(1@fQY-QZS\n'Ml(A--h-QMH#hCDGcJppQKpL$@HUf,d5Hc-T3LpIV!(H,EIHLpDXpRQ2\"-Y!CUk\nlm(Z`8c@qPp@MAN+NLmqpD)*[5[HDMaj+kST9Mid6SLi\"JirjAN2TkeleG9(ebfJ\nk,JUElGHdl,2PlKki&kT8X5EQI&PKB*l#H5q'Y-5((r'hq#Cff5$$l64Xh2pih(X\nqlfQYJ#`!i)5(l+C,GA0@5-1K8-qqJ#VALH%`(4d+,58Je-hT`F`TQ)5D3VYT3+S\n%[JF\"V(9EKj'0jhim!DQ+hU(+IQrKDZXcBQ#cdXqYH-,!ch@hh\"9651N8P$c1qTc\n\"XM-)2C4cFMI*jfIj+kMB@+lE0hPNpXPcZ#F,k+k,B%j[##d,4G*p3NqU)jC6Z&H\n5#dE#!A0JQY2$4D(D`\"cUC83pMG)KFRR9e4c6P!+Y)+j)6[cSHf'eKbF6Y(,5Jb+\nd(5lNR%'[9HpqpbI5,*jd+TZ#[ia@%ArCkrddQX9deXRFVpGIhqmPeCBk5CU)B*'\n)Te$%q1h1l10T!dRZL#4AqjZiq,X#,lR,6-SL5Crr'@k\"%3+mNqNHA-TF#%4c4h!\nf[aSR@0)ES0rMbAb`T[YX6&k-6@5['6Y4N!\"PYFqKRXk2J[,H*4Ddrhhc,JAc%a%\n3rblYUYGV6Y'phA,TBeQMR(a5XBKfblpKY-LXhHCddH*ScJk'jX*SM%TXV`(92p$\nCP)BNmd&iM'9U-ZXI%%!D2B%KF0&SpFBa&H2e[m)RiEH\"SVZLHG#[bJD@A9KFihb\n#E-3++!a+DC[,\"&[Hf4[Z4Y6ib654J#B,6b'0immPDD`3dNE4BVrGp,2J4qTd6C!\n!Xq,EGhU-rR`0Z9&qVh%ip1Rp4031KNVAjbYRLFhG@2&Q-NQkG!*!r33`GIX#9cI\nZ@Z4dj0iZD+L6i`QbRRE)AT!!dejQV*R2N!\"l0hCGXq(P1*fYbGC9iP2a4[k+m%L\ne(JbYSe@ECRk4E%0,9&qm9E')Z8TXbSiRX[%q*#h%LJ8e545jRQ+BiS-H+Drq0'L\n,#QF+*L6hF,j4Xc8j8%XI`RaAb\"rhYCM4MfKM5Q,'T@,aZCZ6-m8l&`[(rc-C)!)\nG*rZ[AhfrZ0J\"H5,bMA*b1&e(HJQ`MJ[,R)rlLTYqieRNA5#f#ANJJX%*@*dV)UY\n3SlbHNJX`,KP[dp(9b%HJ1FB+!R2lFad0iMAr&TX@%lqXMXTK4iF[jPh$1N80Rj!\n!-Q'#q4pJjpb@(q0emlGQ#rmr2hG2jX\"-'hkE[HRl0RBp$UM!mjZjR2Q2q`8p*iE\n-eqA5$9qkD'B`p#pB[R%4iCpfBH#qbfjbd5#JV81Ljrlp!T!!m1Q$PEiQe1)!QL3\n\"\"GRd0ampmJKb2pMA4ffIc4G0NNYikLDjQ6QPkD&SH\"JL0Nr@iHrBa6\"D(QEBVQ(\nN3I$pQC,3aQHQZe5V!L1#VaBVQA8mCUrq1-V!@3-0$im&QYDS*AZ+V(cK-kSFVb%\n)#%`aqjTJ&4%c!A@qr+pM\",ZmH3J)kdaG9''-VjeUEYafS0fAQZ0d\"R+RV(l-d[-\nh1+3RcqZ0`CAiE!Gr-2E36KX3IY2pRV-QFC*'lHAmSC,!%[P6T(3U2\"6G6!+0Nl2\npNQ-4+XE@mSVIUZfE'+lRZX-r3K%JA01mm!m&%2'+T9fV%A8KHjcI1iVLVkJPk1%\nV98#&FFFNQ$&T9#(H&22peRY8XYrMM&\"C`451#X!+2r9M4CB-hESLl4Fel)#2AGe\nIrZRbKk)L*@cb(JBDkaJaXC,l3%jLPFYD1r[dpD$,6%69+8*m%``NJId1JmrGPd[\ncb#-e0#`P8`cE4,`a3B9&9qe5@#PjAX[M'l[kh,bb9-V8,aBe3UYH@MiS'Y+04Y*\n'i$rJ8&)KeQ)MC1M1GGDXe,-c)Y`1VpGp8&a*-U\"mfKlP6-ESXY%T6p1NaXE1-+6\n$0U(DdN@%DpR4'QmINpFhcQRLr)5AaRc%GAY!,#IeVTU*EQY6kpNYfN!DKMf3!2a\n,Q4V-6qhPT0#G%[Rr)0CLXbKRfT4'1B$ll5$E*\"5d@(LkN!#3!%N0ch%BV3)R-(S\nCT(qQc#eqT5`CYH+CT0&`pKp0M*SVA9i!ipNk`%CNJ`H(Ii5Y,5*aaDSBFI2GabM\n`ep@-h[F0b6U1FGpqLX+[8+lid85FDDTa0+SU253-3fjS8aUQ0IID!a-Uj\"fLGp,\nARI+c\"&8EI*rUDPp0p39cB8*F-rCdk!!TTk56q,B@kUbAk0&20P9UZA9p9[b&rL%\nCk2!EfXI0&F@$#rl#aVLk,U1GcQ-H%h0\"fBGdbiH#!e*a4hA`*RSJ![08!b,U(8)\n#JipG*AF(@TG+pQFpH-5UR44rqSF818c#-dX8#Y!Mp\"GT$`S!Hf+krFkqM1!+%ic\nP+60cBf3EB+I+$+3''HBP%GThHXR0(NkT[+rcRrX+hfdFi0Zfd*hl&\"!9-C0FqBR\n%+cY&-lk'UJK@GVkakP9#K@H`EY(jC9Y4CV@kdk!C2NL(plA4!blZ\"L`M5dq&UD#\n*H4MXJBL#X#NM&dPB@T62'b\"C#k0-!#\"4mkkVPIA1kC!!UX(BFZ3am!l@)IXJri@\nH4(fPX*%`L,JbFLi,#ZqiR4(!k0C2`0!!GHjhj+hJk-cfUq($dJMA\"RFJdf&`D%1\nMiI2Pk-MFF(%J03lC\"[@lMb8Rq%-VRXbHLa!6%ff\"9!PGHLP%*Q`UiA!1HTfq[MP\n8JF53!-M!U5PAUE2-cbTL[QV#TR+5j'01hhFN@qUfPGm-`hChAdEa(QS*cpHlC\"6\n5[&*MDjdFLhKcYD4fCK%JJ@q!V\"CTd1E!V4AJTGl+DZUrI[EHdX%b@L!ae&MQB39\nj&G40aP@(pF6(cLjjeG!f8Q1549e26(1r8(8pp5miV$\"4d\"bBD(Z1S$bc-`U!RaX\n9K0*9U+q@6H3irh%m\"E$D\"e#eYj14#56Pf+Q$N!$UJ89&0Zf)iM[V2$c2(&-IJPA\ni(8lq+(C\"2qecU4,,NSVBb2,&(i9$#HNqY5+8iDe1,dk$rHl2d##INfaeCJD5Mqb\njm%26Ej3BH#%#D+5r\"l5*)bP5Shmi\"S,TC&ZLGb)3Tm*F8!XJKdSam[2)Y3e@[Mf\ncA\"Z,Mdc'rcd*(Ih@Gfl6*Kje`$VGbcJReI'K@YNT#[(b9PNkX%TN14U`pM*F2*K\nLI4JDPN0haqFf-Ic@(Ib9ZcfTQ0,Y-a&iHC!!-eI38!f[GkR9j0&RE9Y2bbiLX49\nF-q`cGQjI2Am0EfVUcDGebr1KA0[,)VZ&V%\"ZG5q`''M-lY4ApU-fTK9aqX!SZ+D\n@)qT2Bq!`4$j+)h4E8q0jG@YjEe,0AASlad\"Di*XYc,*phA6dD!\"3d3N\"P'e@9KH\nk'\"5Q3r3d,(-5rZ4N%L[8+jCBEM4rq\"#cl11,(\"UX!!S6-0Z0f+fCYXcECQfc0YQ\nDhUk09kDMRRMrDpcPp4f\"GCTI8#JcVIY@I5dfk&%`\"6[ERGjN)r)NA44Q'UXj@*%\nCk2FB0fT0)\"l#L,8TKbAF5bf*VQZ'&EF$\"a+HjRSr%!`(ZpA&Q*PbPKNF3rS0eh'\n-NNrM2q8UM\"+HX[26DiX$2#\"(`fQCc)3+eE#JME$kLMbX8P\"UBKYP\"'cj1c4Y@J3\n4Ppff!%\"4j1qhKpikTrNb'jaL)G%@R\"41a9(028DLi2p$2%i&\"AEHh+#G@DN*DA[\n1fER&frZ+LM@lKC!!Aj*ADIm3T3$pN!#iYMDq1\"K$LFFXj-Lj(4p@)%#j$H,J[CY\n)VrP%[c66GN+LcHRKEX#%AiIBa2#mqkF@hh!B#3J+,ZGUMQI3bKY\"YYbETHHPde@\n*6\"NY*1,kS!-Cai`XBpITAh*#c&aXe0+5f\"[IkV\"0Al5MU#i-bb%dbHk!C@9H`,B\nLQUAXE5!A(XQf6S#Sq5pHlV)0Y[K,8DR*Lj8a!YHhjGY(eI$XcM2`Ff(G%@-fikC\nmSlVSBfL`!YZE,Xpjd!6p%pRB0&&TbJPldahhE2'55V[(l-,590FdRUIM4Kr@JQY\n*6$L\"bjZ!X*Q+lm9DV6HhQ`d2GZcr%*9++f`$Q@PCH22'ViZi621-N!\"c\"9l1r!#\n2MBVSkRGl\"!UBmCX,4(@GTTQd@iaDdjZcHQ$)J9'JL1,PAj)3!GU@(mc&YZ$@'Pk\n#%b)4ZKL1[f%f3NBG!'K3%N\"E\"3E163-[f#A+!0#ZAQKd9+,&mcD448(0L9Ti+)P\nYXcmYcjBR\"QVbM6GT0m8pbPIRaV-LEVUbRQf*IU06Zfm*Ql4SQ!$G*Uf*+m-D'R9\nLSC2D`1I!1pFR66Qha)&ipU4Jp'EHqKek5J'L&mp(JI4%RU+)LkK'RpXUmY%!@-k\nSi!hqQXP5qR%iNVMB(#`X05XfrA8SVQD1R!1L2P2-8G#LG+31)6`lVd*ISiEP\"fX\nC)UerjAT@!Zr3R`Hqjc4kBZiH$U04MG)Zd0ZNb&l0JRVeX%e3Fr2L[['[lhlkZ3`\naV0lKK`G4cVRqMZ)E%*[bm$q*Q3&1K939R5e%Aj63@edfKEY\"YMpQ8BBT,(j3BTe\nI`2(+Dc(3)iT6NkkaB6LfbQ,PFL#V\"98D`'+UrEb+P1Yc0R@[A4j15dI#'[k`e['\n-K5j4!I3LdC2Ce8f-Xr9jlUD$-j`#\"If@4e+%I,Zc9hrUC)L5J3dM9h+dqkD)+56\nJI96rJ1JidE1A2J59Aj3l50EGidS3YJM69SKe3aUcd[a!JeAPMJ%2a8[8lrpYbC2\nmdY,#jjVT*JqeKRG#Yf$b!)jRK\"KV'6FIrUh!'(4NXkKU\"!N2fVBD'Pij$bb(G`S\n-hrmBG9$`e(CF&9IB%Y)8)SRk[@SR'NHLGa33X51lk08Xj*e\"VB[8+[+Qhm#j89C\nm2qLHchD,4)0VR48h###Mc)Qdm,J*C!aAAqf4XAJhqMYS3h5Pd5G2qi+(&l)A[)(\n4*aVR4K$R+@LPEk2ce[BYK$lb1c$BT$(,\"8Jk'6[5TCIYjH\"lq[khYYhb3Q42XFc\nCkI\"Mpq-+&X\"C,l`rrC[(\"&3-YY`,qLYpFkj@,a(,k!f(E4cTRaa[aaDeDk23($Z\n[(BM8cP20$CB1LpkI*qb!AMPP3,kc,eFfM2ZDZ3LJ@Sa59RJE8p%U(\"j+I5lSd'\"\niZF*UU*0[KV(L[(cTYKaIC[5CBQ+!aqdrD#kcAiGZ8I`3c#1\"&C[F*q&Q,C3S+XN\nfM-SLJE*H,*H#'dHYlhlKrJ'5#HAib-)e2-)R4*`lG,6TNEMTJ,T@6VHMjpF$Q!8\nR1Z8f8!9d*K#f4e[\"[M@@K1%l&XJ'3\"HUbRqFaiMqUF+ZiNLl+S!YC220%r24ZJr\nq'L\"5%e3V#EY&a8#GX+(&4UUIVE[q@(pk)9b'Bbrb&\"-IT#3[-e@YK2GB6cQld''\n!QXHpE+PHR%IHXl39-%KP&QpCRES6r+UBQ@`%TV%@U3G[r*hE\"reD`JcJaV$G+d,\nY)qlSq5*Na'q2PUjdkZ`\"i#VX5mM0FUJfCLP`[$Mm,jp1DCNqBZX$85bD$FX%l#p\nQ\"B5-Ecj5iS2M(KUl0iIPU4q+F53)Ea4#6-BbleF)'GdXF&@a,hG8qH'03b9cN!\"\n*cCAXU&LAQe9B+3Vll,I56mK1YDE2reGa6@LFNQPe1Te[HJ32S)$0+(36p(V!NV+\n&0*PRECDeYrJq)bE%k8e%jM+VmD\"NeB5d@X5+GTQc#P[VhK'%Uld*,BXj+,TZ`\"5\nhfK4-`5Bh([XR9C08DDFSU@,1$+k3!%aQbfd+6V#95hq@jqk\"leSI#RCq5LpE-X`\nbf#K8K+F%%(3,IdSeZSI6r4%SIpKfh9m(kNCr9LSe#Q)DGd`2[Q23c1i0\"d\"m([0\n%4VYP(LA$*ZP+JpU&[4Z(M`Lmf\"\"pl,l5IFqlDc)&aIbUd#5eCc`L5!FQ%BX[r1\"\n&9hV*LK@KLM)jrHF$DQ6,EAKJp8'h6)AdXbfE*rh8Z'a4j(V)1AG[*-i03aiPTXH\n'UaQ(N9LEl!GhZDk@KK(IC2-NEe@lcGX(+Sr3lj!!T(@Xj)#XQpQdXUIA\"5S'NS\"\nEZ,T,R)D%6RF'!(22Q#e1TDAJ94P)P+$pKRbNeD#41b-3%4hF5m#`9h`03-pf@GG\n264MQQrRc45p\"&VKZphPJq#p[0bjB$(mb&%@42C2SMRhEpJpb,)bk9r@Vmc82JJ\"\n8amRebrS425CkbYZ8ecMiEYcNTS`UGM!QU'CV8M9RS*d-UL)J&J!G%NP1Rh[%h(U\n89R3%l3Lh6(QHXN6iJBd#&jr33d(+(B'RNA0)C[d,Tk%&b-Ur@UI6PSJhpr!-2Q9\n3+4B@K[pm$aBDNGZ5Ar`lb-GC*B8Lbf8A&k,Z05*Pk+rLek)XGI\"bR%KIN[Me%Vr\nRl[2Ye5Ch24'b'60q*Die'@)L$IBSR%)3Mbl8H$rEX91&VZ`5[AZeNlVBRY4%+ae\n!P$#\"STc'3qV(T,R'i\"CjDdZR2dc91+98TBeSR0-eIlF3jE(8M0\"rkiqFejrf$JU\n*d4UB(jQrk'k@DP`CP3$F#Dd99CIEQ(pCa[(904i%p6ZR6-BTVE'[L3d@DMCYG+b\nULRMDG#)%*L&bc2m*khh8$cqQM'bM8,i-hUl[fk$\"iR+rmHaFA8mqb\"VPIFpD(QV\nJH[BJh[QpII\"Z#$`efpr6Hib$VJ+YYdj)TX!YecSNRDT[jZ8!)8riS*AfM23KZIE\n$JaIVlp2'P`RSm`MY1r,0a0A!BE9EZMcTE'-jkr8CSTemGk8qQEC0$a$QBI+!T`f\n\"kNNN@L9UL6cm[B5[`,9FJLV%QUkQh9Q)`'d9A1FC5aS#Y%,$hHejHJ#jmU+ITVf\ni8Hl+f`KEkX*&5kD+T,fhTiZ*@BbhURC,PVViG&KHKjAC%K%+D[mUY(1#RM-cfX1\nMcH2NZ@rVk6J@SaQ!(8DB8U(Ph*jFqQ,\"jd-D@QEGHr1Hb!$'LMldVj8b3IRABPD\nd#8'rC$dZVXDGm6a!UNL#4AKJPC9JJ,BaT'eT%mmF0H-jd9E+8iA%Q*3j#'2hVQ(\nHFcrJa)Y[&FqQ,H5lf5I$2BZYce(LHe`80KFdqYrLLM9bS#D#fbD&56$MCGKSL#A\nf1fAT*XU1XkFdD#eH[)A%4l`ZjZ!q@B!\"CS%Z&k!mp6rP@YSZEIK#Im4c&`[Ci\"j\n24XCpZdJIR$IK4jF!ZKq(%Rb8\"k,(deReM\"kpB(6kZhL0+`TU!f3XHBeA4`-N#*A\n,pB%B'*!!HA+#ir#i)CTcBpd2M-mp\"5jFl+,0T8@6fZe@ZEiHhNPp[(Qr(*4D`fl\nN+2mZNl*kX(ic8$$EPTH$0Sr5ClNF[P%TfQ[ccHJS-XXKqC02a5G%bqj%@KTRTlD\nXljl8C*'IFeUM$Pd\"!&-\"H'3#bCV(NY6iTG3+d2p5l1NaaGVi\"a1N![NL,6X(X6J\nm'H8d0+@S6DGhf(C8F\"mGF2+Umhb*a9L1LAY,l`I0r'Ecq,N[51CjZ!'ih*c3'-f\n(UK(JNc\"\"YjJX9f\"G-kPB,VbK3BSj@Vc$q!KiYTfV-l6l3q(-l&$8h%GH)pe,HSA\nc!afrhR-laMMU4K5rPMVNC#qC1!EqXU0q-PC1c-dBB,1`42maXcXe0,BMi)VFrcc\n6#EKLbaIhPlN6UUUUUE'HeNEHC&3pS*,B!D\"(fkHS#Bd@hrcm3adf9`-BV8FR\"Ic\nF9P,!KVMH9h@MApl5'HUdE1Qc\"m\"rLB`aQjXp%fVPIMP3rcj)a[JFBKS[YEY!\"NU\nH(Z%rTJZUVmTk2kVkBIL#HG\"&DMUI050H4a`Uh%+-mc4XGImL\"dPMM3Lf-BKbkr4\najT`ri[UkYrfpYAlHd$pZrZI`l0VlHfEq(DCr$S9ar$XPrKh8r`GTrf(4%2,EqV#\ni5BY@fdJ5Dr`YF%1)LhMpkI[XDaYMTMKNRSXihS,4q!,4H@kN1%51G,(BI5h3[rm\n''fqPMR1QVcViLS#aQSli[MZ63fc@DHLlRb`2arG-`cf,[dejCc`ebmqFqq99j8J\nd[2l6l25Aj!B#5HJC6,EapCmJT0P'9EVXTTIU\"cMSc6-j%SRPkUVN+(EK&5-Nf8F\ncdF*RJVeG(*D3!,e4Tccke83JEI'AGe1iI9G#l''!5[lTma%YK&0V+2`1QipFD$2\nP+UFTJr#i#LReF$0i@K-a$J@$8\"10Ql0r[BM`f*5PCZ2DqSp'RM)IdS1V)j@!'ZG\n`c&qJ#k&X*#pUbJ$p$e)YbD1EC!hZJhehIq`8&$UJ4q)*dMcq+88I,%i#e4G39Td\nrkPV,)DM3`c&i*AaP!HI8FM0di2Y\"2hTapD)*q0rBqrR+8dh%fMp'kf9mjr$(Q(J\nZ8C!!NqLB8kIYSP3lHkb6*D-([N4A5'\"ZSC-VJe&qX%46YEkr$%\"B181N#,eCc(R\np9+`3mVe(kJQQ!5K!dcPimrf!d*kRfj+hGJhr61ai6%Z!E&M))d,j4`'c5%+&`Ca\n@d#R%e#FYli@**kNa0)M@0JkE`PBTY#e*a$eP4TieBjD9IY@C\"4p'+eeJZ2mc3N5\nL1\"GZCh&J'DmDKf($&a+(rE5PB#%l@hqP0)mY'$`[`9YDJ$p0J@1$V(%8A#NpXDJ\npXJ!AAaUFTSf8Zr&461Zj\"5hD*P15I9AdR\"XN2p%fLCdFc%kE8*8K6`+QFF85THd\nXe0*2U`6kDH[Kj\"\"8mEEIKB4L39@F&-Y$d'Q5J12I5h629HHJ6$8S8QDE!k#YB\"$\n@#2`D9KI+e!9N0)PTefb&ZLY3#DCkhKNQ3khV%BH-Mi[(APN+@i--iHB*9(%-SN+\nDLFil$#6[IpZkT6+F%$rm8b,H5QrQ(b9HDqP!03p$1QX,[X2N9*h5VlSQV\"1@)HZ\nU@(iP@hEXpM-4AH2C%+d)0Sjh40[@k%9c&5KPU55\"Jrfl%3*eJHD\"p9Ld(U8(&*0\n(hG!C-b29b3[hF[MMm8'2MDTYr!3+()TK20,Yk3cF-PCdcff3!0R$Tf[V$qKh*P@\nYc109(BEb5#dNA6&Z+)6LL[54((lF!\"V(kB&Yi#ZK4m&LdZ33443,j@KJj66K%fK\npP@dYFiT-`92GX3[ZRPCf@Kh)ULrIF)eaL[#XqImk\"06%#q3pU5NqiT1%m!eT-Gd\n56Eb8JkX[\"'ca$ZKLkaAT##qF`[)D,XQ024C(0XE(4'LJYf`Uh%X(!b((q&cbGp4\nhbf'5RkZIMdDh@$51B2&%*V9(AF8*Abp%Z$8fNC&pmB3+5N-4[q'8U&M2C)4\"'jk\nV'*2$!'CaqEid1HKk+3cYHpb@deT+\"M36rGA8%hE(rA6V,F2--bUq3cZS2D*pA5L\n3!+JL34&Y0'86'I%D&m8D(9PMJ3`%GUk8dNempH+0Ak4GNkQN\"-G4TL*QmfJ5K(J\ni5#28!21JB9KkM-DjEj%Me'5l62%GKhF,hL6DDMrLK(ZS)Qhe$fHN)AKhd%!eH2f\nD$(Rr2,+ED#apZaP)hlreFVk2NHcXqHIV9j*qUXherh-m8DKq53q@J6Nhi45)0Tm\na'P)AR*!!!1qSGakSfh*+a+ZTYRll[%c@d[J3@+Pc#1Pfi--X+JJqqJ*TeU45*qZ\n-S!!2h3-c%'UR&3jENDZ%m[3dN!!'Y([m*U9#,&08&UN9i3+,Bq$2D`JKG2$d$Ep\nM\"1m+P-k#\"N&LY813!+6ZYqShHVrSY5#@q&!Y-C`AREMlF3jk`iZ,6kRIM)2&!*5\n!N!#Y&56r02ZqpE3)jJBRL@JDUCZl)2-!+BmSi32dA856dC*j-Q-KKUIjQdm1G&d\n@V$A3Y)1\"QE!$rVN-lQ3q@apd,Z9%dIAh%69QPNZN+ZjX98,T91&MN5jM0dHQ,),\n#i)Q0cPXVSG%bVf9&i`GN`CmeKb[p$lB[X-$rH5`CdPUR4P2EmZTm0Abr@L[`R)`\nklY--mef+XBbjJ4\"&P-RhZRi$42(39&2Tba@Y-fD'FEJSG`&ae,bpK)bS9qETj@d\nHG'b&P@D%JU@'Fi$MIDh,\")P+BB'r'46P*q#2lCU)#,`cjrpr,)KIJlCK1TY4#M6\nkIq#$V+b`E2-GRA`hKmR[H$JTMbYC,FHiK3R[AR,Tik)Zm@L[iCa1aC(Tm\"[DeE3\nT,1V,Naaf@h-@b,e$FLJ!B,(MUV4fhXUNB!jjkY6QD\"@%Ch#NKNLGcR-`UZ(04pA\nhk`rE*a&V%A8I6)``+D#qYdVNl3UJpmT96R5aLUr&2P2I`HI9VSi-pBG@XBjdmXA\n#2q@[d[5be`0\"9DC36%2@rQ\"kQ'2iDIA9B2iVdhU83T!!(8HUSG-YUC!!Br8Af(E\n+Vrp184HIY6@XQMU&Np-*A)SHi6Z&#AiCka#AFe)9!#5kqmGTJ%4ELY3#4#6)H2F\nfh5V5-BMfKI@jB#ekIKDSN9G3m$XRQUa*m)Sm\"HT)dmUiJFTU(IHI1HT[Za3N4fc\n8VR#hC[eGV60CX5mEk*a%cb(%DH`X1L5KPh-09bTfjeJGE5*MT*QG9`Rr-f'ZYVe\n(Ak@Eabqp2h2pJM&$0+pelpk![Z'I\"9eq1TXSQjD6r*@'(M(Tp))NR8U#48G*AQI\nTr0@+Af)m'bhlIKNLJI%2$NhJTV58+%(N9\"*$T3@F%!)d5%`B[JA&'SP5Vp!b9&`\nQ46@KYqEMqqIiFAaE&ZELd(G+Lm02jRlXTIhaIJ`pP9mP,Tp\"JJlh)8mQcNP[k@'\nC,Kea(561UlPi,242SM@V[\"HR!ja@Q\"qL\"-jBDc0f+(F&,hHZlCe*p'\"IFpJTll*\n*S2K2L*VHH*E,M-iRA1G#XpH6)Ya1V6Reh6*YKEL1KMIe3,ppp!2#J),%T'$NYSU\nfL[aUJPP3P85K4[U@m2FJHd#UXj,+,YV6ZcRRId0c&&5NI&)R'l5DTAXL\"+jGPYZ\nGJSpYeD6@kGLHJPSJi)9+,'dN9bE%)QNq+kB%LH\"f10d&P0D3!$bR9QPKa@8+*JY\njU'jkElf`caBd5d8M!5lS[1F90*!!S2cbcBUef&Fmf3Y*Akkm0Sa2L`#JifVa2M-\nek'DC-HN1-Q1G1Zrj8p1#&mJL[PCS\"0$SF&F!9cQIf&%T8i61&R48l-QjhU(S5TJ\nrcINJ**fe,(JrVjdGJ$RQ!KiUq0M'1p[1YFFq@[p6'C45*(r9(bBYlrmE!8ddk[\"\nQ\"cpL8V\"'DSI%CJcEiPhd9h'2PKRVqRi39AQjc\"kd&4C2'Dl3STI8jqU4lH\"k6Ea\n%f*!!DTl9h&581A&JUMC(Sjm1V\"65$Cm1m!('Zff(BQ3eS[0@'MQQVk9*H**(!6C\n\"\"D#\")edZ15emZEk0%e'@VfMC0c5,CBAIic[cTp$dc!fqBA$Pce*J!3m582Nmf!b\nJrch)L0iU506GhfB@h0P4FXR4TH6%QQ$`9ZaY'2$G+2J@ii6[Vk6)PHbYFhdThMU\n3!1m&YYRBdXNdiZlVh(eqq'(,Zd2AN!$([f-B)Ujj$CbDcIQLKbe1DdUmfM4*q-0\n&p-4i$bQqT4mFZ-hE6&Uc%Npi+N5-QXFh'5%QZ`fcmJVi\"9(JH(!C1T3Y+l\"Z5ki\njp2,9D@58VI4HQ@N(RB$8*Z8ciZY4P`2FUIQ[,G`GVl1EIcC0M@J,k50J3j92TrD\n8%%YBKGpQ(0qrj2@VB%rSRA6Y#hX1H2*M4e\"5`drU5#V&NEI5A`(,'b)d9%NJ#fC\nJ\"k[G5$mabHSBkZFeQl%\"'!8GIG9cq0XH\"+Z`\"CZ*PAP!h#E1P1(f6Y&NKrdmib)\n\"KTbRE(6X@`899dFl+bMCd'ZDc$5PcGe54\"RbR4ZR,[Kk&$L1GZN'GF,Xq'$BI`3\nr5NBRYVep+kmPr(BYc+bkd&[J\"MZT6HrF&)faDp8jITmhZ'Xa2Y9(hrKk(V0cbUA\nEq9M*[G&M$5$+8!`-&)ljZaq*GD4DKE4&)T1DMqd4Dkap'1hBb1X[IXi8!Ie,5G4\n!PM6hX3J[9N6LS-SZZRIVj-0H,-i6,'K4h6qYK(k3!)[jQd&im3VF`*R8Hr++4Y$\ndR$3hj%j#p@C5m6)-h+e-HDPrZh!VlHiT+@2pmD368DaLVZiQMqbNJhAF6#p[l4k\n#heLm0qj)-5p(@Pb'ZCc+U8[f9SeQrfT#FD*h'-X#kd36(9dkG\"l9B,#(VdT1a-G\n'$)SMMF(&$qL'd6%Y\"1M%i2Z,BcKTC&,dD'd@B1`&0@+6X0f-&XEFMSP&iSZiNPD\nSXLqehJa!T8IIHeCkhG*N4J2cfHAG999Dd(r2Tr)Y9BCLbRSRqD'5hRD*hJ2ZGAL\nhBH+3!02ENYhjheY($15C'D4,dLVQ3Ni,XQ0mL3Y`$!1Y+XaKAr`bZdUkD3)aJVC\nlkd032Rqap%G)2`Qk5`dX92BFpm+,pf!6T'q#++--8I3k%,p#F,JmDEJLXPhClLm\nB&$T*lVrH'JEQ4Vb#11(a-\"#PMV6V+@FQ`54DaK(J+Jl,FSGq%4eUqe$3E15`P!P\n%Y&-,YU44GcS9V*KQIflJDll#&4NCJS'1*UT+TAl2CVeP+[VDE$&`(B0BHM2f&V*\n4mrL)Ap3JFKF)I2Jq#91P-U*CN[X0bZF,1K#'SNH!-k#+8%L1PM&%X&KI`Jp#-Cp\n&H*RaZVm0`Q+9pd'E-!68MJqTdU[!$dYDT4SD@NJD`$D1*Dm)6Ye'[+1*)Pmp@qe\nGE+*3)'64d0E\"p-dU[1(DLR8D!UNa-L,jAP*d+KIh(*8XNpTi*U)*)NNl&EaDKA-\nUUANRfkZY[2H'1RpV&`0jbEPY,,A$2JpSH@Ge-'l`kHUH43AQ@@&SijVaZYVC`\"r\nhTG1LkCRa%!%3C*VPe4K1b3B'B&p&PdGj54Ih5j!!QeKXQ8mjVcNJQ@6F`4ap2R-\n`q*1eb@$Vl45GV%%r4'f+D14m%jh)C%`4%,5DDiaQ)hDrP$$8Jcjq#CZC4HNZG9D\n1R(1d&5Q55[l*S'jp0KVL4f#+b(Q+2J+lGNFkM2UL&Y2T*&UJ0e*)k8-p`I,IYBc\nhCr#6UQ0(\"Jl\"[!'L#mVQGCli%N8#DV-MLD23aVM'm&T(GG@hrUTr5!lQUDVLT9K\nQj40L%)Q'Hdmi&NUj+QMN8G9CaR6q(F1I86\"$j!mP#&*R(ei\"Fp2NLD*@iLrb0T!\n!eMCL,!iQi6KP$d#cFeQ5@,r$@UhVr1XrIL''6[l!%A2\"bHB00MBKMc(-+'QLI\"T\n'UZr[ZGC&XLLCa-be[0dBT!je5*VdB*+)0Lpdda2C6M!P@Qr'kiiCE,2C'%Ff4Zl\n5,lBpY`m9*N`PPAMH$9V,MXd(V5N)*AFrTA'a,$aj['['akQ$C(qINDkfKDaE&hC\ncSbi8c$c$KA\"b,JrK'Yq\"babfUPT8P#`TeIKb\"VDh&D(4JUeBLH!Xb8[XjhX8V'Q\n%YUNQAZG'q63RVb8\"Qi)Hqp+Y3L`l4&H`hlQZ,j0)UKT@69A09#2dKj*HJ&GKrAm\n3U'B4UX(&4-2QK&Y#8r@Y!@R&B+%3jdQ2RcPJ+fkDCDZ\"HM%H-%`%P`C9pKLXS6,\nZ3qah5@2%44SLl+Ka&H(95aDQ&-+9P)e[0H*pRX5Tj2Cfmre*XhRpjMPiq-D3!%Z\n6(j`+-3B\"dqr,35C*EP+Mjkhd)#VCEAJ)'0ErBS1+Qekrf2R6Ajb3!1qJS-MrCS4\n**338X@X@`)CN-3+HaDQq0I(j2,3hbcY1m3mPULaf2ETQhpJ0Vk@R1jlG5UEl)00\nIU'qdHT[Z%+'[0!c`%0`rE@64fm+@,@L2cqqXBT(*rDbl6Br1A40IM4[4582*Zd8\n3Miqi2SXlbP!a3DXKU@5e*dKdjaGEU&%e9V*63f[LlNA'b5LAmf,phF-)ccXKqEf\n+QUSmBSC6$8h3*V!YAb[ST$q)G*MDRX5UNAr@3-P(&F\"mBKGK-`b+m1[[NEj-cKb\n4N3*iF8e!$rjREFhbJKPFKZa,'fLV#'1KHmlDRi+MQ-Br-@lCfc!V5jX4NV&`A1S\npFr+c\"KJEY3,dND\"b@Qb4a-,SL,iKb@&1`))(D'9d1M0,-,*!JZbcUJ!lVd8b,ma\neK8J(a8F+KiPNLe&L8kQ6S&i55$*8fUG62,9d8Q!X\"0+DJ$4D6pMXCc`9e@a$0ZM\n0qI)q&fQ\"A$A`NkbN2a-hUJX2A`JAr8I0aaT-rB1Qk@XB8ZZ5MVJ5a#$(h+Q!p$j\n\"fApqiAfF61f8eq@N`bm8KMQ!)Y,RSVN`3r3kc+c0Uj!!RQVM1$kkQ#GGkR6e-1c\nJ'YqHqN8+0#Nd#c)jaH0d%CGD+%2A8*R6Dhl[Y-C,ib%0fD)`CNE8C\"rS6%\"1kCq\nErd!VeJ6cPS&k1m)M#8U#dB,fZ'ei0pb)hl0cB6I@mb'jbrVJV(*35BE&T9hhmFU\nrKR@)eR,4K$GC2F+'3P(b)36#eH%H#`#`qjXk26Pa@$CKmJdQ,aTS#E)*J#(1NY0\nT!3$MUCV4%Z5l-108+@L%Zm6%BQd#ldhTq6#r-U4q3#'If62l`9hJFPq%k-RBNmj\nGZR[#P6SL+91*56-FDIMGDd5SUfF)`IdATN3RT+jZAACF-B2%`Hq$,@cH4R$#R\"l\n*ahFA(,X3[2\"C8mRGS2mep8S8G2'$\"r8r!5+@AJKPlM[h8Ai1eH1YhYd1!JM3bp1\nD*LV$TKNPNm#bL#RjC4KC)h2iahS%qeSB!PpMkZiD2L29l*U\"BrhV*J1p-V`$,GT\nCr\"5)*p$-pb0NUf90N9jV`AA5GN2BHhC2H-Y(r6Pb0L8d+F(N#Q**R)Ja-cBB&B`\nfX22+*YLHc0&6L3plmJAN*0\"'4PZ+AJ2fB95*!9#'fQHd*(!59FC@Sq5Pj[&`KD-\nNJefPd&YK!pF0L$j@TbBCY9NXa#3!e@-)QY5@q)h5TdSN&%N,NP3iklE)BJDcLHS\n'!50cYRQ(#U+!$Z9-FQrHV!4eNU2e3Y-5U+Dp-4(PPXR@3+!ahSMcI-K$e'QH0,H\nk2$QM6565BYd,q&)jG5KUkf%++`f'N!#Y+ai[$9kmV0&i*k,U!F-%9f+aGP@dcE3\n@KE0VQm0jkKHZI6J3L`3RZ9,Z!X4k$l*Y[Q1Q1k+&SARF@icU,aq4aD!Ld,#r6Yj\nB(1kVX)3AMKbBEp3EbM%14pF)J+)AaBYIED&!)Yi+,N5h8#Hqcr-@pT!!`!2PeLG\n9-Z4\"(NQ-Ur+fY9S)&dI!arc[qH)lde#Q#+QUT0E#%kkZ-b&CM6Sf&Y3[iG5lpej\nRZ[Ir3qdf(eCC)XlHE5GF[433E,r5(m\"\"ZrQ&[EY##d#!@'!*jTPp2m'f(TUIY+#\n4@3IL6C@P!GL+N!\"0[m,(jK\"&iUS!`[,IGN`8#U\"+h'h18QHqeF'T*aIii1M-pU[\nK`p))e`Ch)00KF'K%1h!HqjFkHSG0mPY2QRJ3RU-kIm,\"G[1LCJe9NTGQV*M+#@5\nhD+9URQdB%@5r51%AeCm&9&k(E%VdL!SaF'@(Kii)&NimCKE#kqf(5CURPKDAL@C\nF*1REC+pk,)FPhQS0K\"R(*--Lm+G)iAFZ%J$U\"GfI6Lpc@I&DMJl(%LNGD3--3Ak\n6BF#A1S06,lN!DCEYITU4e8mb#FXUM$ba)X'FXcd-e'r%N5Firbd9hKPrNS)F0E$\n3+[`1Je3`Lk(p-#53!&Y*MmMk(@MF`TFEj`fm5VPkd,IT1C-QFUj-BA,64TA0BrV\nLp%[p'&,l&1ic,r\"Z8)GPP''G'F@G+4f-Bj8R`36ma8Ldr*lG0[ULHH2QPedd\"1K\n6fmDji\"YE(4h,ZNNcp8kJ$rfZDII@+KmS+j0VN!$!Dr!m(GBjl9YT@&Ti&R2E1B(\nJ'D`K2b44q$f#m&i,`)qFlUpjM%rR3F3EEL,CF6C#D3m(GIITIRcfhfm`#&I%GBq\n\"!AD2rT-RQ)3R'-1@e9k,2bYAS'V!+C@SLPFeL[b8@BCdfYXMqKRYFPc8&QTVMqC\nM#ah@f$RYcGf3!*j58f&4-6mA83VmmiLr8f0RcaXc%%ST\"1QBSq@jL4(L+a4R$%E\n0*`aP2e\"Nm)RBf\"0iAL6QUAM48emKGF'B,!Vb(G[HJBlP!L'U39qZX8lTT2h@N`6\naT8,h)hr&f+H`3h[U%D-4jYSTjq2iZ35P9eDc'k*lSQLfAZI2)$M8h9Hh2@bDDD3\nTHmBLGrK!eMdL3A`Q4ZY33&+'CLe0'YDjIhk+([S\"a#ikk'C6cdea,Gp*(1-XVN*\n6HBVlRkCrF($Gp!(bX!eL1rXJ2'KDMFZ3!2T6SVQYC!Ic4*Tr2kUdIIcSCHF)2@P\nNCS(KS'934fr2+CT5KhkT2VlYN!!3F0M3X1L`[\",Kd\"31QH&XN!!m5C-eDRX!mXT\nZm9qaL-6fc+Y4NqCc1GUhTk)&3,)j@G(c2MCb+UHdG9$VV)R0\"L+l)X)HpY'qI@V\n1F[3fLa#CLj!!Ya-d+*GPSCbC5#BZh9(5(i*2#Qm@VMTUJ+mG-J*k[a5YfIQU3Lb\n$jF21phZTiZ)AYN)Y6i4Cpd0Gf,bJ12eTL@pci9+V2B$F@dD$fAURPRL[(1FH9kf\nCpqD$#jFS6C!!plCYaANUeS)&k+3l@J%qd#$SMVB-XI*rX4dafp3[RQHM[,3Yhq*\n-26J3ceINZ#KUqE\"9$ETVMfRCaM#A1&aU!r-(dImkUL(Kq[#*MR@Y@'M93Q'bh,-\n9A90XBfF'@6b5dPJLI%pE%Xe6pEF2P92lmA@p6*dlLJmM9&RilJq2CRAXE#'$K#a\nF)ND#l'4h4a(iAp5qiI8[&3A0S&8a\"lDK1p3m$`FacD0E9eG3D`EmQU`@jpm5B*D\n&iG!4r-%\"4X#R+*8+9L%8bJ4C*!6N-\"kKi-#XX\"[pZHH*YUDEN[[SXTb50*Y,VJL\n4$`BU1HUSX&V&RKV$['BNL\"Vk!a6@`*m%FXqh2`&TqcGqT2p$JbFK&P[N2j8pi)2\n$'iq&GkF0-CQrQ\"rPdmpdYN`RGHi#hl@JJ@M'Bj-5V+3G`cV850HM[a52,#rA$rH\n*5RCqXU+##[*fAaP'3UUH0C&CAffl\"i(1*[pIS$)FX&T9j,G2iidfHbUJ-E+cKb(\n,T+&&P#`H0G&9,f3jr*2+jLHe3KG9C\"SfRPK2T8@#\"Ud*+li(\"elNEM@VEPG4pea\nl+)Z93LFRm[k5Fr0R0KZ%'5f&U@*kZ0&B,$aT$)QM)l3DDN[h'a48KkeMdArQ$(2\nbCiZ%0b$l!USTZK58)em3CdlY*!i2Ff&l&2\"$&INh`ai8*Ap&#!+2VPYNQ3qV,V)\n,hNUkD-G@%-qS,3b(qGBr!EH2KePJA,pkZN#6V[Gq%K&1Xf'i%&lY8aKij9fM-\"X\n0pKJ0ZeZZ\"D*X\"JHr,Y\"[+*Y&D51h-k50V%02lj9HjPqSG`rN1,m\"a6GV6`BL%V1\nG4lU0KU@XLp88UEY+i&CmE\"Q3!)\"dQ@,,E'2eRbpml+0r(@Zj(6ZK@qr\"2ma*hkJ\nmB1i\"aPc-E\"m(0@pK[V\"JhRmpAeCb9)c+Gh!j$TQ,0ZE##3Pk`j9rN!#CF8H6&X6\n\"&h#IAk4DUpcK*JBpYG-9`*SUGM6@lC*Tl*2)!R6mG-TP+@2QX&B9)5MB(!MpSCQ\nEZDANePH85P$NU2a99c($[l+m!l@f%[8HeAX)EST+ch39Y0I$i88X[TKF#Qk4F49\nAIRc'H[Zhlr*55&9rBC(cN!#iBY%A(984Nk\"0pLjQTa1Y%-&3YeX2HVlT2H,C9iq\n#%[CN93I9VP*m'cC#(J@YTYkBCZdH1hIK%jeKBf[%)HJZB)X'N`Ec*3Ur4JdjA$f\nre)hIP8i@N@aT[Sq*H3Y%ERP\"0-UhbMZeR5de+QQb6\"5I)33EAqU4J8)bBRRj\"$j\nKfUP@3F+iZaP&FLA6CF%HShBH%JX+SHVE,BPTC4C6&,$j86Mr&+EZjkEjf*FS2\"8\ne)Bl)&ZS4!25!-8i1VJZQhCL1AHZXE8#c#fYmX'`X6FD1BMZEjS(,H@12!N%pRb9\nBh*-ViQ4rebBjiM4ara0J,iYiU[@2)plA#GQ42C2#Fq,hF-\"&!jh1B)5bdkX+,\"$\nFBFB+@5S+q++hJjVK``pE`k(Kb\"ERE!l!E1+IcP[G1TdFfBATMbUPUji(pEm@piN\nhXRSGFd9Maf(r$2[,@2\"hbBd)(j@YF#,CVTdYReU+&fJ'f6@DfPjKB6ELDde,@[#\nC'5l[5mQ,Lm)T@E(Ua,I-mpV*N!$F4qmIBq8q5$bTkdApb%!KFeb[pFT&Fb((fSR\nB6+JTRK4dkmk\"p56kH+LTN!$ah0VV[UD!f&T%2AAX#S1(TeiAYLZNYi1KFQf*`dC\n6VdajrdINRUbXi(AiAjpRi-ki&[G\"J#&%hZ)HE@i0,3TDDqkL%c(T8cP,f1ZR$e0\nEL26qZ0mNdr111kCdHjP3+\"m)-LcA[FCV!j5Cdr0S4c+Icp$[D[AC)KYNF0imc\"q\n!bKR$&5%PF33&'90UR9NiH%[@F48GVqLaSjrKhbaX%CY,'paf*\"pMq#QGj2YaLZr\na'lVf!$FR+0#p+Y1#Z!IYN3JDAP!lK$IDJNab$-!fH[IHlp4I0Z[#c-l@YH#*4@R\nIcRX56kM0d9F-&'Np1'Pj6&SU1Iaj,@*[(+&8Y,-9lqY4M\"YUFLj`D!)ZV4A\"fq\"\nf#k$9HCD!%51S'F2104rmd`3r1!VjBPjh3+EjifFpejiDcZeidR3FD$(63AE!GDe\n1$G3&Jm06XZUhUeimVKiVUY+cc5bUk%+1\"%XYXIJb@l0YZ&!ilmC`I0mE,hKKm-U\n$'EREicAHP@Bdc[MkFjTE'``deSY5L+CSjlrAalNPik#c`)R6Uj%M2r4'&U6SEPe\nT8i-L3-LhjY3(,Kec$jem0@1EDKEhqDIM&i)Cdd&F\"b&mQ2c%2p`'DRm9i-*l&A2\n'jlj8,cl[Ci'ijUTMM4JV((dX$3K[p!+#c9V[H3D99jJ5l3I\"Y+h6#09LM'Jr3E&\n(@S[bRQ!jBJDY2d+cmCVYGmYqJepM83'MQ@qUpJC[KCP`(Zq)Ur[Ba-kaB8Y'F)&\nX@6(+k`$5i$h-Rl)'mBFIVG3@Fca5++,N3VQP*-@JI!$(abZ%E(L96IQbpfPmNq&\nNP*0BHRXZSV'RYVG2GAc00Z4iaNJL)Ki-bBrp4#GEqp6E#'4DhJKN!iX\"kMpKb5,\nPRPS3%D\"YXKLcec#q22k*($5Fld`,*JJE$@e##D9iR8Y1SSe4mdBRBB)Z42eKVhc\n[6CGY*daMHAB,Pl*1B)YbCmVRMM`DF0RH*GbA%6b$K#+@#,PP1CUNGr%@,fj5%UI\n+j!Z,0Vj\"@5&Tm&%RiI\"ZXpE)D9P%6)U!PUPm)E&#JZ@bINqrc%Zm$iPI'ljb!aE\njj)HCpTP&F#-E8[2pANNNNGKB1$Rf-$A6ekf0@I+@bSj!A@r&9ijlFRr95@V@UN)\n2[06$%*pLLDk`hK(B5)IJ@icBYYMPe()N38q!mZG!6!(QfShpK9Ll(rG1Sb5+m$(\nUad9CiMY[A\"3aZrEZd8'+8rh'6rQ3!(H8PIPj@hVH2pmBV!JlS&\"Gp@M`5C(L6k5\nSLb(8%N2T`kdi9ll$YGU`V)Ua8\"JVh\"C5J55C0KE+2r0jNRCmmmB`NdG0EmFErL$\n#KcVF@j*aTeklIq$%Lfm9ckBYj,[C*m-pM6eVKXPFYTj,Ndb-'K*`XD4-LeHEZ\"@\n9Af-YNe'@i@cG\"Z1&Ur1FR,L5N!!H)ImGj!pl0k&S5RiCX$F`&U@4VG-bL`,\"Ia`\n@a2PLHp**j#`'leHP-p*,LbHE@fDakR'M@YEVVqd4SDND\"VhhK292%[`aAPMr-pV\n%YS81AH'@P@rjK6+lEpq[il\"\"JT4H&CM4)*Ir9'dYKHSB$i9\"b[4%X%Q)I*@AaR`\n6`I`@3@TqemZQV[#aPM%KVND`KiEHULZF\"$+B(B,&IMq+$#$\"Xm,RjY9@YFLLaa1\n(*KrGl,KL1i!HTp0Y)H)#84H!*B*c1!0K3R,(U(Ah$Zq96kP9dkD@FB2FQ)ZijLD\n&*9j6,JVMiMKe15e6S)k$lQVXAkrVITQDRDX9+*I`3qjeYZ1iZd9RN!$b58CHh'A\nIi#9hX9c-[f1Eb2,aG#QG@fqGlA66'[!Lq4%K1r9f2SkN\"dJLJp,YP@+YKd6VJM9\nArHiT#dDI'J0e&$,AZY*S+8Abq-k+`3Im!rYaqhHSKdaD92jCQE`5L85MRD+A\")L\n3!+!aSb[9*rGGL1V'bD5ab*84YBN4Hl8Y[Y5mLN!K6ERD@P6@+k-)aQKrFki+`$N\nrCLX2R1@Im21F*fmZH,CkBiUV#)(N\"edA@p+Yd$&beLqlq9,6c@iV604!RVBl,`4\nP(Cbp9qh#6k+21DpT6Q[0AZI!q#T-)QJ*NYQ@baCJJqAfe[pKZMr$G'qfd-Re9Tr\n$DVq'iYpYRirK5Rm0XIiEMr`V32K3,'N5Q$Je$mlmSaVq)mD(94Q4J[b#iNM#I3#\nJRd!S*p!+#I3#JRd!S*p!+#I3#JRd!XDlNcfF,$rrA1E3`'!`'!`'!`'!`'!`'!`\n5EY%Yp)6mBcDIpYUfVDYUfVDYUfVDZ4b*-pek[r5q#`Y%\"p5rrh@k!RjY0Aqc6$a\n)hE@4lH#b*\"bQ!DhN-GU5r345k9)[5`mH8TR!V'BaELh&Z,F@iYaELh&Z,ELm-C!\n!H*[lRaa`FJa-rhrBVbC$Tbd@cKc)dAVM`B058'dAjq#!j'abX\"S8&cR3rU[\"VbM\nF!BQCp@#r3C(aX`)K1\"'f2kKk*f-Db*f\"MacN#VU`1,lr*!SqF(\"@)Q4LXI%GYle\nm3)!2h!pa)DfB-`Y(iMf[+RpBG1peh1+BNX2MhLTQmSd&apdCHG$2$2SeAq\"GfAM\nCB,G2-K%SD$4\"3d!!!!!&\"$C\"iGbkrFbdDSS+#'pq'ja',F#!mlVPN3IK'L`[18&\nj32dLFeJfP8q%'KpP2cPb!XY2L9')YVr+RSF@(@2f-&+b3+Gl[Gk%CTa(2i%!KGR\nC'J5$Q,lp$Y(j6-rM'XD[Q!\"NM*K+'mQ(19QIe#D[TU'q`iD($Qm(3F92Dm\"Q\"CQ\nm'a!l1TZN8Z*CVjdj%R+TmVY$9Gj'mKIT-aeTb$1CHK'Ma$Hfe1l*@6$Ueaiq4#X\n@-9N##bK@YeK2E-p5d-MlJ4(b\"iXB$ZU+-[ph+Z[),LLCGVJdj8G##Zmc5Te[+8N\n5#Y)Lk2Z4pb2Ypcm(T)Zi5EG1%9EX,`H@-dQ%kXP,,B\"\"&3m)KbrXkZ4haEZ2(-a\n&e)3@8EV%!TY35Xr1[CE6mGq-9!S,imlk1)fb+d1pqIGjm%q`6l\"2X%q`9(rcaQG\n`LL3MPXJd9QR-NVC14S,6&ZUkbG2!X8kLBr*l1X+M-l$%P(aNjcZQDahUq43h*AJ\ncKB!(jP,d&Urb[\"+(i@B%E&5(FS9bAJ+RhH4!Arl@CD,c)bCJ*VV6ECR0ZM`691E\n)#0Md2qL88(dRalKlp!RD3TXQf3E4ra+IeCIf[%LSJ5!!&%\"%(Cl32-5\")0kfdS!\n1CRjpq2QD[)43HfEik2ReGXA+Y&&PqTXM9Schk!3*--q\"qKPeeiEYVXhTbZN')r%\n`6\"i2(Sd3@fJjR&CVbVI9UPJZ!E-FTaVc$X!IK&K3+q!IimJ3$bG6-T4$(5QGAl5\n)[6'GL4P[+f*eD0c'c&Ll\"I$`2'G+9VB),p6a,RDP42$f)q#,$2`k2[0KhL6ePRp\n1rJVB-'ah#%*Sl-#C3EYb26kN@JS-JFj`2*G!+UBZMhI6c&h[MG&'9iGh1dY2R8f\n&qqG6B82YBrP*BUQmb-52C*Vq2SR9-ak*YEXeLPkj'I4m+C%J+a#%I1R*2DC4QK0\n'LlCPj5+X48$iTL,Y23mjY`C*rTXem88SZSrID4MqBdNLNQ!N`,,pLEE,b6*p`6)\n2JZ%VACLk48$!4*9f3ZZc0Sj6#q6F09NKa0R\"3TqUIlU5(@4Kr@FB5)*X&&-jA'2\n2[@22NiJ`!GPjEVDSl4Freehr8$dkf[eaq6h5NFGq6FFHX*Lqc*f6XR9GfZ+3!#Y\nm)BkE35TEVGEVGEVGEVB!$2VSf&CkXGVh[0EL[RrrI#T[#ehGCf8dB*&Rq*RM8DM\n8DM8K'NqKe0qYqDK)2YIDqepVlATM--5JkNkNY!)THMqiYaELh&Z,F@iYe+#8I6l\nAhV%[HN&m8,835$qc+Yrkfa51ajK&jS[JE)RHXm4aKlN(U3HT\"kN(U3HT\"kP*LDT\nQ5J'6r,5eJ%JfXE1lk+,Mj[f#(Ic'K2S1J6k$S%qJk\"2S1J6k$S%qJk\"2S1J6k$S\n(92'M`5IrCcQM`Sh$!`-$!`-$!`-$!`-ME2$i3J5YSjXC[DpVf[DpVf[DpVf[B3*\n@kIppa%J84YEH@pMMrh0bqm%fY5b%B\"bBHJQBXMfm&N5$P-!e[)Bl8PqJLPdU4Ic\n*S4+p+a5h&Z,F@iYaELh&Z,F@iYQ'I&(ZYK[\"Z1lG#LmY#pEC81*MLJc*dGdj,Uh\nih085SY3i#f[Rb#Z`%m!XmE*C0+f6Kp[$lcj%k!k051`R\"8\"RNUiR#\"ci(r'$2dl\ne[,PF!#Q(TJL9qY@%bL8XLj*fQ0@l&5p%`dh26em230FF&!,8AYp4I@VH@)IJA$P\nbAaIZpdrT[Q3SjiMqZ!CFhlV`!!!!\"'9((IK@dq8AUIA9'BTRGLH0ZaCbP`JcFjK\nYdfMlTC!!reMGjAPH9jVPJb[Di\"QUeGZKV,+ljNq-`*dQS%i8i8i8i8B9mCVd23#\njEB8Q\"+&2H20&b!eNdkiLBc9Ii-L$j4+)$-re6NTU0XrP$E$SeU62X8V2G&lFFK5\n$NGU3!!J!h'13!+C[90SXkmiXMQ5j,V3FMi9e@m9&AUL$bKTrNi0**h@D2fB4prJ\nF24Nc[`fq*aYl%XUD*ed!'Z[E%9`hXm*d%cdKV,LEGG%A4pb2Z4pb2Z8IiPNbqci\ndjp,C&Al2Hm)%B&Rk8fSe2S['8L(XAT!!fAiV9!N1pa5IQ@,chXGPN!\"f\"iD,e6$\n6'@`1f%R'1\"+JFf@L8\"AFGZ'YVr\"2X%q`6l\"2X&EQ*1*rp#hI$qcYeCIhCDYVNhF\nLk[&-GpRa9GL654(CRT[R%8j4)H()G1fk3\"5PpK+S4l)$Id4M4pi[NF4i9E6$@49\n4,P8YS2`lXS)+!,P4XaN,XdQA#j9AlLZ+IUP)3fZ\"F14K*d8VI98C\"jNVa$lB)YE\nVfYJ9l)iSjSBC+Jd8-VImTV6)@4b%X*J`T5J,erd2`r-K)SPBX6LIA15(1PD6NT-\nipcN0cY9#FClCf5C&YV(NH&S5ch@p8eBeBeCHhRX+#mPQ)188iV&`f04h8,2$ekm\n6THCRqSNKC4,l2KrXBpRG#HAeG2eJL&02JcX1M[6@1#C4-SQ84q8RK395#pXf''i\nTXMDL%6$r2kXbF-%5f$'JND#(hj[%C!BG@eqQ4!%)&035d[Pr5\"QJdm$QYdX$'NJ\n4,apMSe-ke\"bElRGK20Jh4)kU6)N,-0@\"+p*-PMB5c404b)D6eRlF+$dYl+AZ(&`\nc0!85lH0#3p,kaHh!QC'+\"D`pp-Gr'aM3a9XTX0aNTqMjp93ehI(6ME[NU[&B9kZ\nfY-[YH%p)Lk2`H2FR%@HZ!\"G(!53qah\"'55YjQU#mGF-b&Q[1ZjIk2VaQ6DR3TES\n!V(UTLYKiURqh,J+-8mf-QCaDHla!4Ed-!A@b'Y`IZ$J&Njrbp0)*%i8#eNEYhlL\neKQQLa$acZcrM1U+e!Pf[eIUqhc2q)iG5,iqCc1Cc1Cc1Cc1Cc1C-U`m#f[Vh0MT\n'Y3A,IrprqLPPGrjkM3URNar,Y9UY9UY9PkY#U$1%-U6JCEAdMT(51NG)jG)@C'2\n8R8RI&2A`rZ,F@iYaELh&Z,ELmD686T(6fD,,5e\"*%PTM!,qZ4rELF`!f-k@0Z2Q\n$XqIC6Qh2LN1+3iT$LN1+3iT$LA+jURr9\"jbrHXl99Q'1l-1(VhQ`'(,iH[Kkq(V\niH[Kkq(ViJ-rf[qT8%Nr!qRfa\"FQU*T+K)F#FR5e\"4e-CY5mre+r!$!#+8P+Z\"r+\ncb#fSRh2XZUUUUUUUUUUUTBie\"bilpqrI[hlpqrI[FT!!Jj!!SqF@,-i525Y'3'F\nf+@4P!%55%fSEFq[r,Cem@\"J!!!!0EICTrAkraf4b#(B3D$,!Z2!E2YihqA`M,JJ\nbH!0em1H-cEM3\"%2$*+3hG4e-pJDVReS$A)e#2-(QS&'`,VLlGe[#rNLi#KBMJ66\nGNFKq2L\"`MqkUk''PZfhb9JVE[1@ER!rm[@9XL#9L3DMlpE!N&!!!!!\"eF3E'prI\nK23MZPh0m8&l3KS-)!hT\"!qAbldK2H(h-!@,i`2,3dqSLITaPeD[TNd51J**\"eR8\n%#2IjLBj\"ek28F)iUPEE)8S2Lf8!)9Lq%JiMSVe&(SA*E6E@\"8D\"6bqe&1E$jlKG\neaRM5SBq+pE@'&KfY@`PAK048NT!!P2Am852YBAq9e5l-ADdL\"AFPh[BED2a3(q1\njrDHZH@FI`$iX%#l+EqYpL-JZNS0Z5555554M$+))(\"8[%jch([jhcZP&6cTcVD1\n!#EE0jlM[b4N[+cN\"5Fi`rc[J\"8DX@dZ\"h&[f8b-dP1,6`f,CN!##Jfj*****)\"b\n+0Nf4UFVk$SkB*l$IkI88Y'Fi5H9I,0(`@+T+XMiRl3\"eR)HKA`fPm93GK-((ENh\n'b3XU\"KN5fZDi+UL*Sf6KpUC,r5CMbfj*******&rk40UEDpT5`2%JJe$CJ5'b$#\n6prRkqiPhl25ZXJBkq1BD'$5J$EDM-aBXPXE05iB,f%A29EpQka-LJ'c6hIf0mjY\nBQIQAeaa#a(Yi,2LBFTd&bT4!MC!!#NL@BDM8a$frQ1Y`@pL0IUbldYj$J\"'LcDP\nDPp@3!1i*'6!\"f[fN2T+pkdAZ3',\"Vf@m*YQm%R&TDQkZfc!h2cah,Z'iT)8Y3XB\nDHXIdf-K*N30X3$0,djj@P6pF(605raSePp'B6Pc0pS20%[Dm-'3'DX1*aSUlMdG\n(e`@Vb%jdM2B#PBkh!I`8`*Yjd4R*D-'b[B4$*qHhrAChD)Ah#P@5rB%13KTcVKi\n$UV`eL'I(l`Npk+ppGa4,PdYe(ac2!ZU2QFe+V%#YXT-M!4K%3klfA3q3!0[Nf2X\nHH9H#F%a[HM&EX(pQ,GRMCl+EilGi+Z8Yrcllb&LM5lG,GVSlR9)kq,`8X#@E*8R\nbIKq6UN5pYd6\"5ZD8mAAkL1$4&,hIR95D!jP!KKLBqU'aZKfK,mBdT+@P1%TqfBr\nqVIN&Di9Vhm@4N!!EZ[Be%Y9'12`EAc5XYE&A*Na-`1QkNHMd'kDPCR)jS'ZdiF`\nrHQcJHBU,j#IVUQT8ajbrHXl99Q'1l-1(VhQ`'(,iH[Kkq(ViH[Kkq(ViIMj`E-R\nHZpaG[a*U%cH04U04X,LiZ9qQJirrIiCE1`[$bTcS!+r(0\"%iXEXJe50!rid5MA2\nT%BN!08+GreZX!0KN-KN-KN-KP`)[Y5@EpD-0TMTjmcLcfpfpfpfpfpfpfHZA\"%`\nlLfD-81'chHhZhZhZhZhZhZhZd3'@Q'AdDPBQVfQYM*LL#dPT,5@NY*D5dPT4mS1\nL3q(ZMReDBr`[$pZZpp@fPpZippYappZi0pZiRr$C@qh6Rq&Y6kUDJq(@)(3q8(3\niI$h4hfk3!0pYXIYf%rEd8r`h&Re94r`fYrKd)Im'fepZR9pYJAfe&\"m1U3%I&(b\n\")q6GAIEUhr#hIfkdrYh\"rKZEr#m2q'cAm0fpqhBApZNhm+h[YUf2NSciQ4&rfTY\ne%,m$U!4AITVr\"Di)Zc\"CDhhHP`5*#pijhMRH1KGaH\"p9[i*Zrh)&6VYb*mlqfZR\nmka4YjCR`E(5%J(\"a@kr#LA'BChP3eLl`!L,)MNAZj)NBHrYhCEbl9!e*$(c3231\n[iP`5FX!GHq('DCqhN`23MbE*i5pk*i*5+5`0ZQe@rR,$fK14eT3-l&9pR4'B`(q\n9-L9!1C39m@ciH#E09MME&bm&1aGT(GFL@6&da1!E44k13Im4q`2Lhh5%KkIlBI#\nS43e[LD*p9V&&VX0*3l&`d06EMdk*l)B'`-5F`Xm)Bi!iIfE5[r0bjV8Ti`cT5b\"\n3DF4@pm#DkpQPG!G`-dcQ0)-`5hjAm4FBP12@Jd`Pp&JrheMSR9BGj201TFE'm$l\nacKa%ZaZ4b@Hh,1RLZJMD#a(cBr9N41[caC!!8SaS(NTXXCG&rhaCL2h$`5S%9EI\nU-pbFqX$d`+M@eqN(55q-[LHS80l4#eKcAeVR5T5[Ab#U`i`8A&%ZJmNI5ib3!1T\nEb0*()3DbbD(f$+8beLTU(bFh`k&HLiSV#EYTm'fkCXUURT4+brelh18aBci5E[6\nAC3M09)V\"X',rIA4VM%fSbh(YNRE%fSMh4)4fM%rPDTXEYU\"'mf4bQZ1Cf`VKYrb\nqM[F0@Ycb,JCqde8*@G%%N!\"iR58rq&,&$rV&fTC15\"29Y8Yl@&)p3)Mr@X2IHcX\nQUMa5Ib[2cJ9rl95(-%5Y1CiR$8hAm&#P)fqNH5PBMRk-MUAlNA5,#hMh0#(j&QE\nH6\"4BpKZCSI'p-ji,Sp!pi*V\"FbP'344hFX3K-k+p6@qm*fRH!1H8H#XV65M$cBP\nGmiqXmL$V5eKlmB`M!e!JX1b8kFl+`hK,PP'S'8KGXmX0KiU+ShXU5%S\"pqY+Alc\nGEL1Y'@IH')i1Ue(NNJD\"(43\"D53Vic2NJ2(&0CPPQUEdBi85rclYCi\"(`e'%Ihq\nNl3lDBH0(V@b8V$)J(LGDfe*pFU16KFFTIa8M8ked[FFa2jYA[q&GPb1cBc,jNQ`\nIQIUY[FP6BJPrq)MX0VAr)qB[(4Si*4QGLq$EhL,,C43)%Ma&m2(aA44N@MY5d&L\n@\"--(a)XlG!3Q*9FBLJkN5J)YjbQ4SLS\"iEj4k1Hhr%CKMh@&MdqMQlPh(E*Y(UC\nE4602[5i1L(rI9HGqXDR-1l3(PfdIFLJdiPkN304ZL3-,XM66c3$!5TYNTD8V1@\"\nNh0Na!kmrp884Nm@BdD*I&Se'(@$1MALQ!99M9LFbA',rC\"K0%V\"29kGG5#cj+*Q\nM\"p#46($38ijMEY,HlEd3rSVC4c%jDi8eTeKP!2\"!EL2(`2p([p(#rH9RR80@,cH\nEd%HBMJ2LFreMqppLC)[THikla8m6E4#[jZXKTV![F265S`h2F&RlhM()G!iR[`T\nml%G'Q)''EI1qh`Z,eBbI!cJpE@Z0+UVJHK326ri3R\"A%81BaZG6QG,Q'[!J[Er*\n\"IMRATJ\"m4FHk4CLBXl6C@0*p`8p#fhppiQ1NPAUV@LrHJiblZk1P%ImShaFA$#4\nRjeLf0`HCI[\"#e(kdk60,K5C0R-@&%2QKD8+l#NK0ZV4BD@f(jU9lfT+c)f@Z$X[\nI9e!6Kj&f6P8lG,`mC2aBZXaGl*dCaSFhbeeBSrRp#\"!c+H`Y`hk,XCDfri!(M,8\njJGklaXc59hNE&Rim00[RBBq'V9)$G@00YD!P$'pNLTPd3T'-(Mk$ehr&DKAJ0if\nC5jhdk@K8&9YmRke!*rG,hZQ6#KTQIXKDTCJK&`A\"Pk6!JAZlbqAJqjF@8UM,6mV\nM*p`6Tf\"$5XReiiB'NL*T2IYf`,db5j4Ba0T,B4k8[XiQkIpY9eM)P#r+,TC+U(l\n2\"f5-@[k**am0&%SI4T*ZjKZCiRHFCNB8FHQcp4p2@'lXTBqp*P@K#4fdAF298f2\n-1p-DYGrVK-$a(GkqLT`X(``I%pP5eG0&[EZpC@dG@IFFRLL!I%c'cA\"`6`S@Q&R\n&fL-d!23)E$@h5Bp,Q*ZrAaR)pNHTrMphd[\"mEh6QH&`JCcLHL\"%lTrlTiRjLh'V\nhX0(c4rA[M,p0&c,%AD9diEec1(r4C*!!DD'Il`Y,AGj[k!cAXrkNB'iBMp$$()#\n0qr3NImVRKk!,DL$\"#6aT4#)$B6\"kpTjdcpmE$mN'K$fIeh9QCE1FT2LNc!C6PbQ\nq[UrUX4IZNeBY9%4b#8m,E$&B-)%qKV1Q(I&#0FCE*h'Cp,1VG*U6D\"1S,*I*JCE\nT$DRkj5@QL$8M!8j4fVBM,I\"!Fb)2p,$bpf+H%FVcfk&'1biYh6#Fk(*GVYRGq6S\nmrRB,fCrKY)Slm4*m4r2Tahl,Yr5M)C!!-EkZ4N8)hIXPFqFm0RN@L96ME-fX%2N\nLDeR8UfLEC6bDb&2SfTX%hcaXEeHbpdYQQ&elQL@#r!%&i-BVQ$CqDT%a**NZZZ5\n@(93N3kC)Q@Ll\"$hJ[@M!UCPe,08VrKaa+5BKI`5,m&QFeFj98XZk,0CQAj(dEpM\nr4XKU5rF)cK4F&hRE3!32I9([B`r95XaKPDm(cN2pQ2jQPh'Pk'+5+C!!hLYJl)(\n+qpkJ+F@B(1Gl4AEdPZMS)T,Y,4S+i(eCAkFUHjr1LCCeFhBj!%acRF2-*[T%)!f\n63VU#%LbdXZPl#i2ZETR4BI&d0T-ph*El0*0[)X5-qqp'Cr6P\"S4mLrehTZV1S4Y\ne&D6Bh@J(bh,N8G*([TVf0#h1*`AjUbTrM6c&,kir4b4iaUP2X('!c9q1!A+U!k-\n'21H$@bCMP%[`ZA@ZSF'UL'V[lCNVhRdVY((X`3-%lDeqpU+r5'%Yeip4rR'-%4[\nQ!aYMh63q&RHTj-KXdPiBSi*VVBdEASc\"09!JJEM0XP)S$6kP\"KdBNMq'J4eMM2@\n`0jd[IM`1)I[Gp5,DY*hl&6$5X,(jqKeI9Ldl3*l+[aCqLCR6dRaR`FDG666[BZB\nI22p&-I(FFA@`afG$Ne*bqkfeUZSSc6-I!X8(-f!F9&pbic1GA(fe-T5XkYP6ATA\nG!c0H+Jr@l5pp-c$!-AaR,BqHPCkU',&q@#9a$l8h`&*2[,rUH**QHPdB\"*a1`j4\nK@@Y*fJqBG+IbFN5jHV[Qp)TKX99qrb+cXPb0HRQ[4J2#b4$K(&Zd61-0bcbIp$-\n8\"\"GAQH`C$AS&FJV23KiC6BDQ1ZP$2!52\"T@*k$8IPIp9L&M3Xm5fM$X&0el$j@*\nHpNjiU0JD*DN!k2VXZ+RQJ1A\"I0H@5DErAmVLLkMlS520+Y'$a!Ui0,-`(52U8IZ\n+J*Mq6%AXBRGM-aE#NSef+3I!dZ\"USG3FVq+Lm$VaNT2bUkXEq`cINhH-jS\"$*EV\nUiCRZFcS*N3i0LYpB1%#%$5FkcIdT1p*KmT1$cKcdjKHLYQVA5A9')kVfCUN5p+c\nZLcC1dc*Q&C*+iSXTN5)I0S`,aA5c)bmAlXC$U\"*T\"ENErIX0ZhL*k2iP'UT5Tj!\n!,LbEDqFJdk'pa(F%\"TKZ8S#!8ZA-kNSiHKk0SC(kqqDplqLce%(i1'MERlFI\"Ec\nF&+8*5\"\"DjEECYKl(*,*1(P8cTqImH@MNC6G2r`\"I0rbV2rGQPP@cI%f(MAVmRHN\nqcmb')`16XN8NK2\"XYYrA-k66rd'\"k[clS+3ZA1,d,VK(MKrYApH[mRSl5X@SPT*\n\"qee'k(NB+\"I12(C#H8pQSNI3[S!b5\"SPLfVU[![Td)DUfe8dESFMe`6k!RSU(il\n#')P[*9(ckd4#q&rCUM#Vd,TTZ2VGMJfAK4h&p%d*1S)$KI129lD66MA5Y#1ljVC\n6P85&[(Q-EfPVqi@3!&,RLI$!(+aU'[[KRm2HdX!@#9L`1SX(,KAVr+(!c9jS-VU\nP%FT,)Q8iPf(54PK)DeTY6VFSK-hbK,!lR%SlklqG@TqK'jJlm`jU+(TQ#jJmilT\n9XF*D,096(R2ATVQYSETHpi)UZ%+%Gc,RC40kl[#UAJ(5VG\"p6iY\"13[qrXSqb!*\neDhqP)k&\"$!1,+B5hh'+,D4LG)%9466HUY$*X`IBIhq,ANJIE-&AerPZNUGTi8B1\ni9GU4Gqb,*L6a0[4lT*FCFSh(lF)C'@-mSJ4l(pT*89db5!Ur6m(K-9UUJAPFUm4\n*8&0q`lKaC'BQr'r8$)&ibHA$V8+,6TT%UiaC!(a+%%I&9,[r+Mhc,JQL0iUFBPN\nkE&MG`$MGI2Ii\"E`f&#PcQUklJDM!!FbI(-dMX!Gf5#jTdPJjNpG)3YaU@N,d13c\nR0\"RDFcF(N!#[h3eebU((b*SBYAkqAccYBKiZK\"+d\"V81VESpND%c(!j(K6N'm*4\nBBr%a'fB33F!Y)Ll3IeK2G\"p!VpGLp5\"#1fLq@j3SlQ[6pFFAPED0#%ZaaXRE[iU\nk,Z3Y8E%QjqZ+`)LGm)V2VK'%j\")EYk6'V-fBh0hS-Tm!1@54Zj`G1Q%8Y4+j@CD\npb,i`Ree[@L0(la04'0(RG+QVCD$+peN\"i4E105ZLmIi9)#\"NHb2,H!i9,SdHK16\nRhiacT4KiX#faSfHSB%d(UP%!Y3q3!)fj1ckh-2hZUBcarI3iY+fC&AAh@rL'MfF\nIE3hQ`mGH$,M2qV$Y0h-lq,+h@%Dp84mmfaXMHFIVUXLZ&HQTljh!JR!a$(DUiUA\nC!HRZreC`,F)drBP+Z+mYZ(#2)c)AV&rS69KPGm-mBMRm60YZ%D2IGf'lrZBDN[T\n1lDT2j'`eC(iEh\"Mk',5X,NPM3PF3C0R5[Rdi*dN@5MVEKPR\"8N%@JXrbf!BGq#S\n\"kXKY8HG$`RhZ+9NmbTUih33HkGdk-340)NfNTjI&mr+ApK@NDN6i1KQ9p@m4!2B\nDA@`P@Tbf@61ZTUCDBTjT*%RErediJ64')CJRJ+3Se(E3qDX#HX'42Y#hi\"*D@lM\nH0qk09-G5S6`@K6PL%33J'j+KH#l3%48lJiT-fGeQ#`C@@NTFlE)G(VjLQ0hli6M\n61*`hrC*c-Z$BrIFb%$GRRZ6HP--8EkI!iC3H82)LHFN+FF9RB6a'JmIC(`+AV*3\nb(RUlLCk)9bLRjeDj+-820)X8pS-8FiXBaQT'NmE9@fp[MLKDHiZldi`d8!-IDpA\n9b#!KJ+DhB#c%6Z%N,F\"R3fA8FQ'q*5fiZi%2KRp5YlDTr`X@)`V1jB14!6,!!)X\nm+2dIedFj`JTV@+9``qJBq+ZBUeHpU2+UcGYL!FhNG45l#V6Ha2B0m6EGe\"'e-dH\nFbZBl,eJMjGrQ)HbJZ+jT1)EVFXN8[*ljZFk#9$\"k!+BIdMS&Q+Er#jiD8bh*eQ8\n(dPqBb%90cQBcIac60R43rQA)Q)BG\"LXK5-G-r`GBiVH8qHGAd`pf)D-)6LQ3!%a\n[JD\"CERre'PIe6XL4k4r[GNY4-#KTL%ZpdCQVCaNTK+pfUm#c%llL[0YJ%UrX4FR\nNfkSlS+bQYJ%ikSSAlR2beMYJ[1\"VTZMPram4N!#3!+kE1`-S6FPG95DrA*-aU@A\nl3`'UT\"0Um5AcI\"p5,lPeS`V&pFGc!LP1%FbCk$F&&lPi-BbMhirCGp3Ci6H\"`'j\n9QVkCjZM$Dd4'J[ej`Kcj*9$`95aDSBNLIII\"89IXI3DREZ9kYcZI#TTIr)DT4T!\n!R\"d8CQ%4K65Qp90I#PTZHU(*i)I+P0T[Are9efhldEK#[[R,pHHj1bY0cNE(+G(\nQAVbqm)'p(#M[Hi-heNmNI&ic6Vh`BUpm5kE6e\"qKUDLhDI&mk(ekm0lJ9hB'#0@\nIjRcr*\"\"5lBR8N!$,0`95dZ@,V!TPlF!!`jK#qTU!M4K$iAhk8l@riM--Hk`XHRd\nFl+efpReU9NP'd*!!VebH#K,TSq'AKG8h8p(b04IkHr%\"1E$pT4'papSr%MLjq*N\n2fT[6M4L*#lP[(PA#pqGF\"@@hiiGZ!!BF[Kkq(ViFMUU8h89Jaa%+\"U%FD$C6VCU\nid5eDlFec[p&19VPp3$!Y#$Zc,VEE3(q*#6ir2[1m*94`QHH$ep5kV\"6*#G3!h9i\na3&k9k1V[&$HpG%Ji'EF[S6\"9md[9D8ENj#jQkV'NT41QA)Q)$GZ4k9fc!81C2#G\nb*0E`8Ar#+[NeRmb9%GX6cZ(IpQHCVU5BbN-V6F1E'LiTh[Q-GfYfUlEk6TPT3U0\n*10B42L4HZ#MFcc'(kTr!9,5X&'5+PNpII[h01%k#`$M)T0GN-&5`Ir0Yj[k#\"9T\nEXKkaaZ[Sre4p[G#PAja6&L$+NYGP\"X6,Xd8G#5VZhQ*3BX0ql2laY2b3!,TEK6M\nTYq[@TKV0f6@C5I)YX*NASaq*D!*@M9ICNH4I[B1JH0KSrc$jAHrN0qm[9[S+Z8K\neT1@N2be$QV,BK,aL@068F9FYrb129JK2GLbrUR5*BQNJ#E8m8!1[3d\"aidq[&hp\n66,+8R*GjVTX)Gd19fLf#&jf5ff3TI+3hQXmG4SkNb'j03BT1e`E0\"kG%qZE%UZq\nU9$fe8#Rj+j8VNSPjVPMmE'61R-YRpj!!5RVq9k&S)Hb`'aI8EmqNclDi%)kJYj8\ndTT9MRpN1AjhY*-%,2E0eARS-lDqKI%IC5Kj4Q0UjNd3bThfU4,DdY)hFAqdH6#m\n-*qF-3i(S2KTmE'`\"RUadX,20aYK5[E$0&b#\"3Q-$@,B9P5)2hf$FQr@F-Yrf9qc\npeR!BNJ&N02-d3&(UcXLRrK[&Q6$I[pl0E!qSBK',V-JHYV3Z%T[VNL634Y)db24\npCZcK\"G*h2Al4GbYLdi*Kd)P,aJ4r@6GRq-0a#iYCDLT#UcbSlR#\"M8h3T-'k&D#\nLQ(5`V!C&`98Q8fc4cHK%j$4NLPRLJa)#Z+,p003hU&qF65MQU)K*0jPmlq3eS&)\nhR0STq[Sl,[-R)0c'eDaI1GlU(rIj@3eQi,\"S)GG[VC!!H#!$qTd0RHYLRBdfpaJ\nikYHi,H9AVXjb(Y,C#1fS5-82R4T4H+jllPfI1&5\"EbhIiTrJfI2Af$i$NQr4U1,\n!U#Uqra%8'\"T-4BcXTI\"G4m8YJZfNVV,!!e6ihlkTCGX\"HhX+AI$EJeTGif*-U`X\nd@j%ESXG+dD[FG0N(Dr6Y+4cKQpm23d(A\"Ue@ke'&q-C%&AIU4UrpIM5,B9$KEi@\n,$q[0JE',&GFC4Zj8+UGhRY,-pHXU`*2@Q9HpS22,IT!!(M!M)B%C$$DMrL8[[45\nP'$2-`JL,)pCe59crC[0acI&2rbeKU[m3b9cY2f-jr`mk)eFQblGc#9JHIi6k+L[\n(RU+#FJJX![d!8MERdH'-,()apP&i*aYfL%rRSS\"C-2m(V(GZhdq-Ykeq3f(YpJD\nY*Yc[)14b@mc[NHC!4%'1Jbl)$r9X-eE2-lqk+*3-r@!VZcJN-aZNpr)3Gr)Q&Aj\nG`TQ5fM%I3\"`5@\"&Dbi(PZJ-AUKKeN!#$(2IMJ4R4M#a`R@!`LiI)QAi4Fbl3FY8\nH#CA$F*Q%'QQB86#93jU6Jd93diDDZl(+R(8G-bca*A!#bU4D*ZPQq+S`DL-e[m+\n[26+CIcdN-,a&a9M$U!1*ac!QQFJ[19M9G+`Mk$aENH%&'l[dSH#B\"\"c625$)G#1\n`XcpNXI))[4(LH``\"JJU6e(YYk\"4CaHJ&%@*K0d$YlPcdR'Gj8M#USBSNK2990@C\nC@0TU1388ePDM0EKmMKqA!fL2)daESYVU[c2*UUbCD\"3V#q8iq*I\"kTiZbfCAMpk\nac06-G9(j`hXN8-CF**9P%H9%VlEh,4JQQI-2`#kL+QdIZPB!m4q`ZK+,b)X$-1J\nLEG%lI-+UITk4d@H#)XU*bJQTX,HdrF$0VGTBf@d$63[F8fCTfkqRiJMp5)iY%JT\ne%VKjZ*cNSV&D'NjIkr,S2V+,KP*+p)(jL6NNRJR-UViX#j&9H%Uj3D-,j%Y[QrX\nZXYb-[S\"lrY&*EJ,q1kH`ZrM!I$)L+E[NhKSU$kdjL05Y2VrXpqc@qN,C-,e)lH-\nKIhaEPTkZC[Zh$FGca#K2TJimKpK&rC@YlmPHD0&aT[PmD5ljdZT\"lLmX&MC1\"+A\nA)TFcNSP0jr12Y8$h0rCSG,\")bY)FZQ,NrH&UMCej+!!F5iJL,cS,kX[56,rCS$[\n%6l&&ll8r'cV-a#j-BHXjAA%)e&HpifQH8N(dA6qE40bAHE*Vrf*dc($-+-4AU0[\nT8qZ[p@bbV-\"qei(3dAB,J4*f[R+4iBSfK,6%'mQ2h'4hV8&EcKTrQq#RKY'6,PP\nL#f5,G!b(G'9%#L,hPE@5BIRfND2aS(RQSS4l5K$PIje5U8ddQ5Faie,iQ8J$[!h\nr!h\"Qe+!(R(6L)c#m5A0qpA&XEQh,Pri`UB(IM2I0TPc8BkRVBcXS*3GDN!$NVLb\n5*r*HjC[CNf-a&#F'Ym[I(!eNMSeF(RkTr)Mb*j!!*rS-eh1618Cjqa@TKJcA09V\niM)+Ji4-QVp#qX2N+A5Cq3HB`CTc0bUi(+SFRLAE$`jTUf(HK)Fd'jSK`C%1FHhp\n*pCBj!cfej%)cJTQHedXhUa3C%rF#NBGI+k$d0Fm@ZJCAVNh41!$ep!98Ld&HG[H\n\"@h'--0@G0,2+be,CIaYrX)FGLdXbDI08L+-b#EQNJ&,8@HPc#!@3!,0E4ieFj0L\nE#LM*CD6#M)`1E`Ufh[+LZ60f'\"E1Edacp+q!Ji-[@@NS%)3EF1)p#aPl%1,4m8*\nq(X,'k,RG*4*#@Lq[[iX@pUmB!cLSC#4NA#m-48&k2'McZ8Q+DP#K#Y$-8+,B60d\nar&#`(VlKNEqVLJ'iI(hFCMV8&M$V,kB'J\"![3a([-*aDQCRCdj*@pCN`hp3Xi5*\nPcI*BhTJe#jrbDEJ40KPSd6NcR3R9\"#Zcq#`dGjm84i9Pj-J9dU&5$Ufh9'#T)&Y\nfF$@F!1E0jFlSVAe\"-,`('%$HmjM2N!!KI*!!3TQ[(mKFXkrEG-,qi6E#0Grmkkd\n8322aShMUmb0,+#6KDc55AQJaNrU!,YS!['e3KU&BZKMHUAK9@$l2b382SB)46eP\n!hpSPITrV1X5H5rcPVbE1Dera6+qj0NCNS5VP%9Cf9A8XiRMc5)V5dFANmY4Th,K\nRSRQ+pBd\"J\"KM)0ZFI9`,BhY+5hqH8hZAIr05Ip'UPZI(eA$+EEeV[-IDpYc,h0\"\nKHEmb64QT8iUJDE[\"$b\"ZTND[2LR&A`-!R%(DD54+NFdN3ri*`,X1p2UJeR!mF,a\nN-9@K#(jjkIpf0&cA#0qra$\"qfQ%XBYUZ5bK48T[&A!LX!J#XIp\"f`9U!'j-,PkE\nRfcEj08H@p4S5fEI5GQ&GL`-lJN0C,l(r%DM9lD0N-dbmf!!jiFEF5*3#jJ&!8,T\nHCK!92M18a%a\"rbPf3DRh9-E)N!\"Jjr\"lX&!ll6kmpF&h4VGEh5Jr8-&GB+`F'[h\nVeCj&'\"*\"(R82b'4klZBEC5\"RmfZTL%ZDl#Zaf-dfT[\",G05ciTA[2,i,i91YE(F\n3G0549GeRCh[K4X1&H3PkF,rr-L!!4LSBpm)3DjBMH!TmD-hKMKLZ@0qfeD2J@+#\n+`5MCUI'miZK,N!#biX8d(GJJERF4C65iP@f([LMLi12L'P(iSYEM-CM!0(KdI!N\nPp!GA`1I-d94@(d)#p-cQS,`MMFllllDPa!N(c@B3JKbX3U[#42,aEL@q5-S[\"Zi\nKGZpRaFe!SX'h6FTqSE9,ZI-RSfBk$iU9`%!@pb+XY!Y[2I-3+%\"Z\"6q%KkHrm[L\n0G@Zb5l1k)Z'GY(N$dJ@(X%ZJaMpM1&emlrhhNU91f+G4'aVBJ)5#0X#,EV@KcV,\n\"&EBT9c-!2C)rYMf*LB52&Q+*m(3EK8$K0*TQ5D#Ma1ad)S)FHdb*LXhRZq`G`e#\nN9e+06Phl*r)LbKT6pRePd0%rFZFrk%TelA-KULACpMB#iGZ-D'`D4b*-Ta-,9jp\n+-Q`$1*UCB06ca\"Tcr,$8Pf,b(a*DPf4&Jq@UIlMpq)4`Zfm*SUaR1)QAprhF&,D\njXeYMUNRB2,U\"iS@9$LCUZ51YZZ#abNDRm&8f,BX'%B(8R-S+CRJGKX&B4mRAj*F\nSk0k#33bMBbZN!I)6&6K\"m%6jm$5US\"TNbA5`&`d58@C1GD%`$Ap+\"NeRS0pSaca\nB6-im\"Y38lEDH,5lTii4`F`\"B3Q&EkABM+dE,Z$$cLPaQ35Ef1DUc80'i1,5M$3p\nUP-2%0'*d5!b*4J'e@PiC5+,S)5+,%0SeK8fP(3m%'D&0U01EV3d`QIP$LB!TS9F\n5llCRVN!eHH'S[IM42cqVrPR5(3TT8lDX65@+EqV2JSR`3,fBf!16L,(i0)jbmYQ\niJ%1d[r(TjHVKmZlc6C+E*B`GcbPaQ(UI[Z)'hCU,q*+mcG(Q0@RejH@0ffECLV)\n#$h6J6-d%*G)'G0cdS8JUZC98jd6-*j-2@G'dEV,220TqfcHA*IQ\"V6Def3EqH*X\nX*j2fj*K1aT!!YJiL3P3$JPh`Bkke4l\"f0\"XJS+k#JEK#kYP3ZjXYX1j)eDfk5#P\n!0H*NR,YRZBFpG6A8q)p@r(Y3E$HX+bk+\"Cj!D8[hBYAlITPT%1cd0iClJR+M'(P\nBMC3GVp\"2PIRhkBZ6U,@b&VMhYY*3kTeH(VqqD1KK4T,Ga)V2RZjeQjEkNAVDakV\nL%'fFQS#Jddlk%[BhR8)@LpIJ0,QSm5jpI!!fiRDS5f6[[#&hNCVaTPc'F$&UB+K\n`I`!i2\"2T!X6MCB,m9NQQYh)q$aEi#U1e-\"-a\"*e18q1*)lB6EVp2ii+A3a`L,ra\nRTq6GYXiN+-PbRZpiUQR,Dh[ER0%AFJXS6&aYTR!bHAUUr`e-Qa)*d1X5KeH$biL\nb!1KURIkI'k0Z5ZJ'b(Ahj0FqASHHa[Q06qRT[BI*Ri#-TjTpQYrlSHA10Ap+YjL\n98-E2-(C\"8,@LG8r`$I642$Xm8YNaP8j*lKPL#YQ9GN`QX*d1e'D@4%$+JePF\"I#\n1C+&mE0j#KFhX-[aG6H+H\"$#2k6*'HLC$1`dA$Ti8mVKT['4!6d)IZJ\"Cf[He'Q[\nr#@-[SZPl'ihjQMN3bD)jbZjdlpMlMXrr!mf0V5Mq6CiX'B9'Q$iI9\"6')93rIKB\nCL$R@)@q9KF\"N1rl4r!QNpT,JA8f@R0Y$-1EeEZ3CM43*6Jb1TNlfea3XM6d-Eq2\n-@ql(''A(A+aMSQ&IfdNIF95U20\"PKIPH3SZ\"N!\"#aacN!'+2KBG6ZlLNc-H'-#I\nMK$aeUi$Y\"+f\"@4&kdjI42,P%%j!!SkVqQT5!h[X,-VE$*#IU$IK[@aMFj3dY&Bq\nFQ&p`hFm,$N#fS6+*l8qXP88Bi-pJS4LCcR(+dZ%,GQEh4q0r6,UrlpDF1Y'DS`Y\ndMGVPE1RDL,XD``S-8pc$jC(,!,59!,!+CAbqkPYSY@1bhmDUPS!UZSXHGAXYU*d\n(Vam'&9VMEB+XI3,3c$AXQ9TNL)6'e&VlCMY`(aGR#\"4p6XCK(Br03&rQPMMTRA5\nSKdd1T1)aB!4baAbX8Qe[V[B+%\"EYZHH'mPS+QbD\"IQCR4+4fJ4pq*24F!iX+a%P\nVi9p&6I#k#-C!h$J(RM#(R4T+6CXB8eK$*-9qEpm'El8EB%ii1S%rN3a&XhXCF(\"\nJP`,A[pIL\"hea--lS8l0VG@V'@LX96@GG2(cYYPX4&CFNQ'++`Q@Rq`G!B1VkZTL\n22-[+4p%AKm\"`E)0cUi$8D5$UFK59X03SpHi5bjDp#3jU2JR+h$iqPL,pNrNZafj\nk(mUU`0Gd'qqqKCb6@$,Ykq&Ddjc!lRaUkjecZc0GFKTU[q'@-K%H#KG5E9K4,CP\nL#FS)4%0bT$Z2jRfI0Y-rbl#[0S%+YF%ACJXYEl[5i*%KHmG*%I@Adfr&N!!R)e%\nc,&2Te%IA@4',aBH(QZ@6&AcThG66bpYG2jeLMEbc2N%M\"aA!hrS!!B,AYbFAca)\niYrLC$aIFra%\"H9T3dRk8QmiS%j93q\"YKC**hmkY\"@d!jEN)G5K'9(BkP#4N29+X\nE8dZrA)YPI96KS&&YdZ3YpM,PfQm0LNR0(ErrIRMDqpS!!!'!cUDmL,Z9p3\"5`Jq\ne[12)4F@)[4rr3HfKBRaZHB&ElXH2N`fdE%MGF+,XP$QSl([+*eY5##\"8\"dU(aQ\"\ndE0EPL3&[2HGK!T*F\"jN#4Ur4'e@aK2[2'3dHffbebR`FLYf`#UMS64%H@#dYRf1\n&I,U-B!JUa)ZC02aa1EI9)I5f1[9X+f)!VTm'6KNlm&-!I-p!Rdm-\"&C#q*(rE`r\ncH\"S93r#1lr9AQjB0G%e6@lf,L-pK('P)jYlSM*!!JS4P3,'5RQ$hDeY[NjUI&c,\n&)LMQ,VAk2$2EbXBI2b`\"-KZA)S(d8#(JpG#!a8C0'al$'GaLVA!$j'8ZfKqEIQJ\nBVS,U&jiCa5ckPialRGX5')kTKdB1'HdBSSaY1($$9raHFl245&j!RVCRlqhF5Fr\nk&2M@jbFlbfe!KqQGhrJ#BPF`&[pMGG-8`pEm%IG$`ESF#F39\"8(A8#eGKG@FKH!\npcf!j-*8c&86kIl\"&QF5NRLVCi%ke1$rIQcEYZe(9DHITPr\"LG6$h+S'8JfY6'@F\n3U@FTCSRKAS,EQirG*)'XP#16ND2Zi$ZL&M+AFZ'PpB$2MM&0`Cr!4XE+PAQm8#p\nKAiESc8-ZP0c,`k[VeH[C$4(Ib$lE@U!1FNBh5QjdZNb%8JBfV[5e)aF2-b[$A-6\n&hp6k4!aNPbh\"R'rf,Cr1Ir@YAVUfadcHPM[J\"9m3HhJTcF\"PL!YJ!(TNd%bk3(6\ne9'Uk8%PHiijFqQK%m6YEj(VP9TKBJPp0FSa-`cp``i#5ipP(\"CXeZUbU@5JV\")+\n55E'pDc[heZ(2d'ECP\"@IpbGRYZ*8c#Y\"84CJFhc[er#YPK)@cFNDPN`!AI6%ED+\nHC1QDGfh!bX'mS%&(%l2\"[F4d[d1J234J9S%A349%X*5`-)AL,#pqeqfe,C0iK+j\nBC8RN*!#r0jkHhckD#!mYQKlAaVeqS-%V!I\"`MXi%BGb-e,M,&*C**rJ$TA$&d2m\n8%c&T)BVbh3%#lR1p+k2\"0'Vh5%VU%'ZlF@R,bd4'crC3X9KemQ3MH4#$N!\"%P-S\n-1+icMk$IceS6C4+LkU,UQ%N3!)qDB3SMiR[E@eVR(rpD@(a#2CAThh+ERq\"9'Yc\ndRc,[[p)2(M%\"jP$%I'$3l3,-Y!U@3rDd[kbl`b8TE#D@J9@5aAb0MIhL\"`4rThK\n)SN$L\"jmRkCe,@1QpS8e4`EV&&S%C)J'QRCPhM-%GQZLdSX-5%PB9C`GT1Jl+X+P\n9L5I02$!aVp3IB12c$Rqk8%CcT4bihZYh$[Yc%dK0q*lp@F*hkB%ia8m1m3dYfD0\nlJf\"NS93\"k#Y3G&26[&0k*N2L`l2#Q)JGG$CXBAh5$pKK+U`VQZ$DJi5[HjN,hZA\nfQmQApI4Vf646D6e5)1BRLY[M3S'ih\"FZ0`DP0YLYd*'\"iqf)fIcYj4(UB9MYR38\nIJhi(akJHT%'V,kS(faAGhXJ2iedl&!A9TI2!CF6,kZaNDNQpap@c,kND`IUfHM9\nlhYpK[AQrV`(K(KGR5'jiZ9X&)d#M`\"r0cMXbejId+)H!m*pHqXG9b2l'EPLP&D5\n2+$3LCbqZ8C-leFGU+0e$8!'AkDF*b2,MCM-$X'+c83I!ce55AbTVGC*X[\"q&00$\nBU)U,Tfl%i&&YMTM8Gm3f[AkKD`e9)6Y+K`\"'+-F(1S[$XQpp@Ril(Z$*943I!D$\nmD(+h5NNm%MIja8j%0Bq90%AH5k#9&amP!A&e-8diA+6q2DSp9jF#2#XKDL9r1$A\nTaPE,-rD6i[HbL@EXNEGDp%+LJXbl&k`HiFSR0H'(fNaQJ#L\"k5rT\")C5dehX3U,\np)Y`16#Fr-liPI14\")RMGK5PA([8-cCQXkJAqHaRZDd@JEp'3!2%d@%lrHS3PXhK\nd$NE1'CK5`E*0,@b`[M#)(VS\"M3cj%(%LrT!!)h83db84h0ER#*qSr#944beUIpj\nkMQbj!%Sj!50aK,b`f5`G85ldhaG2UB)H,D6ADb@jI4EdK46C@PApda*2%V`IQZ'\n5kbVjaqE9-Jc24VA(LGi`hr&NMH`-'fYH-D9\"3AT4T&53!'EPilrMNA5%pl@'fmd\nSRrf8biXm*@\"X$0#%5'\"09L`I23dqlf&Kh&rhSF3ZMS$Ah0TbTjmJc2#DQGB+HGm\nEA-F`,2VZJmC'c60h92FNl[H%P49h[)@pSIEGNM(Z+MfN6P%Z$FEG-5\"[kq+03J#\nkN[IRJ\"FL1Fh$K#)S'\"`1!JQUDa!XLXZEV`EUml#jqZ0q8Zh*!IiX$1U!VlAT%5B\nHa+!f%hYkcZ8#jSPrpEqV`MC8EA'@j*X`MDQ3!1,V2'aSP1!QR$3'1k6%'V2*(jL\ni!f-%PL[,#BbkcA`ZrcDq*8\"ZTV60MXbN439Qh-1NMEX-PQXr8[+&&Zjj0YI0@h3\nHP['[Q$rG@k92bE`!4Hip)%!IE+5p`Fm`@abrI9YG)Z,pHh+f0m%[)i#8Te,8)0F\n08D+V[AVT24eRG(fqI+0K88A'fZCA9kl(qhj8ULGSY,b-1fC+cQ)KMC4YX2J1U0U\nRN!\"GE20$+TLQ\"UAp5'T5hDA[Mr\"+bT5X&0UVLG36EAP-Sd(FFb[TD6mKkqRQk\"`\nl+Cp0DQ#H-TkTCMl!2F`(Adp%SUHIUH!8&HT\"`a-Fh9EG&LB9-JHZbPSqPqq[#(K\n)l!9!la``S3VTp)Q',D5(0R,jZ+II3Xe15Z\",i8l$b5C8Z0[@H`cR!ML3!$DZ'L6\n%H*J`FB#rbC0J`)5L8CTJ@8,Y'X3#2r'+DV,)9Da&ZEbp[K%iDJUGXK*4[M'V@8E\n!M8ShRc'0@2#U2#U2#UFmVTN+(AjYi)JThUMPm*%)+@HI,4),H&[8SkDDX96J&!`\n6\"GETR\"*i`%j4RQ(%9ajGZA4LJKQqq)'d4,E0me$b8GT,92h'!`k1FU(*CVdLpr%\n!'h[iakDCMaJ3p0-ai`)HQQBmB%26X5P`$'lZKi[LY+X5%k@rEpZ6EJKL'*c2Y85\nci2-QppQ5P9BKEBUekCfI!U$8FS$#RrIe%13UKij)'rFZ16\"Z4+QPES[p-!##B)A\njf4JfU*[F2Nd`3ljNED%R`l%'&4ji%LVFX6DdJJ8aKRh'l5U2*ilPYV!FS[@qcrF\nmlD9Z)NC6j)59ZF,N2Qhkj5VlQZQSP6XMZG\"8fPpJ&dHASCcC8rkAjD3V1eCJ2Jk\nD$p-pU3XI8)a)-M)fKLMBC5*MYjP$hcSRSd\"h3h10[SRkqkkhG#NcPM`*'V@bmRF\n6iHADV5HFlJ%i6IL0+Vd65rX63NS0dQD@BPL)bfHj)$3%PMa4FR-*@RmrRXNi+Z6\n5940I[FQ*CdPK&PYX@aJMiKli%UZUK1`[mG#C+i+ET`LjNFKDc6a@K*elKZbjN!\"\n12@Q9RAm-@,RRc[Hp@-pM#-cQLKjHX5ipLCdMJ0Fcdrm5\"$qNcdhTVVm+!#!f@(h\n0%GFeFH@-@0kj&ilk8(2KNPFILX!%*6kqGcN#Pef,@mVpR2'm4&d@2UY&SV9qG-9\n,U10AcPa&,1(aCUdL6RpI*&9fdPR,MVfJF4,ij+X%ZJ[%%,HS[SJf$DKpL5Khek$\n\"2qQ#CcLq**M&'$![Xh*pe%bE*3lj!Dj!Q8Q@LRrM,eT+c%kT#56i54(LLqba8XM\n`*cS3)[YZfLlMM`9M6L@UB0U9re0hNF%XL*Kq\"@CI0k))!$mK5R3`iGKcN[0)5b`\nlPYdQ)lSKf38-5rm4,cbf-233&D\"!3c+c,``\"K1LU)LRLZ-+h+5NI+Sl!k-f2'NP\n@R4!rU6rYLNHMb@Qj)\"(D$2X'0i8eQlkbm%lG[XHjD314EiRQ*pI'[`\"[`K2d+4[\n#$%c*D,kV@$h#@TS)[hX@RcY33&e83Y,i'h4I*UF,MFqHS(r94+UrRR&9qQiiQqT\nTJ)1(K-U&6KH(lc'YN!#m(!`PCFFCd4eMLFqXNYIHc5eF\"rlFa)I,F6PJ)ZCAB*i\n*53`Z4F,5lT,A*$pP(hjmam)1#X#U#jDV2mr!0Xl,8PFX\"j-(3D\"Zd#Dkj8TVkRb\nI'l$i$RBbAccK6Z$aG8\"kFC4jaJEkI!If@*)HH@(eM$P0f8'fEpj[cbEHh(TQ`,m\nBTTSP,he-#-KH&(H&Iha!Hcm,J'hf-TJc\"@jN94Kb9EFHeMVEr*`22%Q2q9XHBh\"\n!a4r9f0\"+-Y$A%&%(mVMjAY6#!MH%$r\"I0'5afaMdqHf%H@f@l`(X*IpZCXUEh2b\n[TVS(aq54RrcPj%3&,+Vm&l(#!cR1ik$$Vbq9ji2-19R\"a-%\"rc92F2XYD$,)kMq\n+9eDrN!!Hah5DLPS1'V(6SU%3P&M5`eM1ISr!lmM4-6D8'Q5%E#0l-)rTDBEH4f1\nV-$1-c\"RLB6@N&l+'*5j3)EjKUi10N!#GSjfAmA$c`ijHR!*X[Ibl#I\"1Xb2S`PJ\n0)hBmmX6!bpqr6j11ed8\"`\"V*%+FK8XMI68AGV#PlClbfJae59k-R)m9Pd4KjN!!\n'b8C!V&\"**KbCbl!5aITP&bG0iYhVi''03BR*H!T02hBc3RIKD%@UIY3FKbh+Rm!\nNeJV'fZjbiRS'jc'%A0CL+,)%pC!!+Y$LY`[imFJC,9r#&1HDHa5Z`U@j1dDlI`2\nC'6[6ADm\"RIaDhXCa!9aGHbCcKkimPe4FUJa,c1I$cm+1AQ-42HELNG+Q,V$6*G2\n55)5mQ-YDL1FLPpC\"ffJE8C`U5J6e$Y4Di!`QI$f&S!`GNi+HPiHp+4GPAe4,H&G\n)($ePU,8ImBAja5)0e81)LP+\"Gq,\"9H$Cl39QriE\"+LB\"P[#qQa4fTCbqH'pSX*!\n!1F!&cparT6d1+akd*UR(G$QLJQ`mI)hqfGAGd@%b`&BGbi5Yf)&AHSiaNCk!-+*\nJd)0[apYq9,dcd2)Z$+mkLD+e3[9NjE'PMDX%dm)`43F%m+\"XT9lcJ1[Pj\"b$0j[\nrFQk4eleK9hbNFlEC$h[\"R*k+$I@0[8)`#*Qkm1Cc!H9Qk\"3mf65,4b%P\"9GKiqS\nK,Rm0j*&3e6K(G@l2ClkJiVH95&)iKjjN9YX%MRf&X1Fd#mDD4G+#6JI3BBqT`3F\nM'CRi-ZNf1GpFJH1lUiKRXkXq@ZDLYiK5RHPU*%*HBRj)afp`*+d&p!I5$6#f(hX\nUjGlST6caJ,*,S'*fh*fDL8jb&F$#@9lbkNJQbM1$rY5-),'bL\"Z`MqZ1@bMTE4Q\nj@r!!r-VhkF(@cBI'bcRHATpiE*D#bXP+dXKCL6'KCBEf%cU\"C+TM2C'AP5lRN!\"\nahhl2Xqfaf*!!cVDe,)Yh#!9eCTd1#UKH#C!!rb9pPP!0N!!AN!$&#$)a\"cp$\"'+\n04(FThb`NB1b&LLU`Y&l%L0FlP$MaSRYhGI!Sq#kM4Kc&@f0pdPrAb$SAR5PC3NS\n8Z'd*e'kYj&JhMX$')\"I3-U&j8%58Al@F\"\"$82*56-)Rb`T-!ZHI1QHK0+U-iV+6\nbJYiR0beLXdQL@'CIf)\"TaVQ&RVl6K'SF1c@c+JhaLcmRI9$J'iRNRdUfdP2TE$Y\nXBMH)J41i8%F@P%3BqNYIjhNV908Ncdp200Y*[N`X*0+$raLrHYLDrRab'c0*Q`k\n-PqdTSeDBkH'M-$8+Q9Gb9@!'`1jN635QIH9fYDM9MYm&mSCIrhrcdQ$0E+kjYVh\nlA!Y8(i,-aA`M3-PGFM@S-qmlbZ6Q@a@5LJ50aSRr+)T(-451BLNFa&)jLDdeHMr\nrIq2cB$#3!*IrHQ0a\"r+2N!!XqIUjVkY`[fkCrYhBRcqQlp[6Aqh9l[Yk(llHUMI\nYhDrEY*r#kjp9F4mPLKm)R+2N#6jqV@rEZrpEShqhIMp[BEqhTc[Ue+llGr[iGIp\nrKd\"Afl2AffTIEA%I2DB2K%iVkJ@qV86IYhUrESjqhFhp[6lqhTQrEV4r`h'rKeM\nlpZj2lGGri@KIE9ep5f$iQ4&XIkTpH[hJKR(pIPM8AQNT3`LhdfA$I+4%d*l-`\"P\nGdPfkh&)`!\"c9`B$i)ULm%He0$e5lIcI[lDkIcV&'hPQI)(51NF9J@j!!6c\"fMF2\nT!PY)R5PfH[4Gp`Mpp1XVL2dQ&2M6DNaMG&q@)K*M\"6If,mc6&qk`UfGT3A%M+Tr\nlK\")a[VAeJ0-TPaEMY0542CmLQMAe9*qjaG`R3!)SP)me&jA'F[QAP1PS4#l+-0k\nBNM8PA,F,p*bl0c2SI`1b,$GQ-#ifeC%3*8LkU$B6MTaALbU%i(G`\"hF53epU`YI\n&AL!@ad*K-K#q5JDY@PBU)Zq!Q*6N#*R(IQ%P(TCZ#$l6@%AZY23I+Dp[bVmA,9`\nXZDGU4mh685Ghi61CcK)X,c`3RFGakh81)b2AJDQX)$)%89Ul305YqeRL#!9Y(8#\nXdZLX\"T!!PdLb'fFK[P6YIISibD-)dqC4Ni&JFS`TiGjrp)G&`ei+IFiHFmMNY4V\nMVTqVDREJ9J461QMQ,(83d5-JfrQ*EKS'q%a6-k'!elC*,''PRq)#[kbGQGUd1U3\nCcIp1UCZXKGY64m-T8)`LPhX[m@X5ZJ,1kF6(EA6P@I[Elh0e3K)LPE&9dPM,0[8\nXVCh)X!'F9J%e1&[%a%5FNJm+e9H1G\"\"2@GXKSqa(6j-2Q5ll3X!5!mddF(ff1bC\nC!f`N8P41[+eA@&l`X&cRJ6d2m@Y,8YFmai!!$#3M%q0QQbU[QfGQ%f(q[G6h!%X\nUk+#\"(UqqZa3#m#E##l+Tad6T&QGXM,-0H9qIJXh8plQFN!$Rhc1k(JA`SJFYHdG\nb'9!je1&+9$)MjA$X+pIh@GP+HAqDJ-ZU4KFdZa*cj33c8UC8MYqRac+\"IaIr6b9\nDl#ERVe'i1S6UQ*8b(DMc+jSGjLZk-Qem+pY`,+JdIp4b)L49@[iSHQ4-C+[k!0d\njPSVA5VF$J1J1Mre%[*E3J)8P@YmQ0VAJT$H*8LdMkZZ5TJL$QA'b)8Hk`GJZ5Aq\n4Yrj(0N9J+SJT2[F5$Sr4mR+2S8P)ZhV#&C8MQpC6f\"484UFahd5K0ZRZd)kafM`\nL`HTU81e6FI%YR5FXY6dfrbT\"8[EDl!k*d'Y4HXjRRif9,*+lD5l1KCI!b9rMd`l\nPQ'*pMc[DVQm*d#*124a$-+VUdmdFm&A-(-Mej\"-$8H$%-#9)p0)mJfDQGFb&I3D\na%'2RaIQjcIUa()NBr25#Z*,C&,!pUB)1(hpHJR\"A,l8BSQF4%m&,Nqi#2F63VQ$\nBerda3#B3@a8DX'63GAMmHf$SE@iibIGL$93S96++jeC1M,jCq6kK9k@Q%kSkXFf\n*d,jTL%\"rT$0fKXe[iC@'AC'9*'biXIALhR8f1a3R'K!$)ami-8!6T&CMMdE$pa)\nB%,pT0j'a1c2F(i43NarTC&i1@G)QX(26K,N0aHRrB$D[,3H9PB%D*r-b!+LllRV\n-VQ@8qNGNU!$hYE0M4N!C*Lb5aK48a6riL1cqDQZX\"rT!+bTmZlmhFZ6,b)SY)m4\n$T-h9E%k,F(R)\"5Y+,XeD'Dp4pKFAD9*mBEr-e9)1KhR2k!mkUQB(Vr5-[FB#UF4\nqPANFm8S#)[lUf&pZ'4*F$KR'FJTHXQCmT0T,dXeFD*DX%@rHM,,Z(hi,Kpq#iII\nJZ(hi,LaIVHXPDB#UH!M(Aer+([T9RjBE@LXKh1Cqm9X`HYFH2NpEGI0mipQG2*+\nYdX`f@VV`lh-3f#&pAR,`'iR-SVAd&LfjfKKhH$LGUM3jM*SE\"THi,!Jf!`phMSV\n`b&Z(e2G1SBSE2A9kHp-l3ISRUd4aLLcTGd-mMNDA56qc4Z4DdYA[[V$&b+fmR-*\n)%\"T%hrYSHeh,YaTp44QN14NVb$CHMSmDpRd11NLrjb9)@5U[%TGC2R5(*!M6V'2\nkA#E&c9bDp6a+pJA[XdU(X'm9Q!@dMcK5CdZ,BUklTGqkMp1SkeAIU%l5`3d)8@R\nZcAF$bUdPIqKpj$1G4,MaiRVa6UYdBNXcF3eUH&,$L4,3m@[HVSZ%jV#9GAjRDje\n58,\"9Xb&\"8X9SdQdTN6*YG!fYG&#('k(qCS*XRhS6SA!G5bIXS-bIXk0F[+IF9)q\nIa$pF[BQ1ViDEml9FbVarieeQ&)A@El9KF5Xrl6QYm,)SPmrUeYU'XQ'rFLRN$@\"\nNMNU%9l21qcAGd0,I@rFYGmaQ`fT)5'\"F,*HG'URT6[mp1-'Y849H'Yk`SLBdN!$\n&(k#d8RZl*PGPfjK$\"DBJ`QYINKqEheJ5a4pq!l9%p%ZkXpXL5@KKiYfcQ(P1TH!\naKdCT(92f`)jmRKVa'rEd3-FqQHh6Re@dArIY,hUUp*Tl4h2r+ddA-Fik#\"TbRlh\nTUHh`Bk`eKYUP[Z4iK41Y%f`ipb6YXG2BEX,@mjU[J62FQ3[[AeTdJ\"hfDfEZ6#q\n0c'Z@PLBE)lCjb(a0TT4V@VY%dae#SN,L4i1bQF1E,fCZTRXC`58L0GY@&U`6#P#\n9*m'l9S4m3dX00Ba@ZC4f-R996)J3*`0'rI0ThhhC*q-Y)IDULFSZ$)@IYND[01N\nK9UjBd6FM0m+TLlF2DXc,H%HlqaG1)NpLa`'GV@M8F1mRqe2d+,Vc5mp[DBjp)`)\nLp9\"#!l*P1PZicc$2DrG8k#25LcZSr`\"qpMAd'!XaZ,@jU0fHH#'[UPkB5i-TE40\nr,KhNf3B'P$!h$4%FN!$[3JTb-AATF`mJCf&'NmRGEIJCjRELZQAMP(@Zji0Q(Vr\n3eb24QQFcCr)-Q29+GZmkK983RFe3&dFE[$5J5q88-fF0QM9di4,G&e!bU3IYMr5\nA'Zm+-2ci&XhlmJQieX3f\"cX4fTR4\"%GBDIC&8+'C(MCc@J%6'+NfjV(e\"l*Eh2%\n\"'HbHT3l&Dj6+fcfBqLS$XZI)D-`*@fBr`pGcM(8`D\"6M%LDI3V3P(Jr5d\")6PMD\nN6RQ(!mUq2ANTdrp08q$dpr49&[la%RLe[6(`8VepXLPM$r@V*DBBL`qa8hZZdX9\n2pYkN,'hMPppE0UU3!*S)cUU#RqckrGJ8+aH$a8!dpK5H0JbR8V9F83ZVB+VTcV[\n##RUq2Z!dY*NmjIPh0S1$c4QTE8XbQ@epFjIQrCS*K3%aiLLc+BfpQjF6`)BQ\"0A\nS4KHK5LiBr1'Q*4reJdN'Y@LiDG#4B*,cCDHI8E1Mpk4KVK#Rh@+!MV3[ARe`(#+\n&3h(\"*pS$SF3+hArJpAJ[fL'@j,b0b@1ZUr9Q4GZHQprXl!c6Ej!!Ck)2E,XAKY8\nD+iIAe8h!Rf[ZU3kRVaY\"+fEP\"@#HkIAPKXfZ%HFI%'!J@'N%p'LaHp[PZ5e)(C4\nY0*UAl24pHYlQL6&190'6d$L+M!YJPBIJI4`dleDRNFVCKkQU[b[4bkR-!Y-ShZ!\n%FZTcEfl9FTc%2\"LJCIpXlf#hAPN&l'j2PbMT5lAF!kcX#d*-C-+&HkFfQZl1)@N\npID(CC9i2A!'%UmM+)H5&-1'r5T*MFl2f#+&IfS3c@TU,TJ+JF9rGL$ei5AAI02(\n8F+jS\"6l3kZ1f*+5Fh(VE&P9Pifa(4l`Ce`J11C(bbLNe\",Tc,p`rIT!!,4XRBqa\n3@)9Y(@Y14%i[0h\"#4Vf)a1GfVk&%c$EBJeXQXpp\"eJ3,M3e)+AA6$IEJ2EZIhk2\nqI(J3\"qJ[8%@9#5a$`-XU%a*elrUmBr2*I9U1BFkLEU0qL39[LP6*939MYl'ZCcd\nL)rD&4BkAE(6KD\"*Z0rbLE3JG++k#6d(eHfH9qM(Zk*!!\"R[\"YlZ&SL9$$B$GP9F\ndBSfEEKmH`ZiKNPFQ69e((DX0*'&DaQE8&-($c!+$ahU!hL%f(T9T\"m-D2r9)'!$\ndj!,cmfTc&q5\"#&Skmp)N3AQ$X$E8j55eJ2[GjR-PFIKU+cKH!b@42piYd2m%1VF\nDh,15,IT5bD3$J\"@\"6N2kq*LREQIDCMm%Ccll-)EJZA5#i24cMTA*F1(&[XQ6bce\n-(B*e1pT2pSk6BP,'JjD*(3FXEMa!B388@iiRi(M@6d9*!JYE0+UXpGNh$qRVH3h\n%HRVH3h%HRVH3!0L,r24ZX)q)1dZ$AU+IakF$A2E%!((i@fhCbq6BLBk@H%KlpfB\n-N!#BY0&6D\"k\"efqB&qD+`Qa*-4H$Y+H6YZMjN3qDlK@1VR0Vp$chl+-#R+XI0E,\nEMh+$8j&lF)i2\"\",(T-NIf)hEb[1H9d%XZNK,)&a0J9`Jd6\"lIJ3K\"\"UrTVl5IZY\nA0[F\"r3GSbHfHJH'kb4f(HKZkma(Pf0[D24%ZIHp*Q!5YSi`Fm2iJQ8M2dXj-V'c\nVf&V%6X,%ppmVSa1SL%a58('9RpP'NANa8[DQjqCrL8aVFPX85Em3%#VZMa9S')'\nNq`hUX4RM!MGiI*LNBAC+M%\"P4S!p2TdH`5JjXiV3@E@@pUSdSV[&5k3EhTpbh,`\nk`j!!4EHC923\"c$VbEMA28hHCBJL-Hc2GK,db6D#*p$X'9%#'81Ai)c+Jj,#cKIH\n`T116hQ+&&+VZq'6ihXb%K$r3Y,XT&m\"kq%P3CdAPDhD&i0MUX+3#4pKHdPX4!PH\nqhEA*bB)C!6Neb@M4V-P[85hhKY0L\"!KR62\"20'UQHHbAhQ((j30P1C2PCqP(r)Y\n!%kka)9H'mqhS$R6aKjSVa,'+rQlQm+48f%e6L0M%#YLr'bB3&J6*''BTl4ejeR&\nCI!MA\"*XYfiffqEP#9PJT@-ICb$Q[Z4k)TYA5kIl!3UXKDL)qN8+JRYaKdeChADB\nejV\"FqJ8J,3F\"rR@r`D@T%)CGLKeSe\"qD15*cm*AY`KF$h1!9hTYj$0F*TRrhD\"[\nqr[0$0Q)5aQ'pc9Z(E(M*DTLR,Bhr*I),R9qe!P&Up1FFJD*m+aUb)@@`NE0e\"k@\n[,lkqc0(T(4l\"5Lej,iPq`JYKh#Vr*%9[4FKP9cQM3TmHS%@UPRSleDQ+RGMa@A[\nNe8rFeT@lj0-!8Ke8[2S@%qBbaVkUJV9%3#mfGLEfpU%KXJ2*5NY3f84h[\"B6Rqe\nbYXf5RrRBjSP,iNlH#6U!1&IhAV0N+(*495Zr+j)d%(dKFdk*#Y9qBUbdrMKP*XD\nm&DppE%ki$&e,(SN+QL6q$K,6,jkSD8fJM%BfIV3T+@E4D!@-D$aM@Cl\"FhZj+@5\nGLEAB#qr1lcYQK`STJfb)QXU-Q508P\",FAS\"Z)#K,QUX+h2ZUaUNP04bh$I+RE6k\nh)FDI&[X%EEfPpXVRLcI1Z2BFCAHPED,dfZ-5p4\"FX%-4hDpECVSdeRIA\")HY[6*\n)!(*JN9XYR@5`HQBfHD[JDD@DD+Vf+i3[K8,JrMa-NAKAAlhJDQYVp$&ZH1bY4HJ\n#FX02P6eK`[)956pT5%kbc+Pmb-[ebPJHBIjIH5`6IN`,164JQALL``YV)R$$`i\"\nI1c#ReJaZN@2[Ba*HE44)UjDBIa@-pFdm91EK@!rArJe\"EbDPV$XRlbUprIA+aG&\nh\"aN0r2X9FbX$&e-NG*'&KiI@p*N98d!AJdHEk9Bkd$3`'PMTZLP4$e5qJ5SGqh6\nSdbp5SHqQm&T2EK1I30,&r`Ej$Bq%@r(m5#VQ5)Ja6Vf8%24,ENYB\"S5Kd(L6X#5\npkJP$d*`H)SId5A+fj(F@!BhABMZRqY`FcjT@G`aaMK[6(!!5NLe$\"TbaU\"m0ae)\nId#TNR4@r6DjR+!6YSk1SA!r@JER)(#iZ'c%Z))SG)QClq-h`EfE%a2BK(fDN'fU\nXR%Lc@r&@-hC*[km0Jj'a-U5h62kBH8)%aY3cJKNJ96k&Z9R&%$a`a5E8SkShPKK\n8T*bqG\"HC&V3CMZ[b(%N2'`CHYEh--TS`+!M#l`$r%)$63`1jE'crCJ0H-NC!3cZ\nJ4B$\"PJc-0(@ece1)Z)`@NBdS31fe[ZQpTDM`9!FMP2mRBC(21'25pd1(HQj\"G6V\n$G62[m3KrUMK$`(cVA`AeLPQ*JGHMqRqTfYhYYN(k2Kkc4f8Ki3X8m4$RKUr8U8[\nH9Ge$`r6Ek3+H0UPflimd`p5G#qHhCYI8XHhfLeXL!lCmD@`R9Hh\"!+c[`mbhA14\nYNL,IhKC5Lh+9DH&GR9HImcml#2KYTY)B)fK%!KaP(8[rK,H5AD`#Va4#d80bMD6\nGiaRm8HCf#D0RdE*C+KBA'1P@e\"6Ffc%(NL!G)0V&3FGHqX`Mp1l`e-Ge$!#\"fV+\nZ@'I'i8B\"fEHAY+3lIXdi1hPrBC'V1ehCSRZU0\"!96c1XMk[m2r+C`(M6@4pq!A+\n4j@R61l`%CA+821*$FCC6RLj!25e,r9aM!+3H0(XlRNiK[edkk\"j83piN9kC0F[#\n-CCQDqSL3!0TNHL#rF5LR+1SJmPAFhd)R8mK6*8#Vi89L8kj(9V$3eT%idAjP*\"*\n+PS\"ERdeD4mITqf)rE2a8&R3AJm`fJYVm#T&%#J+58KQDV6cdF9B0*m\"C&'FIrV6\n%`Jm!$VN'Sl\"efIG%JAiXrbQEEfZIVd`P*ldjU1pB\"F&',1Mb5FEM`MGiCL%EG,l\ne3rHhP3IZfiQDq#Uk,`RcG4*rJ)T%Y`em0\"iPc%LVGD1!+Mjk&B!I!2)mfLdaY4A\nFIr+ApIbZ'!2Abi[(N!#SS4lq`9E(&*Dq'UHN*XN$kI&P6L5LJ%cA@%fLlGX`8J!\n0fmUm4H(5#IEVPHUlMmfJrXc25VFl,5G`HT5+AfE!FG1-j@eV(`lF8b+A!%1-BIX\nT`(-c4HABSBPE%!SEMbKJ'\"BJp)(!h)1(Y#9V!d)k#[SCHq+3!-lH)dU9SiplI\"c\nPP%0Br`4Zl0*BEhD[mN*DP&%EGcNNh'YDA4AM5e(aYdh+L+GX9cVZ(i5p'*SN8l(\n!LqQR$De*+c$DqChdRlaHGKDRR`+HG'6(D8b#M`c1Rm9['hXH)\"eEma0PMJkHi[Q\n1'-0R3\"8H@fMK1\"imha42qK0r*@!4d2T*fCS+9L*0GZ1[)bKZ6Rbf`f6AMYch$-c\nN6bhFq5b(DFiGY8JbFlhlVi!D[e4SV,)Iq@i6G)5b'b)Yi`Q*K#[[#EK0G(!3SME\nMh2if-8ThmG#lm#*%J@j-BBA'lj1jFZ$GHQ+%j2Cde3E8fPKC0*Y20F#85Lpj@eH\n(`H1D%Pfc+1Qqr86UC&[XaNF5`,G!6\"C8b6&hdiFbX3K(hiP%Jb86ma-PKYhbUU!\nqZ6@aPY,-k96r4\"QeYI-[GBY1PYfI9@00[jAD@12M*T8#p3#\"-YRd5P45Hhe[4l'\n%hfc\"m8J5r6LiH,$a+Gh%-b4c$r'PGaZBXKA@mJEDlFH#@VBR*Y-`RaQcE(!TMQI\nA`RUTlmLFrHA#N!$$fl[30Z8GjqEM-\"%#k@,&%NHK\"T'p`ke21Sk[6EeV'+dlXS,\nHG@Q\"C(+YJSJDDTrh9$LNlS!Y&93h%d%lUHYe1lj'p9Eld3T,U5fDTQJp#pjV(48\nT1TU6&jT3d%XTh9ZJliA$K5eN3cq[ielhQ83l[0%qX'bKa6q2fD\"LI)2aUKr$c3[\nK5'E`E4Er'p0PF(eaTSqa$0EG4%Y)C$LfRHp2YlIZ0%i$CqX9BSc`j5Q!'0)fU8S\n33HPdkPNPdB\"bR+Z+jiIpqSHC,6@k$XXhT3N%q%D%PXTVNFYDe6q+q3$K\"l35FFc\n`JqX6A20%c`hi\"$&#+c+p&$UBU4jhp-#[bIU'1eNVpRbi-1QFCHF9`,G(+F9pe60\nYmEXecMrMa)G)&,pkF(QaNBLG(cZ3!\"&6\",4LJ+Tre3HF[hV1e9CKMZc$KkpjX\"K\nbq(ViH[Kkq(ViH[Kkq(iqiNdA+p66+mFmR-!D&,6rAfi!rXY\"'@XYCDbF+fPf%\"K\n&6#*RRm$Ta0K',X9TPXYhm4SAAb2%Xj'k,T0Z,I$&%MLjmrLC%@fUIp8(R,pkcY9\n@BBlX`iH[HE!BF[Kkq(ViH[Kkq(ViH[Kq2Z*0&b[8db[(2*c!'K5drepZ!2l,34P\nV,@@XR$(i2S+DBh$*SJ&ZP1JEcM'IL(1V%5-TZKJhZV\"HG3r(1r##md'pqG9Q&jJ\nEcmiAkMPqM3CLjMTrqY94j\"1CeTX\"2BSG)FaHTa4SPIR[hU+YU8pl\"`ILkE1)!*e\nPF*frAaFSffp*B3[1NT!!3(TH*&L5BU-dPkb!,,1M'CG&,`\"H+TJ4IM@DPT%p)rM\nA5F@[S-U6iZ1lN!!+3,-2XE!8(`iSLYV)d+`fSQPT!r`!28ddV8!aBAF6%eFUqb&\ni,9*EcF#K9&KI4#\"R`#0J+HT%R[A&dZbbC#4D,Ca#piGKPhGhMV6CZL1cAjp3$%E\nMD9XeqFr16K8#,&h8kD['hD)aEGC-([V3Tk@a)L@Pp+m558P0h2*p[,@J)DD1ZH8\nHRXrcEHQ'XYCfUNI4F&&r[fTVBbeN4860T\"HpDklU1[A4D(H%1HEQUpmJ)d%10L'\n[6Yl8V3l#B(T5e)fkH*b\"[Y8[,fpb9SIkhXNYM&-\"FqHD5fB)@@q9Kj')HliTi\"a\nF*9IaF3NSq-bH`Ck*+eiMY(3TqDjBk,mi)2pP6eE,DY-*[CEIMHqEV,Ji-V`S9Ci\n$6,ef2k6PBcAD8%'NlNaQ3T0D0*cRECTKGfhHT*PFbQYLUVq[3FR[[&H(&Xr$EEl\nl,-DUN!$iiH#BIFY@k@M[j#4k+if-rfa#el0l&%k1f,kaQQ&P4[J-i[\"DU3i)m1q\n$@KcbRcMHUIV1cGK&#XB5B4X0'qJ4@$-A1dZ+eh\"q2c5T%++a(Q[)j3hS++25q@Q\nM4PhDS1A45FUaZMRl8AHF(f)rE+fFA(L'MYj9BcP6dVFCbIpRK9l10MTrMK`G2qU\nJF*p[d22GZ0R&pZFF'TT`Pe$A2[p[@B`5LPqi@GIX`qZC)#%Tla8C6)U-JJ31,*,\n!q-EF*ri`)QH#ZI5AVJAK+2leM%\"f3L66kBT'[hmY'eJl4MD66mCK\"Y1QK'p`V'a\nF%VmaSBDfJDUH#jfci&F0r$MQXfjdNKX`XL0VBbAEl99KfH[U(-c+cJC-QNd'el8\nk#ArY(N`[ApcI6lKDN!!rX6@F8M*$M0iNfr[DL`iP5Pk$0%A8a\"kBUYPFl)P%DaJ\nI+90b@3SXRhdibhPScQ-k2-eeDDf*laQ*IFm*HrQp06U3!*qeSXL,,m[KMCIG@K8\ndRZ68YCa8R##5Xi[++#0,YEB-\"R#4iSS\"+pHheH5,UVC\"5++T4P3Z-QIU`k(@F8-\nVcJi5@c\"#\"Eqdck2HHT0$BSf2L[NRe%Ll*A%H*h$&LlPfYH-9IK,QjBphQd62Iph\n[AclqC3!56dPcT`I#f+8!9BCd[D%1BQ[1Sm[JJDdpLTh2A5eXPR89R`K5kEb(*[%\nFT#16aC(`mKbr\"jHmeh**DQj-9AmXAmDH*YLpDj99!eBB5[TaU0E9G*RJaJ0J0mr\nhq9N0USChCJ#6FGi6LJ!BkrL+L+Qp+cNEGZmhq3\"92Jp'*9r`S22Up*EN6b*)FBS\nEX6A\"-aa8K2Bb8'Djl&#PA%*m9QkG`*R9j)FdZkhkc`HEQ\"q%HlG(`0mC4EiqSd\"\nZ\"C!!46-!h'k!-e-KGd5flj`F4lP55iaUp+Cd1`Z#PLi@LSajNUAhBSI(IT9,q15\n#qK*[!`,)84`mRLbHpBmr0\"pTidkY-EITj#&im&EjC\"hYqDZELPl$jT`+fkk9R)P\nG#,23@LI0*C@YMp8i0c@*4`i)0fElJ(%#I'1lkmhRrdTGbm&LCBh4M#l+a`TTYLD\nBb4D%3d0RTSYk*UFcT[be8BVS*3Xp)aNcr4'*Y#JA)rL'N4h\"fNPLpaEG#'TP91Z\n*'k!`!Q2rBL,f,[jI\"V9XV-FCi1c(Mi(dQC!!j`0b!%iEQ@p-N!!j\"ICq,YQ''Ii\niYXp+FdmDj2h1$-HLCqcQ)pP9'MYF)r'p$TM*a&)#qq$abXmQ%Li0B%aqFeVcV5H\njT'0$ap1f*1bXm+\"H-Z('-DIKl[e9q5@a(GY)pbm*iI4GBe'Z)QpD[UHj\"A,BHGh\na&&1)d2KB9N+j49BZ@4F%\"k3qkYic\"&(S2SFPbJTdYcJr8S$8mc$))T0X+J*HN!\"\nHV5Tcr%kDZ+@4&X*KpN-@hC!!qrY0'ehe`\"DH2q1\"c\"RIYU2VY%$pDI'+,'46QF*\n!0aXM#k%Z95B[9jI`(L`pd2$r+bpQCP5+ESH\"&['NiJaiXjSIM4T#5&0-X55(QlF\nA1i)!H`Dcq[PDjX6EYa&Ldj[UMj2SSReq,+EXYm,*bp8&R`2&Ja3F6\"NUGkT5[Eq\npLE$&qAGBrM%36bja-Z*'`4qA-e(i%%&*,ThR[cP#%L82)HNc1r1m\"k!VRFFPaf#\n(6@3F\"#-k,i5F-*qZCc3ReV+-c$hLc1VV'JL!f(c%0460TfH86[!!F,iU,bjE%G2\n5k$c4-$-(FlR[[qC#4Y3C[q,42I2Te)VD,16d&NdK!MHKJMFEjS[5@)(&Gd0-ljT\n4p8Tp#LZJl9fTjP14QRFIb*Q+kmd-f,#'b0+LEaZhUkVXmMUDT+R-6R&'hG[1K*b\n1Ge-ldi'cBfq`PA1\"ZBk[!`5ZEa-U1`UYUl-96Pd2b5q'@(9RXill9MAiIP3K-jN\nrd-'YpDXq8XRp+)-ckplAB-bk2fTk9ac+,SUKeL'Y2+$f,1-T3jflKPPD0JLTarZ\n5B)1G44maf2#5[+6N6f8YJ2#@eLBYheQ8*GBA-5TR'mBP!9&5SM59Yl6Chmpq4r'\nmmhX)K#2GH`5N[Q!5%klG#6HRC@rQ![pcbd%6DiPJk5PImq*J(%#`ke10-e5XF\"A\nN$e%BNdiA-![V'$[F$61cS2f*h3!ij%%GI2-R3`+`mFKKJQLjXPCQf&9SfmJCFjE\n5Rj!!RrkmM(`0m`rf*FJ1d&$%93MMB6\"pRK$e\"f&)3X6pXpBHN3JRB)jqY2%G[FU\n1Xr8-T81GCj6e@d1LACCl2@S8&IP(e@jZ[VeN@+ZTab#r'FQZjbh%Gk#$Z9[[N8P\nKIHiRTN2TXbj68,rkj'q*($&Z3f,E(idHAI@i@br\"8'Q4AYFXR3rPEpd%VF[*,N3\n)BEYRD[B!0e0@dXeA56MR&hIcZ41N8'RrA0jP@IhJl*,8p*8m6VrK$S@!K[+eiLT\nIh'lP!Q-pi1PU8U(Dr1Yj0C[2H9`0ZFH1fbB&i#Am&Kd*0K!#A(mal1S2CeNGK5E\n1f05)LE8FTV1+\"0#PA02f4H9b\"b4U$QLkRVk2IFc`R6ac3h1e3Q3%QrCiJemCHK*\nh`)30HT85%Cqlj-4%C6#Z0HPf*`f3!(h'B`rCd(5Abr+J3Q(cXUZAeD3&EQ-,%0)\nXM96'hScFi96mlb*F\"XCfb(8Hb%8XN!!cNM8G2E[4jfG''`Xl11k2e9V-r9P(m1R\nVCe4Y8%@G,1[Ze3mGN[@KZMJh%U+Np$rVB*1S)eKI[9d&p&&+9pS[SQ$4FJV$q@B\nmZ%-!pIB150G8PGNq#$IGAN$jd912H%a-jmPJffcTc&&6SA98i&mUPZa)Cf@KHc8\n2kmkEme4T8TCfFa,BqJ-JUU@LE4Q-GM\"%1IpHL'rjXRGAj!''kIm+apXf8Kf5if!\n-3majNL`FK(+#%VTZA#Ka(&Tmc#)BebcFNfU60pik3pS3MmDPpclSra5afC[haH[\nB@4hR&V`FPN&RhV0M!XJ96jcN\"kqSR*CiGI\"6TS8(,`+q0Mi-4hrB['APNV$f!4f\nF[,Jj`D#e2qI#`3JFL01HQ$lLcD$'NK+Zq&QNfF$!c0J#fF\"9h%J[Uh\"hpFb'6[&\nIrS),0VDaCFc@B\"cNe[8HSVaASFEm$Za$N!!fN!!h0\"jLkKlCIVekF&b0!0*8LK$\nT-jjCLq6dk)m$1aFj3@MUm*'iZ&Mr@856'A&#F1GhqIfrjGK6L&56M9R,L$+26`N\n2kT!![bAQ3G5Di,Im%k[S0q4-Qb`Z-\"L!\"FA4YcCpiQDMTSG&1e$Nd,qRV9#MXU6\n'Nd8N&V6SGA`Bl@A%2e+C#I@2Dd%a$`BL*q64CERmAXTpk1VJN!\"IPdV3UbM,G3f\nb$3\"r5'*RS3[3DE`QAdY%)[H&DB)h5`c#2`$QjjR@c\"HdUKIXMpb`TYU5f5-&ZV)\n'+KraNl`a%`KL)%Gr!&8l@(iiVGJ12lVJf5UHmQUdaHBN*&JFUh2@$8kBVPGE14@\nr!l(eUjiijK6,E\"RQF%,hR3F\"NZ`S+QTNGV'GGUY,FGA+C1`TMac35H!XCkLUBDV\n0\"`4Z0U0XZlTiMm#$H8-qAGE4AkXbp#*`c!T[+3$NMPj5#GikMc1%%mFBmp,FjLB\nUG2mPkrCpKp6TLEplbiLM&G8[$@2`3A+9*RZj8(HSR)j5#&Ep4F50Xe[JElKU)+j\nmQqr*6),PU`YbiFPbrX%d$X%e$9b+0X+X!Ge`'09)fVARKr3@26#0UL4l-02[c#&\nZ4(1M-+riQT1GfVKDZFY$2Brfc&eTV)4k&`Z)e2TbJlLXATaEB5D\"p6595bjZkbR\n@Dqc9J)QMhXI*5YU,)M@VL-[@Ti15X'T@R6QRGjU+TUcBQb-r&23ciI'$2Bb2[-\"\n$8ebS'd*-AQ4KLmcQY&MP&KKI`6(S@Zp3Rb,ET6RX(V6LKGK!kBIr1&PBEV!friV\nclDi'@m*KZ%bCr8hl9*a`Z3B)&aPbGPc'dB)PeK3`Tb,ALN0k'Yil-HVa(K4dJT%\nYH#\"HL[5p0P$,H9`#1'9(LI@\")KdH6iG(J!#I9DZ$NLXBDH@8`SKa2k'PI%Ih$9D\nL&f(EG%()pX\"qTm`JS2JP9-Ua'+CGq[j8)@RYR[)!!!!\"U(jf'Tkc--&i6f3Q,GG\nfR#b%8DY1jf\"(#*J`hcc8NrmHYp,K@AQ21,*C9\"YmB(j%SbA-l,%4'\"B!FEUBj$,\n[\"TeEmRrAKQKYQ&X[9f[j2h`4H5#(3cZiCCrYZ)M8[rEGqfBMqRJ-Z1E+\",k5*I4\nb(ZIJkP9$fTjMql(M&MCC9`4DpQD@G$(X\"h&E%2e@fjV&KLG30HD!lIV6UI9$-A&\ndEhXbD9D+lGiXD[I[jP2G+`mT@S[lrbH)'9j@\"*6*GRla6hQpJ3&iB03&a0jQ`U#\nNK!e(X4F49'%G%LI6-9MGR$8,YrN)12,dQ'c90Ufr(BFCePdqEE9VTh!d(DfIC*E\n(NkDEZC(G!86laXkK!#@Cj*E5T'dQfl-h3eKrkCA8HKm2[\"pN(jqVfdA6rR!iYp1\nN*i*!)@\"5+E1`P&Z(RB3DJ#KbIE1E`(1j-A!eeU\"2km)HL(Dp'4@,Ech[UF2j%I2\n@pBQIa#iC3d+b1dVSm#e)d&Fb3M5iaJ&TVi&I\"BRHN!!2hiJA$LhGMQ`[Q-@FmeI\nTpb$Mq6+I\"`8l[Za#mD49$MN*+M@j-Y)UZ2LdVR)TQP9Y4Pm&6KBmP$FH9C8@`TM\n5'R#P'&&8lrLX(I8@8dh-01lVH)#0rcaH9bhmT)cERVY%i1TlMb!QqpHaTKMr4[Z\n5QqUA302\"J2E2P$qca2RF36P(Xd*6EMkG8JGX!DDB8rTD`fQRB6-Kk9-TCZk1laG\npdfMMM6V%[EEE56YE!*)E1,ll'C@X#*1&+'HMp[19H1AdqD-KpcYP'3AiGBlhDcH\nJKM65IV-a24aJPi)433BPlT!!4#81VGblrETF'FkTaVqB3JeXrb$AXG9,pNMhdJ(\n'-@XBiG3aQDV%G$MZ\"KpAkEC1L@qBa6caeRB)cm@5+S!h[)LhYb)Y[)3dQN&EEV8\nlVS23mcSiCZ[6#4\"cJapXHbTUB,$'U,MA8F96,jLZ,H8LJKFF6C-X@NcdrLRhEe[\nfqfqQf\"+Bb'2GM%\"q3c&`[iqA#-1SN!!akBJYrf#)-+1Cd5mAa(Qp&K&$1mke*PX\n*q&&RfZ8iL($N3UhN*ELl+hJE0q5[RVD9p\"+ra9Kaqe[%f\"B\"+e[ijYYS@SXEG@f\n-#mfj4H0K#SMl&Pk9\"*TNSpaZ85Lji1LMGRHF2BjK8[+lXUe!lX2rB[X\"dAkN'Zd\nNiR-2\"UYJHQ2Jp0TQdI#P1Vi64V0ZbQ5\"SDVA8LeqGVYe1$03)J*fLbVcQ,$hLmc\nDPjQ,k!RK\"6'H%+MF9jI[XRE!4eSUNCX2pU95Mr-HFY+r1NU3!-ZqFHE1&GH1keL\nPX@,TN6'KAd\"G[#KP2RR'H)BXE&q$%IK4*8KqpjC[bLDU8dfX49l(E4B1DQD-l6a\n&SM@H`CQ-bMGAFDb1QBGX(U*'VS!YKDBY,5P*'%QBmHRPkZ(bl[00h+*$Kb2@r&*\n)(NdTBcFELk(2d)a9\"!RfJ)KUG*dR`cSCVA3`C03T2-%%X!Zcdrj(MjrZdpqbjI4\n#5Pjda@jK25MFENi[F5pB,NSQ$4*YIcq1L5VHqZPJGd)j-*08+Hrcj1IV6Jlb(MM\n-$[(TBiHQM9p[)NhC@d-jiGe)MUimI84rM81Lb9-QHjS(CZ+3!#mj'5QDHp,#!S!\nV0pJplPKcAF\"QikFM3Y4Nkc2c\")0#HJXTSTi4PX%JpfhD,`)2l8N@@QS[E1NBbGa\nl,@N9XZDJjGMKTX5Q`r51)`[lH$0hd[h%)e++@5JN\"GGa)0\"A!R(0Camki)8Nb`#\nHPmLNLdUZ!r$0XKmGfbh$ERTIVqcrD-2pafj`0[Rb4+4d@pIk95@d`%PX%8%A&V0\nm[$cbU1rX5cp0`0d#84*)Hj,i\"5`C1%X)ChU9TkZ'aThJreHk\"SMQR(0(G(&e,e)\nR2!3YER5J6N+LZjHFrfSak4f56)NHKcl@E,a(LL0$KZrXI((qe(XkLD94GQmp4aj\nRS[)+R[U+6GHJc)QISm6`SUe*VAFmJC',H'ArB1+(Sh&-ef[+XYfP8X3HVCF8fbe\ne`#L5!aq+U-[+pR%S*h-)L&`N@#,,`%[)#a(d1k1V-dfdHPNqcRRLFUaAL#XJK\"*\npeAfm[UB'%T6HUI(DhN2(`Xc`%T%T'U!0*1,c%#YDNGa6U(S@r*bEjHGGKXaMaSX\nTbc8T'p1-(V+*+pRI&[JkLdTS8Xaeq[CKK)HeGC6dLh(ecjQYDe!k8*'ZXM4[UPi\ni'QTT9LiI`Ubd0Q)NipV2idlV8cp9h*'L9X&PM,L`i6%baX2SpIaSQJRJ&G`2Gp1\njqBKhI-*6b[KLm!p+LH[CT1IN3k*6i,Y@![PTm#I$l*q(5)cIr,m@I2pr2ShGdpJ\n)dP'$IK-l5KS8ba5emlM(Z!r[R'SfUPVE#NZj0F\"d\"@D%49)J\"P13!(\"E+4$lK`l\nd)+9'THHF,(Q2@Vi9Me`#SAHVe$QBpYj[CA8AS+*$Ma9d()CJ!Zr4UES&Fbq)0I,\nbHFqfaAdKX)@\"86FVZJ#V6LLR1ri1'jUrd1mQ+r`HLrA+4rSe*Xhq8Zd1##`Yk+6\n--UiEmU$e#Hd*(Z\"Q2EHJB!L1+kV\"lci'5Dr*mA!,XqBeiZ\"R%D*mbH%k)EA*M'm\nl(U['D9LpE@0&2Cbb`YNh3j!!`YcU5-D8Q3mM@@*F6hN2TPH'`EYpBfICVE1kp0a\n!\"qr@R$V@HGZKI6HqD,-ehlK3+AM@*4Q&MRGr0Qp`&V&[#CiL@XdaVr+VIPhRTZ+\nhS&qX)TUYqXRXamk2A*p$@\"cZ)0HJc&b+Vmm-k0k)V62!#eq,'U9mdKRY5V0J6T)\nlDpfRl[(k!@qDL3Z4qA@Md2IG,2HEcVmF`IPpd#0YiKIcjM3mrHYq*,ZrPm[8UPD\n@KKpI1a)bbjA'$KfLF*DQTh4b[2`NrGc0mTDK-SK4KIp\"p[S8+h`S2H*Nl0I+0)\"\nZMmp6m-[ldk@X30KrZ3-'0(UC13ajN3b%,ZNY)$[8B@2,!a'L&HEr'98cL@*2e!e\nqAXQ(Z%QfljcDE,KjIhhQe8[H!p1LpeZqmqqT0a3UH-T,ZL%54CiM-@\"IG%&UK!G\n8C2#U1,,UL5HeC%L9iRAK00QGS&L!Em@MSh6%Ej4SGemfHYB5mTEXEpJq%V`6HrV\nePQ&)C@R[lMKIVaL,%#kMb0Rl\"8Ed4FdhFb\"8TEJQ`h#hFH9YKXJ@*I,'-c[I,I5\n4QVP448V49UieF4B*JrK33HAr121,e3jim`iGNCipR4PaeGE)Dh\"qi1!@6Rr,ddJ\nN6RqPTfYr($&YT`i'K5drllF!If@JM,@@XYCDb*,AmJ!!-)eA9r(m2KMEHVQU4Qc\nhj0EpYSphmNI0I#3PJM5k\"SjNf5mfRa)iZI2iQ4&p[kP@c9`BQ!#C8)'%M6&\"D5B\n&alEiGphNGBhDmZ!J-l`pi5M0C0Q0crBb(M(5!'UI(6Kb3ar[Q(*&4k#)FN-IljK\nb48HJL(*$(qqBHc,)J@Je5'mcrhrq,E31NVB'Z1b-BQ1lHbK43dkR[NkLf)bXCIc\n2qCrc2qCrc2pCcXr8P(c(USI'B&q&q(4r%d`KIKIKFNaGRpFEe-0beVKa%1[Jk(1\niRj*3JLi!15GB`lrKH$JC[2Ter+Nq8e\"&5aL8k!YUd&$m#`$`3$\"8R6r&!Pm51J[\n8j+i+!NZGJ(%,8IB)[0`2SIpHIGfl-m9epi\"jBIA01*-[#@S%-GhX5!i6)mpR`+U\nh+eUVM-[#AUN1j3(hKL-L4)b@*XX)rh2kl%$1IBaJ8ADd'DCTPkP2bFQ*eZHr1Uc\nYI&!+Hhc2C@Ykc#CkP,*Sp)rrIr0i'MHMb[,BV%h-!&%8$KYer3[pp518R+#cp`d\nMB'fcm6-MB,Prr5(9LapR4dGr[QqV[e[)`4aQAD*cD,AQG)E$j[i(S`BD@ATjG2b\n)Vrpq4$@lDUc\"2kCF*LMqhp9ZZpQAj5`DihZGKM85ASXDM''(SmLNE(TZf$Y1ULq\nFbej53fI8E8E8lc)T$*F49Z5hSJ+*a-VE$C,V3@hC0,+(51G*[6DU-Rqq)m,TQ0-\nSpa'EE#MaJiEZ)$iGq(m,m&Sl%qp1)0UX0caLBfFRFb-YkVhh##B3cee!GhDI8f\"\nL5,Xc[!T&NQ99r,!K$`&q4c4\"Lj-8)KY5M!'%G8)KHJ0QX[4L@Sa,8BPU-5e'*Df\n6[`1QT4dl,-c*kBVMq46GhMVM6f9'-+8Z'E5IX'r1,%HXPRqJ+N@GlR+[I*!!f'-\nmhk[pG5T[Hb4pl5fNk@Y(5lck@aLj0ZHqSF3f-r)$[Q\"da\"U3!&9Fk1!'Bd*)HF4\n%A#Ek!CB#24Hpj&kjkaZlmc9CU\"+\"L0Fc[(cb'i38B@BeP0C6@8eP0C6@8eP0C6@\n8eP0CBEKZ*p5rXreGNG)D8ilIbQ&5Mj5Z'kj,RkEX@@2TBp*aifmB$ec+SGq,HQV\nZ18++h\"-S+Y-leQk)K(k@Sq&hSTZ22b4F[P(H`Ul@)qcja$mJVj)2ha[&DaBKZNa\nIhZ+MS6XAEm%Dh*rT+@$A-SK5`+f`[1EVhXYVAJUj#cNABXlh1lU[a#@J)(b+dYR\n*lHq6[pF@h)&IP-`e\"0S[kT1-'lfk*U+Mq1ALZd)+fJ4QBEX-(65GTN8-2Y0klYH\nY9cRFIXMLfD%M6LD!lD(iT*b\"hY,!)kHj,L#\"\"iQY9iAcZY#,Lc`%9)1VmmZAXQl\nA@i@4q%E%!S!D[DaZ4`04&rMBP+[F'mZ0fr5b#[+#hJ,4b1C4%h5Y$'ik5S[Sm&f\nL55Zl4C,\"K'(UHADSd1LA)8YK89HSAk9\"$+eIhRa*9cl#hpLA#'1Zm#)$22[q*p3\nU\"\"PEM$DScA'8-2Yi4XGPEi,r2,l,9CjbQjc%p4(!cA35Kq&CpDD$,K\"pNeBcZ0f\nfqpQLL1Aql%X46,BNE3aP*8G3%SU$Yr!P1\")Ea+bicK$b1a1DMKd&LFc0)!G&\"4r\nEJ4fjkaf\"(ERV(B'hC-8[e5`cPeQ\"RDDDf\"$GN!#!R$QI@kR2bjAQ8LlN(rprrhm\n\"KE`8N!!-G9hH(IAEU8R0bG34F-K)S!'%K,M'4d4&B1jrpRL@Q3YqXP-k-Ch(9pG\n%`lIAiJQ959UeT3\"UNQ&dFa$U'D'6JG@+0\"3*)!B4#FCj+$\"0@c![BAiAiB-C#fB\nmYQ3CmZIep#5DT!\"`ZMDLifSqVIpE1d3c5f!Td-HH@&L\"1-fIHf3laJa02h'Z-%U\nl#e3i6K&++-hAb(IU6qRb[dd5XLcC22aNr'CK`dd`+3mm\"Eh168)\"&X2S$8EkDSN\n0`c8A$cacPb#'28V2YR3E(4e\"LI,VNhM)iAN%9LGV\"0)AS15',lC[QJ[3ccmeikf\nl\"BJL%Ip[X92Vki,hUKTGm`Z+KIMM-S2bp`Y`1q!bH%)(YXqLkYHKSUJcXTUGE3%\nR[[+bXE\"QJ5V'bfl6j`(*i!mMje,jSF,IK(C@QMML28da\"(%0rc+!%C!!j*EdTZi\nhJEbIdrY#r3!IpRrMA8Cep@JPMSQ*6Q@ambE,\"5&5dc&p14r!r\"GZ32#4Sr9\"e-8\n6J)M80r@dm'FEHV%@6Pm-VMpDbkTG(X39'[`q2-)Jm&pcRQ[\"l0j8eI--Vl&2(jp\nff3f8c1)%4bZpMdCG3#cYa-$*i+k!HiIr@&r$Gk06Fq6+Q!5J\"p0#k[P`Gkc+h,k\nJS3P61,EY2r4H*#`\"E\",rC#XD9TrIB4@jXBFkQUP$LFCJM6hJcPqc'SCVmbDD6I`\naB$f2e$L2I9S*2MKd(`$dMZQ)G8`$9P9kV[0EIB)J-IHJarGm-m#4VPL%b3Mr&$)\nL)Lp-I'1JBI3kD%\"-$eD!AXB-PT+YN!$L`arZ-EfrU2)&5rp$BCb2H1F*TZ2erdF\n6QRHS2&U+D3$S(cm)rSZTN@[Gd%B1cApkhrcbN3qpG*BdK+[3Z+qhh1F0['54eX`\nHH\"pXZ&em2!Q&@0cIEhrE-AUTiNZp[!K$+1T6R`RXcb[45GVb-$Y4#%-#6)K2a$[\ndrdDU)R)$,KDda%)Ri2BT5Ejr*0V-f1#V@UR&*fK-Je8aLXM9@XE\"K11j2pHhGcj\nZ+EIkiPk)lHlXSd@GDJ@!!Jb,pclAJG@dQFdThDbZ0&'VGZ2$`M$5IY@#`-9T%BQ\n+-A-N'VKrd8BG9UVBSPNeUeN#N!!,-abT1NF#pZS,erAmqJeMQPlqAdj@PBi`6DE\naI4U\")M24XUD\"ZS8P\"(YC[dFK(L2+0RdCV6cJP%)!8M2@P4Ap,BRkJ+%)YTSbDPH\n+cbX@KTJlcRl6hfaDDGIJ6b`\"cV3-ZR[r6%'RBT&lm5rpT&&XEMi3PeDc9%6k*-N\n'ciVT[cMc99p'*Q0h1Fcc!(55Q*eI1YL%rYeURb)4,EZ5\"'-IqPB2@1HfhURPZ%[\nD#db+j(e$L[UCAE8`'c*!!Er`Je*$1+&HR1M#\"B5rXAk4NjiX*@33i2!`FS#UZq[\nhCrG@,ET&m184maV9P(Sc0ZqDa4@,6I%lNIfDVlD&iP`9*IeZL*@QH1I`22ffQMC\nEfM9A52-EcXB14GN,d@r8Lc`m6(\"YNXZFD+Ki\"5M03(9jDm,9bQSZTKGl65$M9mL\nqYP6`4+lUR+(0d'ik(HLiSh0lYdjh\"GFM&GfPR,3ZY2*MmBC(N!#5S-3H-'P6Te)\nmc$ZQ!Z9L!Z[j6!&PP'&CUem\"F[4Qqee1dFIebTT2NDKdCSQBL4U`CIUG\"SHVf4[\nM$!0jKH#(&kX1Y\"G@#B-10RPVA+lqcf`Q3J(FjPRREYdY69[I65AQ%C(CNE)6a2F\nT9hm6N!#ehbGY%B91&-lX$@YkFNrU'II'SZ\")L9c8T5N5!MMd[2BkRq&Y251h+PS\n90)X-[QBSGMiEb\"qMl`2YXZAU[-)pb4NlmFN!rT9q)lURc-fb2ImB,GaNUhd\"pqa\nZ\"[ab+pa(5Q!@&Q*8YjDl,rSQ2k8S0aa*8ar15L93\"`3L'D&+UeArDP+JEFk\"2rJ\nIZF!3(kQLeN`F#Hk4dCKrY,b,kp0*HfcfiG)25$\"$pjCmJH-C*$r*b(qBRIbpck%\n[h2LPKG(\"m4CUNP0VI&Ea%cKGJ)'Am@0E6VcS8RAehJ06BdM6ha'Xm8ac\"#Rc0VN\nAR[PjXFH#h4Ujd(AJR6`MaGcXbZd1k!*@!!6dHPRFCfSCr3-qENEh-D9K$RDhAU5\n)j%M(QHC6Yidd4IAD3&RacPII3XGebIR(Q5Z#c&AK6[GE8p9LPG(h\"'hEMKDf10P\neMf*9+d#R5dleNHM%DSG)G*@h#9IC3had-Tjl4i14Z6JR$U#b3kr)T5eYbHcXNQ3\np+64\"2Ij3L*TDm#8*(@HFR+d$9BbAa5bre+p,-Hf06cli'1+'l,eA#G4rr9TFkl-\n0P9[lQN0@fS@YAJB(p#aLKl+J+)UIiQ8MaNAijm&+T83(A+2eXNGFT$4QQbXNGFS\nr@b4eppR!34&2RRYT,B,'9d$8$C&,)m4iJN[90lf52[D@dR5eSkBeGjFrG,P4TGE\nQ,N*cbUjU4#@e8HhIc94\"'jfc85$+ep[lraXZE2Pf(#eQD@\"0ST+6!#!C8ZNMrST\n!b)T'K1U5Cq4\"JdAafbq*%'#bp-8h'r5hpaGU6!Xi[6Fe3h@69R0C6@8eP0C6@8e\nP0C6@B&R\"CLX#QXTV+DbV[#mShN2NmSQR8Z5jjh!45FN+#Y4l!,qC\"kP6prV[3R*\nVR0TE*d)hYUbhcb@Hf#ULPB2+fG52IfXSG13mGU`[))HdQXPeL,RJK1m22d8KUcd\nM)JU4j-,KF,KF0'$Ie@\"e%Si(X9e4-krVDUhk'pUfeHMedqjed3JS!5PR)ZB3YCk\nmihTZ1N53!1SQFJKR35Pi353+qM-N-BYfhKcmA+CG2hFVljJ$&X[l-`'KAS3HYRI\n$M6a0B230Yh[f4l)8!Ik,)iLi&fXjDd&V&[md!GSF'6(IhYmqLe@c+6p(R,'Rb\"R\nR8hp2dScIp'cAJ')RAS#b[Rd@G02&(Q2+Zc+N%UI$k8eZm6Y+#UEP[Y%ckN5LiV4\n,B\"Dqi+JR)IpVV2JC)mQTeP!d3jD@)q$AjAVj8G`SdD1MA@hb3GNYB+@*Mp\"0\"&'\nGH5NKXM8*pqm%X6$UJa&Jm#,65N)Fc`Tc2NAe!4rd)M1EKF8hS++fj`!-bAU!X0M\n,pC&k[EhX-[kFc48H&,GB9pa$`MieFEJe[J+&VK[JaMhr'dX8+YB-DY5$q`B[mha\nZ@HLI9[ARMH+Yjhd5%R%62dZPpkS&`+3Lr&b,R+#,ADHaj'lr(hLc\"q`MHqlp2UN\nc-`mf1aTqf[2T*`[)dk6Q%4(cRJ\"G\"qLq'RHfGdp6YlPMmC`,FdE+\"iS%450JL#f\nFJU0`PX2Rc(@RjqLaq1k#FJj,h&XF,@'qpVkR*3bD,RAK02U4+ij&3ZKhA)BJCd,\n!lV%UCrRJK[@eIN)f,EQ26d1LEp[C%$)5&\"TGc1PV#Rr0I&cZjdEmQYqXh3\"RCj-\n542C2L#k4QNeiQ\"FSS80dQ6eTF53kUj*bY1'0Z&R,d$c!cmmPY40)-3911'$CaE$\npcNcZaJf%JEfMh4E1M'r1paY6%+)hV9$*'$fDh`r4i6iGU(LEmpTX,U[U$r4YY%5\n'ZLHI@#18A&`0G$--l`5((U02dCEP3@(3lScajZ4`%Q-h$3jcP\"#q[j33B1Z\"-$N\nCiR$UiCZmd%K[T3+9hkUmSe9(*d8,-ICrK!N%4hbBa`LERIf3!'MHD'(EPi%[E%k\nB8&'VPNYL%@\")+H-U@kJXlF1cdRm&8[UPUA\"SN!!'mlTM+`&c%cDJEP!VTK$pK9l\nJ[l(FRmVNU-@FL)0qc\"c*6CPVN8$iQT++5DiH-aT!BIhQHfRJd+D2*B,KF'\"H$HN\nGLQ%PL)P&QJaBC8UkVhTp5V+3!\"R4&*-&18\"j!X\"XMl$A6qYT6iq`C,'8MTe01)(\n00CF8mF6R)RA3!,dD4JU[UC*il65II\"a&XUee&ImV'c15\"f81'a3!U%Le)a$mV9F\nqQfPk\")rG4ljpLp--&2SIYX(@BD0r\"Y2e,Ahc6QNBRH'@pIMlfX)clYY$fbbVM9@\nTB%D&\"69ed`M%T1U-a$j\"p[iK'2Y4Gd8%!(SDC1`U,BLr&pUH*\"%!R4&Yb+M2Qcb\n01V&ZDXGhQ)l+QbK,,8Dfq@XR9MH(R%+rJUlbi5C\"'66K5$$dSU30&#,TC*U,TQA\n)m8\"!R4,((pA*iRJVKZZ,f)!S5A4!Bki)dS'-N3I(*9EEkQ%X4efk-@B&MiA@DcC\neGV'+kXKF,[9a3KrFr+qT9*5D[B$kP!![8Tf\"JTG*M*rrFMJ9rR0rK'dm-mMff08\nM05FPqSqmNHXTR1iV*3bCXP22X0\"+(P2RRXV1RV2r,\"J2UEi,`rm%'cX!3FL'X6@\n83qq[+DibkakdFTE\"9Tk@jBBkVjcEFZ#[reSNNrI,Q(6ElF6p+6HL*KFEreCf@eN\n)bM@LecfQ0VHQdHlTQImU[L89bQeFccHIKlk`e1&R9kTB3aPY40c#6PDFP9,ciFK\nQQRPcEBc(+Ql%@ERLU+pDhh)hQ%qrTDD1`I6p-$!XJ4m2iJcSabYdrH$'bH#lp\"[\nCZUcC%dr*Kf@fiP)Nj[l`-Hj-@%FG@cYCYDUQ85kU&TD48TKGa(NV,J1Sb#IU!P%\nZNrlD$BNj,[Zb2rJcYE)'qX8+CXe*iLN,Am3[M4@ICX#(i4J6c9A,dR$9ccaj0Pr\n0a\"KU`@!YTRT!MC`Z3pr$@P&HJ*!!6)b+p`@h&9e#HIM+'IV[0KGkcMNiM@l8P!3\n6APN$%5eUfa!-08@'k0ZKaqe9kGX#H%dVMd)5-facR\"`dBmhR+JYl1Er!@-jM9RX\n$he3!)IA%I1b&l(98HVFA\"!N$9fI!##S-4&,\"$[V5Z2cF#5q[hr''!-QLbK&1rX\"\nKBpi6B0))GHc(`,0`q+DIXih\"'K(-A0kNl%\"Z'@68Hkq6@h)[5CHd'Pc%,qR!U8e\nR#`@(lkSdL2pq'#l&d#22b5!brH!)lj!!LfiKYc+)8EFGV9#i5JMAZ[58XHjB63r\nmL62f[Zmca[p!TdYp'3(5SK@I+0#pKL,A(UdZ+K'99E)&Qm8NdNpBI'M1@V+-[l8\n9Bm)bE\"@1aEYUD%*8P0S*qU0$db%-*SJG-83SUUT(+ZZD#%JIIP!P&98bj$D!%m*\nh(\"bjqUa@Re10UGVFB#a2HRZC3DpqMmQEI'Fi551TYUFZ8bA!-He\"fC8SRVX`KFc\n)UX*,DFK*dH(pZ3EcQ4+G58L1Yh4`2$XmZ1%Q83,Dd3UU*B8UR+,)@D'60H,LRT5\n[db\"FU*K#B2U`B,'rTPRJr-0pNQpV2f`B83ibKr3h)E4[9dJ5GArAFUARFJ,V[Mp\neeL!bI([KmY(1A(U9A5Tc,Dri8SCqcQclh`cFqeqGQ[#T+!G(CTL0J8Z(J+TLM\"@\n\"8+`h%hi&V`Tc&2d8R)LP`%j4#GmP[,Tf``lP$0U-)6BSkNchieH%b*E9Nl&)Y!`\n(hA1Jri5j)5\"X5NU#\"-V0kN0*R-$HZVr(AV@2(@l%#i)0d*03*59Dq'k[fqdrA*p\nH`Hd&6-@b&ZM68i*I'UE9RX'Y&bYG%km9dRd-UcHH62h@p\"pa2NZZHUE[0S)Q$1I\nU)H5b)ERKB(XB8!mZRHB+PBf4-@Nj+Ma*9AG'3TAX\"'FZReqrl5-QIUiQ\"X!2MX$\n')\"I3-U&j8%58f5hhaH&'m-1IVrCI#cdFH9,8Tk50EHPJq'1SSh$0mGL3!*NjmBG\nPaJ2R,4BpTR$`b'Qai535[hBq@rf+IZ`N,&*RjI*hP'-)BrGXfa2eGMU&`D3cmR@\n-DCR0rZ9jR[JJiAerpBK0H9k\"mcJe[*ZFlm\"l%,EAK,(9a-a9qAUqL5AK#2LV+aJ\n#l4&`)r9rmIC61iehCS(2YI[3f'XZh54p`L5lRrK3,(Yr(Z,dE-0p64&pC[$-&,#\nK+',a*fLrJ1A$'$c8XKiXb(Lc)H,-KiXb(Lfp4QBrrhrpp*J(C*BU%[\"6m%3P*5S\n0Q1F*ph-AQb#GIXC'%!)-*G8%NT9qpS$aMj!!*2RkXGp@h(lG(2fl[cjr5[pEdUA\neDTrlHJfqVUVlkYV[fl3rYXZ2NdY(b@D(`LF`q3*(cpAFr9Z9qV3Aq'qPp[B0qVT\n)r9UE[flirYkkIq'kPpZc&p9Che9\"(cfU$i4H+qS&[UeAhlGh[fk$rYh+[UkJ[fp\n+9p@Xhr$G+qhV\"hlGT2fl!Afee2UU@qT8!2LC%#DUIAVpi)CarAjBe&jT+8-)Yp0\nP`hbN40#Hc-!CAG*GZYa5-!!FeF'!q#+S[\"(Y63p8ZhmhlqfZRmka4YjCRb\"dMT(\n&B&Z3!%m`GSh$k3*E5*dTGRVdAIF)rI6V+iMp*K6idfT-Bh4IPL)5B`8hpLr-daI\nZX+YRD8&a)3+6rfP\",V@!(Zq[ZY+++Zc0-L\"B!YSJYf$5*RRh!NZi!ap)Xb9-!#F\n2I68U'UjN,B5Xj9l$#l+-0kBNM8PA,F,p*bl0c2dZ00EbRN&m)aZE([&P8*`1lJ$\nZi!l`CffDeU1&6Ar6fK$rK`K`1V&K(FL@6U$#6Epb\"-2Sr`HYZi#NeF5F[qMP0##\nTZi`,EU-,ZKCc'q%3JB$,r8$UB\"NHcMFZmD+04ViS,Nfd*$DiR5m3MKq+45+B#jK\nQk@B3A\"!+J6EkcK\"S'IGR$C6%T%TN)kF89hG6N!$JepFeG-`0\"rprp8L0!Uf8$3J\nUUCUr4-,ZC`@m5,PTc\"LAQbrUT!A!UQ)q8CERp9HeT'IJZD#hA,D$XSXS6fUArfY\nPX-pNCNL`[F$$kpT2S0\"GB48$r40dl(K!Xj&Z5%CF+4M6!CCBi8GdH1LlMMrc[&J\n!b53mJJ\"rXqPT2rRC!ZcSfUd$lGUA03*mT2pPJ!jjP#@UcAdF5M`a1Y5mlVT*pfJ\nbiH\"F3Qq4ipGr)b-@3Mc!U&QRRQ`((`Jm36X[-HS*3HQjLI*p#Zh*NP$D''f)8I0\nKdEZ)jNfZ`MIe2K@f-Xkc\"E`@[kc\"E`@[kc\"E`@[kc\"E`@[kc\"EU5I4+I+aJ[8H[\nUJfGd[*L6,%Z\"Y$bBa5G\",5YYBi#C!!NiM[ER6X$%),fhpLNe+ICIp(cVhkZaQ`#\n*1&S9bb99cN$5-Q*V$CbYYUmDE@IEQ,e(H!6Y$,Ud\"iM25bPp*Lpb0`&%pMEBjD#\niir#MU9[DHTX`'eHcq0b%*lp(!*d9946i4@d%aQ*DGe2i++a&!Y)H&`VFHQ8#mI5\nlk1KLX[0KImkr`58eGd'E5)-qb$abP@\"B)$mDFf*iad1MNMIN%)Ze-V1@E`pMAAr\nbJ4JVJ%H0&*1l+1N*6B$k'K1[6j!!3PCP'pL)&,VSiPFK4#eH#C24YY,ke6hF,\"S\n#bTj#`JJ51CHcH,PGKca$N!\"$VENXVH''EQ`@BL`IT'3ebTINk3[m9YkK2,Z0mrM\n8A3r!D+!NUGa$H,CMUi9NGUb(PUq2Vieq*Q(A*KIdc!F93,M(2A)l%*hh`Qd[4'%\n)9MBRTGi,f'f#$*H86Y,j&#\"CAL[p1%Z[3b*%PAXV(D5LP5X'2VaFJIXMI$A`-@!\nA@DQjP4LBTqG\"A`8&KEA1Qk(dUmNA1bH&*&MQ#@fjhl2lj+URA8V0JfhNa(QaK-k\n94km&Q`@Y'$+fCm!045)&f2Zk@!,J2YEhYk+kZ,'TCDAr09ALEPS%'L1A&5frq)#\nPARkDJ3[9@C0553U,ZcVY`bpYAUk#3\"h\"hJZ,Pk[eKIK*J0%NmIm)S`MPGX,20Zj\nf3XmflRC#ccEZGMpS299k6K'I0!ULK60\"J)BeN!$YV`!e1B&+r$QS!)AHNE)\"D(2\np6Hp!&V$YS$S4@IQaXUcUrac-45EIYZ6HmcNh[-j2,Cb'Y-(-q#ek+0&S\"SbNkjl\nBl2LCM!UiEaB\"`GVeEk!'j2AcI0mhcI12CGVVE3Q'bH+h9B8f\"0TQ&PaDN@6!3LA\n)ADUd`X`jSM`Qq)6D6B(,SYN[jQl1am&)rhdRq1'kZ8NCL%[rGqhPXaU3!'Z+aU8\nCd4e-,5**cb%650NR8rpabPQY8p\"EHDQQ81ZFIJAUh$#,e'YjEYES&Xb!1@5p+i+\nZaiY@j1GRebc3'@5U[%Tb)[)(Qe0JDibTZC*dTIJmf!NP',RcjSU`$`6m#j%Zrd,\nB&YP2+jETKG!lqDS9[#C2FNJ[`,CNbGc\"q(80UImRkRY($9B*P%Ff!ll4aNl09F6\nA@h%A4-@'BEB%!G2f#0,+'6RUK5L4$p4J(m,@3EAq\"UU1\"PB!&qT5V--N-8D(FpE\nhBiNY60**34'kJ#R%fPcj&K@rZ(eK5cM0@aVB0$4\"!699kR005+N!Ef!3!!0ZAqC\nla@e'QkKmXQMVUhPh'*%V3!QV!Cl53,638lcYGGaJpY[rAAfiLP&G46F-&f+\"!Fa\na#M*RQL3@3+eBcXhlMQR`4+M)4+B-9e&GUf9m6Yl2,hXiq+`qkpIl('[0Y+JHGq!\njcS0q@)j#l+bpSdq+8YSZbH+1b'jGK+pG+$46LYfRebL6'#YhX%#11E1(6NAY)VD\ne6(Bb@mMUMIH$PLSIc'e5V8*1@'L*S3VNkHbmk)\"3,RqbpfVDN`kG)'MLNTP2p1d\n0afAm05&RfI*jUE2@kdE2d80`[8cDrfHER3RM!LK'hF#M(@cTR3T4kC-)r!,cMD\"\n+PQGLU&PT\"Tr2Gi2eckKU@8&AHbfD'*jUfrGjBjaSZQF3SkR(P,S8JC!!D1)$m@A\ndA03qf'5Lp+!EH-&0'(LYEpUpBabAGL\",HIX8j2$,`@)k#(bh$$++ZrVi1b[CL@@\n6Ad'M(kpMQ4A-)Fa6!PBR1GU!N!\"`)3VU+1Q)Y)98ED9'6KTjeVdjcq$R9NYlX%C\nS@`hUeDpVNLfkmhR#1$RB*04H\"9J*`XCDQGU`H\"$Q998N!kY@cdFTUm\"82A-*(J1\nkipYC$VPH#rCFD!Li5iL[LTQQUkLaM!8V$`YRmQiHJX$p&CE`PlC,lTB1cC!!Z*L\njdb-k,bM$b2$QqYGL*!DY98j2TNacG(6L&,'r5[p5Z#FS[JXbTI3aYf))qVU)k!i\n8I+$IimZmD%k2edi`bYSPK,8Cm4)G8K$93`bTmXQGPC1&0BKe$PH&JLcP@0'YQH9\n(Qhm6Apm*Ycr@0K#Lf#PRLT4045)NL6Q[m*!!dZp86,&Zm\"HdSmJ)K'U3!1-M4AV\n)J0lRa&6Ul!@pMrCdi88P4@!FP%9[@+ZUXkQjd!*I@ljC6SV*l@M!j@hbE2cc-&D\nPJ1%4MEB&[lr4Maa!0Hm'$`plrE3aqLhCR#!ad&e)#ZF#\"V5)iaFR*K,ZV8jihk0\nA-m-iFm1XV*HD6ZQZp&c3$dr[%mC8c$TpZH,1bL,G5LlR@G*4k,fIE1Y%UJqNe9H\nG!(X0(MU#X5Acb#hf1X(c4T!!\"L,$lk#(Cd`BmJ+$TARe&i#Y!BaC5CH2h%Gi-D-\nTVUm'h)1LcQqLH8R*k&C`SqY02bdVVJB8i#k-DfUrXKG,+TR!96QY39M6T&!1$$S\nlKf'V1a`iFP)8%l'U'kM2*+p3DFJ3jM4BjK1X$Pi#B[d1qMrYk%mVU`fe4SB[*)E\n@e!E&#mpa-ik23N[%i!VqS1N9'aAU0XKe#r22'b)pmV(%FJ1RaeE(X`[TmB!-'b*\nrQ49YqN['9VSKAI6bl0MTM!\"lLX5mFef2QK&ifH8Y9!DXjcFe0`$ASkKk[1IIJ!l\n!c%$EHpLF+[4XPQe&#BLa@!,#Q*aKRmk6NMHrYPEScc9)'ENEGJA+2[Q#VQ9YGPe\nX!l3)fXr&)#6LC3p0V-JABmHad5F2fMk,CMqeXc!+d9@R,VR$)L2mfFekf+Xi(Y+\nPL*c&,0k-f33l(lb2%R1JZ1[XLk\"ZAhE9!NDa$DX9&i4!E5TL'PR9cemP&e`GiS*\nkHmZ@TUmEZKadKBblEmRX(Acf9Tm&r8Y8Fc8QGb`HT0e+*aLUf'J)EAf,03*jrhr\ndT86,B*j3I\"$kfH2hkC1A4FeJ`G9c-)-SKCD58GfQJIG%YH!N3cH(L0l6D9+E*dC\nJ%4$LVHBeX&(IkdQ8R&r+eF(2EFXlUVmSLaNr3[J&&YB(0!FL4AdJ3@V,aiF#+UH\n6lc*5BGQT0c0N986CN!$PrUHFaD-Gh,l`,1J2!B\")2l3aBY`R!)Ge[PH#TZAD1Q$\n\"D`VG&Q+80X`(biZm%1)+K'U2A5E*\"`&N,!@Ueb)M08PZQRVHN5P)hTGUZaAUE)1\n)`B6BJfhbml13!)RhLCV#40d,mYTbp6l-H1#S*qRp3-\"TMQVadk`V@&T$#!Q#[De\n-i25CkVGEpD$&C69p$m(T-T'LaempdCITNk\"U$q%4RQm&aFp5K!YRSB!QF6T6Zlf\n2-Ip3`cr0MG*m6P4A,%UL&J'(283$+q@bDGCFJGC3AeKZSr$`J#i)fpMkf1RYE-J\n8,SHXIjJ(RiZJ%X@\"0D+8P@TX1MpGD0VbYPE`iGM-hbVRK@)c$BBm@@q@FhSG&aN\nd\"2H-2a'm)hSB0T8\"5'GCF1R@9ZcXMdb\"FbB0R)89bZXf+G#KfkXF*iC9L#eSKb)\n\"&i)VQZJHkI2*Lh-CKjrLJl`\"Amp#U5!PbYq!eYEG#4&CG4jjp$B$bjkr63-a[JD\nTZZX'SXr(pVRRc[`\"5d1B82EJHkPrP!Zc0U-GaF!A9feeV8-3%f1%iR#bQ$a$qmc\n,Y,*GhZ[F$6e[ch*#aR)bq(iEkPT+!X9MSpY[K1D#&l4fIq,hMVBM%(9%DLmGGXp\nrLiB#rSjXMQT,F2cRJj-2\"Phbj*(hm0!6kGIFF\"3S4,#Qf)'M`@J!30e[CmZ)+E!\nkl2AMG&EBA!iTEZq1B8ATkRfc9raNdJI,pGX$mPlPiDhM#ZhrIcL++,XR68CSMKa\nChfi+'*+ilX+QBEJm0m#)4eYr%P#pJJ\"cUV8k6I1'N5`&HifEEL'&+B(!0UrD\"Rl\nDm\"d%rXK!j0cSMKT(rNmH5rC)!411,PSahIjkeG#&4+%@HmDe(*5dh&SPS%E*M,C\nI,)M&R#l-q%j)VFK!)0$i2Yq@plI#(R5a+TYq-L,ip(6`[!bGmm51mB[a0Xk6mYa\nYSjS82\"EbBGHIDaEN3U1f2d!-iQDIh5XlFC(HGLc%IA$Uc@f+MKKm0d@JPj42XND\nA,HPS3qQcA6jX*BZ&6rfpqb1',4,5,qIeS'%qa(IiZ8aHfU[\"(j!!k-0*&ILr%NS\n-U&L3!&$ilSRe[$F)bI($1jBK@RjVbjRfaIZ1V+Rif(rV5(k8j%dII!DUV'UZj[%\n*4hk%)6!DZcc(ad#IXe1bV1NLF@*8Kr8F&IG$(@YJQQfNmXLK,YN'$*3UR&Ar5-G\nB4ZM[cU'd'YAqmJX9mq(hG%RPPYpqU*`K6TQPcFHeViTa+CL,*q1ZN!$iRQ,p)+N\nbXY+h8'jR,TcDUap%iE[\"@#S!\"#GdP-Xe'Zkr(%&QND!`hfNliLA@3RpF6q#A!kT\nNSipie+R@Y)YZHNH('Z#Kb@6\"+[RVBXLL4-#+,!2J!K*-4,p*)3$K9qmB`Cd!hM'\n[b,Ai-+rLUh$*1FRjreX0hQ-B-4*'QA0hA\"'Ikr8c*8YlL$J[N!#d-53j0Jec-9@\ndZQbKjT!!U0eTZh9H*2SjpqG6l@H+TYfI)[Ml5\"H3!0c,l'3H-RYG(-mpp&N6VrM\nE4@250!Z`FZEf1c,fYJCi4R6SXl)-3E4$dU2h3\"P8im4j,88EY3N[M%Xef\"S*Aek\nAi!2aQ3+5N!$kA`P+4i4(Jp'pF4-j%Z-Lh\"S2Ncq'd+j@(YQfTkFH3aFJr+qc6`Q\n9\"(R3!C%EfL5cfV*\"C9AZ\"&2`HC'k8[e0*m%jVH+kZIpMjYG%$Z-l[6`%(T1B62(\niYS0V+AT'BfX)EZ`(MqcE*)F`)*I%I@9jiec'[q`VVqU+j(a6@f3qk+&-6l,qd(k\nE12p['rHF'DECHB00eVKU2S80Lj9'I@#KA&IS1J`dRG)bj6Y*$2CK)3Hfe1-D\"R`\nbC5!!6Bk5U'\"%8Z!lr'!KG%e\"q#Q,e65M+8IkVAmG2,R3hj4e`EKEH[Gr1&X9@jK\njBl,e''G,cP'0-,TFDM(d6m[bCkYabF$)5'rM3h5Cf@)0efFJf\",,T69aJh3Z$36\nb'rDLf(a$EFI+!`U5bKU8H+\"QZ&\"LD0X[\"X@P!P6(Hb-ULYE\"H$J4*X&%!#,SibD\nP1K9bT+j6AJFZ+cLr)*XaYLRlfC6`d`1M&fX#6Kh#\"RaKI)*a9TTVQ8Ujkhb#LVK\n%p@i\"`G25HYB!'!M,ENi,H-iqJPc`p'L3!+ma*m-Mhl2!)R[Xl0C[(pQP[XH!%D)\ni&RcH)%p2R\"38b#i+Be,*A`H)8mbe(fU2N!\"G@+!BYk#pb!HUNUp-E3cpDU+V5+,\nV3d(YVVKNcA-&bfC+KGj\"Vf,p3d*&f+pENd`5EYiG0r+[i\"DX%3*a2b5Ak5G%Ql&\nUYL8cl,LSB855B09(mPhJBVeArhZN@E)\"#LV1GA'FMV(MT1SjJ*JVcc$1mK+1V#J\nF2c!!jYUJ(6U''KHGa(iF%`c!86UTA1j#La)P605%\"pHjP-5YqiST!*!!5-[G1q+\nA8!P2CX)\"4p@bl*dA80Rj8#h%S4%Xer)*)jDkTZ&hXp)I[TRmBKKXF#')4VH`EfT\nZ8`)2XAi8$Ta*&&eM3(*jK9i@1b(bPrAmVK,ZfUYY5@+c3ffkC+YEFK'1Tk[BqEE\nj2b4,a[)hXX'VV*aZFYMjC0NHK5L\"9$(E*6S1ID)ma9CfAU+YkhepZ!2eIGNjJlf\nIj`M`4!hC[P+)HX*C-dMe*N5+8pHf)X-dBP%%55FF*'(LN!\"CrbqAl-)`-Cd&BqU\nVEL#N1k83#hp1I-\"p-'L[0[9IP(NapMacRk%d('AMi%rqZ`feRlSEHaH(8a!CAS%\nYqhFMEr@iQ@cEQH6@[ZMq2iqJ)kUa5ajFjHh\"lNCLeUb*e[FbUVYCZ'3JlT5%Jd&\nP[*N%NMRabPjIjlD+YZeS`q'-Yj@AU(T)DH!JArI(YjMRA,LP5XU5(1k'IQXX'R1\nR)!j5Q8fqr0c'9'QK5cI-cL(THLT(-D[Si-X3kJqFfMrIXL&$Z'XVDP!a''B,bpK\nZIP8SkKTT('e50TA\"dH+K6NKRDhFGYc%q3p4\"PaSN4e2r1KLQkV&Lj5Tf%M`0TqY\nqe(1UB3cXpqf--+!4E%lFi@($J%QPef3,XQk2A1EX+qP6$IMci1UP2ZSLJZY85Tq\n[2\"Y\"-KLrSFL!kr+b'*RepLDh,(PUQI)TlCaR9h8D)3G&Fq4#@&H(V0P1+fe1TH2\n!Rcq@\"@V#`YJ$hrpa,H'E[E1Ur4r5aA1#U\"!4#i2RLX-U1[)MaJ4Er6r*[rZq1m5\n@F8ZmNH,h@a&9'5*&`LcPGAEYlD6(plhQCXdq[8[YR(jVfdJ(5ENaBhM`HqaTK[)\n-fP6!$CV[M`*ErNq5M%JEikB,qCj%PhX18LrSL,FBP'@5l5,r6E$TMQ8BEf\"YrGj\nBJRED4kY#K#(pb#b$P8ldF6q1`hD+SEqEG\"jYIErfd1jceahJ&9`3K-HT)GmVE$j\n*D2c-&$XMq4Z$PEb0T,-c3'Z!mN4)Le41-0m((CcB[FP5Z4bU1#NYI1rG`,GCN`0\nA0[[@Qe4+[)GP2(89-@STM1'HA8LE+(icPDclZ19HjQpK1kpDNR&CH*Di&1JhIA5\nA2d!+LG2K[0pmZ-QCa(%T1)pCc1a55(HUIp8(R,pkcY9@BBlX`iH[HE!BF[Kkq(V\niH[Kkq(ViH[Kq2Z*0&b[8db[(2*c!'K5drepZ!2l,34PV,@@XR#96aN!`MqNl9T2\ni,4LF)chAGG($CApLC*ZbY[4T#jQh&[KLG\"&$1%m51,Rcq*N4EDTre3HF[hV1e9C\nKMZc$KkpjX\"Kbq(ViH[Kkq(ViH[Kkq(iqiNdA+p66+mFmR-!D&,6rAfi!rXY\"'@X\nYCDbF-IJqJUdD2$0kYU\"A2e`5pGXL9cUC*S#paiGY\"I@!UaLrZ9LNVUrEr5K&*8d\n'hq9G`2CXUAAl2-I$f8RAYr+mC1%6c\"5Q+r,K0BAlEQKRQI6QHQS*I%3A!$&e!bG\n\"hFJm84RB#HBZcE31YPeeK)BI[K#NfMHB-DiK%T(DX0$hV(k@,Pk#,#rA#f`ZXZR\nM!J[QpiRf*qr`(p-*-JHVTTf[Km!L@R6Q\"3bRD1*HmlSCid8kdX6p%h5ELT[m5ZA\ni1Y6Aj+me-khJbS*X2Bqejl&UrZB[TDZ6AZVb)d60lcXcQG9*qAC\"J1jA+rL9m4c\n1Cc1Cjl2Xm!&+m%j9YaD$AFhR3`E3E0#B4*eqUTC@*TPpi6$Q5IAVN9*VME0'ME\"\n3622-P'LZH[6ARYKCl@ZDRB68)KY8NiMjQa0rqkFH\"H)EieZ1KaRYFVq-VV*#NN+\nS%\"&-[Nk#*$JGG2l3-23UE#BS*QIr$63@fLc`GlZhCmc,$Xf%UNU0@[cq@aJj,&K\n,!m$pM#4p(r[0QXDCXG,X\"ABrNfa@Zq1Kl+I2DmZU@ia+9H@\"ceT'qH8m4RfK85f\nlEhLJGpM`6kdhrTrCe#0&Y+k!kTYarSV92a,+DI)pr&V6i$H53#(b$Tj+3Zh\"T1J\n'9%[2Bba+0X6[bRM4qZl+6`Y')MHQa`(mRh$KbALAfCGXAZcT1F43H4q`S3R)FRr\nfb+UKUT`mf92A%j[A2VhdlIVRelkG[ed!-CpDPJ1#FL@FhN%*)D&ddHhh\"jJ+VRL\nk6ZfXa8'b0)ZE0-T8are@'d'!,(lY93@#RHQ\"%9jR)k5qYU(#k0F09kGqTrI&0PM\nCBf@0PMCBfCQ-3#CJqT9*@#@1'S#YHciJ!'[4Q@[H!1k0JVh8#5A#ThfGchfdGKc\n`%MBjbUIF,R[!dl+*dIm@jiEh!PpHfKZARGGmDMR'FGX)Ta!GR`e&\"93AX1A4DNB\nGQN43abT-`&[aQBP!01(ha)@A*#XHQ-Ujf9HZhqdHJHA!BI2iSA1$HDL+j\"E2*#\"\n5)TEBN!\"[)lTBeR#*2*e#bDIEebH3!)TQk0Pf#&FAGj+A*aDV$Ad56Ck5Ba#-T)a\nNZX8Ja3MXkA\"hPG`rFUiY3bh`@N-%VEc[,i32UbU\"`r4l1#H`,,E$5DA3NkQk\"qG\n!qPa3)&AmYceRfH@[6DBr)&)&UHF\"I2*DjHc'GFcNEe8GmT(4&D0MQ&KYeRDGP*0\nUeFQSTfb[R3Cp@,c3B!RZ9-*3450'N4@MDZjFlV$HL13)F)a[SHV)NCcVXpk(QAY\nU)i`cq,'mLD+[3E-#i[2\"3KTY[X9e@Jp((YEkQ`mXqF3apA1A#U[[kE`dNpaj#k3\nGVZiVq*,49S$(%JRMHa6fP-m5ZmYmUMp9'R[LI9hH,p-6G1UZKTm[fCX8KNaqi&H\n02&E8LqH-(@cC'&l-c-3Rb16p,jpJSBCcKN0Xp#Jl+PQjkG89DE@9$U3c1fV5K5f\nel!Nk9MAN#6T@0H3*26\"eir9J#0@C%c2`&\"I8RL86f5&h04)eTP4Ef+H@SpF+U@*\nGj1G0JMc3ETPa9\"V%&%CVd!Xc`$%jh0KNmh6@e,PA-ENk0rYpN!\"AZIlLMfcN!Q)\nii#EC1fdm+fkqEj[QfI0LNB%MSK[a\"Pk8frU[+D&Lf0FY6P\"KjY5R1T`V(BfJ$X*\nrc6QYMAkYk(Jm\"[[h`p$%$rprV(0cZQRN\"XNBRQ(qq+hM'c%0H6SX!pfY*ak+[!,\n$aAJp6%NHBh4TVe#G+cmI,JDHHG[HQ0UQ@#5i'bhLfNEmGSM&q$\"Zd!JI'fqHP1Z\n5QiiFbJBU*bqjGL*LkphK&5-k&8Kc6lrGB(ajm'l0i\"jJMGDDVYX[+CG2B0pQR#6\n2SXi8cZpA$BGkMXV(b6'4MhL+VSTQ9*f%i\"DIG4lI\"b6Q'iF9*HP(J6EN02%8cjC\nHfM+8Ch&-rcMCGk5EbK8-[H#Xpf0%@hNE($6X*Cr2#b[NJIaq$L$9Z%XSqP--ARp\n3GB%@`be,Bd33Fllk%0024f(6X\"Q\"paJrq\"C[CM4QP+li+6m`Rlj#p*ad2KJ'4ZA\n5L\"$-M1-TQ+&HF4aIU@F0,RKqc#Pi86bj@hl*-VDE)&mSd2l#dZCVFa'Rdp#S(RI\nH1bU'dbCM&CAfIdXa&lV&$X!Gie[IeVIKVk@!qc0Kmj'IlX[0N`+))KZ+k`U#b#`\n%K4H#3ZR[LFAh5l,J'R5!ek@pP#MSlDlXPQQ'TVG)i,alCiVc+1XLB$*mbI&dXk[\n%R\"lC!J@TG6BY9'**,GhcQM0e)-hGL&6B0B2#@r&UKAbK$G%Gql-2qRG,-drBT9P\nDb1fcY@hT\"L-$!P5\"GHd1P9%J*&GRHkV9%J[9`eq0VSGGhJ'kTfi86jd,,Yr+,K'\nql[$r4I`ER,0,a2BRNGGaFp(C,E$1CE'@14MLlhS[e,hJeJMPEE\"8mdFP,\"'LA#T\n8bLGVhqJ&hQJ8$mh[8\"fp&d1@eh!@GZGh!lY(*N+eG5rrAU*RED1(X,rIH#'d(-l\neT%c6YPVFmF)Vh@I96Yr$`h%f![!j!ed9lA-AUJSP#mGa$`2,cY6)$c\"[X*VcEAq\n-f$G6Fr%q16!dJ486D\"@VmGX2CMXHJ*dVC&mReG[C5l%N(U!H[e-)1MFd[1$dc3'\n2+\"'-8j2[XrkV9i+khDS1%(`X#qCT&1A*`f(YF5\"FQ(6qpS0GQk,HGP88YCEDiRG\nU&-`[UR[PfSYS0%SMI4FZKHa``4eE%fj'!qY-r)8!&RPLI84jP\"!*#fN#UJ`!Q&0\n2*MYheME)J5MIMl&qF(MGm9E&&'RVQ$Hq#VZ[T2a'i-eJ[j+!`i8QHpI'**E`%j8\n+`LGe$$BqMJkB8`hID%#23fQ#b(d@2IYhYl))R0MD36m#a)e-a3'&DZ2(VBQ!HYL\nHSSdrFf0dS\"c\"(P8cc@iIP$1p\"`1-S@VGjlj*NUc5$!5br)clkk)i8RPD%P,6T&D\n-+UHEYG6&)hMD8aDHl4%-Y'0j-iVffeZN9f18i6J\"NZDe9%X#VS1P$DXrAmLm['#\n\"E[-GBI`Cc6)Uma2+N5cp,q&S#cI!SrfXm15f&ear-Yr4A2EK!ZTh5Ue\"FiL6E**\np3)&)Q$'SRjTFC8IA*J\"!U4Z3!)Q)MAj![`(`f1'L,fYPL6HKMJ8MUL8-*qJ`eS-\n`A(Bq&3R+%lqCqY0(TC@HZQ!XjV`r)TlFi[+6%M$kFIT(+&jiI4p!qFe&k!NL\"fr\nH,`XLX83[(P1dXi31-!0HA%6j,h4Kr'IjNQhb9kN)`[jZ+3Lcf-pIP(k',Zkeh`r\nSPKqp+jdQV#jM,MjjcPYL-G3qi05C2C`p-TR3NL6VM,pNZ`hNA1a(Ba@BEmrKB`9\nFR'R`3XcEXK&Blj!!NGBQaKh3p)pBB5\"-iJf@kmp60@)K3&e1$X!pVXYlS(MVi$C\nBKZb*R31'HQ*MAr%$me\"DA8X\"TV04KrjcSi$PQ&\"A,NBfecVe@%A!`eH6J)1\"r`8\nC\"GBdI1rBm$M4CRYQ)Z\"G)d+AfMj&(V9pe#LUXS\"r#)mY(1N2bVESle#'0$UL#R4\nJlS11[`%US\"\",P-@EYK3+dAiK$Tmr9p\"Gb%NAd+DhV@)I30)V9(!b(6M0D#Nqdeh\n3NL[X90mY&BLa2k-bcAIlr2@+@!\"Xh+5T(#c51KZ!r#%Id*md5&RjPfpCmeMrG0'\nhV$Cdb@&H[DX9T)Ac)#[NFbP%R8k'i[6D2NX4iLZDq94(P`%H9K6r05G+2JQI3`b\n$EYpB[K20TFSlh35cYqYEDE2G-U9l,9dkbmAh2DQSJKmimh`b#CA2A00Rl32b0\"m\n4BZ%IZ83MeJVmHMB!,E)-0$9i(RiE8BahS4K4CKF#2aS&c[IZCi6@[q33UA*a4XY\ndjCIf8l8bFDCG[`8mQ8j!#BZ0%@h@Q3b%QeG#@T)G%JC)I1DDE+ECV-CZQH8@6L*\n)-((%6kK-'#DXI&3hBP+&&N\"3-*b8@b*AiA2ZQTi-KN5N[DdGEYb!)'A16&1+i2*\npcBajf@PHE#1HYQ1eFf`aJi*D`&m9XJk@IqcSp$()*+q4Sp$Y%qL0!IQCE,G[iYL\n0@83TcS24l'Dj&0e3L\"+j4(IbNfC`mp8)B-iHE+9R+FhVRXi+h)e+Se3KbPH*Zb+\n\"KU2,+N9\"e*ai*emE'B\"UJ(dMD%4J+Nf)PUP1fJS%JL5AMIe4rLUT8\"R6$A$NH+-\nlb!BH+FjhacGfFfjm'pE29jPR)3(AQll28-b6bU3VE$,2i5UaX0\"#SQe2U5#Ti%E\n66b6bGf0CXcTP\"2+pd0a65cIKiB\"[3MJUjEkJ\"'eM95`r'S4G[r$VT0%[qcH!BGj\nJVI8#bHZFrR8(2J8N,)4*Ga38k*!!MdK2XNdUJXR`f96I[r*j0![9mT!!Zq\"kfd,\n,c,[#c0)h)dTi0'Mr3TQCZ1)G4Fp2pV&4Erm8f20@p'idL1,E(FS-&XTiPS0jNV'\npTfPC[$2GNhqphdB'eY+&1380J5mPj5AqlP`dE,&Za#fH1m0)ri3+L-'J[X#RimF\n&aeVJ03CH9mA-$KYh-G%!@@b@(e2aMm-MZYUlH8e2(`emi3m6iDqFIX0XGKbqCN$\n\"F([bTYATNNKU\"a0Ta0'`Pd@VKpqMQ9\"Uc*T@HX,!jcGT#C(3H#lQb*!!H9,8F'c\nQ[bT#PET-J0`9#d5Mq*XjZ%hVl,a#!TRj[3[k1qR(%K&JmE9K*1F-e9ar[lMM0@+\nC'+8HSBG)KIFTaGr8q#jTkBaJA)aJA-4LA)aJA)aJ-fL+*'dqZT8\"IHa6UeB,3'\"\n+`89CrV0+jk@Ci2*,22-METTJ'Xe2aS#q1NHimIq'fmK6%@'MQkq@khG@LU-LRk,\nacL0,rYl\"fMCcpP[%I2Np-1EjM)@,$6!p1$kEVY9Zr`rmk11S@pbjEk!)%iaV-'b\n@hSi!bIDG@rKjA92'TJh83,!M(LT+Y[!4NKhI1hl)KSf@HXp(2C&MGe!\"8L*mPC*\nXE3bK'p0N94N2kC@GTCP&Xi[0KfqTIRkZ5Y'S%I!YUhj&3cT%9m1F2S(+&FMIiqq\n#&R8XXikd6jG*#[8#hISSiPEQIGH$+G-c@eD,4!JZl90`0iD3!0-f$hd$ALTlFdF\nGEj-66e9aEC!!GPP+,!fDVi9XQk9DQ924L9U@HJKrRDlpGQDU'PP(Tab-8@2UrfB\n#`K3DIFQ$J+5fY(5$UK3UaiX+Rbc0fFIA859!ViZF#JjP-6(2%NUIafe(@*UZ+'[\nbJL@\"UHLZh)qqEVNT@M(N*D[m%T*e9alkLf*J30p[-\"BjTH)9iPQ&U0(cm!#hVpL\nk`mER3LHBqYZ)$8rL`@V*jfSl(5%fN!$Sl[c!19Z@DG3Mhbf9@RG1$+VFNYkVFM+\nDPe1jXH\"pLk3aL390l8ha&#V(9fSe+82%mU!EmrKlEM31#Z&%qXr*2!&@)!2b[$h\n30$J-e%[Cm'[`#Y0#4rPjDb$F,dhhNUFdpRr66dRdcPVpPrbHHApfkRGDX$\"+D9F\nV*HkV0JbMrF(-J#,Rd[+c%DPH3II#,K-lZPj3'IpNYZ9*EF@*!9JCQG4F2IE`)&8\n8QU4$p2Fq9IP[d,0kGpk88(kpc)eN)A`YR2S#Cd!p4%)33'jX[rY039H9Ghh[c%b\nr-q!$h,KLQ\"YcK%aP0Srp(Yjk4Y*r#+paK2eIIYRfj03d(p6('NDfSGlVe!M9ZK*\n5KTEJc1\"3FJ5bM$@0\"8J[R%eaGr'+JHD!a6@pIchF6AGC(FJaq1Ib$,KjJ!E'XV%\neKIh!68ISi6LVLLB-&J+p2eqKTELdLm+DT4-cS59!R\"5J8KcpGN#J1XF4%QU(50i\ncqJ[Nlc)SB0RPU08Y&[TY9@5ZUY`@\"p3(+k!d$L2XjjX##AC1\"@p*#+28Y)PY*jH\nk2JYN@EX)h#[NSR84X,k19palf$k9f6Q!kKYVEM+!3c$++6Tm-&9j0G(d9J&PmHP\n*!mF6phEkCVQDi,Kmp@0*QMa@YD+Ee8$cS9&UjRI'dfM$GIhDAr(TjHVKm[Hp+K[\nqcNCN)-RK)0mKF+qiKHp5,C*Flm!X!alD@EZG+)#U31J3kl(VRGMiKV-R[GdY3(i\nDH`3L&RQ(G3$[(aY1F'0I3*@AVD6XPZ+[%0cP'dV-',+E50aX3eZ!5'a4aaTk6D9\nG'(f!A*!!5Dr9fQF5r`8d3pkpq\"eGV`V-HUiF&)2DQK8mqRG`ArQdZEPUl24'-aZ\nYjXNJ,`8eN!$Y9mYSl4kRQTdSpP*P9'Y'VeViF-U$5LF4I1)A`TV-&E@N!Q'!F*,\n0qU[0TD`kRhZ(H!+X0%)X'I@S6R(j@6l`hDj`bR&fTZ85(M*GmD+!p2%D!\"*N5f&\nU9Sq@@pTcmUF6RJ@DI1aEAXEQlB$MF#Q2V0E1l4i++8*R-PmEleGN0h,6##GbSRK\n,(q\"Y!m[b('!kR0cc'#M0YCfBSN)0mKaT@CNE32pRm8Z$C0h)dHTB)GCK#pGJ2mJ\nYblm0SHPX+qLmij2r%Eqm4H1$(f0*$D8Z+4f(MM3\"'Je,A!T-b5MB#l()&Ib,V4R\n)!3'j6bNQ6UKPUGQmA\"HpVE$qjem1A'c+U%&T(Tcqb59%!#$BTP9rVIc*E\"V6NL3\n,la9BVFk*i%D4GHTefm`RdSCjCa%e83PJIj5rm\"+4+AdA0Ka0#+TaTANFFiRaJCS\n61Uq'+Faf%Y3lm!#!K'rYT&4fhJqbr\"Q1!lk4c@pX,5&U'If8+S$B2GfdRlH0J)5\n&I2I%ic21RcqA'Y5(@m8lJPrU%+TPPX&!`fJFf$@#DGP!Xq[Y0##Dr#1#j[ABlp3\nm4mq'*kG%N!!D5T*k44Nb-6cBh*X&5qM\"`Fi[jGPN#dbd8,1$jeR5L$e1\"KijR6k\nV$RMrHi'@&k!43!5#1eV,Z@*C,*B-%-TIULA,9N3-A80%AN-jK$'F*b8k89jZa!l\njj&C#Ra*T)mJ[6[#haCT4h\"3Yr&Q2I%*&T)8&XA2YNTPkJIS,d9ME3Z9qrA\"9Cd#\nl$N,Ti6jBb\"J@ZimlANPMpP1-TVMekd-`Xl[2dU#'GURZ[d@!\"CNcJdR&5Ej#d[-\nf-JZ(XjaR8-\"FeQZC(&I*V#Nr2aA#4pj'C66b8VacIiCJUFH1PM-@2A!kZ*YmYH*\nZ4L1&5cI\"i,PGcM&bmSi&-``-a1+mKAcGjDCfZ1PLk)JQ(pkL-$m[P'9+Hh!+TMl\n(Q![Y&jl+4iRaZQ[\"$JH4h1ZD6HIf8lNTBf'*YVBc&-,$SlkE,044!Aeb[VX#+j2\nXZrJXpl!Dil&ApBY2YhNd\"1k#H2V6314,Aa\"i6G9S,\"pZI(`I9&`L@h2,j&-1@pj\nUm2&q!`)T11QB90*q-dSh6haIE(61ZFFe-CV,M'PNp'FN,UV[pCMk3L'-L84Zh)d\nUqiX*lN5MlQ((K&Q#S4-KCJA[Ppd0ImijiYcS9NDJph!bb6EX`\"GCN46a*C-h\"Ke\n6BR'iSDEa-aG(C(M'H6`EUQi52SaTGlVFSImE4m8)TfA9j+l8Xb4VH(%Hd%\"#j\"'\nmmGY9P!$+ch)m@@04-4d*NLmV+l%JY8H,9Z)Fm)$Ip(qrC[VX,6JECqrY2m2J,aP\n,e4HPL&D3!$kZ#Xkb+Y-dGK,r($4f0j`),)q5lrRa!iU@M*VTMqKUlR%5k6kVFGk\nR45i@Q[5V3Kri8%(PrcMcLp81H2-1(C'H2CdCFGA@b'Y`IZ$J&Njrbp0)*%jrTDG\nVIa`aEDF1\"S8Y2qqh!(pPS)bePV,@@XL5A0S\"K(p+3IYIFf*N+dRU*5D*C%RbJqe\n@UZcST#8Af'3%EFfaaFe9acCR%MLjrhriQ4'!2kP@c9`BQ!#C8)'%M6&\"D5B&alE\niGphNGBhDmZ!J-l`pi5M0C0Q0crBb(M(5!'UI(6Kb3ar[Q(*&4k#)FN-IljKb48H\nJL(*$(qqBHc,)J@Je5'mcrhrp#Dk#3dBp9$ic![`[`Z5BlYBK8Fr#IAXdjD%!PGj\nGLQfAl@%4HU,aJkeK5DRlkD4makSb8%4CM'!&q&q&q&q&q&b6*D0ZD0D!mh+)C6@\nfi!bBfa,+EC!!\"9XMR'QB+K04B5JZUFNRFce8X)LUC1kMNq`dC&hdjQZjY*M1-*9\nS`a8IUH&pi3LmQ9-L$Hd3&3@bCbXEXE8+(DreSN5S39`S6YLmVi$)r`%PNTq'QJX\n(,@llT0A`CG9qEfKqNkSXdN#kLla'm`biUp(J-rj3-\"GM91-6j[!bJhZM,bCV4Qa\nU58K#ZC!!NIBHR,m'-f+eN!#kkd#8BimjKc8,C*8[d6AD,)8rrhrhr%r@,rDJr0V\n6kcB4j@rY4&U*-mZ\"kN9Z1kNp9k[F#2JkC\"3paiE@1XB+Bd3iBI)-(''Y8+G9,AS\nrf0Qa%rRidm*\"A1AUXB$-X&bJKkd[f1(DmHcAZcf&lbe@X(@Mb#B2M&20J*8`5+f\nZS+bhhS,F#-bihikQpSr2&e1c-VdK8M6hPFL*\"Y$q&1d896fMPELkka-i&Gqr(Qa\nN`pdqYlk6C%-M4rfU-SSV#1G!Jj[(k@2DU'ChV&cR0C[b8a99p3FDi[T8\"J`qb'2\nRN!#m@P!YZ8L59'GHpaLGYXEqmi!V!&T1C+2pVd0Jc`lQC-$U6!UR66B1@p&m99d\n'6BC3*lJKbVrU9,%Ih*4%@d*6K'ecXrA*ah'YlG2Q(&d0d!1GNmI)$XMTNp\"5Kb(\n`elU''[3Sq3Qa%a*EeB+eJV@#YB+eJV@#UJXPRkM!IAhDcUJ6)eXRXbHh(&Y#`R*\nap(GRG1@6FIA9@k&#m,A`5cfe%#LZ,mNL8pV`KCCcTBCcTBCcTBCcTBCcTBCcTB9\nH+)Bc5cr6I95P)(293PDCed9l!C4,FXHTidQ(1jHNk#%[DlV69[FHr*Mh-*f(rFN\nU2&1l09%(%#SZqYFR3i1#@b%20lG#8HL(R+'V*EP'&BUYY3KR5qdrZ-rFh-PTUrM\n2NRa5'VGkemh,9I+FTPMr6mak+YDkDN\"pp[F&1'@)A,XHI[VjkR*Rh@N,DH4Qp5#\n`e!kC*NXkMaI0kJ2c@EM'!m#QB$8E0`h4`8&RH#8l\"V%AGTrcG@#A[628FDVVU8V\n%J$9bbTDjY'V1ia-GV&-FU3\"!6V-#q#@)U(3i@h66Zkq#A$`CbCTTV20(3bJ)F`4\n`*GR\"Fkca-QBFZFTP!SciNdRPlSM!CG#4%XU9biNb2PXp),a[q&T0AC4da+rXem(\n6V6`j08m1ie4)$G2FV40d@#U6mEGqUSb,#frdm6Q`M0d3J5Q8V&+@-5dq8M(U%mh\n(p,f4U$4CB,Ykc8GrmGb!cA35Kq'QTIBXhm,DA,(rI91SpA%Gm\"FRRV$bJbr[2$$\nq\"4#GbKeA$XA'c3kHVqKU%1&HJfdS!#T#6N%NR4kQS&HQS&HQP&#ZKFaFj0$+k%`\n2N9fh63l3,[ZZ)XN)IFC4m[d2EGDfArprr9!$@C-`$Z-6Z2\"L+FI8d),J)K+5hpd\n9VTRj*I'&2k5Nd3Ck'`3ePVBDST@TbIMZQCF9[jJ6F('68jC%LiF#k#KppY6E,iH\nRa)%Rk`303`dU(aQ\"IKIKJh6[EMfeNUNTR2llFhKh9J%rmT!!pRV[Vm\"XN64T+Er\nqpmJ3,JJD,E(aYTkCa3dUNR##4+dqc+'Rlr#QAB6*-R[!AMGCdk*UFZ[2BF-%QM'\n8FYL`j`6P2SjmVZ(HTji0m%+LJfR[,1NN+CD1JA5#Xbm%Vc1[A\"4L$+I@q%UMdpQ\nQi%*!@ldFCL@P(q\"I([TV(Kc@%NL(6eAeHY@Q%)UDUPh0\",DMmmNIV6qiNZTq0Jf\nTM6BJC8R)plEHZ'Ja@i554q,Xm6M(6[XL4ck-S+lQM+R%[0GkTPrl@ihZ6[(K'DM\n!C\"qBC'G#lBKIIVL[U(B*NBVM-Y\"GX+V2A!9jI'RGmdhNl&j-jJIp,Z!CAbT-RTj\neT%8@ArmV@N,`4clIRFM422p2L9&-rSlqk'9XC8aRA!L-I([`4pA)\"`qVZkdQdGi\nAM[mjA4dPB3Gj#r[-p`BU0PX@CN$3!`CiCrq#\")6qTkrSpJK3Z!X5p(Kd$RIEKRc\n*SrA8p15cGHY&Mk\"S4P*5c2#5mHfkA4%,H*cY&qH4*iVKibbHqF1U`Icd0l#(F(H\ni,[B*&kl3Pa0L!00X%`(H3DZ\"+a9\"H@8XL)r@\"8FGMBY5X2Y$8)*S8h4(Nf@Vahq\nTNHe'TH\"58S`%UcYjBF'j41YN)eJR\"MmV0hECa@\"'D4[fYVDbNH!f2VDk*a3L%@T\n($pmUqAl9lF[dAV3k-Aq@)m3[V&q5QH5QR2K6RFq&YE'RHdFm-EV5d5IPGINHhhZ\nXXp$aP\"c8q&&!k[5M[+!eH+bVA@Qh@bbG4RFXqm6%YQj4G`-8\"a+&d*chX6cmi3L\n8eB[Z64TQP*-J*aRU[r2(VZlN(Kp1D%Va#Bi%RB3LNk%E,*!!+BJ(Z#bK@4kP55[\nplE1#([*&2h@M8hMQA6-iS4-P0fXq1L5`jiVe[CcIaClSPj3!E6+'hM)Ta(Hf$&\"\nh1SjBkMkiA9Q2EZ@[mS%-6Rb[r5S\"Pi0,0(!@T3EE3r)3DC6'CXra!DCTH12cET&\nT))ET\"TA(aM@cpX5mZ,5Lp9a1c8f13UZSZ8Dm,@AAY!3&1q8US`MY&1VFhRGZI-N\n8lhGV&Qm&$f@$eD+U88rEhA-[b!(JaMVfP8qDhQ&XeSV!'k01Qk,)jk$MjA,LkYl\ne6BE1C5!\"P#&Yd'EL3R,59ef@elPZ0!Bb4R+3!+lX5!*(jiq&-FfG92ER1q#,hq$\nN4CDNiV[`UX9(IGHJAmLjT1h0Bh3'Z&)qN!!r9SX8BVL@`*+K&dS&eLJ85J!rU*R\n*UCr2\"5kS1q[3plq&&EVZIA4KXIUm@jLmI8b-,qmbLdjHJ#VjI[%X1kZ&1(e3jKN\nJdJ(j*ab'cC!!N!#1e!-X2)\"JkYFlJer08R#UI*NGGX8fp!ZeH&6q$b#&3!b%6X#\n(6fp+b,be25AIf0X&bN*$6F2V9*LQeFE2m2RJ'T!!6e`48Q*%-F6Ta`8DcN&K'-\"\nZ(,i&NlDQ$Db)VJa4[X5K&Mb-X$cJ2$+IV#pqD&b629cm-cFh#+*8@Y($MkPSHi(\n43*%5KFHX1\"YCEG!qXPSAk+)aS)eT1D\"N5T@(r$Gj$cfDlba1JBI\"jQG'%r@HRPq\nQ+pjDU4r%+I*cG\"9lRVSTdk63R'JhZ0Pm2fU#KTfY-f+IT1Hk(RQb\"'r(Fd6r2UT\n)(,29fH6@AMEZI1UaV8MMA#%8m1DT3jCVccQihFpUSAKmkdkr$`*`eH2MVN(fC3m\nb\"`CJ*DXT`&S`HYpmTKHqcaM85),Xm(m'KhDKfK,XS,59iLTHb8HiLJ+!aqDAeI#\ne\"XpmVHQ,JL0aDMSL!fa5pPPYj!,M9`ac0YUMD)T4ST2VUP#@ikJ3miC&dNK1lkD\np)J(+AArep&)0[MjEH[mH1Y!iIHN+bbHQh+QKMf!QGl3GqCa0`d\"a,bLD*YCEXK`\n,c#hl2X+e-q8Kb06182pK!`+4ph&l`0ZY&MIbKmTZjai,jf%N9d-361&QS@#X'eM\nkEE&Y3,-dG#f53SJPm0`!*5h*Ua!d%I9-Y1&HE13HE[pr3XGebKmd2p4if!hK4h2\nMP)\"GZqiEf%N46!l(&8S9J5!N\"(\"\"aiBB1+VcTiGqKSX(RqeL40Q(5EUV,Ef1&'Q\n$0Jh&ed)&c#e+Uk)6(LDLR)G\"$fHKY853!$,-RJ`@)lIjm9*RXprc&0k)#kp5*4l\nX46l3H0D$aV3H0D3f#I`dIaAaH0$Mka0@4JmQY0KG26GhPch*MfAlcY&0a-aCGEB\nG(L&UpV'BNQSHaTVT!JPrqAGpllj'UN*%-\"rV)EI9H1G99frf29-#aleA'eJV@#Y\nB+1hB0B#YB+5lTDhV#')PipU-K5Sf-0Ph0Vqi&U0dU&+[IBfhpi\"XQcL*Z8lk1&a\nG23@RqlR0FAd!1Jkj81m80(A5kX4d$SQ-*%[SaGMRAN41k*!!2IMR`cR5`cR5`cR\n5`cR5`bHVZ58HLjGD@'@[E+iIiciG8T`8[@\"6)$DjNi1HKYbqJQr[jS5JQ$0#QHb\nQK)MbcqfMcIprp$(NMkp`b`G@ZIDIDIDIDIDIDIDIE21da-e+lD2`CQUFAYVhNSj\nlG$54DIN!@+eQTA44\"eZ&rd#!Aj'J-,\"TK!BN**ejEY+8fEfX1N%[MkrIG$6dMR@\n4f[FEdL@9hb9DE@q(+i&%F+9bd(BTeR!k-2QY`&f`E6hUhCpEF&%bGHir2%IGbZh\nr-D296H&jVjCp,GhI!mL%L%JP9c@eZf#(Er*fQfDTlm(BTa!'`9kJQa`jB23METh\nP8Xfk,&21JJ2E1+DU3Uf'0EKAF*Id0A13!)-!bh&@!h4CaH%IQ!'#AM%Xa'hQ#lJ\n@N!#Y[kFIYSk%m\"KZkLS`4cVpIQ0C'@kZrh#1!i[cQmfGqGLYlDQ#`M%piZ%9hEI\n13qheQQa0`(Rb)3Q&K$$A%5G-\"jmL%&%*NRHl2&VJLLq\"qjF)fSa0bFNKHG*EK!5\n\"(ah`SQG$24(@@Bp5eJL\"Bb*VLK)#Zel4)D,!i%YH8p&H*N'PYhe3M3\"2Bk`I#G4\nAIR&`(,cG+JZ0%h'\"@jTKjZDB94Bc#hY-mh5a`hF!hCV`ha2l`,l\"3Kh4[lT3a\"D\nf*q6lEehaNGmCDIiGMZd5F8\"2bqYYqY,KqMHN(Rlq#CID025dXClj-k(P'E!6m$P\n'bTj&+b0IIpPJ()eYf[26TV1lG*GFHIHRJ[1c2(2@4+!D[YpRr3@U0[`SBfa[e*N\nN)L$-+j+I*FKd9+T8kDIFdFr`%ES\"#M-`iY5lJLl0)k9kHNBF31[[@G$a(RQ+PZ5\nBHN(%+PR%%J\"#T'i#pIj63DR5Lb%[bUXdCqXCPE4*9\"GDc)jH'q2\"dE$q#CF5Y4F\n-VY(hbiX$Af2Ti5!j%hpJ3c8SfR0MYhDB)*DK6E5ae4kNhpk)M''mfD@@1GP0Qm#\n8J6eFd`N$ZbTBS9($V#5hY(V&GE`UI'K`2pV08cMhS)\"cdB!E8B61iYpC'jhFP[3\nKXQeBm!Yi),(9!02k\"$Q[e$Lr)NDFTA,4\"fGp4j5FH)C-mfaZYU'C)$E%lQ6GZZc\nLQkV6(6D%LLKHMfVa&k2,d(VikV#\"i[KY8Fa(FN3**BTRk0+V15'(DiH,SjpHF3l\nqDB'$,`QQ5Y!rrZLIS'0NTPJ40@1APl&#MUGb[ia@'4(r+#C(B,,I[$lJl'GFSS\"\n`+-*edjLQRi[JIYE8q`XU,4bdMR[Ibjh@r-j#q%Z0Sjqr+G@q()l2f$5$\"ELVc'U\n(-1T,qS-CQKG'm\"3IP*CKASeGe%9!e,3pGKa,r5F-TNljmUaJRq(iRipB'rbP\"+5\n10lhTK[%l&5DEI8@MiX3k\"5)lbClQ`m-EXTDdB$fFP'6h26qYZlBa\"a(k%F(3Z`\"\nc!,l-lCek6M2*Kkbi%+IYI2LiIffSdRUGNVe+S[('\"K*\"f9`r1qp`J4G(c0F-!Jq\nkUj`8E*M4G@C5)8mR4D)fiKbCSi\"CP-F!\"`,5)eT+B-BQ&4+k$l+$IbHTeVa2PS-\nJYa9HTcPYTeCGQ56K+I'(RqdBV[mXC21MA[JS01ldUiYUTbl@mGG0\"$T2TZX5ECe\n,(ArI[%r$)C!!mr$ldCPCr6&P#dXP+,)B+a-i4[ZkIqlqhRL1+(qXYdlJ(fCCKFa\neUMVAPGj19H5pmTEY+6HVG'&0#0VG\"'3p0YXqcS`f&4)H''DIV0SFdlMR(YCT)Ll\nh1('S8bkmDPC\"cPBQ6fXC5%i*pEIHm9dmdkG)Zm@+dk-bqp+MbBYF`E&l+d!5'mD\n-XU`m0)Q\"B!*'ZFa$AcZqqEl(mSaPTVM\"Tl6QldRG1Z5),58K',UZ,5TT+JH[S,6\n8!q,m$1d%%QYLqIkj69e[Q4iZeTjGj,3eC)&6cUdX$YTJeI(G8kqE!NckT!k(2cL\n2M!5XS1qqm4I54AD!qj,I+JAJaXK49a+F)LK[@0,+b+9D$Fa&BmfArK,1p&l6[Ia\nScd9e9F)+-L#m[N\"1DT'Y5iG+Pmm,cG9M4'hLSqC,[BJ@rh`Q1kGAcpH50BC)-rG\nZP62@**U![LV2Jp%6CSid5MVDqj)SZ1REH+Z@Z9!pd#m,+&!Dk[TX(N9b$\")!&jJ\nJD*r23j,(QEJq9\"Z8!0'0EZ&BZ8cI$jCa)m@-604-%&KRBXb%cbSeRCZ6K,&&RLB\nRjm1Q4Z6\"-PHUCi&`4,,*,FTlYr''!-QLbK&1rX\"KBpi6B0))GHc(`,0`q+DIXih\n\"'K(-A0kNl%\"Z'@68Hkq6@h)[5CHd'Pc%,qR!U8eR#`@(lkSdL2pm[@DU2YlI\"M1\n2A8[caM-$'PSF#mDN,-G+X85af'-6)NPbD%6*C3M*R$bmIrjGSDL'!arRc4f1(KN\n@SI'N,H8N*a3&#c1X!r'l&c[jcNTSeUM@SAjDVScRY4M!(\"c%4`c-I`#2R'-\"D,[\nb'Q8BKeYQ!%T@)6X,f(5$GkZL1N,Xj+%G584FAVG)'MI&qMV,S$a'GE!5HiN$Tpe\nhZ#(kaQD(0(3@GeQRS6(jpjLReblpH9'Pr%V%$&%2$F#0P$BBVH!XHY(MVR$LIir\na@Bp#4[Y0SlL3!&'fNrSHS,JF*5(ZG26A16-Fe[E!-8G$IqhAi5,B5bA8h!412QD\n1A3lVGM)$rc'DEflG#6PAp9kY%2!mU%RZT@p$Y,k1djI0Ni'1'P(ZMd&ZD6&5Fr5\nBmSbY*4Y5ab!efK-N&%2Eap\"RQAqGT$EhaIJS0`BJd6D2q0IdQ9iNl'j)eXFBYNP\nSmd616eSh`SKr6eB(!`KVV#)K8l*6ED+)Gh5,55Mj3r[$lbXFDbe`8eN*DY!UM0p\n@DBrIGVhR!dUGeM#,C1qVXq43+lS9qY`&[9*P9dNFICUPqYF*BF6pQ`1-m8p2m4Q\nl[B#1JY`qfjJYR`84UYHR#2K@qd3Rq!Dk)fh1H4QmZVm&Bm',fk@3!*rZ)arPVZV\nkT+C`ElBVk9riLc6eMDTVNrQ,dUiCY@Y#($RVRmLD`LrN\"GAlEDepM0Al&0UE8fh\na5q2RiKf3!&!R+Ge-S@SGXB@Lq1j(8a+P0idfC'%%!kldG4%H@\"A@D&!ch5*Z%(c\ni+BbilHfBbpX8(Ipda%3YE9(fH-1UPLHE\"j+emUBrHqq6QrmB[VR1'e*p$RAbY6(\n`IrUT!2%CB[CJK8'ZJS9jT-)r*3I@'R0mEENNNNNNNNNNNNNNDrK3,(Yr(Z,dE-0\np64&pC[$-&,#K+',a*fLrJ1A$'$c8XKiXb(Lc)H,-KiXb(Lfp4QBrrhrp+$LZ#J`\nN*IaH\")B@S5B5#JLaD`*%JpbD!N5%Z%-UMr+qS&rDXGpYdAfk[Ae+4r#`YqffQMj\n!RlAApZbpp9jhe20p30b[U\"EkP2IY[,pZN!$qeA2ffhr`ZYNq3*qTX[Ye&rKH[kR\nhp30arJ#r`+pqfd2fk1I`+cpYArm&HZI8#I`FElG6Ii@Pr#M3q*N4IlqX5T8C4,)\n-*A*m&jra(M3kU-b-&q3A%NB6k!8%qJ&\"2S\"36k!8%qJ&\"2S\"36k!8%qJ&\"2S\"3G\n&IfGPArpd6ElEV[\"Ad#!0D`Li3,NARkG999999999995cp$rZM1T-c+3UpqPckk0\n0f2lf*K`p*Za$,N\"Er4aNhN,EqYMr()0kcCE`Di9eEG0@@6Ppkqq[4D*ZBj!!82f\nU#dc2JFDCZ0`NQ*-5!@A`TL3p[ZL-@[3@!R%kX%D%!!!!!!!!#X',#62Z\"*0KP3(\n#-[pI`Ur$)MJl1kKi$MNrGH&m51dMA6kXB!&#a0J@c,+&VN),r00#')T3&!8\"3SH\nB'E,VAKSS5aJ13GRE*2Z6bQ%JT$L(+!GY2'Dq&+Jc)RY6V!#%jB3TU-%NGD9PZFS\nD4NkULiQebd3HHprUj9bPMq5V@J5f,2U05CrP@F,80$Z!5(!B,b+j3$hQ'LMpR(L\n+8%#bTJ[b8-GRbBH+(e'ENRrccch%%4X2G5MiIqV[J%NCd*e\"cUNqTXFPf1)iiL#\n&GN,b6K(&G[66MK'(PMB#NF9re'N#b*KV6#Dk@6'Y$A[4eJKDZ9'GJGZY'JpjI#S\nN!dVr+*5-%!TdT[56Y21)ZViNkV#V[@#a`BMDc[50ed$A@-)pV+#U42+hq,eL))P\n@Tib0-1U[-Hb9UeRL#%X`P[8BhRi[2iMr5mrMi4Y%2e0ZQLf+0b')fBcbVR\"KD8k\n@jHCZkNDI(CPpEDC5!ThH9fQJTR``%41QCj)iZ6b#5bf)3EYJcVqMmS(J5,0YK*B\nNQ+6Q%%GKT46$@0[DbfN!2\"V3)8h%M@E*I\"&ETfG&F@F8\"FGeY-(+-(FP#qRYpEX\n-6+%H!fY\"Ekim1XY6rF-k5EYP'hY*dr#pQ'ZjSJAl%XMVYC)*+#G8\"DP9bAb8&L*\ndqQU-0!%RpI8kDm9P5pDU-EGP'0ZbM'hC4MEXSaYf8Bfl+-EGP'0ZbM'r(-E%IIp\np6kcr4MU[)b3L-MPeqS%,RfA9999999999@ViQ4!mNXZcQ-Pk2h1N05lr&,Xdc'l\n)+YS&4eH&ZD6iB0)8dX8#E9*2T'6$[6rTYB&)2+KdV2kN5aFpAZFPp!aX1*!!1`L\nSN60@rdr!md)f-JeM@0BeM0Il6N6CddB*!!!!!!!!!!!!!!%A(HV)&5,EaAc,8CU\nmkRkN4IprhI+#H!lr-VH'(U5%!%6KLd\"6XY(FJ-!T5eL5diHjC-!iiR&KIU4P5+H\nQ59!je)B9YQqIR6ka28I6FkE4Cp,XVJ8d3d3d3cIc\"4jMY,B`kbM!'U%CQb'44([\npp$@N#lBh&(41Vk@l-EXaZc'f)+[PJ5Z!rfr&r!G`FPZD*J#HDN[TLV!4)Kr`104\n6N6-Z65C(kMV+BBiBU+[9b\"P,T`d!!!!!!!!!!!&B\"H6p9fh!,!i35'*[+@5!jc[\nkYJ1NCjiNm(Jm(Jm(Jm(J2H+`9SK0\"iBmE8$P4dYKRjQ#Q#lbN!\"c4QQ-Lj!!Prf\nh(kr+pX3%5mL`MK8Cd4HC0-5ImZqNeGrRUq*1`[hcUE#rI1TX,pmkQ`[hcUE+D*+\n`Rm8CJr8dA%L[q*N4IUeF@ZTI*1jNPJQTLiqHk![ldPSGfU(QHMapQV30+eS(`mA\n4U#,UV2M0EPU+4f#L@jDLNGJSPZ@Sb5brqqm$1C4KFlTQFL85P(dqGVFKp*4MD5Q\n,8e4kF0Z)Z(4B'\"JC6!i5*i(J40$@Cf8(IN#jY@3aqQq!YC8@q1A4eD5M#d(9%Yq\np8VQC4#E'NS`k8%#lk(#h$-M@h[f'k3$&C2B#DGiVD!D2-,LaCh\"i0F3kGYIc6K[\n*(D4jjl-L)X(M1)LS6!#9K)Mc2Ue6,BbB-eMaCb\"i0'81++k6m!I$KAk14Yd56Fa\nc&VL1MkH4KD8q2)Yf$l!!,4IIE1!cLVlE,6'lHhZ&l\"0d99Kq$5a\"4m(f62hAmK$\nkIIF@i)V,BUpkDL\"QJTP$QTQp!,YKDB#[G(+l\"ZRRi8fPMDj-2Z&hRbMBCqcK@3I\n6mCeamr\"*%Z,@+AHqem1%(TZQM$'PFk6$3bHGqEV0\"#3T##(CVZY$qmm2c519bb4\n)20JM['lQVC6$95-9Ihj\"eZRH5-I[@23B%XkDqPI$1Y8(iAG+b5e[9)c\"%3X[Xp`\nhk!F%#Fm`FVrpXKide8LXEFr5r9'ESCRLjfm*f9AH2Bd5eG4RbZL1+kZAj0!%V&p\nR@mqLAq,Pm!b%NY*U&80B#9dEX!C!M919ZMh0c))e1'9B@4(lDUcc!c*\"j@fCUd&\n'b\"hYG2MpVf`[k%N1+ZIVYRF1*'MGqC8UU8&dF,#Tk)4$GK,)#NdJ0l+`%HFlQ!l\nI\"(DU'DLmICpNAK,,AU%P(2D5i$Mf$qT\",Q2M[(U*RVf,l6D+XbU'[3,E4Q@0JE!\nf\"X$Af*!!a%*Gre@(#)B\"!!!!!!!!aH`h[M5#UeLS4H96kpj+DF3I4PifrC3'8@L\n@QiT5FGUD*kMK(#1%F)ikrC`bfr!,iJ,(jq!%2[-5areYZS*$U(CZS1(,9)XGXi\"\nj$JPZeY1Td4ik9@fffffffhp*K*'hEHAZR\"i'G%k)bP'hCfLb8pD5p`Pq8P2kA$6\nkEPcRLp2r@h(q[NEY(kTlbN'6r,5eJ%JfXE1lk+,Mj[f#(Ic'K2S1J6k$S%qJk\"2\nS1J6k$S%qJk\"2S1J6k$S%qJkMj,rrGYLSh$!`-$!`-$!`-$!`,B,'LESj'9TP(3J\nf$B0Jf$B0Jf$B0Je`q'4Z'\"JB'\"JB'\"JB'\"JB'8`2rY!erhrP3em51,RmrhriQ4&\nr[kP9bI``4q1rP`jBcpk#I+d+&UYq3A%NB6k!8%qJ&\"2S\"36k!8%qJ&\"2S\"36k!8\n%qJ&\"e6R%bY[2rea*jFFC['2C1TRJef@\"pcl,UUUUUUUUUUTCmM-A0p($6-V9!bS\n@X8P'0G#qpf*19Dm\"mjckDHE##TkR[ZaCfJKe5r2hmQ!%ZpEakl\"!%J0AH9cNYN\"\nqK$B4eq[Kl#[B,cIVb5dGLJUUIc334XXb2Q*3&'cRSmQIReAE@2XY402B883!!!!\n!!!6Cd!&VrA@j!GbdJ24d'Ra3BY53!%VfTVHiT0GaT`T`T`T`TY4-keDfP\"HLUR9\nhPYcRGY91DCTQQEB3NT+c'#Md-%q`A%3Z4`Y\"j*******(J\"hlpdkHkRHej!!!F6\nT4Q$UeSSKQ!I+@4()&'(A+pK,jcFV6EVbifVH6`RKX#G-#'0#)i2S2q%V61)pR0L\n(CbidaX22iTlLp,e66B&5#bESfSS3\"lf2X+C4hrV9N5e0Lm+VdbNr(P5,XjqRMEm\n*bGI)B!P,YP+9h(k*\"+,*8QXb9LI`[mhVZM1&4r*Qh10AHmZNc-Iefjli@*DqVf-\nqq\"UF6Lp*b0b#N@@*l-3Hf&2G@GI`UeD(MC!!8MkjhbVEZEIGXjRrDi3fDDfdf6d\nIYPacm4iF43X-3H52hjeeV8XSPDIR6X@Nb,`)YrV2T5MZBhlK5fAd`92L)FfM&V&\nJ2jJJJm\"J@PLpe)i6R+HmPC[q8,dp`)Mi8AeG[%R*dAqAf4C*hFA`EHAiTEFdb@5\n$!TACTPZjASP05D6VDA[*5&Mi@LmhifXm!a8[-B)iVqeE1,q8VTfXAC(Iq&#I%r@\nmNaGi6[`\"X\"5H\"@bp,R[#ZNPIhATHSC!!VA\"[5p3b&Di0kAU'3VA\"[5p3b&Di0kr\nrAHm-rhrrIrfV5aE$L`e`*h0FP4,NARkG99999999999@XmrY$M$Dj,p`!XSk\"Dp\nV#-9brSieVEJ1C')9Ci9Ci9Ci08[&4TB*B`a38k&$FJ+(*%[iFJ!'%K,FrHlU!44\n1VN$r(Z&hkN[&+qh``PJQjl[GDc3Qkf8!FN!!!!!!!!!!!!!#UrNcdUEh&&ThX@G\nkF@9F!M*TQij)*`T`T`T`T`T`T`T`T`T`MU@r[PT*I`iM1$GV60+jHF'%+rFPbA*\nAbG&MU`EU'XDGb555555555555555555555C#1#B0ZN[qiV)HrGXQ$fZ\"Y$mJc(X\n*I1EPDFkFkFkFkFkFkIIA-ePU2P[Zd4-IcLe8\"8,#dI'JQM9mC\"FXjmX4mV,iUVD\nUCZVDTBkIepVMU9flrSiVTBflFmV+V2MbYfJlDZ)r3,P6$Z(*k9!&QXIbR8G4e3j\nM4`e*5-KR5LP8!!!!!!!!!\"SSEjVMbTNeP9+Lj5c$5FlY+rEq!,q&Yqb`*S4k#Ip\nR'-$bEGflYhEZhJZM4`9p5R1M(`28FFUF`4S!3HqL85fcqhj2`H&6[CeINm%b@1G\n[p6ke!XY[l`J!6-\"-\"rNHbNSH5l,p$L@M62kLIB*pJRf#IB*pJRf#IB$PpK0l96S\nYi$U*$MBfNXriQ4&qURZp#p\"BLG2TUM$3\"*rAe1Q[&C8[@UM'hC4MEXSaYf8Bfl+\n-EGP'0ZbM'hC4MEXSaYf8D6l*4rpl3,J``d3UViFL8Sr4,Yh!k`IVY%5U4Zi-M-!\n\"-9pYUUUUid(S$%KVhL2ScI92r2Yb2EI[mNCBd(2!0bqqcGa$Cf2&V9#,c(rf*kD\n-)'1UVE%0(UK5FLZPjfJEMq0TZ5V@4LXhMjL0`IijJHb1UAHQXah['a&Z8qJ&p&L\npje0dreJV0G!C'ki$BM-,[1N2P3Q`,U-SHd+Bd5fBq-9Mi@)@r)A-4-@NCLjfI%)\nb4TGM,qq`DCFDHRXB&D[Ml1$3TpF(8mZc'Bc(+pFHiQQ%bINJS8[TQ$l`GDd5AI#\nd02pkkb)@-@%(ddNqbRZ*(CkI58-3*AC4#5m[r`@0$+Elre(3S'h@$Xk`&fJ3E3\"\n%2QP9+!d-e58#4MAhTl2(U9!4iLFSq@lQ`%%E60Er&i[J5PEcD-T[q#$A5@'L3rl\nIIp@L59K#Za6k2@FJ,r(%(S+fI+&T&IpCSmY)rYIlCdHG'MUcNMqL3%XDXH25\"mG\n-UU&#jXr*'$Q'GlJ#ErLC%-Ql,M0\"C*80XH,DdRQ[mDh9P**ZF@+R1%\"Zc[$N2L5\n6MdZ(qZQ9#I3*rhqmGai(HUK[,Cc-Z41T[X'dlr#ZH%C0A0AT+kRmf8YKV&*i@XD\n2mqr0ZYmqDBKCZm*j*Ye1G#23G\"b!2Z$0dHFGiP2r0!'!!!!!!!&5cRdd$'!5aJ%\nN8(U9llN8lHS*JhRKr(69U\"QfKY$D'd0RC#b*#5B3M1,IUiY\"S'833jJA4q,15*N\nQ6hCdbJBZ8!+261YKNaQqja&0Z5555553!$b,59irVZr#NG581r+4CN!1-fha0h$\nKBG!kfa`KfSE!MS`BdSdM&#pCckTlbN'6r,5eJ%JfXE1lk+,Mj[f#(Ic'K2S1J6k\n$S%qJk\"2S1J6k$S%qJk\"2S1J6k$S%dRe'e)!rrh2!D0``-$!`-$!`-$!`-$%U%$6\nfAm*[eAVLL+)SLL+)SLL+)SLJS)fU0999999999999999@hNk2m2PErpr[3f+ib`\nI%MLjr2prq*N4@EqT@FU!!8k50MBf[+)YkXA(FCrMKfi!\"Kbq(ViH[Kkq(X+\"AIk\ni@rmDY[bI&0+&9((0IINHiMEcqXDk$kAPRrZ58(rR#+%Ed+MN*-SbQLc6JQjbrVH\npaVi('H)PIR\"R3KaUEB'k23l9kMjl\"B)QrTV%`VIid#a-[hJqPrmDT&QF$Jj8DZ1\nAAHYH%FdFq`IQ3qc9SI05[jiY!%Y+!!!!!!!%d1KZhA5JE391m8XQJ+@p0-0-KYZ\n,k@VEa1*`Zic8I0qaT2Q)BYDF1\"!'52P1K2N+J0Z5555555554mPS@IZfXZbFDlH\n$1jCbC,90X5GlBJIi43BZeKJG%cDKEq%'aQe(TdC-dE`BLS0DeBZjQ+IrCDqC\"'c\nmLNCrT(m4cf-8GSC&8`H,p2jfXe1h4`HQpH$I+b2jKNf4',G2IN,SdX+#+9[hiBl\nM*lBX`jXU8RYT#fR-A*!!*!jPSUf4Gb!dAJD!GcZap66XB0YdJkMCS38T,aa($(P\npIaK8$PTcU%mIA+!)e2mV9G,(S,,QV0GYT-N!G9Ij'fpmCeJRkrU\"PVfDR#rm0'l\n[4#+K1JJ4pbKE)%#UGjP*3IeMU3j-8rYE#$ch\"4d'e3[1TE![%NBa6lfelBY!Q[I\nEej`B91ehe$*cAaBk5'b%Zj1)f5\"`KmC0$a#08TMHC8kSQq1$6UY\"+epM\"kSjmPE\nARCR6P1VAGqlQG`[Q%4qQ3M6II+PCbS!\"6T)f0MDmSLhUaFGaRq1(EJ!'(,iH[Kk\nq(ViH`S&GrVKEqqM(-Ep'q$TNkQA'rQ-9LpFAYH5`PK0(mQbkN@H6pe[rB(i(Ml4\n8J9AE'm*V5cK,jIj6,%A`01H#QTr&kmAK(&l+P@4(iUbF[CEqE10`A,#RG8$SE[e\nrr[DXT2EGpN%a+J!!!!!!!!!!!!&X3`fVhY%LmF,m*2PQr&`MK(#1%F)i4`MK(#1\n%F*8[0TERPrQHb8%mELP+$ENNNNNNNNNNNNNNNNNNNNK`'filf%Ir0(\"6b&mCm`R\nrB*D)2[X'K1$IN!!+DTXj\"'-+cN&39\"DCBQfQE$9)ei%P#b8lIeqEf@IN88UmicX\nBhrfPU8,P)*!!d(C3HXPC%H+fMi9C-C[mapXh6jrE3q,lVQ0&i!!1!3J!Akp$IhV\nVKT0Ul%4ZRp!T`T`T`T`T`T`CaBM1A1%K@[DB*m[,JmjV4NTPZPZPZPZPZPZPZ!a\n32H9Z,M9Zbj2+,rVj(JPT#\"Eiq3m`eKY,Pq@\"A#&6hE9'!`$aDIY5'N)rN!!rq*N\n4@+eF(j!!iFEN\"i0pb3bcF&8Y,PLka9d88BK&[lRHVR1Be&RI+pq+G@3A`9I-#SB\nr$L#-NIRMS!B4qeXUPIH8m@2SrHa(G!jaZ+q6)(kLXR,55L89%8L-VHDGR)P%SU)\nSfA4qRCb*4++L+-VErTfFL85LRjCVhXX(NqZa)-bV,Rjlc31Qr-E!#Laj8`L)d,a\n)b3@Vi8#,Ap%@3JBL92Jjc[6R44$J5RaqGI$Clib$KPi(4[-,8GN!U4XmV@1EjfT\n''%TNhpZll8eNFPV@`UAEF(XQ-BJ3V2Y,LE`+6@9D1QK#el@-%hP$UFQU+rD-4p1\nF*!D%L,(+UJ#GArhK1*kcd#&TK1KdjMd5kD)SaYMU(@RRSF\"GXH09Y&qFrf&Bl$c\ncGmrbCT[!Z1K%0A%Nqhb8f'Ymk$Yee!ZFAF6ZFHf+fl)0\"TX3Sk2LAZk([39'fl\"\n6`jkhm1)MU9fH4E3(14+rMf0ce6PeKFAie)pi,A+QbS%0r*6Qir\"db%`\"kE+fjYP\nD3D$dQ6-90UI8Pb@[%ANbLEqKbK$AD2X)FDpYj5GY4!rN#T!!bhmcD3*RP6DBd)U\nqZ3`$@QY$NjHE2'T441LD)hrT%h)pAEq%99D&%kcU+SULK3c18ZmXIYf+$kNCrM%\n8Z465E)hr4fP0*J0SFUT-dd[QP6L3!*2DbGIbVX6%\"TG,9iBY!CFGlDK`1V+\"0\"8\nqVTbLCH00PHNF,k@D#[Di0G0J6(TJeeG`kcb[+-%ZGl[mcVZ8dM9j&$ip'kpScEH\ncTXl$lYPIa3`*G4\"YT+@SaB)i!2prpB*irYk$8`jX2J$&B+c*&eB52fFI'fj****\n*R-Zb-%AcqaSS\"R5B[iR6#J+lIlUq'ji,U6b5555555D'8U52UQT8ajbrHXl99Q'\n1l-1(VhQ`'(,iH[Kkq(ViH[Kkq(ViJ-rr6*K`jrJI6lBJZ69%dP3N1\"16TDJSkT-\nkrYbc(*Nl[1GTXSkCR)P%SP%SP%SP%SP%SP&3TT+5L85L85L85L85L85L85LS1E+\n5L85L85L85L85L85L85LS*355L85L85L85L85L85L85LRrpN!!!%!!!0,+`!$5LX\n!!!!b!!!!!!!!!!!!(!!b!!\"TBfjc!!!!#Vqjrrm!!!!!!!!!!*mk:\n"
  },
  {
    "path": "res/license.txt",
    "content": "MIT License\n\nCopyright (c) 2018 Jakub Ďuraš\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "src/__tests__/basic.spec.ts",
    "content": "import path from 'path'\nimport { Application } from 'spectron'\n\nconst baseDir = path.join(__dirname, '../..')\nconst electronBinary = path.join(\n    baseDir,\n    'node_modules',\n    '.bin',\n    process.platform === 'win32' ? 'electron.cmd' : 'electron'\n)\n\ndescribe('Basic functionality', () => {\n    jest.setTimeout(30 * 1000)\n\n    const app = new Application({\n        path: electronBinary,\n        args: [baseDir],\n        requireName: 'spectronRequire',\n        env: {\n            ELECTRON_IS_DEV: 0,\n            NODE_ENV: 'test',\n        },\n    })\n\n    beforeEach(() => app.start())\n\n    afterEach(() => {\n        if (app && app.isRunning()) {\n            return app.stop()\n        }\n    })\n\n    it('Is showing an initial window', async () => {\n        const electronWindowCount = await app.client.getWindowCount()\n        expect(electronWindowCount).toBe(1)\n\n        const mainExists = await app.client.waitForExist(\n            '#webamp #main-window',\n            5000,\n        )\n        expect(mainExists).toBeTruthy()\n    })\n\n    it('Allows minimizing of the window', async () => {\n        const isMinimized = await app.browserWindow.isMinimized()\n        expect(isMinimized).toEqual(false)\n\n        const wasMinimized = await new Promise(async (resolve) => {\n            const eventTimeout = setTimeout(() => {\n                clearInterval(checkInterval)\n                resolve(false)\n            }, 10000)\n\n            // We don't use minimize event becasue it doesn't get triggered\n            const checkInterval = setInterval(async () => {\n                if (await app.browserWindow.isMinimized()) {\n                    clearTimeout(eventTimeout)\n                    clearInterval(checkInterval)\n                    resolve(true)\n                }\n            }, 500)\n\n            app.client.leftClick('#webamp #minimize')\n        })\n\n        expect(wasMinimized).toEqual(true)\n    })\n\n    // TODO: Skipped till I figure out why it doesn't work\n    it.skip('Allows closing of the window', async () => {\n        const wasClosed = await new Promise((resolve) => {\n            const eventTimeout = setTimeout(() => {\n                clearInterval(checkInterval)\n                resolve(false)\n            }, 10000)\n\n            // We don't use minimize event becasue it doesn't get triggered\n            const checkInterval = setInterval(async () => {\n                if ((await app.client.getWindowCount()) === 0) {\n                    clearTimeout(eventTimeout)\n                    clearInterval(checkInterval)\n                    resolve(true)\n                }\n            }, 500)\n\n            app.client.leftClick('#webamp #close')\n        })\n\n        expect(wasClosed).toEqual(true)\n    })\n})\n"
  },
  {
    "path": "src/global.d.ts",
    "content": "import { Track } from './webamp/webamp.bundle'\n\ndeclare global {\n    interface Window {\n        minimizeElectronWindow: () => void\n        closeElectronWindow: () => void\n        webampRendered: () => void\n        centerWindowsInView: () => void\n        webampOnTrackDidChange: (track: Track) => void\n        webampPlay: () => void\n        webampPause: () => void\n        webampNext: () => void\n        webampPrevious: () => void\n    }\n}\n"
  },
  {
    "path": "src/index.css",
    "content": "/**\n * RESET\n */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed, \nfigure, figcaption, footer, header, hgroup, \nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n    margin: 0;\n    padding: 0;\n    border: 0;\n    font-size: 100%;\n    font: inherit;\n    vertical-align: baseline;\n}\n\nhtml, body {\n    overflow: hidden;\n    /* width: 100vw;\n    height: 100vh; */\n}\n\n#app {\n    /* width: 100vw;\n    height: 100vh; */\n}\n\n.spinner {\n    width: 26px;\n    height: 26px;\n    border-radius: 50%;\n    border: 3px solid #0f0;\n    animation: spinner-bulqg1 .8s linear infinite alternate,spinner-oaa3wk 1.6s linear infinite;\n    position: absolute;\n    left: calc(50% - 26px);\n    top: calc(50% - 26px);\n }\n \n @keyframes spinner-bulqg1 {\n    0% {\n       clip-path: polygon(50% 50%, 0 0, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%);\n    }\n \n    12.5% {\n       clip-path: polygon(50% 50%, 0 0, 50% 0%, 100% 0%, 100% 0%, 100% 0%, 100% 0%);\n    }\n \n    25% {\n       clip-path: polygon(50% 50%, 0 0, 50% 0%, 100% 0%, 100% 100%, 100% 100%, 100% 100%);\n    }\n \n    50% {\n       clip-path: polygon(50% 50%, 0 0, 50% 0%, 100% 0%, 100% 100%, 50% 100%, 0% 100%);\n    }\n \n    62.5% {\n       clip-path: polygon(50% 50%, 100% 0, 100% 0%, 100% 0%, 100% 100%, 50% 100%, 0% 100%);\n    }\n \n    75% {\n       clip-path: polygon(50% 50%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 50% 100%, 0% 100%);\n    }\n \n    100% {\n       clip-path: polygon(50% 50%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 0% 100%);\n    }\n }\n \n @keyframes spinner-oaa3wk {\n    0% {\n       transform: scaleY(1) rotate(0deg);\n    }\n \n    49.99% {\n       transform: scaleY(1) rotate(135deg);\n    }\n \n    50% {\n       transform: scaleY(-1) rotate(0deg);\n    }\n \n    100% {\n       transform: scaleY(-1) rotate(-135deg);\n    }\n }\n\n .message {\n   position: absolute;\n   width: 93%;\n   top: calc(50% - 26px);\n   text-align-last: center;\n   background: black;\n   padding: 9px;\n   font-size: 15px;\n }"
  },
  {
    "path": "src/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Webamp</title>\n    <link rel=\"stylesheet\" href=\"./index.css\">\n</head>\n<body>\n    <div id='app'></div>\n\n    <script src=\"./renderer.ts\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/node/api-server.js",
    "content": "const http = require('http');\nconst url = require('url');\n\nlet apiServer = null;\nlet mainWindow = null;\n\nfunction getHtmlInterface() {\n  return `<!DOCTYPE html>\n<html lang=\"ru\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Yaamp - Управление плеером</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n        \n        body {\n            font-family: 'MS Sans Serif', 'Tahoma', Arial, sans-serif;\n            background: #C0C0C0;\n            background-image: \n                repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,.03) 2px, rgba(0,0,0,.03) 4px),\n                repeating-linear-gradient(90deg, transparent, transparent 2px, rgba(0,0,0,.03) 2px, rgba(0,0,0,.03) 4px);\n            min-height: 100vh;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            padding: 20px;\n        }\n        \n        .container {\n            background: #363659;\n            padding: 4px;\n            max-width: 500px;\n            width: 100%;\n            box-shadow: 2px 2px 4px rgba(0,0,0,0.3);\n        }\n        \n        .window-content {\n            background: #363659;\n            padding: 8px;\n        }\n        \n        .title-bar {\n            background: linear-gradient(to bottom, #000080, #000040);\n            color: #FFFFFF;\n            padding: 4px 8px;\n            font-size: 11px;\n            font-weight: bold;\n            margin: -4px -4px 8px -4px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        \n        h1 {\n            color: #00FF00;\n            margin-bottom: 8px;\n            font-size: 16px;\n            font-weight: bold;\n            text-align: center;\n            text-shadow: 1px 1px 2px #000;\n        }\n        \n        .subtitle {\n            color: #C0C0C0;\n            margin-bottom: 12px;\n            font-size: 11px;\n            text-align: center;\n        }\n        \n        .controls {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            gap: 8px;\n            margin-bottom: 12px;\n            flex-wrap: wrap;\n        }\n        \n        button {\n            background: #C0C0C0;\n            border: 2px outset #C0C0C0;\n            color: #000;\n            padding: 6px 12px;\n            cursor: pointer;\n            font-size: 11px;\n            font-weight: normal;\n            font-family: Arial, sans-serif;\n            min-width: 50px;\n            min-height: 24px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n        \n        button:hover {\n            background: #D4D0C8;\n        }\n        \n        button:active {\n            border: 2px inset #C0C0C0;\n            background: #808080;\n        }\n        \n        button:disabled {\n            opacity: 0.5;\n            cursor: not-allowed;\n            border: 2px inset #C0C0C0;\n        }\n        \n        .play-pause-btn {\n            min-width: 60px;\n            min-height: 28px;\n            font-size: 14px;\n            font-weight: bold;\n        }\n        \n        .prev-btn, .next-btn {\n            font-size: 12px;\n        }\n        \n        .volume-control {\n            margin: 12px 0;\n            padding: 8px;\n            background: #C0C0C0;\n            border: 2px inset #C0C0C0;\n        }\n        \n        .volume-control label {\n            display: block;\n            margin-bottom: 6px;\n            color: #000;\n            font-weight: bold;\n            font-size: 11px;\n        }\n        \n        #volumeSlider {\n            -webkit-appearance: none;\n            appearance: none;\n            width: 100%;\n            height: 16px;\n            background: #FFF;\n            border: 2px inset #C0C0C0;\n            outline: none;\n        }\n        \n        #volumeSlider::-webkit-slider-thumb {\n            -webkit-appearance: none;\n            appearance: none;\n            width: 16px;\n            height: 16px;\n            background: #C0C0C0;\n            border: 2px outset #C0C0C0;\n            cursor: pointer;\n        }\n        \n        #volumeSlider::-moz-range-thumb {\n            width: 16px;\n            height: 16px;\n            background: #C0C0C0;\n            border: 2px outset #C0C0C0;\n            cursor: pointer;\n        }\n        \n        .playlist-btn {\n            padding: 6px 12px;\n            font-size: 11px;\n        }\n        \n        .search-section {\n            margin: 12px 0;\n            padding: 8px;\n            background: #C0C0C0;\n            border: 2px inset #C0C0C0;\n        }\n        \n        .search-section label {\n            display: block;\n            margin-bottom: 6px;\n            color: #000;\n            font-weight: bold;\n            font-size: 11px;\n        }\n        \n        .search-input-group {\n            display: flex;\n            gap: 4px;\n            margin-bottom: 8px;\n        }\n        \n        #searchInput {\n            flex: 1;\n            padding: 4px;\n            border: 2px inset #C0C0C0;\n            background: #FFFFFF;\n            font-size: 11px;\n            font-family: Arial, sans-serif;\n            outline: none;\n        }\n        \n        #searchInput:focus {\n            border: 2px inset #000080;\n        }\n        \n        .search-btn {\n            padding: 4px 12px;\n            font-size: 11px;\n        }\n        \n        .search-results {\n            max-height: 200px;\n            overflow-y: auto;\n            margin-top: 8px;\n            border: 2px inset #C0C0C0;\n            background: #FFFFFF;\n        }\n        \n        .search-result-item {\n            padding: 4px 8px;\n            cursor: pointer;\n            font-size: 11px;\n            border-bottom: 1px solid #C0C0C0;\n        }\n        \n        .search-result-item:hover {\n            background: #0000FF;\n            color: #FFFFFF;\n        }\n        \n        .search-result-item:last-child {\n            border-bottom: none;\n        }\n        \n        .search-loading {\n            text-align: center;\n            padding: 8px;\n            color: #000;\n            font-size: 11px;\n        }\n        \n        .status {\n            background: #C0C0C0;\n            border: 2px inset #C0C0C0;\n            padding: 8px;\n            margin-top: 12px;\n        }\n        \n        .status-item {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            padding: 4px 0;\n            border-bottom: 1px solid #808080;\n            font-size: 11px;\n        }\n        \n        .status-item:last-child {\n            border-bottom: none;\n        }\n        \n        .status-label {\n            color: #000;\n            font-weight: bold;\n        }\n        \n        .status-value {\n            color: #000;\n            font-weight: normal;\n        }\n        \n        .status-value.success {\n            color: #00FF00;\n        }\n        \n        .status-value.error {\n            color: #FF0000;\n        }\n        \n        .message {\n            margin-top: 12px;\n            padding: 8px;\n            font-size: 11px;\n            display: none;\n            border: 2px inset #C0C0C0;\n        }\n        \n        .message.success {\n            background: #C0FFC0;\n            color: #000;\n            display: block;\n        }\n        \n        .message.error {\n            background: #FFC0C0;\n            color: #000;\n            display: block;\n        }\n        \n        @media (max-width: 480px) {\n            .container {\n                max-width: 100%;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"title-bar\">\n            <span>Yaamp Remote Control</span>\n            <span style=\"font-size: 10px;\">[ - ]</span>\n        </div>\n        <div class=\"window-content\">\n            <h1>YAAMP</h1>\n            \n            <div class=\"controls\">\n                <button class=\"prev-btn\" onclick=\"sendCommand('prev')\" title=\"Предыдущий трек\">\n                    |&lt;&lt;\n                </button>\n                <button class=\"play-pause-btn\" onclick=\"sendCommand('playpause')\" title=\"Воспроизведение / Пауза\">\n                    &gt;\n                </button>\n                <button class=\"next-btn\" onclick=\"sendCommand('next')\" title=\"Следующий трек\">\n                    &gt;&gt;|\n                </button>\n            </div>\n            \n            <div class=\"volume-control\">\n                <label for=\"volumeSlider\">\n                    Volume: <span id=\"volumeValue\">50</span>%\n                </label>\n                <input \n                    type=\"range\" \n                    id=\"volumeSlider\" \n                    min=\"0\" \n                    max=\"100\" \n                    value=\"50\" \n                    step=\"1\"\n                    oninput=\"setVolume(this.value)\"\n                />\n            </div>\n            \n            <div class=\"playlist-controls\" style=\"margin-top: 12px; display: flex; gap: 4px; flex-wrap: wrap;\">\n                <button class=\"playlist-btn\" onclick=\"sendCommand('mywave')\" title=\"Моя волна\">\n                    Моя волна\n                </button>\n                <button class=\"playlist-btn\" onclick=\"sendCommand('myloved')\" title=\"Любимые треки\">\n                    Любимые\n                </button>\n            </div>\n            \n            <div class=\"search-section\">\n                <label for=\"searchInput\">Поиск:</label>\n                <div class=\"search-input-group\">\n                    <input \n                        type=\"text\" \n                        id=\"searchInput\" \n                        placeholder=\"Введите запрос...\" \n                        onkeypress=\"if(event.key === 'Enter') searchTracks()\"\n                    />\n                    <button class=\"search-btn\" onclick=\"searchTracks()\" title=\"Поиск\">\n                        Найти\n                    </button>\n                </div>\n                <div class=\"search-results\" id=\"searchResults\" style=\"display: none;\"></div>\n            </div>\n            \n            <div class=\"status\">\n                <div class=\"status-item\">\n                    <span class=\"status-label\">Статус:</span>\n                    <span class=\"status-value\" id=\"apiStatus\">Проверка...</span>\n                </div>\n                <div class=\"status-item\">\n                    <span class=\"status-label\">Действие:</span>\n                    <span class=\"status-value\" id=\"lastAction\">-</span>\n                </div>\n            </div>\n            \n            <div class=\"message\" id=\"message\"></div>\n        </div>\n    </div>\n    \n    <script>\n        const baseUrl = window.location.origin;\n        \n        function showMessage(text, type = 'success') {\n            const messageEl = document.getElementById('message');\n            messageEl.textContent = text;\n            messageEl.className = 'message ' + type;\n            setTimeout(() => {\n                messageEl.className = 'message';\n            }, 3000);\n        }\n        \n        async function sendCommand(command) {\n            try {\n                const response = await fetch(baseUrl + '/' + command);\n                const data = await response.json();\n                \n                if (data.success) {\n                    showMessage(data.message, 'success');\n                    document.getElementById('lastAction').textContent = data.message;\n                    document.getElementById('lastAction').className = 'status-value success';\n                } else {\n                    showMessage(data.error || 'Ошибка выполнения команды', 'error');\n                    document.getElementById('lastAction').textContent = data.error || 'Ошибка';\n                    document.getElementById('lastAction').className = 'status-value error';\n                }\n            } catch (error) {\n                showMessage('Ошибка подключения к API', 'error');\n                document.getElementById('lastAction').textContent = 'Ошибка подключения';\n                document.getElementById('lastAction').className = 'status-value error';\n            }\n        }\n        \n        let volumeTimeout;\n        function setVolume(value) {\n            const volume = parseInt(value);\n            document.getElementById('volumeValue').textContent = volume;\n            \n            // Debounce API calls\n            clearTimeout(volumeTimeout);\n            volumeTimeout = setTimeout(() => {\n                sendCommand('volume?value=' + volume);\n            }, 100);\n        }\n        \n        async function searchTracks() {\n            const query = document.getElementById('searchInput').value.trim();\n            const resultsEl = document.getElementById('searchResults');\n            \n            if (!query) {\n                showMessage('Введите запрос для поиска', 'error');\n                return;\n            }\n            \n            resultsEl.style.display = 'block';\n            resultsEl.innerHTML = '<div class=\"search-loading\">Поиск...</div>';\n            \n            try {\n                const response = await fetch(baseUrl + '/search?query=' + encodeURIComponent(query));\n                const data = await response.json();\n                \n                if (data.success && data.results && data.results.length > 0) {\n                    let html = '';\n                    data.results.forEach((result) => {\n                        const typeLabel = result.type === 'artist' ? 'Артист' : 'Альбом';\n                        const onClick = result.type === 'artist' \n                            ? 'playSearchResult(\\\\'artist\\\\', \\\\'' + result.id + '\\\\')'\n                            : 'playSearchResult(\\\\'album\\\\', \\\\'' + result.id + '\\\\')';\n                        html += '<div class=\"search-result-item\" onclick=\"' + onClick + '\">' +\n                            '<strong>' + typeLabel + ':</strong> ' + escapeHtml(result.name) +\n                            '</div>';\n                    });\n                    resultsEl.innerHTML = html;\n                } else {\n                    resultsEl.innerHTML = '<div class=\"search-loading\">Ничего не найдено</div>';\n                }\n            } catch (error) {\n                resultsEl.innerHTML = '<div class=\"search-loading\" style=\"color: #FF0000;\">Ошибка поиска</div>';\n                showMessage('Ошибка поиска', 'error');\n            }\n        }\n        \n        async function playSearchResult(type, id) {\n            try {\n                const endpoint = type === 'artist' ? '/setArtist?id=' : '/setAlbum?id=';\n                const response = await fetch(baseUrl + endpoint + encodeURIComponent(id));\n                const data = await response.json();\n                \n                if (data.success) {\n                    showMessage(data.message || (type === 'artist' ? 'Артист загружен' : 'Альбом загружен'), 'success');\n                    document.getElementById('lastAction').textContent = data.message || 'Загружено';\n                    document.getElementById('lastAction').className = 'status-value success';\n                } else {\n                    showMessage(data.error || 'Ошибка загрузки', 'error');\n                    document.getElementById('lastAction').textContent = data.error || 'Ошибка';\n                    document.getElementById('lastAction').className = 'status-value error';\n                }\n            } catch (error) {\n                showMessage('Ошибка подключения к API', 'error');\n                document.getElementById('lastAction').textContent = 'Ошибка подключения';\n                document.getElementById('lastAction').className = 'status-value error';\n            }\n        }\n        \n        function escapeHtml(text) {\n            const div = document.createElement('div');\n            div.textContent = text;\n            return div.innerHTML;\n        }\n        \n        async function checkStatus() {\n            try {\n                const response = await fetch(baseUrl + '/status');\n                const data = await response.json();\n                \n                if (data.success) {\n                    document.getElementById('apiStatus').textContent = 'Работает';\n                    document.getElementById('apiStatus').className = 'status-value success';\n                } else {\n                    document.getElementById('apiStatus').textContent = 'Ошибка';\n                    document.getElementById('apiStatus').className = 'status-value error';\n                }\n            } catch (error) {\n                document.getElementById('apiStatus').textContent = 'Недоступен';\n                document.getElementById('apiStatus').className = 'status-value error';\n            }\n        }\n        \n        // Check status on load and every 5 seconds\n        checkStatus();\n        setInterval(checkStatus, 5000);\n        \n        // Keyboard shortcuts\n        document.addEventListener('keydown', (e) => {\n            if (e.code === 'Space' && e.target.id !== 'searchInput') {\n                e.preventDefault();\n                sendCommand('playpause');\n            } else if (e.code === 'ArrowLeft') {\n                e.preventDefault();\n                sendCommand('prev');\n            } else if (e.code === 'ArrowRight') {\n                e.preventDefault();\n                sendCommand('next');\n            }\n        });\n    </script>\n</body>\n</html>`;\n}\n\nfunction createApiServer(port, window) {\n  if (apiServer) {\n    apiServer.close();\n  }\n\n  mainWindow = window;\n\n  apiServer = http.createServer((req, res) => {\n    // Enable CORS\n    res.setHeader('Access-Control-Allow-Origin', '*');\n    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n    if (req.method === 'OPTIONS') {\n      res.writeHead(200);\n      res.end();\n      return;\n    }\n\n    const parsedUrl = url.parse(req.url, true);\n    const pathname = parsedUrl.pathname;\n    const method = req.method;\n\n    // Serve HTML interface on root path\n    if (pathname === '/' && method === 'GET') {\n      res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n      res.end(getHtmlInterface());\n      return;\n    }\n\n    // Handle API endpoints\n    if (pathname === '/next' && method === 'GET') {\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('nextTrack');\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: 'Next track' }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/prev' && method === 'GET') {\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('prevTrack');\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: 'Previous track' }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/play' && method === 'GET') {\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('playPause');\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: 'Play' }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/pause' && method === 'GET') {\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('playPause');\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: 'Pause' }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/playpause' && method === 'GET') {\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('playPause');\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: 'Play/Pause' }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/volume' && method === 'GET') {\n      const volume = parseInt(parsedUrl.query.value) || 50;\n      if (volume < 0 || volume > 100) {\n        res.writeHead(400, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Volume must be between 0 and 100' }));\n        return;\n      }\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('setVolume', volume);\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: `Volume set to ${volume}%`, volume: volume }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/mywave' && method === 'GET') {\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.executeJavaScript('window.require(\"electron\").ipcRenderer.invoke(\"setMywave\")').catch(() => {});\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: 'Моя волна запущена' }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/myloved' && method === 'GET') {\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.executeJavaScript('window.require(\"electron\").ipcRenderer.invoke(\"setMyloved\")').catch(() => {});\n        res.writeHead(200, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: true, message: 'Любимые треки загружены' }));\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/search' && method === 'GET') {\n      const query = parsedUrl.query.query || parsedUrl.query.q || '';\n      if (!query) {\n        res.writeHead(400, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Query parameter is required. Use ?query=... or ?q=...' }));\n        return;\n      }\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        const decodedQuery = decodeURIComponent(query);\n        mainWindow.webContents.executeJavaScript(`window.require(\"electron\").ipcRenderer.invoke(\"search\", {searchText: \"${decodedQuery.replace(/\"/g, '\\\\\"')}\"})`)\n          .then((result) => {\n            res.writeHead(200, { 'Content-Type': 'application/json' });\n            res.end(JSON.stringify({ success: true, results: result || [] }));\n          })\n          .catch((error) => {\n            console.error('Search error:', error);\n            res.writeHead(500, { 'Content-Type': 'application/json' });\n            res.end(JSON.stringify({ success: false, error: error.message || 'Search failed', results: [] }));\n          });\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available', results: [] }));\n      }\n    } else if (pathname === '/setArtist' && method === 'GET') {\n      const artistId = parsedUrl.query.id || parsedUrl.query.artistId || '';\n      if (!artistId) {\n        res.writeHead(400, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Artist ID parameter is required. Use ?id=... or ?artistId=...' }));\n        return;\n      }\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.executeJavaScript(`window.require(\"electron\").ipcRenderer.invoke(\"setArtist\", {id: \"${artistId.replace(/\"/g, '\\\\\"')}\"})`)\n          .then((result) => {\n            res.writeHead(200, { 'Content-Type': 'application/json' });\n            res.end(JSON.stringify({ success: true, message: 'Артист загружен' }));\n          })\n          .catch((error) => {\n            console.error('Set artist error:', error);\n            res.writeHead(500, { 'Content-Type': 'application/json' });\n            res.end(JSON.stringify({ success: false, error: error.message || 'Failed to load artist' }));\n          });\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/setAlbum' && method === 'GET') {\n      const albumId = parsedUrl.query.id || parsedUrl.query.albumId || '';\n      if (!albumId) {\n        res.writeHead(400, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Album ID parameter is required. Use ?id=... or ?albumId=...' }));\n        return;\n      }\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.executeJavaScript(`window.require(\"electron\").ipcRenderer.invoke(\"setAlbum\", {id: \"${albumId.replace(/\"/g, '\\\\\"')}\"})`)\n          .then((result) => {\n            res.writeHead(200, { 'Content-Type': 'application/json' });\n            res.end(JSON.stringify({ success: true, message: 'Альбом загружен' }));\n          })\n          .catch((error) => {\n            console.error('Set album error:', error);\n            res.writeHead(500, { 'Content-Type': 'application/json' });\n            res.end(JSON.stringify({ success: false, error: error.message || 'Failed to load album' }));\n          });\n      } else {\n        res.writeHead(500, { 'Content-Type': 'application/json' });\n        res.end(JSON.stringify({ success: false, error: 'Window not available' }));\n      }\n    } else if (pathname === '/status' && method === 'GET') {\n      res.writeHead(200, { 'Content-Type': 'application/json' });\n      res.end(JSON.stringify({ \n        success: true, \n        message: 'API server is running',\n        endpoints: ['/next', '/prev', '/play', '/pause', '/playpause', '/volume?value=50', '/mywave', '/myloved', '/search?query=...', '/setArtist?id=...', '/setAlbum?id=...', '/status']\n      }));\n    } else {\n      res.writeHead(404, { 'Content-Type': 'application/json' });\n      res.end(JSON.stringify({ success: false, error: 'Not found' }));\n    }\n  });\n\n  apiServer.listen(port, '127.0.0.1', () => {\n    console.log(`API server is running on http://127.0.0.1:${port}`);\n    if (mainWindow && !mainWindow.isDestroyed()) {\n      mainWindow.webContents.send('showMessage', `API сервер запущен на порту ${port}`);\n    }\n  });\n\n  apiServer.on('error', (err) => {\n    if (err.code === 'EADDRINUSE') {\n      console.error(`Port ${port} is already in use. Please choose a different port.`);\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('showMessage', `Порт ${port} уже занят. Выберите другой порт.`);\n      }\n    } else {\n      console.error('API server error:', err);\n      if (mainWindow && !mainWindow.isDestroyed()) {\n        mainWindow.webContents.send('showMessage', `Ошибка API сервера: ${err.message}`);\n      }\n    }\n  });\n\n  return apiServer;\n}\n\nfunction stopApiServer() {\n  if (apiServer) {\n    apiServer.close();\n    apiServer = null;\n    console.log('API server stopped');\n  }\n}\n\nmodule.exports = {\n  createApiServer,\n  stopApiServer\n};\n\n"
  },
  {
    "path": "src/node/preload.js",
    "content": "const { remote } = require('electron')\nconst { ipcRenderer } = window.require('electron');\n\n// const handleTransparency = require('./transparency.js')\nconst handleThumbnail = require('./thumbnail.js')\nconst handleThumbar = require('./thumbar.js')\n\nlet windowLock = true;\nlet zoom = 1;\nlet fullscreen = false;\n\n// We want to completely disable the eval() for security reasons\n// ESLint will warn about any use of eval(), even this one\n// eslint-disable-next-line\nwindow.eval = global.eval = function () {\n    throw new Error(`Sorry, this app does not support window.eval().`)\n}\n\n// Add require for e2e spectron tests\nif (process.env.NODE_ENV === 'test') {\n    window.spectronRequire = require\n}\n\n/**\n * Electron API wrappers passed to the renderer\n *\n * Only implementation of the selected APIs is available\n * to greatly reduce the attack surface\n * See https://github.com/electron/electron/blob/master/docs/tutorial/security.md#2-disable-nodejs-integration-for-remote-content\n */\n\nwindow.minimizeElectronWindow = function () {\n    return remote.getCurrentWindow().minimize()\n}\n\nwindow.closeElectronWindow = function () {\n    return remote.getCurrentWindow().close()\n}\n\nwindow.webampRendered = function () {\n    // handleTransparency()\n    handleThumbnail()\n    var ms = navigator.mediaSession;\n    ms.setActionHandler('nexttrack', window.webampNext);\n    ms.setActionHandler('previoustrack', window.webampPrevious);\n    handleThumbar(\n        'stopped',\n        window.webampPlay,\n        window.webampPause,\n        window.webampPrevious,\n        window.webampNext,\n    )\n\n    ipcRenderer.invoke('getSettings').then((rs) => {\n      const settingsData = JSON.parse(rs);\n      zoom = settingsData.zoom;\n    })\n\n}\n\nwindow.webampOnTrackDidChange = function(track) {\n    let state\n\n    if (!track) {\n        state = 'paused'\n    } else if (track) {\n        state = 'playing'\n    }\n\n    var ms = navigator.mediaSession;\n    ms.setActionHandler('nexttrack', window.webampNext);\n    ms.setActionHandler('previoustrack', window.webampPrevious);\n\n    handleThumbar(\n        state,\n        window.webampPlay,\n        window.webampPause,\n        window.webampPrevious,\n        window.webampNext,\n    )\n}\n\nfunction getTranslateXY(element) {\n  const style = window.getComputedStyle(element)\n  const matrix = new DOMMatrixReadOnly(style.transform)\n  return {\n      translateX: matrix.m41,\n      translateY: matrix.m42\n  }\n}\n\nipcRenderer.on('unlockWindow', (event, store) => {\n  windowLock = false;\n  document.getElementById('title-bar').style.webkitAppRegion = 'no-drag';\n  setTimeout(() => {\n    // window.centerWindowsInView();\n  }, 100)\n\n});\n\nipcRenderer.on('lockWindow', (event, store) => {\n  windowLock = true;\n  document.getElementById('title-bar').style.webkitAppRegion = 'drag';\n});\n\nipcRenderer.on('lockWindowWithoutSave', (event, store) => {\n  windowLock = true;\n  window.centerWindowsInView();\n  document.getElementById('title-bar').style.webkitAppRegion = 'drag';\n});\n\nipcRenderer.on('setFullscreen', (event, status) => {\n  fullscreen = status;\n});\n\nsetInterval(() => {\n  if (windowLock) {\n    zoom = zoom ? zoom : 1;\n    const windows = [];\n\n    // Helper function to collect window data\n    const addWindowData = (containerId, windowId) => {\n      const containerEl = document.getElementById(containerId);\n      const windowEl = document.getElementById(windowId);\n      if (containerEl && windowEl) {\n        const rect = windowEl.getBoundingClientRect();\n        const translate = getTranslateXY(containerEl);\n        windows.push({\n          x: translate.translateX,\n          y: translate.translateY,\n          width: rect.width,\n          height: rect.height\n        });\n      }\n    };\n\n    // Collect data for all windows\n    addWindowData('main', 'main-window');\n    addWindowData('playlist', 'playlist-window');\n    addWindowData('equalizer', 'equalizer-window');\n    addWindowData('milkdrop', 'gen-window');\n\n    if (windows.length === 0) return;\n\n    // Calculate min and max extents\n    let minX = Math.min(...windows.map(win => win.x));\n    let maxRight = Math.max(...windows.map(win => win.x + win.width));\n    let minY = Math.min(...windows.map(win => win.y));\n    let maxBottom = Math.max(...windows.map(win => win.y + win.height));\n\n    let totalWidth = maxRight - minX;\n    let totalHeight = maxBottom - minY;\n\n    // Add additional padding if needed (e.g., 12px for height as in original code)\n    totalHeight += 12;\n\n    // Check for context menu\n    const contextMenu = document.getElementById('webamp-context-menu');\n    if (contextMenu) {\n      totalWidth += contextMenu.scrollWidth;\n      const menuDiv = contextMenu.querySelector('div');\n      if (menuDiv) totalHeight += menuDiv.scrollHeight;\n    }\n\n\n\n    // Apply zoom\n    if (zoom) {\n      totalWidth = Math.round(totalWidth * zoom);\n      totalHeight = Math.round(totalHeight * zoom);\n    }\n\n\n    if (totalWidth && totalHeight && !fullscreen) {\n      remote.getCurrentWindow().setBounds({\n        width: totalWidth,\n        height: totalHeight\n      });\n    }\n\n  }\n}, 100); // Adjust interval as needed"
  },
  {
    "path": "src/node/protocol.js",
    "content": "const fs = require('fs')\nconst path = require('path')\nconst mime = require('mime-types')\nconst isDev = require('electron-is-dev')\n\nfunction interceptStreamProtocol() {\n  // Content security policy\n  const cspSrc = [\n    \"default-src 'none'\",\n    \"script-src 'self'\",\n    \"style-src 'self' 'unsafe-inline' data:\",\n    \"img-src 'self' data:\",\n    \"font-src 'self' data:\",\n    \"media-src 'self' blob:\",\n    \"object-src 'self' blob:\"\n  ]\n\n  if (isDev) {\n    cspSrc.push(\"connect-src 'self' ws://127.0.0.1:54439\")\n  } else {\n    cspSrc.push(\"connect-src 'self'\")\n  }\n\n  return function (request, callback) {\n    const url = request.url.substr(8)\n    const filePath = path.normalize(`${__dirname}/../../${url}`)\n    const contentType = mime.contentType(path.extname(request.url))\n\n    callback({\n      statusCode: fs.existsSync(filePath) ? 200 : 404,\n      headers: {\n        'Access-Control-Allow-Origin': '*',\n        'Cache-Control': 'private, max-age=0',\n        'Content-Type': contentType,\n        // 'Content-Security-Policy': cspSrc.join(';'),\n        'Date': (new Date).toUTCString(),\n        'Server': 'Electron',\n        'X-Frame-Options': 'DENY',\n        'X-XSS-Protection': '1; mode=block',\n      },\n      data: fs.createReadStream(filePath)\n    })\n  }\n}\n\nmodule.exports = interceptStreamProtocol\n"
  },
  {
    "path": "src/node/thumbar.js",
    "content": "const path = require('path')\n\nconst { remote, nativeImage } = require('electron')\n\nfunction handleThumbar(state = 'stopped', onPlay, onPause, onPrevious, onNext) {\n  // Only supported on Windows\n  if (process.platform !== 'win32') {\n    return\n  }\n\n  const mainWindow = remote.getCurrentWindow()\n\n  mainWindow.setThumbarButtons([\n    {\n      icon: nativeImage.createFromDataURL('data:image/png;base64,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'),\n      click: onPrevious,\n      tooltip: 'Previous',\n      flag: [(state === 'stopped' ? 'disabled' : 'enabled')],\n    },\n    {\n      icon: nativeImage.createFromDataURL(`${(state === 'playing' ? \n        'data:image/png;base64,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BgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQEAAeAMECBAgQGCggAAYeOmOTIAAAQIEBIA3QIAAAQIEBgoIgIGX7sgECBAgQOD/AXSg9tP0gtASAAAAAElFTkSuQmCC' : \n        'data:image/png;base64,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'\n      )}`),\n      click: state === 'playing' ? onPause : onPlay,\n      tooltip: 'Play',\n      flag: [(state === 'stopped' ? 'disabled' : 'enabled')],\n    },\n    {\n      icon: nativeImage.createFromDataURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAgAElEQVR4Xu3dSdBsZ33f8d9/kU3siiuVKsdJOWN5m8oic7LLWHElmyycbJyNnUqycqUSKiU0XdA8ogkJgRBikIwYZbCZByeRbRnLCCNbIBAIC4RACCEJIaEBdepBfc29usN7+u3TT3ef8+kqSip0+jznfJ7/ve/3vrff7ooHAQIECBAgMDuBmt0du2ECBAgQIEAgAsAQECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQIECAAIEZCgiAGW66WyZAgAABAgLADBAgQIAAgRkKCIAZbrpbJkCAAAECAsAMECBAgACBGQoIgBluulsmQIAAAQICwAwQ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7iY29M4kr66q/7eJkzsnAQIEpiCwWCzad0d/ceR7+cWqan/d6rEUEAAnGYXFYnF5kv854pS0P+m3v+P/1IjndCoCBAhMUmCxWPx0kncl+bcj3eB/qqr2Y9UexwgIgFOMw2Kx+PdJ3pjk59aYmD9cvqr/Q2ucw1MJECAwS4HFYnEkyblr3Hx7D5Vf8gLrkwsKgNNM1mKx+PNJfi3J/17xdQHtpwnaG/h8cI3B9VQCBAjMXmCxWPyD9mLpFf9KoH1AWvuU1Eurqn1iqsdJBATAwLFYLBb/Ism/SfKPkvzVJD+b5C8sn95eVPKlJP83yfur6vcGntZhBAgQIDBAYLFYtN9z2+/B/3j549o/n+RvJGm//7YPRmt/2v9Mkju9zmoAqJ8CGIbkKAIECBAgMDUB3wGY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiagACY2o66HwIECBAgMEBAAAxAcggBAgQIEJiawP8Hl2gF4sUAPwkAAAAASUVORK5CYII='),\n      click: onNext,\n      tooltip: 'Next',\n      flag: [(state === 'stopped' ? 'disabled' : 'enabled')],\n    },\n  ])\n}\n\nmodule.exports = handleThumbar\n"
  },
  {
    "path": "src/node/thumbnail.js",
    "content": "const { remote } = require('electron')\nconst { debounce } = require('./utilities')\n\nfunction handleThumbnail() {\n  // Currently only supported on Windows\n  // TODO: Add support for other platforms?\n  if (process.platform !== 'win32') {\n    return\n  }\n\n  const mainWindow = remote.getCurrentWindow()\n  const mainWebampWindow = document.querySelector('#main-window')\n\n  const setClip = () => {\n    const boundingRect = mainWebampWindow.getBoundingClientRect()\n\n    mainWindow.setThumbnailClip({\n      x: boundingRect.x,\n      y: boundingRect.y,\n      width: boundingRect.width,\n      height: boundingRect.height,\n    })\n  }\n\n  const observer = new MutationObserver(debounce(setClip))\n  observer.observe(\n    mainWebampWindow.parentElement,\n    { attributes: true }\n  )\n  setClip()\n}\n\nmodule.exports = handleThumbnail\n"
  },
  {
    "path": "src/node/transparency.js",
    "content": "const { remote } = require('electron')\n\nfunction handleTransparency() {\n    const mainWindow = remote.getCurrentWindow()\n\n    // Mac OS already handles it around the UI (windows and context menu) well.\n    // TODO: Check if forward: true still doesn't work reliably\n    // if the webamp windows is not in the foreground (no events triggered).\n    // TODO: Check if skin transparency can be implemented without performance hit.\n\n    // Windows\n    // Ignoring mouse events around the UI (windows and context menu).\n    // Works by using mousein and mouseout and forwarding when ignoring.\n    if (process.platform === 'win32' || process.platform !== 'darwin') {\n        mainWindow.setIgnoreMouseEvents(true, { forward: true })\n        let ignored = true\n\n        const mouseenterHandler = () => {\n            if (ignored) {\n                mainWindow.setIgnoreMouseEvents(false)\n                ignored = false\n            }\n        }\n        const mouseleaveHandler = (e) => {\n            if (!e.toElement\n                || !e.toElement.offsetParent\n                || e.toElement.offsetParent.id === 'webamp'\n            ) {\n                mainWindow.setIgnoreMouseEvents(true, { forward: true })\n                ignored = true\n            }\n            // We want to schedule events again for context menu.\n            // Context menu can \"stick out\" of windows.\n            if (e.toElement.classList.contains('context-menu')) {\n                e.toElement.addEventListener('mouseenter', mouseenterHandler)\n                e.toElement.addEventListener('mouseleave', mouseleaveHandler)\n                e.toElement.addEventListener('click', () => {\n                    // Removing context menu means we have to trigger leave too\n                    // mainWindow.setIgnoreMouseEvents(true, { forward: true })\n                    // ignored = true\n                })\n            }\n        }\n\n        const rebindMouseEvents = () => {\n            const webampWindows = document.querySelectorAll('#webamp .window')\n            for (webampWindow of webampWindows) {\n                webampWindow.removeEventListener('mouseenter', mouseenterHandler)\n                webampWindow.removeEventListener('mouseleave', mouseleaveHandler)\n                webampWindow.addEventListener('mouseenter', mouseenterHandler)\n                webampWindow.addEventListener('mouseleave', mouseleaveHandler)\n            }\n        }\n\n        const observer = new MutationObserver(() => {\n            rebindMouseEvents()\n        })\n        observer.observe(\n            document.querySelector('#main-window').parentElement.parentElement,\n            { childList: true }\n        )\n\n        rebindMouseEvents()\n    }\n\n    // Linux\n    // Ignoring mouse events around the UI (windows and context menu).\n    // We'll track and save position of webamp windows and context menu\n    // and poll mouse to see if it is within the saved bounds.\n    // TODO: Check if we can use forward: true on this platform too.\n    if (process.platform === 'linux') {\n        /**\n         * @type {[id: string]: {minX: number, maxX: number, minY: number, maxY: number} }\n         */\n        const elementPositions = {}\n        let ignored = false\n        let interval\n\n        const setupWatchingElements = () => {\n            const watchWindowAttributes = (webampWindowWrapper) => {\n                // Removed from the DOM\n                if (webampWindowWrapper.parentElement === null) {\n                    delete elementPositions[webampWindowWrapper.children[0].id]\n                    return\n                }\n\n                const recalculateElementPositions = (windowWrapper) => {\n                    const recalcWindow = windowWrapper.children[0]\n                    const boundingRect = recalcWindow.getBoundingClientRect()\n\n                    elementPositions[recalcWindow.id] = {\n                        minX: boundingRect.x,\n                        minY: boundingRect.y,\n                        maxX: boundingRect.x + boundingRect.width,\n                        maxY: boundingRect.y + boundingRect.height,\n                    }\n                }\n\n                const observer = new MutationObserver(\n                    (mutationsList) => recalculateElementPositions(\n                        mutationsList[0].target\n                    )\n                )\n                observer.observe(\n                    webampWindowWrapper,\n                    { attributes: true }\n                )\n                recalculateElementPositions(webampWindowWrapper)\n            }\n\n            const observer = new MutationObserver((mutationsList) => {\n                for (const mutation of mutationsList) {\n                    const changedNodes =\n                        mutation.addedNodes.length > 0 ? mutation.addedNodes : mutation.removedNodes\n                    for (const changedNode of changedNodes) {\n                        watchWindowAttributes(changedNode)\n                    }\n                }\n            })\n            observer.observe(\n                document.querySelector('#main-window').parentElement.parentElement,\n                { childList: true }\n            )\n\n            for (const webampWindow of document.querySelectorAll('#webamp .window')) {\n                watchWindowAttributes(webampWindow.parentElement)\n            }\n\n            // Context menu is watched just by observing adding and removing of the node.\n            // When added, whole body is position of the contet menu.\n            const contextMenuObserver = new MutationObserver((mutationsList) => {\n                for (const mutation of mutationsList) {\n                    if (mutation.addedNodes.length > 0\n                        && mutation.addedNodes[0].id === 'webamp-context-menu'\n                    ) {\n                        elementPositions['webamp-context-menu'] = {\n                            minX: 0,\n                            minY: 0,\n                            maxX: 9999,\n                            maxY: 9999,\n                        }\n                    }\n\n                    if (mutation.removedNodes.length > 0\n                        && mutation.removedNodes[0].id === 'webamp-context-menu'\n                    ) {\n                        delete elementPositions['webamp-context-menu']\n                    }\n                }\n            })\n            contextMenuObserver.observe(\n                document.querySelector('body'),\n                { childList: true }\n            )\n        }\n\n        const enableTransparencyChecking = () => {\n            clearInterval(interval)\n            interval = setInterval(() => {\n\n                const cursorPoint = remote.screen.getCursorScreenPoint()\n                const windowBounds = mainWindow.getBounds()\n    \n                const cursorWithinBounds =\n                    (cursorPoint.x >= windowBounds.x\n                        && cursorPoint.x <= (windowBounds.x + windowBounds.width)\n                    ) &&\n                    (cursorPoint.y >= windowBounds.y\n                        && cursorPoint.y <= (windowBounds.y + windowBounds.height)\n                    )\n                if (!cursorWithinBounds) {\n                    return\n                }\n\n                const positionInWindow = {\n                    x: cursorPoint.x - windowBounds.x,\n                    y: cursorPoint.y - windowBounds.y,\n                }\n\n                for (const elementId of Object.keys(elementPositions)) {\n                    const elementPosition = elementPositions[elementId]\n    \n                    const withinX = (positionInWindow.x > elementPosition.minX)\n                        && (positionInWindow.x < elementPosition.maxX)\n                    if (!withinX) {\n                        continue\n                    }\n                    const withinY = (positionInWindow.y > elementPosition.minY)\n                        && (positionInWindow.y < elementPosition.maxY)\n                    const within = withinX && withinY\n                    if (within) {\n                        if (ignored) {\n                            mainWindow.setIgnoreMouseEvents(false)\n                            ignored = false\n                        }\n                        return\n                    }\n                }\n    \n                if (!ignored) {\n                    mainWindow.setIgnoreMouseEvents(true)\n                    ignored = true\n                }\n            }, 200)\n        }\n\n        const disableTransparencyChecking = () => {\n            clearInterval(interval)\n        }\n\n        mainWindow.on('restore', () => {\n            enableTransparencyChecking()\n        })\n        mainWindow.on('minimize', () => {\n            disableTransparencyChecking()\n        })\n        mainWindow.on('closed', () => {\n            disableTransparencyChecking()\n        })\n\n        setupWatchingElements()\n        enableTransparencyChecking()\n        setInterval(() => {\n            setupWatchingElements()\n        }, 100)\n\n    }\n}\n\nmodule.exports = handleTransparency\n"
  },
  {
    "path": "src/node/updates.js",
    "content": "const { autoUpdater } = require('electron-updater')\nconst log = require('electron-log')\nconst electron = require('electron')\nconst isDev = require('electron-is-dev')\nconst htmlToText = require('html-to-text')\n\nfunction checkForUpdatesAndNotify() {\n  if (isDev) {\n    console.warn('Updates are not checked in dev mode')\n    return\n  }\n\n  autoUpdater.autoDownload = false\n  autoUpdater.autoInstallOnAppQuit = false\n  autoUpdater.fullChangelog = true\n  autoUpdater.logger = log\n\n  autoUpdater.on('update-available', (info) => {\n    log.info('Got info about update available', info)\n    electron.dialog.showMessageBox({\n      type: 'none',\n      buttons: ['Открыть', 'Отмена'],\n      title: 'Доступна новая версия',\n      message: [\n        `Доступна новая версия: ${info.version}.`,\n        ` Хотите её скачать?`,\n      ].join(''),\n      detail: htmlToText.fromString(\n        info.releaseNotes.reduce((acc, n) => acc + n.version + '<hr>' + n.note, ''),\n        { singleNewLineParagraphs: true }\n      ),\n      noLink: true,\n    }, (choice) => {\n      if (choice === 0) {\n        electron.shell.openExternal('https://yaamp.ru')\n      }\n    })\n  })\n\n  autoUpdater.on('error', (err) => {\n    log.error('Update check failed', err)\n  })\n\n  autoUpdater.checkForUpdates()\n}\n\nmodule.exports = checkForUpdatesAndNotify\n"
  },
  {
    "path": "src/node/utilities.js",
    "content": "function debounce(fn, time = 100) {\n    let timeout\n\n    return () => {\n        const ctx = this, args = arguments\n        clearTimeout(timeout)\n        timeout = setTimeout(() => fn.apply(ctx, args), time)\n    }\n}\n\nmodule.exports = {\n    debounce\n}\n"
  },
  {
    "path": "src/renderer.ts",
    "content": "// Temporary switch to custom webamp build\n// import Webamp from 'webamp'\nimport Webamp from './webamp/webamp.bundle.js'\nconst { ipcRenderer } = window.require('electron');\n\nconst DEFAULT_DOCUMENT_TITLE = document.title\n\nlet trackList: { metaData: { artist: string; title: any; }; url: string; duration: number; }[] = [];\n\nconst webamp = new Webamp({\n  initialTracks: trackList,\n  // initialSkin: {\n  //   url: './skins/base-2.91.wsz'\n  // },\n  availableSkins: [\n    { url: './skins/base-2.91.wsz', name: 'Base v2.91' },\n    { url: './skins/Green-Dimension-V2.wsz', name: 'Green Dimension V2' },\n    { url: './skins/MacOSXAqua1-5.wsz', name: 'Mac OSX v1.5 (Aqua)' },\n    { url: './skins/Skinner_Atlas.wsz', name: 'Skinner Atlas' },\n    { url: './skins/TopazAmp1-2.wsz', name: 'TopazAmp v1.2' },\n    { url: './skins/Vizor1-01.wsz', name: 'Vizor v1.01' },\n    { url: './skins/XMMS-Turquoise.wsz', name: 'XMMS Turquoise' },\n    { url: './skins/ZaxonRemake1-0.wsz', name: 'Zaxon Remake v1.0' },\n  ],\n  enableHotkeys: true,\n})\n\nconst unsubscribeOnMinimize = webamp.onMinimize(() => {\n  window.minimizeElectronWindow()\n})\n\nconst unsubscribeOnClose = webamp.onClose(() => {\n  window.closeElectronWindow()\n  unsubscribeOnMinimize()\n  unsubscribeOnClose()\n})\n\nwebamp.onTrackDidChange((track: any) => {\n    window.webampOnTrackDidChange(track)\n\n    if (track && 'metaData' in track && track.metaData.title && track.metaData.artist) {\n      document.title = `${track.metaData.title} - ${track.metaData.artist}`\n    } else if (track && 'defaultName' in track) {\n      document.title = track.defaultName\n    } else {\n      document.title = DEFAULT_DOCUMENT_TITLE\n    }\n\n    ipcRenderer.invoke('nowPlaying', document.title);\n\n})\n\n// Render after the skin has loaded.\nwebamp.renderWhenReady(document.getElementById('app')).then(\n  () => window.webampRendered()\n)\n\n// Expose some webamp API on the window for the main process\nwindow.webampPlay = function () {\n  // @ts-ignore\n  webamp.play()\n}\n\nwindow.webampPlay = function () {\n  // @ts-ignore\n  webamp.play()\n}\n\nwindow.webampPause = function () {\n  // @ts-ignore\n  webamp.pause()\n}\n\nwindow.webampNext = function () {\n  // @ts-ignore\n  webamp.nextTrack()\n}\n\nwindow.webampPrevious = function () {\n  // @ts-ignore\n  webamp.previousTrack()\n}\n\nwindow.centerWindowsInView = function () {\n  // @ts-ignore\n  webamp.centerWindowsInView()\n}\n\nwindow.webampSetVolume = function (volume: number) {\n  // @ts-ignore\n  if (webamp.store) {\n    // @ts-ignore\n    webamp.store.dispatch({ type: 'SET_VOLUME', volume: Math.max(0, Math.min(100, volume)) });\n  }\n}\n\nwindow.webampPlayFirstTrack = function () {\n  // @ts-ignore\n  if (webamp.store) {\n    // @ts-ignore\n    const state = webamp.store.getState();\n    // @ts-ignore\n    const trackOrder = state.playlist.trackOrder;\n    if (trackOrder && trackOrder.length > 0) {\n      // @ts-ignore\n      const firstTrackId = trackOrder[0];\n      // @ts-ignore\n      webamp.store.dispatch({ type: 'PLAY_TRACK', id: firstTrackId });\n    }\n  }\n}\n\nipcRenderer.invoke('getSkin').then((rs: any) => {\n  if (rs) {\n    webamp.setSkinFromClient(rs);\n  }\n})\n\nipcRenderer.invoke('getEq').then((rs: any) => {\n  if (rs) {\n    webamp.setEqFromClient(rs);\n  }\n})\n\nipcRenderer.invoke('getLikedTracks').then((rs: any) => {\n  rs.result.forEach((element: any) => {\n    let artist: any[] = [];\n\n    if (element) {\n      element.artists.forEach((a: any) => {\n        artist.push(a.name);\n      });\n  \n      if (element.durationMs) {\n        webamp.appendTracks([{ metaData: {artist: artist.join(', '), title: element.title}, url: element.id, duration: Math.floor(element.durationMs / 1000) }]);\n      }\n    }\n\n  });\n\n  webamp.appendTracks(trackList);\n})\n\n\nipcRenderer.on(\"setTracks\", (event:any, data: any) => {\n  webamp.setTracksToPlay([]);\n\n  let tracksIds: string[] = [];\n\n  data.forEach((element: any) => {\n    let artist: any[] = [];\n\n    if (element) {\n      element.artists.forEach((a: any) => {\n        artist.push(a.name);\n      });\n  \n      if (element.durationMs) {\n        if (!tracksIds.includes(element.id)) {\n          webamp.appendTracks([{ metaData: {artist: artist.join(', '), title: element.title}, url: element.id, duration: Math.floor(element.durationMs / 1000) }]);\n          tracksIds.push(element.id);\n        }\n      }\n    }\n    \n\n  });\n});\n\n// Display loader\nipcRenderer.on(\"setLoader\", (event:any) => {\n  const el = document.createElement('div');\n  el.classList.add('spinner');\n  const box = document.getElementById('playlist-window');\n  box.appendChild(el);\n});\n\nipcRenderer.on(\"hideLoader\", (event:any) => {\n  document.querySelector(\".spinner\").remove();\n});\n\n// Show message\nipcRenderer.on(\"showMessage\", (event:any, data: any) => {\n  const el = document.createElement('div');\n  el.classList.add('message');\n  el.innerHTML = data;\n  const box = document.getElementById('playlist-window');\n  box.appendChild(el);\n\n  setTimeout(() => document.querySelector(\".message\").remove(), 1000);\n\n});\n\nipcRenderer.on(\"playPause\", (event:any) => {\n  // @ts-ignore\n  const status = webamp.getMediaStatus();\n  // @ts-ignore\n  if (status === \"PLAYING\") {\n    // @ts-ignore\n    webamp.pause();\n    ipcRenderer.invoke('isPlay', 0);\n  } else if (status === \"PAUSED\") {\n    // @ts-ignore\n    webamp.play();\n    ipcRenderer.invoke('isPlay', 1);\n  } else if (status === \"STOPPED\") {\n    // @ts-ignore\n    const state = webamp.store.getState();\n    // @ts-ignore\n    const trackOrder = state.playlist.trackOrder;\n    // @ts-ignore\n    const currentTrack = state.playlist.currentTrack;\n    \n    // Если есть текущий трек, просто запускаем его\n    if (currentTrack !== null && currentTrack !== undefined) {\n      // @ts-ignore\n      webamp.play();\n      ipcRenderer.invoke('isPlay', 1);\n    } \n    // Если нет текущего трека, но есть треки в плейлисте, запускаем первый\n    else if (trackOrder && trackOrder.length > 0) {\n      // @ts-ignore\n      const firstTrackId = trackOrder[0];\n      // @ts-ignore\n      webamp.store.dispatch({ type: 'PLAY_TRACK', id: firstTrackId });\n      ipcRenderer.invoke('isPlay', 1);\n    }\n    // Если плейлист пуст, ничего не делаем\n  }\n});\n\nsetInterval(() => {\n    // @ts-ignore\n  if (webamp.getMediaStatus() === \"PLAYING\") {\n    ipcRenderer.invoke('isPlay', 0);\n  } else {\n    ipcRenderer.invoke('isPlay', 1);\n  }\n}, 2000);\n\nipcRenderer.on(\"prevTrack\", (event:any) => {\n  // @ts-ignore\n  webamp.previousTrack();\n});\n\nipcRenderer.on(\"nextTrack\", (event:any) => {\n  // @ts-ignore\n  webamp.nextTrack();\n})\n\nipcRenderer.on(\"setVolume\", (event:any, volume: number) => {\n  window.webampSetVolume(volume);\n});"
  },
  {
    "path": "src/webamp/webamp.bundle.d.ts",
    "content": "interface TrackInfo {\n    /**\n     * Name to be used until ID3 tags can be resolved.\n     *\n     * If the track has a `url`, and this property is not given,\n     * the filename will be used instead.\n     *\n     * Example: `'My Song'`\n     */\n    defaultName?: string;\n\n    /**\n     * Data to be used _instead_ of trying to fetch ID3 tags.\n     *\n     * Example: `{ artist: 'Jordan Eldredge', title: \"Jordan's Song\" }`\n     */\n    metaData?: {\n        artist: string,\n        title: string,\n    },\n\n    /**\n     * Duration (in seconds) to be used instead of fetching enough of the file to measure its length.\n     *\n     * Example: 95\n     */\n    duration?: number;\n}\n\ninterface URLTrack extends TrackInfo {\n    /**\n     * Source URL of the track\n     *\n     * Note: This URL must be served the with correct CORs headers.\n     *\n     * Example: `'https://example.com/song.mp3'`\n     */\n    url: string | URL;\n}\n\ninterface BlobTrack extends TrackInfo {\n    /**\n     * Blob source of the track\n     */\n    blob: Blob;\n}\n\n/**\n * Many methods on the webamp instance deal with track.\n *\n * Either `url` or `blob` must be specified\n */\ntype Track = URLTrack | BlobTrack;\n\ninterface Options {\n    /**\n     * An object representing the initial skin to use.\n     *\n     * If omitted, the default skin, included in the bundle, will be used.\n     * Note: This URL must be served the with correct CORs headers.\n     *\n     * Example: `{ url: './path/to/skin.wsz' }`\n     */\n    initialSkin?: {\n        url: string,\n    };\n\n    /**\n     * An array of `Track`s to prepopulate the playlist with.\n     */\n    initialTracks?: Track[];\n\n    /**\n     * An array of objects representing available skins.\n     *\n     * These will appear in the \"Options\" menu under \"Skins\".\n     * Note: These URLs must be served with the correct CORs headers.\n     *\n     * Example: `[ { url: \"./green.wsz\", name: \"Green Dimension V2\" } ]`\n     */\n    availableSkins?: { url: string, name: string }[];\n\n    /**\n     * Should global hotkeys be enabled?\n     *\n     * Default: `false`\n     */\n    enableHotkeys?: boolean;\n\n    /**\n     * An array of additional file pickers.\n     *\n     * These will appear in the \"Options\" menu under \"Play\".\n     *\n     * In the offical version, this option is used to provide a \"Dropbox\" file picker.\n     */\n    filePickers?: [{\n        /**\n         * The name that will appear in the context menu.\n         *\n         * Example: `\"My File Picker...\"`\n         */\n        contextMenuName: string,\n\n        /**\n         * A function which returns a Promise that resolves to an array of `Track`s\n         *\n         * Example: `() => Promise.resolve([{ url: './rick_roll.mp3' }])`\n         */\n        filePicker: () => Promise<Track[]>,\n\n        /**\n         * Indicates if this options should be made available when the user is offline.\n         */\n        requiresNetwork: boolean,\n    }];\n}\n\nexport default class Webamp {\n    constructor(options: Options);\n\n    /**\n     * Returns a true if the current browser supports the features that Webamp depends upon.\n     *\n     * It is recommended to check this before you attempt to instantiate an instance of Winamp.\n     */\n    public static browserIsSupported(): boolean;\n\n    /**\n     * Add an array of `Track`s to the end of the playlist.\n     */\n    public appendTracks(tracks: Track[]): void;\n\n    /**\n     * Replace the playlist with an array of `Track`s and begin playing the first track.\n     */\n    public setTracksToPlay(tracks: Track[]): void;\n\n\n    public setSkinFromClient(data: string): void;\n    public setEqFromClient(data: string): void;\n\n    /**\n     * Webamp will wait until it has fetched the skin and fully parsed it and then render itself.\n     *\n     * Webamp is rendered into a new DOM node at the end of the <body> tag with the id `#webamp`.\n     *\n     * If a domNode is passed, Webamp will place itself in the center of that DOM node.\n     *\n     * @returns A promise is returned which will resolve after the render is complete.\n     */\n    public renderWhenReady(domNode: HTMLElement): Promise<void>;\n\n    /**\n     * A callback which will be called when a new track starts loading.\n     *\n     * This can happen on startup when the first track starts buffering, or when a subsequent track starts playing.\n     * The callback will be called with an object `({url: 'https://example.com/track.mp3'})` containing the URL of the track.\n     * Note: If the user drags in a track, the URL may be an ObjectURL.\n     *\n     * @returns An \"unsubscribe\" function. Useful if at some point in the future you want to stop listening to these events.\n     */\n    public onTrackDidChange(callback: (track: Track) => any): () => void;\n\n    /**\n     * A callback which will be called when Webamp is closed.\n     *\n     * @returns An \"unsubscribe\" function. Useful if at some point in the future you want to stop listening to these events.\n     */\n    public onClose(callback: () => any): () => void;\n\n    /**\n     * A callback which will be called when Webamp is minimized.\n     *\n     * @returns An \"unsubscribe\" function. Useful if at some point in the future you want to stop listening to these events.\n     */\n    public onMinimize(callback: () => any): () => void;\n}\n"
  },
  {
    "path": "src/webamp/webamp.bundle.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Webamp\"] = factory();\n\telse\n\t\troot[\"Webamp\"] = factory();\n})(self, () => {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 1894:\n/***/ (function(__unused_webpack_module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar __read = this && this.__read || function (o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o),\n    r,\n    ar = [],\n    e;\n  try {\n    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  } catch (error) {\n    e = {\n      error: error\n    };\n  } finally {\n    try {\n      if (r && !r.done && (m = i[\"return\"])) m.call(i);\n    } finally {\n      if (e) throw e.error;\n    }\n  }\n  return ar;\n};\nvar __spreadArray = this && this.__spreadArray || function (to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n    if (ar || !(i in from)) {\n      if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n      ar[i] = from[i];\n    }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.convertAniBinaryToCSS = void 0;\nvar parser_1 = __webpack_require__(7478);\nvar JIFFIES_PER_MS = 1000 / 60;\n// Generate CSS for an animated cursor.\n//\n// This function returns CSS containing a set of keyframes with embedded Data\n// URIs as well as a CSS rule to the given selector.\nfunction convertAniBinaryToCSS(selector, aniBinary) {\n  var ani = readAni(aniBinary);\n  var animationName = \"ani-cursor-\".concat(uniqueId());\n  var keyframes = ani.frames.map(function (_a) {\n    var url = _a.url,\n      percents = _a.percents;\n    var percent = percents.map(function (num) {\n      return \"\".concat(num, \"%\");\n    }).join(\", \");\n    return \"\".concat(percent, \" { cursor: url(\").concat(url, \"), auto; }\");\n  });\n  // CSS properties with a animation type of \"discrete\", like `cursor`, actually\n  // switch half-way _between_ each keyframe percentage. Luckily this half-way\n  // measurement is applied _after_ the easing function is applied. So, we can\n  // force the frames to appear at exactly the % that we specify by using\n  // `timing-function` of `step-end`.\n  //\n  // https://drafts.csswg.org/web-animations-1/#discrete\n  var timingFunction = \"step-end\";\n  // Winamp (re)starts the animation cycle when your mouse enters an element. By\n  // default this approach would cause the animation to run continuously, even\n  // when the cursor is not visible. To match Winamp's behavior we add a\n  // `:hover` pseudo selector so that the animation only runs when the cursor is\n  // visible.\n  var pseudoSelector = \":hover\";\n  // prettier-ignore\n  return \"\\n    @keyframes \".concat(animationName, \" {\\n        \").concat(keyframes.join(\"\\n\"), \"\\n    }\\n    \").concat(selector).concat(pseudoSelector, \" {\\n        animation: \").concat(animationName, \" \").concat(ani.duration, \"ms \").concat(timingFunction, \" infinite;\\n    }\\n   \");\n}\nexports.convertAniBinaryToCSS = convertAniBinaryToCSS;\nfunction readAni(contents) {\n  var _a;\n  var ani = (0, parser_1.parseAni)(contents);\n  var rate = (_a = ani.rate) !== null && _a !== void 0 ? _a : ani.images.map(function () {\n    return ani.metadata.iDispRate;\n  });\n  var duration = sum(rate);\n  var frames = ani.images.map(function (image) {\n    return {\n      url: curUrlFromByteArray(image),\n      percents: []\n    };\n  });\n  var elapsed = 0;\n  rate.forEach(function (r, i) {\n    var frameIdx = ani.seq ? ani.seq[i] : i;\n    frames[frameIdx].percents.push(elapsed / duration * 100);\n    elapsed += r;\n  });\n  return {\n    duration: duration * JIFFIES_PER_MS,\n    frames: frames\n  };\n}\n/* Utility Functions */\nvar i = 0;\nvar uniqueId = function () {\n  return i++;\n};\nfunction base64FromDataArray(dataArray) {\n  return window.btoa(String.fromCharCode.apply(String, __spreadArray([], __read(dataArray), false)));\n}\nfunction curUrlFromByteArray(arr) {\n  var base64 = base64FromDataArray(arr);\n  return \"data:image/x-win-bitmap;base64,\".concat(base64);\n}\nfunction sum(values) {\n  return values.reduce(function (total, value) {\n    return total + value;\n  }, 0);\n}\n\n/***/ }),\n\n/***/ 7478:\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.parseAni = void 0;\nvar riff_file_1 = __webpack_require__(1343);\nvar byte_data_1 = __webpack_require__(2394);\nvar DWORD = {\n  bits: 32,\n  be: false,\n  signed: false,\n  fp: false\n};\nfunction parseAni(arr) {\n  var riff = new riff_file_1.RIFFFile();\n  riff.setSignature(arr);\n  var signature = riff.signature;\n  if (signature.format !== \"ACON\") {\n    throw new Error(\"Expected format. Expected \\\"ACON\\\", got \\\"\".concat(signature.format, \"\\\"\"));\n  }\n  // Helper function to get a chunk by chunkId and transform it if it's non-null.\n  function mapChunk(chunkId, mapper) {\n    var chunk = riff.findChunk(chunkId);\n    return chunk == null ? null : mapper(chunk);\n  }\n  var metadata = mapChunk(\"anih\", function (c) {\n    var words = (0, byte_data_1.unpackArray)(arr, DWORD, c.chunkData.start, c.chunkData.end);\n    return {\n      cbSize: words[0],\n      nFrames: words[1],\n      nSteps: words[2],\n      iWidth: words[3],\n      iHeight: words[4],\n      iBitCount: words[5],\n      nPlanes: words[6],\n      iDispRate: words[7],\n      bfAttributes: words[8]\n    };\n  });\n  if (metadata == null) {\n    throw new Error(\"Did not find anih\");\n  }\n  var rate = mapChunk(\"rate\", function (c) {\n    return (0, byte_data_1.unpackArray)(arr, DWORD, c.chunkData.start, c.chunkData.end);\n  });\n  // chunkIds are always four chars, hence the trailing space.\n  var seq = mapChunk(\"seq \", function (c) {\n    return (0, byte_data_1.unpackArray)(arr, DWORD, c.chunkData.start, c.chunkData.end);\n  });\n  var lists = riff.findChunk(\"LIST\", true);\n  var imageChunk = lists === null || lists === void 0 ? void 0 : lists.find(function (c) {\n    return c.format === \"fram\";\n  });\n  if (imageChunk == null) {\n    throw new Error(\"Did not find fram LIST\");\n  }\n  var images = imageChunk.subChunks.slice(0, metadata.nFrames).map(function (c) {\n    if (c.chunkId !== \"icon\") {\n      throw new Error(\"Unexpected chunk type in fram: \".concat(c.chunkId));\n    }\n    return arr.slice(c.chunkData.start, c.chunkData.end);\n  });\n  var title = null;\n  var artist = null;\n  var infoChunk = lists === null || lists === void 0 ? void 0 : lists.find(function (c) {\n    return c.format === \"INFO\";\n  });\n  if (infoChunk != null) {\n    infoChunk.subChunks.forEach(function (c) {\n      switch (c.chunkId) {\n        case \"INAM\":\n          title = (0, byte_data_1.unpackString)(arr, c.chunkData.start, c.chunkData.end);\n          break;\n        case \"IART\":\n          artist = (0, byte_data_1.unpackString)(arr, c.chunkData.start, c.chunkData.end);\n          break;\n        default:\n        // Unexpected subchunk\n      }\n    });\n  }\n\n  return {\n    images: images,\n    rate: rate,\n    seq: seq,\n    metadata: metadata,\n    artist: artist,\n    title: title\n  };\n}\nexports.parseAni = parseAni;\n\n/***/ }),\n\n/***/ 4615:\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"default\": () => (/* binding */ webampLazy)\n});\n\n// EXTERNAL MODULE: ../../node_modules/@babel/runtime/helpers/esm/defineProperty.js + 3 modules\nvar defineProperty = __webpack_require__(2601);\n// EXTERNAL MODULE: ../../node_modules/react/index.js\nvar react = __webpack_require__(2784);\n// EXTERNAL MODULE: ../../node_modules/react-dom/index.js\nvar react_dom = __webpack_require__(8316);\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/components/Context.js\n\nvar Context_ReactReduxContext = /*#__PURE__*/react.createContext(null);\n\nif (false) {}\n\n/* harmony default export */ const Context = ((/* unused pure expression or super */ null && (Context_ReactReduxContext)));\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/utils/batch.js\n// Default to a dummy \"batch\" implementation that just runs the callback\nfunction defaultNoopBatch(callback) {\n  callback();\n}\n\nvar batch = defaultNoopBatch; // Allow injecting another batching function later\n\nvar setBatch = function setBatch(newBatch) {\n  return batch = newBatch;\n}; // Supply a getter just to skip dealing with ESM bindings\n\nvar getBatch = function getBatch() {\n  return batch;\n};\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/utils/Subscription.js\n // encapsulates the subscription logic for connecting a component to the redux store, as\n// well as nesting subscriptions of descendant components, so that we can ensure the\n// ancestor components re-render before descendants\n\nfunction createListenerCollection() {\n  var batch = getBatch();\n  var first = null;\n  var last = null;\n  return {\n    clear: function clear() {\n      first = null;\n      last = null;\n    },\n    notify: function notify() {\n      batch(function () {\n        var listener = first;\n\n        while (listener) {\n          listener.callback();\n          listener = listener.next;\n        }\n      });\n    },\n    get: function get() {\n      var listeners = [];\n      var listener = first;\n\n      while (listener) {\n        listeners.push(listener);\n        listener = listener.next;\n      }\n\n      return listeners;\n    },\n    subscribe: function subscribe(callback) {\n      var isSubscribed = true;\n      var listener = last = {\n        callback: callback,\n        next: null,\n        prev: last\n      };\n\n      if (listener.prev) {\n        listener.prev.next = listener;\n      } else {\n        first = listener;\n      }\n\n      return function unsubscribe() {\n        if (!isSubscribed || first === null) return;\n        isSubscribed = false;\n\n        if (listener.next) {\n          listener.next.prev = listener.prev;\n        } else {\n          last = listener.prev;\n        }\n\n        if (listener.prev) {\n          listener.prev.next = listener.next;\n        } else {\n          first = listener.next;\n        }\n      };\n    }\n  };\n}\n\nvar nullListeners = {\n  notify: function notify() {},\n  get: function get() {\n    return [];\n  }\n};\nfunction Subscription_createSubscription(store, parentSub) {\n  var unsubscribe;\n  var listeners = nullListeners;\n\n  function addNestedSub(listener) {\n    trySubscribe();\n    return listeners.subscribe(listener);\n  }\n\n  function notifyNestedSubs() {\n    listeners.notify();\n  }\n\n  function handleChangeWrapper() {\n    if (subscription.onStateChange) {\n      subscription.onStateChange();\n    }\n  }\n\n  function isSubscribed() {\n    return Boolean(unsubscribe);\n  }\n\n  function trySubscribe() {\n    if (!unsubscribe) {\n      unsubscribe = parentSub ? parentSub.addNestedSub(handleChangeWrapper) : store.subscribe(handleChangeWrapper);\n      listeners = createListenerCollection();\n    }\n  }\n\n  function tryUnsubscribe() {\n    if (unsubscribe) {\n      unsubscribe();\n      unsubscribe = undefined;\n      listeners.clear();\n      listeners = nullListeners;\n    }\n  }\n\n  var subscription = {\n    addNestedSub: addNestedSub,\n    notifyNestedSubs: notifyNestedSubs,\n    handleChangeWrapper: handleChangeWrapper,\n    isSubscribed: isSubscribed,\n    trySubscribe: trySubscribe,\n    tryUnsubscribe: tryUnsubscribe,\n    getListeners: function getListeners() {\n      return listeners;\n    }\n  };\n  return subscription;\n}\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js\n // React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser. We need useLayoutEffect to ensure the store\n// subscription callback always has the selector from the latest render commit\n// available, otherwise a store update may happen between render and the effect,\n// which may cause missed updates; we also must ensure the store subscription\n// is created synchronously, otherwise a store update may occur before the\n// subscription is created and an inconsistent state may be observed\n\nvar useIsomorphicLayoutEffect_useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? react.useLayoutEffect : react.useEffect;\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/components/Provider.js\n\n\n\n\n\n\nfunction Provider(_ref) {\n  var store = _ref.store,\n      context = _ref.context,\n      children = _ref.children;\n  var contextValue = (0,react.useMemo)(function () {\n    var subscription = Subscription_createSubscription(store);\n    return {\n      store: store,\n      subscription: subscription\n    };\n  }, [store]);\n  var previousState = (0,react.useMemo)(function () {\n    return store.getState();\n  }, [store]);\n  useIsomorphicLayoutEffect_useIsomorphicLayoutEffect(function () {\n    var subscription = contextValue.subscription;\n    subscription.onStateChange = subscription.notifyNestedSubs;\n    subscription.trySubscribe();\n\n    if (previousState !== store.getState()) {\n      subscription.notifyNestedSubs();\n    }\n\n    return function () {\n      subscription.tryUnsubscribe();\n      subscription.onStateChange = null;\n    };\n  }, [contextValue, previousState]);\n  var Context = context || Context_ReactReduxContext;\n  return /*#__PURE__*/react.createElement(Context.Provider, {\n    value: contextValue\n  }, children);\n}\n\nif (false) {}\n\n/* harmony default export */ const components_Provider = (Provider);\n// EXTERNAL MODULE: ../../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(3463);\n// EXTERNAL MODULE: ../../node_modules/react-redux/node_modules/react-is/index.js\nvar react_is = __webpack_require__(3920);\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/components/connectAdvanced.js\n\n\nvar _excluded = (/* unused pure expression or super */ null && ([\"getDisplayName\", \"methodName\", \"renderCountProp\", \"shouldHandleStateChanges\", \"storeKey\", \"withRef\", \"forwardRef\", \"context\"])),\n    _excluded2 = (/* unused pure expression or super */ null && ([\"reactReduxForwardedRef\"]));\n\n\n\n\n\n // Define some constant arrays just to avoid re-creating these\n\nvar EMPTY_ARRAY = (/* unused pure expression or super */ null && ([]));\nvar NO_SUBSCRIPTION_ARRAY = (/* unused pure expression or super */ null && ([null, null]));\n\nvar stringifyComponent = function stringifyComponent(Comp) {\n  try {\n    return JSON.stringify(Comp);\n  } catch (err) {\n    return String(Comp);\n  }\n};\n\nfunction storeStateUpdatesReducer(state, action) {\n  var updateCount = state[1];\n  return [action.payload, updateCount + 1];\n}\n\nfunction useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) {\n  useIsomorphicLayoutEffect(function () {\n    return effectFunc.apply(void 0, effectArgs);\n  }, dependencies);\n}\n\nfunction captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs) {\n  // We want to capture the wrapper props and child props we used for later comparisons\n  lastWrapperProps.current = wrapperProps;\n  lastChildProps.current = actualChildProps;\n  renderIsScheduled.current = false; // If the render was from a store update, clear out that reference and cascade the subscriber update\n\n  if (childPropsFromStoreUpdate.current) {\n    childPropsFromStoreUpdate.current = null;\n    notifyNestedSubs();\n  }\n}\n\nfunction subscribeUpdates(shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch) {\n  // If we're not subscribed to the store, nothing to do here\n  if (!shouldHandleStateChanges) return; // Capture values for checking if and when this component unmounts\n\n  var didUnsubscribe = false;\n  var lastThrownError = null; // We'll run this callback every time a store subscription update propagates to this component\n\n  var checkForUpdates = function checkForUpdates() {\n    if (didUnsubscribe) {\n      // Don't run stale listeners.\n      // Redux doesn't guarantee unsubscriptions happen until next dispatch.\n      return;\n    }\n\n    var latestStoreState = store.getState();\n    var newChildProps, error;\n\n    try {\n      // Actually run the selector with the most recent store state and wrapper props\n      // to determine what the child props should be\n      newChildProps = childPropsSelector(latestStoreState, lastWrapperProps.current);\n    } catch (e) {\n      error = e;\n      lastThrownError = e;\n    }\n\n    if (!error) {\n      lastThrownError = null;\n    } // If the child props haven't changed, nothing to do here - cascade the subscription update\n\n\n    if (newChildProps === lastChildProps.current) {\n      if (!renderIsScheduled.current) {\n        notifyNestedSubs();\n      }\n    } else {\n      // Save references to the new child props.  Note that we track the \"child props from store update\"\n      // as a ref instead of a useState/useReducer because we need a way to determine if that value has\n      // been processed.  If this went into useState/useReducer, we couldn't clear out the value without\n      // forcing another re-render, which we don't want.\n      lastChildProps.current = newChildProps;\n      childPropsFromStoreUpdate.current = newChildProps;\n      renderIsScheduled.current = true; // If the child props _did_ change (or we caught an error), this wrapper component needs to re-render\n\n      forceComponentUpdateDispatch({\n        type: 'STORE_UPDATED',\n        payload: {\n          error: error\n        }\n      });\n    }\n  }; // Actually subscribe to the nearest connected ancestor (or store)\n\n\n  subscription.onStateChange = checkForUpdates;\n  subscription.trySubscribe(); // Pull data from the store after first render in case the store has\n  // changed since we began.\n\n  checkForUpdates();\n\n  var unsubscribeWrapper = function unsubscribeWrapper() {\n    didUnsubscribe = true;\n    subscription.tryUnsubscribe();\n    subscription.onStateChange = null;\n\n    if (lastThrownError) {\n      // It's possible that we caught an error due to a bad mapState function, but the\n      // parent re-rendered without this component and we're about to unmount.\n      // This shouldn't happen as long as we do top-down subscriptions correctly, but\n      // if we ever do those wrong, this throw will surface the error in our tests.\n      // In that case, throw the error from here so it doesn't get lost.\n      throw lastThrownError;\n    }\n  };\n\n  return unsubscribeWrapper;\n}\n\nvar initStateUpdates = function initStateUpdates() {\n  return [null, 0];\n};\n\nfunction connectAdvanced_connectAdvanced(\n/*\n  selectorFactory is a func that is responsible for returning the selector function used to\n  compute new props from state, props, and dispatch. For example:\n      export default connectAdvanced((dispatch, options) => (state, props) => ({\n      thing: state.things[props.thingId],\n      saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),\n    }))(YourComponent)\n    Access to dispatch is provided to the factory so selectorFactories can bind actionCreators\n  outside of their selector as an optimization. Options passed to connectAdvanced are passed to\n  the selectorFactory, along with displayName and WrappedComponent, as the second argument.\n    Note that selectorFactory is responsible for all caching/memoization of inbound and outbound\n  props. Do not use connectAdvanced directly without memoizing results between calls to your\n  selector, otherwise the Connect component will re-render on every state or props change.\n*/\nselectorFactory, // options object:\n_ref) {\n  if (_ref === void 0) {\n    _ref = {};\n  }\n\n  var _ref2 = _ref,\n      _ref2$getDisplayName = _ref2.getDisplayName,\n      getDisplayName = _ref2$getDisplayName === void 0 ? function (name) {\n    return \"ConnectAdvanced(\" + name + \")\";\n  } : _ref2$getDisplayName,\n      _ref2$methodName = _ref2.methodName,\n      methodName = _ref2$methodName === void 0 ? 'connectAdvanced' : _ref2$methodName,\n      _ref2$renderCountProp = _ref2.renderCountProp,\n      renderCountProp = _ref2$renderCountProp === void 0 ? undefined : _ref2$renderCountProp,\n      _ref2$shouldHandleSta = _ref2.shouldHandleStateChanges,\n      shouldHandleStateChanges = _ref2$shouldHandleSta === void 0 ? true : _ref2$shouldHandleSta,\n      _ref2$storeKey = _ref2.storeKey,\n      storeKey = _ref2$storeKey === void 0 ? 'store' : _ref2$storeKey,\n      _ref2$withRef = _ref2.withRef,\n      withRef = _ref2$withRef === void 0 ? false : _ref2$withRef,\n      _ref2$forwardRef = _ref2.forwardRef,\n      forwardRef = _ref2$forwardRef === void 0 ? false : _ref2$forwardRef,\n      _ref2$context = _ref2.context,\n      context = _ref2$context === void 0 ? ReactReduxContext : _ref2$context,\n      connectOptions = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n  if (false) { var customStoreWarningMessage; }\n\n  var Context = context;\n  return function wrapWithConnect(WrappedComponent) {\n    if (false) {}\n\n    var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';\n    var displayName = getDisplayName(wrappedComponentName);\n\n    var selectorFactoryOptions = _extends({}, connectOptions, {\n      getDisplayName: getDisplayName,\n      methodName: methodName,\n      renderCountProp: renderCountProp,\n      shouldHandleStateChanges: shouldHandleStateChanges,\n      storeKey: storeKey,\n      displayName: displayName,\n      wrappedComponentName: wrappedComponentName,\n      WrappedComponent: WrappedComponent\n    });\n\n    var pure = connectOptions.pure;\n\n    function createChildSelector(store) {\n      return selectorFactory(store.dispatch, selectorFactoryOptions);\n    } // If we aren't running in \"pure\" mode, we don't want to memoize values.\n    // To avoid conditionally calling hooks, we fall back to a tiny wrapper\n    // that just executes the given callback immediately.\n\n\n    var usePureOnlyMemo = pure ? useMemo : function (callback) {\n      return callback();\n    };\n\n    function ConnectFunction(props) {\n      var _useMemo = useMemo(function () {\n        // Distinguish between actual \"data\" props that were passed to the wrapper component,\n        // and values needed to control behavior (forwarded refs, alternate context instances).\n        // To maintain the wrapperProps object reference, memoize this destructuring.\n        var reactReduxForwardedRef = props.reactReduxForwardedRef,\n            wrapperProps = _objectWithoutPropertiesLoose(props, _excluded2);\n\n        return [props.context, reactReduxForwardedRef, wrapperProps];\n      }, [props]),\n          propsContext = _useMemo[0],\n          reactReduxForwardedRef = _useMemo[1],\n          wrapperProps = _useMemo[2];\n\n      var ContextToUse = useMemo(function () {\n        // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext.\n        // Memoize the check that determines which context instance we should use.\n        return propsContext && propsContext.Consumer && isContextConsumer( /*#__PURE__*/React.createElement(propsContext.Consumer, null)) ? propsContext : Context;\n      }, [propsContext, Context]); // Retrieve the store and ancestor subscription via context, if available\n\n      var contextValue = useContext(ContextToUse); // The store _must_ exist as either a prop or in context.\n      // We'll check to see if it _looks_ like a Redux store first.\n      // This allows us to pass through a `store` prop that is just a plain value.\n\n      var didStoreComeFromProps = Boolean(props.store) && Boolean(props.store.getState) && Boolean(props.store.dispatch);\n      var didStoreComeFromContext = Boolean(contextValue) && Boolean(contextValue.store);\n\n      if (false) {} // Based on the previous check, one of these must be true\n\n\n      var store = didStoreComeFromProps ? props.store : contextValue.store;\n      var childPropsSelector = useMemo(function () {\n        // The child props selector needs the store reference as an input.\n        // Re-create this selector whenever the store changes.\n        return createChildSelector(store);\n      }, [store]);\n\n      var _useMemo2 = useMemo(function () {\n        if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription's source should match where store came from: props vs. context. A component\n        // connected to the store via props shouldn't use subscription from context, or vice versa.\n\n        // This Subscription's source should match where store came from: props vs. context. A component\n        // connected to the store via props shouldn't use subscription from context, or vice versa.\n        var subscription = createSubscription(store, didStoreComeFromProps ? null : contextValue.subscription); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n        // the middle of the notification loop, where `subscription` will then be null. This can\n        // probably be avoided if Subscription's listeners logic is changed to not call listeners\n        // that have been unsubscribed in the  middle of the notification loop.\n\n        // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n        // the middle of the notification loop, where `subscription` will then be null. This can\n        // probably be avoided if Subscription's listeners logic is changed to not call listeners\n        // that have been unsubscribed in the  middle of the notification loop.\n        var notifyNestedSubs = subscription.notifyNestedSubs.bind(subscription);\n        return [subscription, notifyNestedSubs];\n      }, [store, didStoreComeFromProps, contextValue]),\n          subscription = _useMemo2[0],\n          notifyNestedSubs = _useMemo2[1]; // Determine what {store, subscription} value should be put into nested context, if necessary,\n      // and memoize that value to avoid unnecessary context updates.\n\n\n      var overriddenContextValue = useMemo(function () {\n        if (didStoreComeFromProps) {\n          // This component is directly subscribed to a store from props.\n          // We don't want descendants reading from this store - pass down whatever\n          // the existing context value is from the nearest connected ancestor.\n          return contextValue;\n        } // Otherwise, put this component's subscription instance into context, so that\n        // connected descendants won't update until after this component is done\n\n\n        return _extends({}, contextValue, {\n          subscription: subscription\n        });\n      }, [didStoreComeFromProps, contextValue, subscription]); // We need to force this wrapper component to re-render whenever a Redux store update\n      // causes a change to the calculated child component props (or we caught an error in mapState)\n\n      var _useReducer = useReducer(storeStateUpdatesReducer, EMPTY_ARRAY, initStateUpdates),\n          _useReducer$ = _useReducer[0],\n          previousStateUpdateResult = _useReducer$[0],\n          forceComponentUpdateDispatch = _useReducer[1]; // Propagate any mapState/mapDispatch errors upwards\n\n\n      if (previousStateUpdateResult && previousStateUpdateResult.error) {\n        throw previousStateUpdateResult.error;\n      } // Set up refs to coordinate values between the subscription effect and the render logic\n\n\n      var lastChildProps = useRef();\n      var lastWrapperProps = useRef(wrapperProps);\n      var childPropsFromStoreUpdate = useRef();\n      var renderIsScheduled = useRef(false);\n      var actualChildProps = usePureOnlyMemo(function () {\n        // Tricky logic here:\n        // - This render may have been triggered by a Redux store update that produced new child props\n        // - However, we may have gotten new wrapper props after that\n        // If we have new child props, and the same wrapper props, we know we should use the new child props as-is.\n        // But, if we have new wrapper props, those might change the child props, so we have to recalculate things.\n        // So, we'll use the child props from store update only if the wrapper props are the same as last time.\n        if (childPropsFromStoreUpdate.current && wrapperProps === lastWrapperProps.current) {\n          return childPropsFromStoreUpdate.current;\n        } // TODO We're reading the store directly in render() here. Bad idea?\n        // This will likely cause Bad Things (TM) to happen in Concurrent Mode.\n        // Note that we do this because on renders _not_ caused by store updates, we need the latest store state\n        // to determine what the child props should be.\n\n\n        return childPropsSelector(store.getState(), wrapperProps);\n      }, [store, previousStateUpdateResult, wrapperProps]); // We need this to execute synchronously every time we re-render. However, React warns\n      // about useLayoutEffect in SSR, so we try to detect environment and fall back to\n      // just useEffect instead to avoid the warning, since neither will run anyway.\n\n      useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs]); // Our re-subscribe logic only runs when the store/subscription setup changes\n\n      useIsomorphicLayoutEffectWithArgs(subscribeUpdates, [shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch], [store, subscription, childPropsSelector]); // Now that all that's done, we can finally try to actually render the child component.\n      // We memoize the elements for the rendered child component as an optimization.\n\n      var renderedWrappedComponent = useMemo(function () {\n        return /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, actualChildProps, {\n          ref: reactReduxForwardedRef\n        }));\n      }, [reactReduxForwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering\n      // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate.\n\n      var renderedChild = useMemo(function () {\n        if (shouldHandleStateChanges) {\n          // If this component is subscribed to store updates, we need to pass its own\n          // subscription instance down to our descendants. That means rendering the same\n          // Context instance, and putting a different value into the context.\n          return /*#__PURE__*/React.createElement(ContextToUse.Provider, {\n            value: overriddenContextValue\n          }, renderedWrappedComponent);\n        }\n\n        return renderedWrappedComponent;\n      }, [ContextToUse, renderedWrappedComponent, overriddenContextValue]);\n      return renderedChild;\n    } // If we're in \"pure\" mode, ensure our wrapper component only re-renders when incoming props have changed.\n\n\n    var Connect = pure ? React.memo(ConnectFunction) : ConnectFunction;\n    Connect.WrappedComponent = WrappedComponent;\n    Connect.displayName = ConnectFunction.displayName = displayName;\n\n    if (forwardRef) {\n      var forwarded = React.forwardRef(function forwardConnectRef(props, ref) {\n        return /*#__PURE__*/React.createElement(Connect, _extends({}, props, {\n          reactReduxForwardedRef: ref\n        }));\n      });\n      forwarded.displayName = displayName;\n      forwarded.WrappedComponent = WrappedComponent;\n      return hoistStatics(forwarded, WrappedComponent);\n    }\n\n    return hoistStatics(Connect, WrappedComponent);\n  };\n}\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/utils/bindActionCreators.js\nfunction bindActionCreators(actionCreators, dispatch) {\n  var boundActionCreators = {};\n\n  var _loop = function _loop(key) {\n    var actionCreator = actionCreators[key];\n\n    if (typeof actionCreator === 'function') {\n      boundActionCreators[key] = function () {\n        return dispatch(actionCreator.apply(void 0, arguments));\n      };\n    }\n  };\n\n  for (var key in actionCreators) {\n    _loop(key);\n  }\n\n  return boundActionCreators;\n}\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/connect/wrapMapToProps.js\n\nfunction wrapMapToPropsConstant(getConstant) {\n  return function initConstantSelector(dispatch, options) {\n    var constant = getConstant(dispatch, options);\n\n    function constantSelector() {\n      return constant;\n    }\n\n    constantSelector.dependsOnOwnProps = false;\n    return constantSelector;\n  };\n} // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args\n// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine\n// whether mapToProps needs to be invoked when props have changed.\n//\n// A length of one signals that mapToProps does not depend on props from the parent component.\n// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and\n// therefore not reporting its length accurately..\n\nfunction getDependsOnOwnProps(mapToProps) {\n  return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;\n} // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,\n// this function wraps mapToProps in a proxy function which does several things:\n//\n//  * Detects whether the mapToProps function being called depends on props, which\n//    is used by selectorFactory to decide if it should reinvoke on props changes.\n//\n//  * On first call, handles mapToProps if returns another function, and treats that\n//    new function as the true mapToProps for subsequent calls.\n//\n//  * On first call, verifies the first result is a plain object, in order to warn\n//    the developer that their mapToProps function is not returning a valid result.\n//\n\nfunction wrapMapToPropsFunc(mapToProps, methodName) {\n  return function initProxySelector(dispatch, _ref) {\n    var displayName = _ref.displayName;\n\n    var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {\n      return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);\n    }; // allow detectFactoryAndVerify to get ownProps\n\n\n    proxy.dependsOnOwnProps = true;\n\n    proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {\n      proxy.mapToProps = mapToProps;\n      proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);\n      var props = proxy(stateOrDispatch, ownProps);\n\n      if (typeof props === 'function') {\n        proxy.mapToProps = props;\n        proxy.dependsOnOwnProps = getDependsOnOwnProps(props);\n        props = proxy(stateOrDispatch, ownProps);\n      }\n\n      if (false) {}\n      return props;\n    };\n\n    return proxy;\n  };\n}\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/connect/mapDispatchToProps.js\n\n\nfunction whenMapDispatchToPropsIsFunction(mapDispatchToProps) {\n  return typeof mapDispatchToProps === 'function' ? wrapMapToPropsFunc(mapDispatchToProps, 'mapDispatchToProps') : undefined;\n}\nfunction whenMapDispatchToPropsIsMissing(mapDispatchToProps) {\n  return !mapDispatchToProps ? wrapMapToPropsConstant(function (dispatch) {\n    return {\n      dispatch: dispatch\n    };\n  }) : undefined;\n}\nfunction whenMapDispatchToPropsIsObject(mapDispatchToProps) {\n  return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? wrapMapToPropsConstant(function (dispatch) {\n    return bindActionCreators(mapDispatchToProps, dispatch);\n  }) : undefined;\n}\n/* harmony default export */ const mapDispatchToProps = ([whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject]);\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/connect/mapStateToProps.js\n\nfunction whenMapStateToPropsIsFunction(mapStateToProps) {\n  return typeof mapStateToProps === 'function' ? wrapMapToPropsFunc(mapStateToProps, 'mapStateToProps') : undefined;\n}\nfunction whenMapStateToPropsIsMissing(mapStateToProps) {\n  return !mapStateToProps ? wrapMapToPropsConstant(function () {\n    return {};\n  }) : undefined;\n}\n/* harmony default export */ const mapStateToProps = ([whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing]);\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/extends.js\nfunction extends_extends() {\n  extends_extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return extends_extends.apply(this, arguments);\n}\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/connect/mergeProps.js\n\n\nfunction defaultMergeProps(stateProps, dispatchProps, ownProps) {\n  return extends_extends({}, ownProps, stateProps, dispatchProps);\n}\nfunction wrapMergePropsFunc(mergeProps) {\n  return function initMergePropsProxy(dispatch, _ref) {\n    var displayName = _ref.displayName,\n        pure = _ref.pure,\n        areMergedPropsEqual = _ref.areMergedPropsEqual;\n    var hasRunOnce = false;\n    var mergedProps;\n    return function mergePropsProxy(stateProps, dispatchProps, ownProps) {\n      var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n\n      if (hasRunOnce) {\n        if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;\n      } else {\n        hasRunOnce = true;\n        mergedProps = nextMergedProps;\n        if (false) {}\n      }\n\n      return mergedProps;\n    };\n  };\n}\nfunction whenMergePropsIsFunction(mergeProps) {\n  return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;\n}\nfunction whenMergePropsIsOmitted(mergeProps) {\n  return !mergeProps ? function () {\n    return defaultMergeProps;\n  } : undefined;\n}\n/* harmony default export */ const mergeProps = ([whenMergePropsIsFunction, whenMergePropsIsOmitted]);\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/connect/connect.js\n\n\nvar connect_excluded = (/* unused pure expression or super */ null && ([\"pure\", \"areStatesEqual\", \"areOwnPropsEqual\", \"areStatePropsEqual\", \"areMergedPropsEqual\"]));\n\n\n\n\n\n\n/*\n  connect is a facade over connectAdvanced. It turns its args into a compatible\n  selectorFactory, which has the signature:\n\n    (dispatch, options) => (nextState, nextOwnProps) => nextFinalProps\n  \n  connect passes its args to connectAdvanced as options, which will in turn pass them to\n  selectorFactory each time a Connect component instance is instantiated or hot reloaded.\n\n  selectorFactory returns a final props selector from its mapStateToProps,\n  mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,\n  mergePropsFactories, and pure args.\n\n  The resulting final props selector is called by the Connect component instance whenever\n  it receives new props or store state.\n */\n\nfunction match(arg, factories, name) {\n  for (var i = factories.length - 1; i >= 0; i--) {\n    var result = factories[i](arg);\n    if (result) return result;\n  }\n\n  return function (dispatch, options) {\n    throw new Error(\"Invalid value of type \" + typeof arg + \" for \" + name + \" argument when connecting component \" + options.wrappedComponentName + \".\");\n  };\n}\n\nfunction strictEqual(a, b) {\n  return a === b;\n} // createConnect with default args builds the 'official' connect behavior. Calling it with\n// different options opens up some testing and extensibility scenarios\n\n\nfunction createConnect(_temp) {\n  var _ref = _temp === void 0 ? {} : _temp,\n      _ref$connectHOC = _ref.connectHOC,\n      connectHOC = _ref$connectHOC === void 0 ? connectAdvanced : _ref$connectHOC,\n      _ref$mapStateToPropsF = _ref.mapStateToPropsFactories,\n      mapStateToPropsFactories = _ref$mapStateToPropsF === void 0 ? defaultMapStateToPropsFactories : _ref$mapStateToPropsF,\n      _ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,\n      mapDispatchToPropsFactories = _ref$mapDispatchToPro === void 0 ? defaultMapDispatchToPropsFactories : _ref$mapDispatchToPro,\n      _ref$mergePropsFactor = _ref.mergePropsFactories,\n      mergePropsFactories = _ref$mergePropsFactor === void 0 ? defaultMergePropsFactories : _ref$mergePropsFactor,\n      _ref$selectorFactory = _ref.selectorFactory,\n      selectorFactory = _ref$selectorFactory === void 0 ? defaultSelectorFactory : _ref$selectorFactory;\n\n  return function connect(mapStateToProps, mapDispatchToProps, mergeProps, _ref2) {\n    if (_ref2 === void 0) {\n      _ref2 = {};\n    }\n\n    var _ref3 = _ref2,\n        _ref3$pure = _ref3.pure,\n        pure = _ref3$pure === void 0 ? true : _ref3$pure,\n        _ref3$areStatesEqual = _ref3.areStatesEqual,\n        areStatesEqual = _ref3$areStatesEqual === void 0 ? strictEqual : _ref3$areStatesEqual,\n        _ref3$areOwnPropsEqua = _ref3.areOwnPropsEqual,\n        areOwnPropsEqual = _ref3$areOwnPropsEqua === void 0 ? shallowEqual : _ref3$areOwnPropsEqua,\n        _ref3$areStatePropsEq = _ref3.areStatePropsEqual,\n        areStatePropsEqual = _ref3$areStatePropsEq === void 0 ? shallowEqual : _ref3$areStatePropsEq,\n        _ref3$areMergedPropsE = _ref3.areMergedPropsEqual,\n        areMergedPropsEqual = _ref3$areMergedPropsE === void 0 ? shallowEqual : _ref3$areMergedPropsE,\n        extraOptions = _objectWithoutPropertiesLoose(_ref3, connect_excluded);\n\n    var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');\n    var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');\n    var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');\n    return connectHOC(selectorFactory, _extends({\n      // used in error messages\n      methodName: 'connect',\n      // used to compute Connect's displayName from the wrapped component's displayName.\n      getDisplayName: function getDisplayName(name) {\n        return \"Connect(\" + name + \")\";\n      },\n      // if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes\n      shouldHandleStateChanges: Boolean(mapStateToProps),\n      // passed through to selectorFactory\n      initMapStateToProps: initMapStateToProps,\n      initMapDispatchToProps: initMapDispatchToProps,\n      initMergeProps: initMergeProps,\n      pure: pure,\n      areStatesEqual: areStatesEqual,\n      areOwnPropsEqual: areOwnPropsEqual,\n      areStatePropsEqual: areStatePropsEqual,\n      areMergedPropsEqual: areMergedPropsEqual\n    }, extraOptions));\n  };\n}\n/* harmony default export */ const connect = (/*#__PURE__*/(/* unused pure expression or super */ null && (createConnect())));\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/hooks/useReduxContext.js\n\n\n/**\n * A hook to access the value of the `ReactReduxContext`. This is a low-level\n * hook that you should usually not need to call directly.\n *\n * @returns {any} the value of the `ReactReduxContext`\n *\n * @example\n *\n * import React from 'react'\n * import { useReduxContext } from 'react-redux'\n *\n * export const CounterComponent = ({ value }) => {\n *   const { store } = useReduxContext()\n *   return <div>{store.getState()}</div>\n * }\n */\n\nfunction useReduxContext_useReduxContext() {\n  var contextValue = (0,react.useContext)(Context_ReactReduxContext);\n\n  if (false) {}\n\n  return contextValue;\n}\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/hooks/useStore.js\n\n\n\n/**\n * Hook factory, which creates a `useStore` hook bound to a given context.\n *\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\n * @returns {Function} A `useStore` hook bound to the specified context.\n */\n\nfunction createStoreHook(context) {\n  if (context === void 0) {\n    context = Context_ReactReduxContext;\n  }\n\n  var useReduxContext = context === Context_ReactReduxContext ? useReduxContext_useReduxContext : function () {\n    return (0,react.useContext)(context);\n  };\n  return function useStore() {\n    var _useReduxContext = useReduxContext(),\n        store = _useReduxContext.store;\n\n    return store;\n  };\n}\n/**\n * A hook to access the redux store.\n *\n * @returns {any} the redux store\n *\n * @example\n *\n * import React from 'react'\n * import { useStore } from 'react-redux'\n *\n * export const ExampleComponent = () => {\n *   const store = useStore()\n *   return <div>{store.getState()}</div>\n * }\n */\n\nvar useStore_useStore = /*#__PURE__*/createStoreHook();\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/hooks/useDispatch.js\n\n\n/**\n * Hook factory, which creates a `useDispatch` hook bound to a given context.\n *\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\n * @returns {Function} A `useDispatch` hook bound to the specified context.\n */\n\nfunction createDispatchHook(context) {\n  if (context === void 0) {\n    context = Context_ReactReduxContext;\n  }\n\n  var useStore = context === Context_ReactReduxContext ? useStore_useStore : createStoreHook(context);\n  return function useDispatch() {\n    var store = useStore();\n    return store.dispatch;\n  };\n}\n/**\n * A hook to access the redux `dispatch` function.\n *\n * @returns {any|function} redux store's `dispatch` function\n *\n * @example\n *\n * import React, { useCallback } from 'react'\n * import { useDispatch } from 'react-redux'\n *\n * export const CounterComponent = ({ value }) => {\n *   const dispatch = useDispatch()\n *   const increaseCounter = useCallback(() => dispatch({ type: 'increase-counter' }), [])\n *   return (\n *     <div>\n *       <span>{value}</span>\n *       <button onClick={increaseCounter}>Increase counter</button>\n *     </div>\n *   )\n * }\n */\n\nvar useDispatch = /*#__PURE__*/createDispatchHook();\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/hooks/useSelector.js\n\n\n\n\n\n\nvar refEquality = function refEquality(a, b) {\n  return a === b;\n};\n\nfunction useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub) {\n  var _useReducer = (0,react.useReducer)(function (s) {\n    return s + 1;\n  }, 0),\n      forceRender = _useReducer[1];\n\n  var subscription = (0,react.useMemo)(function () {\n    return Subscription_createSubscription(store, contextSub);\n  }, [store, contextSub]);\n  var latestSubscriptionCallbackError = (0,react.useRef)();\n  var latestSelector = (0,react.useRef)();\n  var latestStoreState = (0,react.useRef)();\n  var latestSelectedState = (0,react.useRef)();\n  var storeState = store.getState();\n  var selectedState;\n\n  try {\n    if (selector !== latestSelector.current || storeState !== latestStoreState.current || latestSubscriptionCallbackError.current) {\n      var newSelectedState = selector(storeState); // ensure latest selected state is reused so that a custom equality function can result in identical references\n\n      if (latestSelectedState.current === undefined || !equalityFn(newSelectedState, latestSelectedState.current)) {\n        selectedState = newSelectedState;\n      } else {\n        selectedState = latestSelectedState.current;\n      }\n    } else {\n      selectedState = latestSelectedState.current;\n    }\n  } catch (err) {\n    if (latestSubscriptionCallbackError.current) {\n      err.message += \"\\nThe error may be correlated with this previous error:\\n\" + latestSubscriptionCallbackError.current.stack + \"\\n\\n\";\n    }\n\n    throw err;\n  }\n\n  useIsomorphicLayoutEffect_useIsomorphicLayoutEffect(function () {\n    latestSelector.current = selector;\n    latestStoreState.current = storeState;\n    latestSelectedState.current = selectedState;\n    latestSubscriptionCallbackError.current = undefined;\n  });\n  useIsomorphicLayoutEffect_useIsomorphicLayoutEffect(function () {\n    function checkForUpdates() {\n      try {\n        var newStoreState = store.getState(); // Avoid calling selector multiple times if the store's state has not changed\n\n        if (newStoreState === latestStoreState.current) {\n          return;\n        }\n\n        var _newSelectedState = latestSelector.current(newStoreState);\n\n        if (equalityFn(_newSelectedState, latestSelectedState.current)) {\n          return;\n        }\n\n        latestSelectedState.current = _newSelectedState;\n        latestStoreState.current = newStoreState;\n      } catch (err) {\n        // we ignore all errors here, since when the component\n        // is re-rendered, the selectors are called again, and\n        // will throw again, if neither props nor store state\n        // changed\n        latestSubscriptionCallbackError.current = err;\n      }\n\n      forceRender();\n    }\n\n    subscription.onStateChange = checkForUpdates;\n    subscription.trySubscribe();\n    checkForUpdates();\n    return function () {\n      return subscription.tryUnsubscribe();\n    };\n  }, [store, subscription]);\n  return selectedState;\n}\n/**\n * Hook factory, which creates a `useSelector` hook bound to a given context.\n *\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\n * @returns {Function} A `useSelector` hook bound to the specified context.\n */\n\n\nfunction createSelectorHook(context) {\n  if (context === void 0) {\n    context = Context_ReactReduxContext;\n  }\n\n  var useReduxContext = context === Context_ReactReduxContext ? useReduxContext_useReduxContext : function () {\n    return (0,react.useContext)(context);\n  };\n  return function useSelector(selector, equalityFn) {\n    if (equalityFn === void 0) {\n      equalityFn = refEquality;\n    }\n\n    if (false) {}\n\n    var _useReduxContext = useReduxContext(),\n        store = _useReduxContext.store,\n        contextSub = _useReduxContext.subscription;\n\n    var selectedState = useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub);\n    (0,react.useDebugValue)(selectedState);\n    return selectedState;\n  };\n}\n/**\n * A hook to access the redux store's state. This hook takes a selector function\n * as an argument. The selector is called with the store state.\n *\n * This hook takes an optional equality comparison function as the second parameter\n * that allows you to customize the way the selected state is compared to determine\n * whether the component needs to be re-rendered.\n *\n * @param {Function} selector the selector function\n * @param {Function=} equalityFn the function that will be used to determine equality\n *\n * @returns {any} the selected state\n *\n * @example\n *\n * import React from 'react'\n * import { useSelector } from 'react-redux'\n *\n * export const CounterComponent = () => {\n *   const counter = useSelector(state => state.counter)\n *   return <div>{counter}</div>\n * }\n */\n\nvar useSelector = /*#__PURE__*/createSelectorHook();\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/exports.js\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/utils/reactBatchedUpdates.js\n/* eslint-disable import/no-unresolved */\n\n;// CONCATENATED MODULE: ../../node_modules/react-redux/es/index.js\n\n\n // Enable batched updates in our subscriptions for use\n// with standard React renderers (ReactDOM, React Native)\n\nsetBatch(react_dom.unstable_batchedUpdates);\n\n// EXTERNAL MODULE: ../../node_modules/redux/es/redux.js + 1 modules\nvar redux = __webpack_require__(4081);\n;// CONCATENATED MODULE: ../../node_modules/redux-thunk/es/index.js\n/** A function that accepts a potential \"extra argument\" value to be injected later,\n * and returns an instance of the thunk middleware that uses that value\n */\nfunction createThunkMiddleware(extraArgument) {\n  // Standard Redux middleware definition pattern:\n  // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware\n  var middleware = function middleware(_ref) {\n    var dispatch = _ref.dispatch,\n        getState = _ref.getState;\n    return function (next) {\n      return function (action) {\n        // The thunk middleware looks for any functions that were passed to `store.dispatch`.\n        // If this \"action\" is really a function, call it and return the result.\n        if (typeof action === 'function') {\n          // Inject the store's `dispatch` and `getState` methods, as well as any \"extra arg\"\n          return action(dispatch, getState, extraArgument);\n        } // Otherwise, pass the action down the middleware chain as usual\n\n\n        return next(action);\n      };\n    };\n  };\n\n  return middleware;\n}\n\nvar thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version\n// with whatever \"extra arg\" they want to inject into their thunks\n\nthunk.withExtraArgument = createThunkMiddleware;\n/* harmony default export */ const es = (thunk);\n// EXTERNAL MODULE: ../../node_modules/redux-devtools-extension/index.js\nvar redux_devtools_extension = __webpack_require__(8267);\n;// CONCATENATED MODULE: ./js/actionTypes.ts\nconst ADD_TRACK_FROM_URL = \"ADD_TRACK_FROM_URL\";\nconst CLOSE_WINAMP = \"CLOSE_WINAMP\";\nconst OPEN_WINAMP = \"OPEN_WINAMP\";\nconst MINIMIZE_WINAMP = \"MINIMIZE_WINAMP\";\nconst IS_PLAYING = \"IS_PLAYING\";\nconst IS_STOPPED = \"IS_STOPPED\";\nconst PAUSE = \"PAUSE\";\nconst PLAY = \"PLAY\";\nconst SEEK_TO_PERCENT_COMPLETE = \"SEEK_TO_PERCENT_COMPLETE\";\nconst SET_BALANCE = \"SET_BALANCE\";\nconst SET_BAND_VALUE = \"SET_BAND_VALUE\";\nconst SET_FOCUS = \"SET_FOCUS\";\nconst SET_BAND_FOCUS = \"SET_BAND_FOCUS\";\nconst SET_FOCUSED_WINDOW = \"SET_FOCUSED_WINDOW\";\nconst SET_MEDIA = \"SET_MEDIA\";\nconst SET_SCRUB_POSITION = \"SET_SCRUB_POSITION\";\nconst SET_SKIN_DATA = \"SET_SKIN_DATA\";\nconst SET_VOLUME = \"SET_VOLUME\";\nconst START_WORKING = \"START_WORKING\";\nconst STEP_MARQUEE = \"STEP_MARQUEE\";\nconst STOP = \"STOP\";\nconst STOP_WORKING = \"STOP_WORKING\";\nconst TOGGLE_DOUBLESIZE_MODE = \"TOGGLE_DOUBLESIZE_MODE\";\nconst SET_EQ_AUTO = \"SET_EQ_AUTO\";\nconst SET_EQ_ON = \"SET_EQ_ON\";\nconst SET_EQ_OFF = \"SET_EQ_OFF\";\nconst actionTypes_TOGGLE_LLAMA_MODE = \"TOGGLE_LLAMA_MODE\";\nconst TOGGLE_REPEAT = \"TOGGLE_REPEAT\";\nconst TOGGLE_SHUFFLE = \"TOGGLE_SHUFFLE\";\nconst TOGGLE_TIME_MODE = \"TOGGLE_TIME_MODE\";\nconst TOGGLE_VISUALIZER_STYLE = \"TOGGLE_VISUALIZER_STYLE\";\nconst UNSET_FOCUS = \"UNSET_FOCUS\";\nconst UPDATE_TIME_ELAPSED = \"UPDATE_TIME_ELAPSED\";\nconst SET_USER_MESSAGE = \"SET_USER_MESSAGE\";\nconst UNSET_USER_MESSAGE = \"UNSET_USER_MESSAGE\";\nconst SET_PLAYLIST_SCROLL_POSITION = \"SET_PLAYLIST_SCROLL_POSITION\";\nconst CLICKED_TRACK = \"CLICKED_TRACK\";\nconst CTRL_CLICKED_TRACK = \"CTRL_CLICKED_TRACK\";\nconst SHIFT_CLICKED_TRACK = \"SHIFT_CLICKED_TRACK\";\nconst SELECT_ALL = \"SELECT_ALL\";\nconst SELECT_ZERO = \"SELECT_ZERO\";\nconst INVERT_SELECTION = \"INVERT_SELECTION\";\nconst REMOVE_ALL_TRACKS = \"REMOVE_ALL_TRACKS\";\nconst CROP_TRACKS = \"CROP_TRACKS\";\nconst FILE_INFO = \"FILE_INFO\";\nconst REMOVE_TRACKS = \"REMOVE_TRACKS\";\nconst SET_AVAILABLE_SKINS = \"SET_AVAILABLE_SKINS\";\nconst REVERSE_LIST = \"REVERSE_LIST\";\nconst RANDOMIZE_LIST = \"RANDOMIZE_LIST\";\nconst SET_TRACK_ORDER = \"SET_TRACK_ORDER\";\nconst PLAY_TRACK = \"PLAY_TRACK\";\nconst BUFFER_TRACK = \"BUFFER_TRACK\";\nconst DRAG_SELECTED = \"DRAG_SELECTED\";\nconst SET_MEDIA_TAGS = \"SET_MEDIA_TAGS\";\nconst SET_MEDIA_DURATION = \"SET_MEDIA_DURATION\";\nconst TOGGLE_WINDOW = \"TOGGLE_WINDOW\";\nconst CLOSE_WINDOW = \"CLOSE_WINDOW\";\nconst MEDIA_TAG_REQUEST_INITIALIZED = \"MEDIA_TAG_REQUEST_INITIALIZED\";\nconst MEDIA_TAG_REQUEST_FAILED = \"MEDIA_TAG_REQUEST_FAILED\";\nconst NETWORK_CONNECTED = \"NETWORK_CONNECTED\";\nconst NETWORK_DISCONNECTED = \"NETWORK_DISCONNECTED\";\nconst UPDATE_WINDOW_POSITIONS = \"UPDATE_WINDOW_POSITIONS\";\nconst WINDOW_SIZE_CHANGED = \"WINDOW_SIZE_CHANGED\";\nconst TOGGLE_WINDOW_SHADE_MODE = \"TOGGLE_WINDOW_SHADE_MODE\";\nconst LOADED = \"LOADED\";\nconst SET_Z_INDEX = \"SET_Z_INDEX\";\nconst DISABLE_MARQUEE = \"DISABLE_MARQUEE\";\nconst SET_DUMMY_VIZ_DATA = \"SET_DUMMY_VIZ_DATA\";\nconst SET_WINDOW_VISIBILITY = \"SET_WINDOW_VISIBILITY\";\nconst LOADING = \"LOADING\";\nconst CLOSE_REQUESTED = \"CLOSE_REQUESTED\";\nconst LOAD_SERIALIZED_STATE = \"LOAD_SERIALIZED_STATE\";\nconst RESET_WINDOW_SIZES = \"RESET_WINDOW_SIZES\";\nconst BROWSER_WINDOW_SIZE_CHANGED = \"BROWSER_WINDOW_SIZE_CHANGED\";\nconst LOAD_DEFAULT_SKIN = \"LOAD_DEFAULT_SKIN\";\nconst ENABLE_MILKDROP = \"ENABLE_MILKDROP\";\nconst SET_MILKDROP_DESKTOP = \"SET_MILKDROP_DESKTOP\";\nconst SET_VISUALIZER_STYLE = \"SET_VISUALIZER_STYLE\";\nconst GOT_BUTTERCHURN_PRESETS = \"GOT_BUTTERCHURN_PRESETS\";\nconst GOT_BUTTERCHURN = \"GOT_BUTTERCHURN\";\nconst RESOLVE_PRESET_AT_INDEX = \"RESOLVE_PRESET_AT_INDEX\";\nconst SELECT_PRESET_AT_INDEX = \"SELECT_PRESET_AT_INDEX\";\nconst TOGGLE_PRESET_OVERLAY = \"TOGGLE_PRESET_OVERLAY\";\nconst PRESET_REQUESTED = \"PRESET_REQUESTED\";\nconst TOGGLE_RANDOMIZE_PRESETS = \"TOGGLE_RANDOMIZE_PRESETS\";\nconst TOGGLE_PRESET_CYCLING = \"TOGGLE_PRESET_CYCLING\";\nconst SCHEDULE_MILKDROP_MESSAGE = \"SCHEDULE_MILKDROP_MESSAGE\";\nconst SET_MILKDROP_FULLSCREEN = \"SET_MILKDROP_FULLSCREEN\";\nconst SET_MILKDROP_LOCK = \"SET_MILKDROP_LOCK\";\n;// CONCATENATED MODULE: ./js/baseSkin.json\nconst baseSkin_namespaceObject = JSON.parse('{\"images\":{\"EQ_PREAMP_LINE\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\"EQ_GRAPH_LINE_COLORS\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"},\"colors\":[\"rgb(0,0,0)\",\"rgb(24,33,41)\",\"rgb(239,49,16)\",\"rgb(206,41,16)\",\"rgb(214,90,0)\",\"rgb(214,102,0)\",\"rgb(214,115,0)\",\"rgb(198,123,8)\",\"rgb(222,165,24)\",\"rgb(214,181,33)\",\"rgb(189,222,41)\",\"rgb(148,222,33)\",\"rgb(41,206,16)\",\"rgb(50,190,16)\",\"rgb(57,181,16)\",\"rgb(49,156,8)\",\"rgb(41,148,0)\",\"rgb(24,132,8)\",\"rgb(255,255,255)\",\"rgb(214,214,222)\",\"rgb(181,189,189)\",\"rgb(160,170,175)\",\"rgb(148,156,165)\",\"rgb(150,150,150)\"],\"playlistStyle\":{\"normal\":\"#00FF00\",\"current\":\"#FFFFFF\",\"normalbg\":\"#000000\",\"selectedbg\":\"#0000FF\",\"font\":\"Arial\"}}');\n;// CONCATENATED MODULE: ./js/constants.ts\n\nconst BANDS = [60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000];\nconst WINDOWS = {\n  MAIN: \"main\",\n  PLAYLIST: \"playlist\",\n  EQUALIZER: \"equalizer\",\n  MILKDROP: \"milkdrop\"\n};\nconst LOAD_STYLE = {\n  BUFFER: \"BUFFER\",\n  PLAY: \"PLAY\",\n  NONE: \"NONE\"\n};\n\n// TODO: Make this an enum?\nconst MEDIA_TAG_REQUEST_STATUS = {\n  INITIALIZED: \"INITIALIZED\",\n  FAILED: \"FAILED\",\n  COMPLETE: \"COMPLETE\",\n  NOT_REQUESTED: \"NOT_REQUESTED\"\n};\nconst UTF8_ELLIPSIS = \"\\u2026\";\nconst CHARACTER_WIDTH = 5;\nconst WINDOW_RESIZE_SEGMENT_WIDTH = 25;\nconst WINDOW_RESIZE_SEGMENT_HEIGHT = 29;\nconst WINDOW_HEIGHT = 116;\nconst WINDOW_WIDTH = 275;\nconst TRACK_HEIGHT = 13;\nconst LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\nconst DEFAULT_SKIN = baseSkin_namespaceObject;\nconst VISUALIZERS = {\n  OSCILLOSCOPE: \"OSCILLOSCOPE\",\n  BAR: \"BAR\",\n  NONE: \"NONE\",\n  MILKDROP: \"MILKDROP\"\n};\nconst VISUALIZER_ORDER = [VISUALIZERS.BAR, VISUALIZERS.OSCILLOSCOPE,\n// TODO: Verify the order\nVISUALIZERS.NONE];\nconst TIME_MODE = {\n  ELAPSED: \"ELAPSED\",\n  REMAINING: \"REMAINING\"\n};\n\n// TODO: Convert to enum once we are fully Typescript\nconst MEDIA_STATUS = {\n  PLAYING: \"PLAYING\",\n  STOPPED: \"STOPPED\",\n  PAUSED: \"PAUSED\"\n};\n;// CONCATENATED MODULE: ./js/utils.ts\n\nfunction imgFromUrl(url) {\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.onload = () => {\n      resolve(img);\n    };\n    img.onerror = reject;\n    img.src = url;\n  });\n}\nconst getTimeObj = time => {\n  if (time == null) {\n    // If we clean up `<MiniTime />` we don't need to do this any more.\n    return {\n      minutesFirstDigit: \" \",\n      minutesSecondDigit: \" \",\n      secondsFirstDigit: \" \",\n      secondsSecondDigit: \" \"\n    };\n  }\n  const minutes = Math.floor(time / 60);\n  const seconds = time % 60;\n  const digits = time == null ? [\" \", \" \", \" \", \" \"] : [String(Math.floor(minutes / 10)), String(Math.floor(minutes % 10)), String(Math.floor(seconds / 10)), String(Math.floor(seconds % 10))];\n  const [minutesFirstDigit, minutesSecondDigit, secondsFirstDigit, secondsSecondDigit] = digits;\n  return {\n    minutesFirstDigit,\n    minutesSecondDigit,\n    secondsFirstDigit,\n    secondsSecondDigit\n  };\n};\nconst getTimeStr = (time, truncate = true) => {\n  if (time == null) {\n    return \"\";\n  }\n  const {\n    minutesFirstDigit,\n    minutesSecondDigit,\n    secondsFirstDigit,\n    secondsSecondDigit\n  } = getTimeObj(time);\n  return [truncate && minutesFirstDigit === \"0\" ? \"\" : minutesFirstDigit, minutesSecondDigit, \":\", secondsFirstDigit, secondsSecondDigit].join(\"\");\n};\nconst parseViscolors = text => {\n  const entries = text.split(\"\\n\");\n  const regex = /^\\s*(\\d+)\\s*,?\\s*(\\d+)\\s*,?\\s*(\\d+)/;\n  const colors = [...DEFAULT_SKIN.colors];\n  entries.map(line => regex.exec(line)).filter(Boolean).map(matches => matches.slice(1, 4).join(\",\")).map((rgb, i) => {\n    colors[i] = `rgb(${rgb})`;\n  });\n  return colors;\n};\nconst SECTION_REGEX = /^\\s*\\[(.+?)\\]\\s*$/;\nconst PROPERTY_REGEX = /^\\s*([^;][^=]*)\\s*=\\s*(.*)\\s*$/;\nconst parseIni = text => {\n  let section, match;\n  return text.split(/[\\r\\n]+/g).reduce((data, line) => {\n    if ((match = line.match(PROPERTY_REGEX)) && section != null) {\n      const key = match[1].trim().toLowerCase();\n      const value = match[2]\n      // Ignore anything after a second `=`\n      // TODO: What if this is inside quotes or escaped?\n      .replace(/\\=.*$/g, \"\").trim()\n      // Strip quotes\n      // TODO: What about escaped quotes?\n      // TODO: What about unbalanced quotes?\n      .replace(/(^\")|(\"$)|(^')|('$)/g, \"\");\n      data[section][key] = value;\n    } else if (match = line.match(SECTION_REGEX)) {\n      section = match[1].trim().toLowerCase();\n      data[section] = {};\n    }\n    return data;\n  }, {});\n};\nconst clamp = (value, min, max) => Math.min(Math.max(value, min), max);\nconst sum = values => values.reduce((total, value) => total + value, 0);\nconst base64FromDataArray = dataArray => {\n  return window.btoa(String.fromCharCode(...dataArray));\n};\nconst base64FromArrayBuffer = arrayBuffer => {\n  return base64FromDataArray(new Uint8Array(arrayBuffer));\n};\n\n// https://stackoverflow.com/a/15832662/1263117\nfunction downloadURI(uri, name) {\n  const link = document.createElement(\"a\");\n  link.download = name;\n  link.href = uri;\n  window.document.body.appendChild(link);\n  link.click();\n  window.document.body.removeChild(link);\n}\nconst toPercent = (min, max, value) => (value - min) / (max - min);\nconst percentToRange = (percent, min, max) => min + Math.round(percent * (max - min));\nconst percentToIndex = (percent, length) => percentToRange(percent, 0, length - 1);\nconst rebound = (oldMin, oldMax, newMin, newMax) => oldValue => percentToRange(toPercent(oldMin, oldMax, oldValue), newMin, newMax);\nconst normalizeEqBand = rebound(1, 64, 0, 2400);\nconst denormalizeEqBand = rebound(0, 2400, 1, 64);\nconst normalizedToDb = value => {\n  return value / 2400 * 24 - 12;\n};\nconst dbToNormalized = db => {\n  return Math.round((db + 12) / 24 * 2400);\n};\n\n// Merge a `source` object to a `target` recursively\n// TODO: The typing here is a bit of a disaster.\nfunction merge(target, source) {\n  const s = source;\n  const t = target;\n  // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties\n  for (const key of Object.keys(s)) {\n    if (s[key] instanceof Object) Object.assign(s[key], merge(t[key], s[key]));\n  }\n\n  // Join `target` and modified `source`\n  Object.assign(target || {}, source);\n  return target;\n}\n\n// Maps a value in a range (defined my min/max) to a value in an array (options).\nfunction segment(min, max, value, newValues) {\n  const ratio = toPercent(min, max, value);\n  /*\n  | 0 | 1 | 2 |\n  0   1   2   3\n  */\n  return newValues[percentToIndex(ratio, newValues.length)];\n}\n\n// https://bost.ocks.org/mike/shuffle/\n// Shuffle an array in O(n)\nfunction shuffle(array) {\n  const sorted = [...array];\n  let m = sorted.length;\n\n  // While there remain elements to shuffle…\n  while (m) {\n    // Pick a remaining element…\n    const i = Math.floor(Math.random() * m--);\n\n    // And swap it with the current element.\n    const val = sorted[m];\n    sorted[m] = sorted[i];\n    sorted[i] = val;\n  }\n  return sorted;\n}\nfunction sort(array, iteratee) {\n  return [...array].sort((a, b) => {\n    const aKey = iteratee(a);\n    const bKey = iteratee(b);\n    if (aKey < bKey) {\n      return -1;\n    } else if (aKey > bKey) {\n      return 1;\n    }\n    return 0;\n  });\n}\nfunction moveSelected(arr, isSelected, offset) {\n  const newArr = new Array(arr.length);\n  let next = 0;\n  for (let i = 0; i < newArr.length; i++) {\n    const from = i - offset;\n    // Is a value supposed to move here?\n    if (from >= 0 && from < arr.length && isSelected(from)) {\n      newArr[i] = arr[from];\n    } else {\n      while (next < arr.length && isSelected(next)) {\n        next++;\n      }\n      newArr[i] = arr[next];\n      next++;\n    }\n  }\n  return newArr;\n}\nfunction spliceIn(original, start, newValues) {\n  const newArr = [...original];\n  newArr.splice(start, 0, ...newValues);\n  return newArr;\n}\nfunction replaceAtIndex(arr, index, newValue) {\n  return [...arr.slice(0, index), newValue, ...arr.slice(index + 1)];\n}\nfunction debounce(func, delay) {\n  let timeout;\n  let callbackArgs = [];\n  return function (context, ...args) {\n    callbackArgs = args;\n    if (timeout != null) {\n      clearTimeout(timeout);\n    }\n    timeout = window.setTimeout(() => {\n      func.apply(context, callbackArgs);\n    }, delay);\n  };\n}\n\n// Trailing edge only throttle\nfunction throttle(func, delay) {\n  let timeout = null;\n  let callbackArgs = [];\n  return function (context, ...args) {\n    callbackArgs = args;\n    if (!timeout) {\n      timeout = window.setTimeout(() => {\n        func.apply(context, callbackArgs);\n        timeout = null;\n      }, delay);\n    }\n  };\n}\nlet counter = 0;\nfunction uniqueId() {\n  return counter++;\n}\nfunction objectForEach(obj, cb) {\n  Object.keys(obj).forEach(key => cb(obj[key], key));\n}\nfunction objectMap(obj, cb) {\n  const modified = {};\n  Object.keys(obj).forEach(key => modified[key] = cb(obj[key], key));\n  return modified;\n}\nfunction objectFilter(obj, predicate) {\n  // TODO: Could return the original reference if no values change\n  return Object.keys(obj).reduce((newObj, key) => {\n    if (predicate(obj[key], key)) {\n      newObj[key] = obj[key];\n    }\n    return newObj;\n  }, {});\n}\nconst calculateBoundingBox = windows => {\n  if (windows.length === 0) {\n    return null;\n  }\n  const windowSizes = windows.map(w => ({\n    left: w.x,\n    top: w.y,\n    bottom: w.y + w.height,\n    right: w.x + w.width\n  }));\n  return windowSizes.reduce((b, w) => ({\n    left: Math.min(b.left, w.left),\n    top: Math.min(b.top, w.top),\n    bottom: Math.max(b.bottom, w.bottom),\n    right: Math.max(b.right, w.right)\n  }));\n};\nfunction findLastIndex(arr, cb) {\n  for (let i = arr.length - 1; i >= 0; i--) {\n    if (cb(arr[i])) {\n      return i;\n    }\n  }\n  return -1;\n}\nfunction getWindowSize() {\n  // Aparently this is crazy across browsers.\n  return {\n    width: Math.max(document.body.scrollWidth, document.documentElement.scrollWidth, document.body.offsetWidth, document.documentElement.offsetWidth, document.body.clientWidth, document.documentElement.clientWidth),\n    height: Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.body.clientHeight, document.documentElement.clientHeight)\n  };\n}\nfunction getScreenSize() {\n  return {\n    width: window.screen.width,\n    height: window.screen.height\n  };\n}\nfunction weakMapMemoize(func) {\n  const cache = new WeakMap();\n  return value => {\n    if (!cache.has(value)) {\n      cache.set(value, func(value));\n    }\n    return cache.get(value);\n  };\n}\n;// CONCATENATED MODULE: ./js/reducers/playlist.ts\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\nconst defaultPlaylistState = {\n  trackOrder: [],\n  currentTrack: null,\n  lastSelectedIndex: null,\n  selectedTracks: new Set()\n};\nfunction toggleSetMembership(set, value) {\n  if (set.has(value)) {\n    set.delete(value);\n  } else {\n    set.add(value);\n  }\n}\nconst playlist = (state = defaultPlaylistState, action) => {\n  switch (action.type) {\n    case CLICKED_TRACK:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        selectedTracks: new Set([state.trackOrder[action.index]]),\n        lastSelectedIndex: action.index\n      });\n    case CTRL_CLICKED_TRACK:\n      {\n        const id = state.trackOrder[action.index];\n        const newSelectedTracks = new Set(state.selectedTracks);\n        toggleSetMembership(newSelectedTracks, id);\n        return _objectSpread(_objectSpread({}, state), {}, {\n          selectedTracks: newSelectedTracks,\n          // Using this as the lastClickedIndex is kinda funny, since you\n          // may have just _un_selected the track. However, this is what\n          // Winamp 2 does, so we'll copy it.\n          lastSelectedIndex: action.index\n        });\n      }\n    case SHIFT_CLICKED_TRACK:\n      if (state.lastSelectedIndex == null) {\n        return state;\n      }\n      const clickedIndex = action.index;\n      const start = Math.min(clickedIndex, state.lastSelectedIndex);\n      const end = Math.max(clickedIndex, state.lastSelectedIndex);\n      const selectedTracks = new Set(state.trackOrder.slice(start, end + 1));\n      return _objectSpread(_objectSpread({}, state), {}, {\n        selectedTracks\n      });\n    case SELECT_ALL:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        selectedTracks: new Set(state.trackOrder)\n      });\n    case SELECT_ZERO:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        selectedTracks: new Set()\n      });\n    case INVERT_SELECTION:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        selectedTracks: new Set(state.trackOrder.filter(id => !state.selectedTracks.has(id)))\n      });\n    case REMOVE_ALL_TRACKS:\n      // TODO: Consider disposing of ObjectUrls\n      return _objectSpread(_objectSpread({}, state), {}, {\n        trackOrder: [],\n        currentTrack: null,\n        selectedTracks: new Set(),\n        lastSelectedIndex: null\n      });\n    case REMOVE_TRACKS:\n      // TODO: Consider disposing of ObjectUrls\n      const actionIds = new Set(action.ids.map(Number));\n      const {\n        currentTrack\n      } = state;\n      return _objectSpread(_objectSpread({}, state), {}, {\n        trackOrder: state.trackOrder.filter(trackId => !actionIds.has(trackId)),\n        currentTrack: actionIds.has(Number(currentTrack)) ? null : currentTrack,\n        selectedTracks: new Set(Array.from(state.selectedTracks).filter(id => actionIds.has(id))),\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null\n      });\n    case REVERSE_LIST:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        trackOrder: [...state.trackOrder].reverse(),\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null\n      });\n    case RANDOMIZE_LIST:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        trackOrder: shuffle(state.trackOrder)\n      });\n    case SET_TRACK_ORDER:\n      const {\n        trackOrder\n      } = action;\n      return _objectSpread(_objectSpread({}, state), {}, {\n        trackOrder\n      });\n    case ADD_TRACK_FROM_URL:\n      const atIndex = action.atIndex == null ? state.trackOrder.length : action.atIndex;\n      return _objectSpread(_objectSpread({}, state), {}, {\n        trackOrder: [...state.trackOrder.slice(0, atIndex), Number(action.id), ...state.trackOrder.slice(atIndex)],\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null\n      });\n    case PLAY_TRACK:\n    case BUFFER_TRACK:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        currentTrack: action.id\n      });\n    case DRAG_SELECTED:\n      return _objectSpread(_objectSpread({}, state), {}, {\n        trackOrder: moveSelected(state.trackOrder, i => state.selectedTracks.has(state.trackOrder[i]), action.offset),\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null\n      });\n    default:\n      return state;\n  }\n};\n/* harmony default export */ const reducers_playlist = (playlist);\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nfunction objectWithoutPropertiesLoose_objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\n\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = objectWithoutPropertiesLoose_objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}\n;// CONCATENATED MODULE: ./js/reducers/windows.ts\n\n\nconst windows_excluded = [\"hidden\"];\nfunction windows_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction windows_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? windows_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : windows_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\nconst defaultWindowsState = {\n  focused: WINDOWS.MAIN,\n  positionsAreRelative: true,\n  genWindows: {\n    // TODO: Remove static capabilities and derive them from ids/generic\n    [WINDOWS.MAIN]: {\n      title: \"Main Window\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: false,\n      canShade: true,\n      canDouble: true,\n      hotkey: \"Alt+W\",\n      position: {\n        x: 0,\n        y: 0\n      }\n    },\n    [WINDOWS.EQUALIZER]: {\n      title: \"Equalizer\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: false,\n      canShade: true,\n      canDouble: true,\n      hotkey: \"Alt+G\",\n      position: {\n        x: 0,\n        y: 0\n      }\n    },\n    [WINDOWS.PLAYLIST]: {\n      title: \"Playlist Editor\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: true,\n      canShade: true,\n      canDouble: false,\n      hotkey: \"Alt+E\",\n      position: {\n        x: 0,\n        y: 0\n      }\n    },\n    [WINDOWS.MILKDROP]: {\n      title: \"Milkdrop\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: true,\n      canShade: false,\n      canDouble: false,\n      position: {\n        x: 0,\n        y: 0\n      }\n    }\n  },\n  browserWindowSize: {\n    width: 0,\n    height: 0\n  },\n  windowOrder: [WINDOWS.PLAYLIST, WINDOWS.EQUALIZER, WINDOWS.MILKDROP, WINDOWS.MAIN]\n};\nconst windows = (state = defaultWindowsState, action) => {\n  switch (action.type) {\n    case ENABLE_MILKDROP:\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        genWindows: windows_objectSpread(windows_objectSpread({}, state.genWindows), {}, {\n          [WINDOWS.MILKDROP]: windows_objectSpread(windows_objectSpread({}, state.genWindows[WINDOWS.MILKDROP]), {}, {\n            open: action.open\n          })\n        })\n      });\n    case SET_FOCUSED_WINDOW:\n      let windowOrder = state.windowOrder;\n      if (action.window != null) {\n        windowOrder = [...state.windowOrder.filter(windowId => windowId !== action.window), action.window];\n      }\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        focused: action.window,\n        windowOrder\n      });\n    case TOGGLE_WINDOW_SHADE_MODE:\n      const {\n        canShade\n      } = state.genWindows[action.windowId];\n      if (!canShade) {\n        throw new Error(`Tried to shade/unshade a window that cannot be shaded: ${action.windowId}`);\n      }\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        genWindows: windows_objectSpread(windows_objectSpread({}, state.genWindows), {}, {\n          [action.windowId]: windows_objectSpread(windows_objectSpread({}, state.genWindows[action.windowId]), {}, {\n            shade: !state.genWindows[action.windowId].shade\n          })\n        })\n      });\n    case TOGGLE_WINDOW:\n      const windowState = state.genWindows[action.windowId];\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        genWindows: windows_objectSpread(windows_objectSpread({}, state.genWindows), {}, {\n          [action.windowId]: windows_objectSpread(windows_objectSpread({}, windowState), {}, {\n            open: !windowState.open\n          })\n        })\n      });\n    case CLOSE_WINDOW:\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        genWindows: windows_objectSpread(windows_objectSpread({}, state.genWindows), {}, {\n          [action.windowId]: windows_objectSpread(windows_objectSpread({}, state.genWindows[action.windowId]), {}, {\n            open: false\n          })\n        })\n      });\n    case WINDOW_SIZE_CHANGED:\n      const {\n        canResize\n      } = state.genWindows[action.windowId];\n      if (!canResize) {\n        throw new Error(`Tried to resize a window that cannot be resized: ${action.windowId}`);\n      }\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        genWindows: windows_objectSpread(windows_objectSpread({}, state.genWindows), {}, {\n          [action.windowId]: windows_objectSpread(windows_objectSpread({}, state.genWindows[action.windowId]), {}, {\n            size: action.size\n          })\n        })\n      });\n    case UPDATE_WINDOW_POSITIONS:\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        positionsAreRelative: action.absolute === true ? false : state.positionsAreRelative,\n        genWindows: objectMap(state.genWindows, (w, windowId) => {\n          const newPosition = action.positions[windowId];\n          if (newPosition == null) {\n            return w;\n          }\n          return windows_objectSpread(windows_objectSpread({}, w), {}, {\n            position: newPosition\n          });\n        })\n      });\n    case RESET_WINDOW_SIZES:\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        genWindows: objectMap(state.genWindows, w => windows_objectSpread(windows_objectSpread({}, w), {}, {\n          // Not sure why TypeScript can't figure this out for itself.\n          size: [0, 0]\n        }))\n      });\n    case LOAD_SERIALIZED_STATE:\n      {\n        const {\n          genWindows,\n          focused,\n          positionsAreRelative\n        } = action.serializedState.windows;\n        return windows_objectSpread(windows_objectSpread({}, state), {}, {\n          positionsAreRelative,\n          genWindows: objectMap(state.genWindows, (w, windowId) => {\n            const serializedW = genWindows[windowId];\n            if (serializedW == null) {\n              return w;\n            }\n            // Pull out `hidden` since it's been removed from our state.\n            const {\n                hidden\n              } = serializedW,\n              rest = _objectWithoutProperties(serializedW, windows_excluded);\n            return windows_objectSpread(windows_objectSpread({}, w), rest);\n          }),\n          focused\n        });\n      }\n    case BROWSER_WINDOW_SIZE_CHANGED:\n      return windows_objectSpread(windows_objectSpread({}, state), {}, {\n        browserWindowSize: {\n          height: action.height,\n          width: action.width\n        }\n      });\n    default:\n      return state;\n  }\n};\nfunction getSerializedState(state) {\n  return {\n    positionsAreRelative: state.positionsAreRelative,\n    genWindows: objectMap(state.genWindows, w => {\n      return {\n        size: w.size,\n        open: w.open,\n        hidden: false,\n        // Not used any more\n        shade: w.shade || false,\n        position: w.position\n      };\n    }),\n    focused: state.focused\n  };\n}\n/* harmony default export */ const reducers_windows = (windows);\n;// CONCATENATED MODULE: ./js/reducers/media.ts\n\nfunction media_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction media_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? media_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : media_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\nconst defaultState = {\n  timeMode: TIME_MODE.ELAPSED,\n  timeElapsed: 0,\n  // The winamp ini file declares the default volume as \"200\".\n  // The UI seems to show a default volume near 78, which would\n  // math with the default value being 200 out of 255.\n  volume: Math.round(200 / 255 * 100),\n  balance: 0,\n  shuffle: false,\n  repeat: false,\n  // TODO: Enforce possible values\n  status: MEDIA_STATUS.STOPPED\n};\nconst media = (state = defaultState, action) => {\n  switch (action.type) {\n    // TODO: Make these constants\n    case PLAY:\n    case IS_PLAYING:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        status: MEDIA_STATUS.PLAYING\n      });\n    case PAUSE:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        status: MEDIA_STATUS.PAUSED\n      });\n    case STOP:\n    case IS_STOPPED:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        status: MEDIA_STATUS.STOPPED\n      });\n    case TOGGLE_TIME_MODE:\n      const newMode = state.timeMode === TIME_MODE.REMAINING ? TIME_MODE.ELAPSED : TIME_MODE.REMAINING;\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        timeMode: newMode\n      });\n    case UPDATE_TIME_ELAPSED:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        timeElapsed: action.elapsed\n      });\n    case SET_MEDIA:\n      return media_objectSpread({}, state);\n    case SET_VOLUME:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        volume: action.volume\n      });\n    case SET_BALANCE:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        balance: action.balance\n      });\n    case TOGGLE_REPEAT:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        repeat: !state.repeat\n      });\n    case TOGGLE_SHUFFLE:\n      return media_objectSpread(media_objectSpread({}, state), {}, {\n        shuffle: !state.shuffle\n      });\n    case LOAD_SERIALIZED_STATE:\n      return media_objectSpread(media_objectSpread({}, state), action.serializedState.media);\n    default:\n      return state;\n  }\n};\nfunction media_getSerializedState(state) {\n  const {\n    volume,\n    balance,\n    shuffle,\n    repeat\n  } = state;\n  return {\n    volume,\n    balance,\n    shuffle,\n    repeat\n  };\n}\n/* harmony default export */ const reducers_media = (media);\n// EXTERNAL MODULE: ../../node_modules/reselect/lib/index.js\nvar lib = __webpack_require__(4949);\n;// CONCATENATED MODULE: ./js/reducers/display.ts\n\n\nconst display_excluded = [\"skinCursors\"];\nfunction display_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction display_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? display_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : display_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\nconst defaultSkinGenExColors = {\n  itemBackground: \"rgb(0,0,0)\",\n  itemForeground: \"rgb(0,255,0)\",\n  windowBackground: \"rgb(56,55,87)\",\n  buttonText: \"rgb(57,57,66)\",\n  windowText: \"rgb(255,255,255)\",\n  divider: \"rgb(117,116,139)\",\n  playlistSelection: \"rgb(0,0,198)\",\n  listHeaderBackground: \"rgb(72,72,120)\",\n  listHeaderText: \"rgb(255,255,255)\",\n  listHeaderFrameTopAndLeft: \"rgb(108,108,180)\",\n  listHeaderFrameBottomAndRight: \"rgb(36,36,60)\",\n  listHeaderFramePressed: \"rgb(18,18,30)\",\n  listHeaderDeadArea: \"rgb(36,36,60)\",\n  scrollbarOne: \"rgb(36,36,60)\",\n  scrollbarTwo: \"rgb(36,36,60)\",\n  pressedScrollbarOne: \"rgb(121,130,150)\",\n  pressedScrollbarTwo: \"rgb(78,88,110)\",\n  scrollbarDeadArea: \"rgb(36,36,60)\",\n  listTextHighlighted: \"rgb(0,198,255)\",\n  listTextHighlightedBackground: \"rgb(0,198,255)\",\n  listTextSelected: \"rgb(0,198,255)\",\n  listTextSelectedBackground: \"rgb(0,198,255)\"\n};\nconst defaultDisplayState = {\n  doubled: false,\n  marqueeStep: 0,\n  disableMarquee: false,\n  loading: true,\n  llama: false,\n  closed: false,\n  working: false,\n  skinImages: DEFAULT_SKIN.images,\n  skinColors: DEFAULT_SKIN.colors,\n  skinCursors: null,\n  skinPlaylistStyle: null,\n  skinRegion: {},\n  visualizerStyle: 0,\n  // Index into VISUALIZER_ORDER\n  dummyVizData: null,\n  playlistScrollPosition: 0,\n  skinGenLetterWidths: null,\n  // TODO: Get the default value for this?\n  skinGenExColors: defaultSkinGenExColors,\n  additionalVisualizers: [],\n  zIndex: 0\n};\nconst display = (state = defaultDisplayState, action) => {\n  switch (action.type) {\n    case LOAD_DEFAULT_SKIN:\n      {\n        const {\n          skinImages,\n          skinColors,\n          skinCursors,\n          skinPlaylistStyle,\n          skinRegion,\n          skinGenLetterWidths,\n          skinGenExColors\n        } = defaultDisplayState;\n        return display_objectSpread(display_objectSpread({}, state), {}, {\n          skinImages,\n          skinColors,\n          skinCursors,\n          skinPlaylistStyle,\n          skinRegion,\n          skinGenLetterWidths,\n          skinGenExColors\n        });\n      }\n    case TOGGLE_DOUBLESIZE_MODE:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        doubled: !state.doubled\n      });\n    case actionTypes_TOGGLE_LLAMA_MODE:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        llama: !state.llama\n      });\n    case STEP_MARQUEE:\n      return state.disableMarquee ? state : display_objectSpread(display_objectSpread({}, state), {}, {\n        marqueeStep: state.marqueeStep + 1\n      });\n    case DISABLE_MARQUEE:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        disableMarquee: true\n      });\n    case STOP_WORKING:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        working: false\n      });\n    case START_WORKING:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        working: true\n      });\n    case CLOSE_WINAMP:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        closed: true\n      });\n    case OPEN_WINAMP:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        closed: false\n      });\n    case LOADING:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        loading: true\n      });\n    case LOADED:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        loading: false\n      });\n    case SET_SKIN_DATA:\n      const {\n        data\n      } = action;\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        loading: false,\n        skinImages: data.skinImages,\n        skinColors: data.skinColors,\n        skinPlaylistStyle: data.skinPlaylistStyle,\n        skinCursors: data.skinCursors,\n        skinRegion: data.skinRegion,\n        skinGenLetterWidths: data.skinGenLetterWidths,\n        skinGenExColors: data.skinGenExColors || defaultSkinGenExColors\n      });\n    case TOGGLE_VISUALIZER_STYLE:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        visualizerStyle: (state.visualizerStyle + 1) % VISUALIZER_ORDER.length\n      });\n    case SET_PLAYLIST_SCROLL_POSITION:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        playlistScrollPosition: action.position\n      });\n    case SET_Z_INDEX:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        zIndex: action.zIndex\n      });\n    case SET_DUMMY_VIZ_DATA:\n      return display_objectSpread(display_objectSpread({}, state), {}, {\n        dummyVizData: action.data\n      });\n    case LOAD_SERIALIZED_STATE:\n      {\n        const _action$serializedSta = action.serializedState.display,\n          {\n            skinCursors\n          } = _action$serializedSta,\n          rest = _objectWithoutProperties(_action$serializedSta, display_excluded);\n        const upgrade = url => ({\n          type: \"cur\",\n          url\n        });\n        const newSkinCursors = skinCursors == null ? null : objectMap(skinCursors, upgrade);\n        return display_objectSpread(display_objectSpread({}, state), {}, {\n          skinCursors: newSkinCursors\n        }, rest);\n      }\n    default:\n      return state;\n  }\n};\n/* harmony default export */ const reducers_display = (display);\nconst display_getSerializedState = state => {\n  // My kingdom for a type-safe `_.pick`.\n  const {\n    visualizerStyle,\n    doubled,\n    llama,\n    marqueeStep,\n    skinImages,\n    skinCursors,\n    skinRegion,\n    skinGenLetterWidths,\n    skinColors,\n    skinPlaylistStyle\n  } = state;\n  let newCursors = null;\n  if (skinCursors != null) {\n    // @ts-ignore Typescript does not like that we can have `undefined` as\n    // values here. Since this is going to get serialized to JSON (which will\n    // drop undefined) it's fine.\n    // This code is geting removed soon anyway.\n    newCursors = objectMap(skinCursors, cursor => {\n      return cursor.type === \"cur\" ? cursor.url : undefined;\n    });\n  }\n  return {\n    visualizerStyle,\n    doubled,\n    llama,\n    marqueeStep,\n    skinImages,\n    skinCursors: newCursors,\n    skinRegion,\n    skinGenLetterWidths,\n    skinColors,\n    skinPlaylistStyle\n  };\n};\nconst getVisualizerStyle = (0,lib/* createSelector */.P1)(state => state.visualizerStyle, visualizationStyle => {\n  return VISUALIZER_ORDER[visualizationStyle];\n});\n;// CONCATENATED MODULE: ./js/reducers/userInput.ts\n\nfunction userInput_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction userInput_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? userInput_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : userInput_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nconst defaultUserInput = {\n  focus: null,\n  bandFocused: null,\n  scrubPosition: 0,\n  userMessage: null\n};\nconst userInput = (state = defaultUserInput, action) => {\n  switch (action.type) {\n    case SET_FOCUS:\n      return userInput_objectSpread(userInput_objectSpread({}, state), {}, {\n        focus: action.input,\n        bandFocused: null\n      });\n    case SET_BAND_FOCUS:\n      return userInput_objectSpread(userInput_objectSpread({}, state), {}, {\n        focus: action.input,\n        bandFocused: action.bandFocused\n      });\n    case UNSET_FOCUS:\n      return userInput_objectSpread(userInput_objectSpread({}, state), {}, {\n        focus: null,\n        bandFocused: null\n      });\n    case SET_SCRUB_POSITION:\n      return userInput_objectSpread(userInput_objectSpread({}, state), {}, {\n        scrubPosition: action.position\n      });\n    case SET_USER_MESSAGE:\n      return userInput_objectSpread(userInput_objectSpread({}, state), {}, {\n        userMessage: action.message\n      });\n    case UNSET_USER_MESSAGE:\n      return userInput_objectSpread(userInput_objectSpread({}, state), {}, {\n        userMessage: null\n      });\n    default:\n      return state;\n  }\n};\n/* harmony default export */ const reducers_userInput = (userInput);\n;// CONCATENATED MODULE: ./js/reducers/equalizer.ts\n\nfunction equalizer_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction equalizer_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? equalizer_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : equalizer_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nconst equalizer_defaultState = {\n  on: true,\n  auto: false,\n  sliders: {\n    preamp: 1200,\n    60: 1200,\n    170: 1200,\n    310: 1200,\n    600: 1200,\n    1000: 1200,\n    3000: 1200,\n    6000: 1200,\n    12000: 1200,\n    14000: 1200,\n    16000: 1200\n  }\n};\nfunction migrateSliderValues(sliders) {\n  const migrated = equalizer_objectSpread({}, sliders);\n  const needsMigration = Object.values(sliders).some(val => val > 0 && val <= 100 && val !== 0);\n  if (needsMigration) {\n    Object.keys(migrated).forEach(key => {\n      const value = migrated[key];\n      if (value >= 0 && value <= 100) {\n        migrated[key] = Math.round(value / 100 * 2400);\n      }\n    });\n  }\n  return migrated;\n}\nconst equalizer = (state = equalizer_defaultState, action) => {\n  switch (action.type) {\n    case SET_BAND_VALUE:\n      const newSliders = equalizer_objectSpread(equalizer_objectSpread({}, state.sliders), {}, {\n        [action.band]: action.value\n      });\n      return equalizer_objectSpread(equalizer_objectSpread({}, state), {}, {\n        sliders: newSliders\n      });\n    case SET_EQ_ON:\n      return equalizer_objectSpread(equalizer_objectSpread({}, state), {}, {\n        on: true\n      });\n    case SET_EQ_OFF:\n      return equalizer_objectSpread(equalizer_objectSpread({}, state), {}, {\n        on: false\n      });\n    case SET_EQ_AUTO:\n      return equalizer_objectSpread(equalizer_objectSpread({}, state), {}, {\n        auto: action.value\n      });\n    case LOAD_SERIALIZED_STATE:\n      if (action.serializedState.equalizer) {\n        const loadedState = action.serializedState.equalizer;\n        return equalizer_objectSpread(equalizer_objectSpread({}, loadedState), {}, {\n          sliders: migrateSliderValues(loadedState.sliders)\n        });\n      }\n      return state;\n    default:\n      return state;\n  }\n};\nfunction equalizer_getSerializedState(state) {\n  return state;\n}\n/* harmony default export */ const reducers_equalizer = (equalizer);\n;// CONCATENATED MODULE: ./js/reducers/network.ts\n\nfunction network_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction network_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? network_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : network_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nconst network = (state = {\n  connected: true\n}, action) => {\n  switch (action.type) {\n    case NETWORK_CONNECTED:\n      return network_objectSpread(network_objectSpread({}, state), {}, {\n        connected: true\n      });\n    case NETWORK_DISCONNECTED:\n      return network_objectSpread(network_objectSpread({}, state), {}, {\n        connected: false\n      });\n    default:\n      return state;\n  }\n};\n/* harmony default export */ const reducers_network = (network);\n;// CONCATENATED MODULE: ./js/reducers/settings.ts\n\nfunction settings_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction settings_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? settings_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : settings_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nconst defaultSettingsState = {\n  availableSkins: []\n};\nconst settings = (state = defaultSettingsState, action) => {\n  switch (action.type) {\n    case SET_AVAILABLE_SKINS:\n      return settings_objectSpread(settings_objectSpread({}, state), {}, {\n        availableSkins: action.skins\n      });\n    default:\n      return state;\n  }\n};\n/* harmony default export */ const reducers_settings = (settings);\n// EXTERNAL MODULE: ../../node_modules/invariant/browser.js\nvar browser = __webpack_require__(7677);\nvar browser_default = /*#__PURE__*/__webpack_require__.n(browser);\n;// CONCATENATED MODULE: ./js/fileUtils.ts\n\n// Import music-metadata type definitions\n\nfunction genMediaTags(file, musicMetadata) {\n  browser_default()(file != null, \"Attempted to get the tags of media file without passing a file\");\n  const options = {\n    duration: true,\n    skipPostHeaders: true // avoid unnecessary data to be read\n  };\n\n  if (typeof file === \"string\") {\n    return musicMetadata.fetchFromUrl(file, options);\n  }\n  // Assume Blob\n  return musicMetadata.parseBlob(file, options);\n}\nfunction genMediaDuration(url) {\n  browser_default()(typeof url === \"string\", \"Attempted to get the duration of media file without passing a url\");\n  return new Promise((resolve, reject) => {\n    // TODO: Does this actually stop downloading the file once it's\n    // got the duration?\n    const audio = document.createElement(\"audio\");\n    audio.crossOrigin = \"anonymous\";\n    const durationChange = () => {\n      resolve(audio.duration);\n      audio.removeEventListener(\"durationchange\", durationChange);\n      audio.src = \"\";\n      // TODO: Not sure if this really gets cleaned up.\n    };\n\n    audio.addEventListener(\"durationchange\", durationChange);\n    audio.addEventListener(\"error\", e => {\n      reject(e);\n    });\n    audio.src = url;\n  });\n}\nasync function genArrayBufferFromFileReference(fileReference) {\n  browser_default()(fileReference != null, \"Attempt to get an ArrayBuffer without assigning a fileReference\");\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      resolve(reader.result);\n    };\n    reader.onerror = reject;\n    reader.readAsArrayBuffer(fileReference);\n  });\n}\nasync function genStringFromFileReference(fileReference) {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      resolve(reader.result);\n    };\n    reader.onerror = reject;\n    reader.readAsText(fileReference);\n  });\n}\nasync function promptForFileReferences({\n  accept,\n  directory = false\n} = {\n  accept: null,\n  directory: false\n}) {\n  return new Promise(resolve => {\n    // Does this represent a memory leak somehow?\n    // Can this fail? Do we ever reject?\n    const fileInput = document.createElement(\"input\");\n    if (accept) fileInput.setAttribute(\"accept\", accept);\n    fileInput.type = \"file\";\n    fileInput.multiple = true;\n    // @ts-ignore Non-standard\n    fileInput.webkitdirectory = directory;\n    // @ts-ignore Non-standard\n    fileInput.directory = directory;\n    // @ts-ignore Non-standard\n    fileInput.mozdirectory = directory;\n    // Not entirely sure why this is needed, since the input\n    // was just created, but somehow this helps prevent change\n    // events from getting swallowed.\n    // https://stackoverflow.com/a/12102992/1263117\n\n    // @ts-ignore Technically you can't set this to null, it has to be a string.\n    // But I don't feel like retesting it, so I'll leave it as null\n    fileInput.value = null;\n    fileInput.addEventListener(\"change\", e => {\n      const files = e.target.files;\n      resolve(files);\n    });\n    fileInput.click();\n  });\n}\nfunction urlIsBlobUrl(url) {\n  return /^blob:/.test(url);\n}\nfunction curUrlFromByteArray(arr) {\n  const base64 = base64FromDataArray(arr);\n  return `data:image/x-win-bitmap;base64,${base64}`;\n}\n\n// This is not perfect, but... meh: https://stackoverflow.com/a/36756650/1263117\nfunction filenameFromUrl(url) {\n  if (urlIsBlobUrl(url)) {\n    return null;\n  }\n  const lastSegment = url.split(\"/\").pop();\n  if (lastSegment == null) {\n    return null;\n  }\n  return lastSegment.split(\"#\")[0].split(\"?\")[0];\n}\n;// CONCATENATED MODULE: ./js/trackUtils.ts\n\n\nconst trackName = weakMapMemoize(track => {\n  const {\n    artist,\n    title,\n    defaultName,\n    url\n  } = track;\n  if (artist && title) {\n    return `${artist} - ${title}`;\n  } else if (title) {\n    return title;\n  } else if (defaultName) {\n    return defaultName;\n  } else if (url) {\n    const filename = filenameFromUrl(url);\n    if (filename) {\n      return filename;\n    }\n  }\n  return \"???\";\n});\nconst trackFilename = weakMapMemoize(track => {\n  if (track.url) {\n    const urlFilename = filenameFromUrl(track.url);\n    if (urlFilename != null) {\n      return urlFilename;\n    }\n  }\n  if (track.defaultName) {\n    return track.defaultName;\n  }\n  return \"???\";\n});\n;// CONCATENATED MODULE: ./js/reducers/tracks.ts\n\nfunction tracks_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction tracks_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? tracks_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : tracks_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\nconst tracks_defaultPlaylistState = {};\nconst tracks = (state = tracks_defaultPlaylistState, action) => {\n  var _action$duration;\n  switch (action.type) {\n    case ADD_TRACK_FROM_URL:\n      return tracks_objectSpread(tracks_objectSpread({}, state), {}, {\n        [action.id]: {\n          id: action.id,\n          defaultName: action.defaultName || null,\n          duration: (_action$duration = action.duration) !== null && _action$duration !== void 0 ? _action$duration : null,\n          url: action.url,\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.INITIALIZED\n        }\n      });\n    case SET_MEDIA:\n      {\n        const newTrack = tracks_objectSpread(tracks_objectSpread({}, state[action.id]), {}, {\n          duration: action.length\n        });\n        return tracks_objectSpread(tracks_objectSpread({}, state), {}, {\n          [action.id]: newTrack\n        });\n      }\n    case MEDIA_TAG_REQUEST_INITIALIZED:\n      return tracks_objectSpread(tracks_objectSpread({}, state), {}, {\n        [action.id]: tracks_objectSpread(tracks_objectSpread({}, state[action.id]), {}, {\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.INITIALIZED\n        })\n      });\n    case MEDIA_TAG_REQUEST_FAILED:\n      return tracks_objectSpread(tracks_objectSpread({}, state), {}, {\n        [action.id]: tracks_objectSpread(tracks_objectSpread({}, state[action.id]), {}, {\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.FAILED\n        })\n      });\n    case SET_MEDIA_DURATION:\n      {\n        return tracks_objectSpread(tracks_objectSpread({}, state), {}, {\n          [action.id]: tracks_objectSpread(tracks_objectSpread({}, state[action.id]), {}, {\n            duration: action.duration\n          })\n        });\n      }\n    case SET_MEDIA_TAGS:\n      const track = state[action.id];\n      const {\n        sampleRate,\n        bitrate,\n        numberOfChannels,\n        title,\n        artist,\n        album,\n        albumArtUrl\n      } = action;\n      const {\n        kbps,\n        khz,\n        channels\n      } = track;\n      return tracks_objectSpread(tracks_objectSpread({}, state), {}, {\n        [action.id]: tracks_objectSpread(tracks_objectSpread({}, track), {}, {\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.COMPLETE,\n          title,\n          artist,\n          album,\n          albumArtUrl,\n          kbps: bitrate != null ? String(Math.round(bitrate / 1000)) : kbps,\n          khz: sampleRate != null ? String(Math.round(sampleRate / 1000)) : khz,\n          channels: numberOfChannels != null ? numberOfChannels : channels\n        })\n      });\n    default:\n      return state;\n  }\n};\n/* harmony default export */ const reducers_tracks = (tracks);\nconst getTrackDisplayName = (state, id = null) => {\n  if (id == null) {\n    return null;\n  }\n  const track = state[id];\n  if (track == null) {\n    return null;\n  }\n  return trackName(track);\n};\n;// CONCATENATED MODULE: ./js/types.ts\n// Avoid warnings from Webpack: https://github.com/webpack/webpack/issues/7378\n\n// TODO: Use a type to ensure these keys mirror the CURSORS constant in\n// skinParser.js\n// TODO: Type these keys.\n// TODO: type these keys\n// TODO: Fill these out once we actually use them.\n// This is what we actually pass to butterchurn\n// A URL that points to a Butterchurn preset\nlet TransitionType = /*#__PURE__*/function (TransitionType) {\n  TransitionType[TransitionType[\"IMMEDIATE\"] = 0] = \"IMMEDIATE\";\n  TransitionType[TransitionType[\"DEFAULT\"] = 1] = \"DEFAULT\";\n  TransitionType[TransitionType[\"USER_PRESET\"] = 2] = \"USER_PRESET\";\n  return TransitionType;\n}({});\n\n/**\n * Many methods on the webamp instance deal with track.\n *\n * Either `url` or `blob` must be specified\n */\n\n/**\n * Type definition of the music-metadata module.\n * Ref: https://github.com/Borewit/music-metadata/blob/master/src/index.ts\n */\n\nconst SELECT_PRESET = \"SELECT_PRESET\";\nconst NEXT_PRESET = \"NEXT_PRESET\";\n;// CONCATENATED MODULE: ./js/reducers/milkdrop.ts\n\nfunction milkdrop_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction milkdrop_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? milkdrop_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : milkdrop_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\nconst defaultMilkdropState = {\n  display: \"WINDOW\",\n  overlay: false,\n  lock: false,\n  presetHistory: [],\n  presets: [],\n  currentPresetIndex: null,\n  butterchurn: null,\n  transitionType: TransitionType.DEFAULT,\n  randomize: true,\n  cycling: true,\n  message: null\n};\nconst milkdrop = (state = defaultMilkdropState, action) => {\n  switch (action.type) {\n    case SET_MILKDROP_DESKTOP:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        display: action.enabled ? \"DESKTOP\" : \"WINDOW\"\n      });\n    case SET_MILKDROP_FULLSCREEN:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        display: action.enabled ? \"FULLSCREEN\" : \"WINDOW\"\n      });\n    case SET_MILKDROP_LOCK:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        lock: action.enabled\n      });\n    case GOT_BUTTERCHURN:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        butterchurn: action.butterchurn\n      });\n    case GOT_BUTTERCHURN_PRESETS:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        presets: state.presets.concat(action.presets)\n      });\n    case PRESET_REQUESTED:\n      if (action.addToHistory) {\n        return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n          presetHistory: [...state.presetHistory, action.index]\n        });\n      }\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        presetHistory: state.presetHistory.slice(0, -1)\n      });\n    case RESOLVE_PRESET_AT_INDEX:\n      const preset = state.presets[action.index];\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        presets: replaceAtIndex(state.presets, action.index, {\n          type: \"RESOLVED\",\n          name: preset.name,\n          preset: action.json\n        })\n      });\n    case SELECT_PRESET_AT_INDEX:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        currentPresetIndex: action.index,\n        transitionType: action.transitionType\n      });\n    case TOGGLE_PRESET_OVERLAY:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        overlay: !state.overlay\n      });\n    case TOGGLE_RANDOMIZE_PRESETS:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        randomize: !state.randomize\n      });\n    case TOGGLE_PRESET_CYCLING:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        cycling: !state.cycling\n      });\n    case SCHEDULE_MILKDROP_MESSAGE:\n      return milkdrop_objectSpread(milkdrop_objectSpread({}, state), {}, {\n        message: {\n          text: action.message,\n          time: Date.now()\n        }\n      });\n    default:\n      return state;\n  }\n};\n/* harmony default export */ const reducers_milkdrop = (milkdrop);\n;// CONCATENATED MODULE: ./js/reducers/index.ts\n\n\n\n\n\n\n\n\n\n\n\nconst reducer = (0,redux/* combineReducers */.UY)({\n  userInput: reducers_userInput,\n  windows: reducers_windows,\n  display: reducers_display,\n  settings: reducers_settings,\n  equalizer: reducers_equalizer,\n  playlist: reducers_playlist,\n  media: reducers_media,\n  network: reducers_network,\n  tracks: reducers_tracks,\n  milkdrop: reducers_milkdrop\n});\n/* harmony default export */ const reducers = (reducer);\n// EXTERNAL MODULE: ../../node_modules/react/jsx-runtime.js\nvar jsx_runtime = __webpack_require__(2322);\n;// CONCATENATED MODULE: ./js/playlistHtml.tsx\n\nfunction playlistHtml_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction playlistHtml_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? playlistHtml_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : playlistHtml_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\nconst getAsDataURI = text => `data:text/html;base64,${window.btoa(text)}`;\n\n// Replaces deprecated \"noshade\" attribute\nconst noshadeStyle = {\n  height: \"2px\",\n  borderWidth: 0,\n  color: \"gray\",\n  backgroundColor: \"gray\"\n};\n\n// We use all kinds of non-standard attributes and tags. So we create these fake\n// components to trick Typescript.\nconst Body = props => {\n  // @ts-ignore\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"body\", playlistHtml_objectSpread({}, props));\n};\nconst Font = props => {\n  // @ts-ignore\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"font\", playlistHtml_objectSpread({}, props));\n};\nconst Hr = props => {\n  // @ts-ignore\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"hr\", playlistHtml_objectSpread({}, props));\n};\nconst Div = props => {\n  // @ts-ignore\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", playlistHtml_objectSpread({}, props));\n};\nconst Table = props => {\n  // @ts-ignore\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"table\", playlistHtml_objectSpread({}, props));\n};\n\n// TODO: Move <html> tag out to the string creation step in order\n// to avoid the warning.\nconst Playlist = props => /*#__PURE__*/(0,jsx_runtime.jsxs)(\"html\", {\n  children: [/*#__PURE__*/(0,jsx_runtime.jsxs)(\"head\", {\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"link\", {\n      rel: \"stylesheet\",\n      href: \"null\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"style\", {\n      type: \"text/css\",\n      children: `\n        body { background: #000040; }\n        .para1 { margin-top: -42px; margin-left: 145px; margin-right: 10px; font-family: \"font2, Arial\"; font-size: 30px; line-height: 35px; text-align: left; color: #E1E1E1; }\n        .para2 { margin-top: 15px; margin-left: 15px; margin-right: 50px; font-family: \"font1, Arial Black\"; font-size: 50px; line-height: 40px; text-align: left; color: #004080; }\n        `\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"title\", {\n      children: \"Winamp Generated PlayList\"\n    })]\n  }), /*#__PURE__*/(0,jsx_runtime.jsxs)(Body, {\n    bgcolor: \"#000080\",\n    topmargin: \"0\",\n    leftmargin: \"0\",\n    text: \"#FFFFFF\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsxs)(Div, {\n      align: \"center\",\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Div, {\n        className: \"para2\",\n        align: \"center\",\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"p\", {\n          children: \"WINAMP\"\n        })\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Div, {\n        className: \"para1\",\n        align: \"center\",\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"p\", {\n          children: \"playlist\"\n        })\n      })]\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Hr, {\n      align: \"left\",\n      width: \"90%\",\n      size: \"1\",\n      color: \"#FFBF00\",\n      style: noshadeStyle\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Div, {\n      align: \"right\",\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(Table, {\n        border: \"0\",\n        cellSpacing: \"0\",\n        cellPadding: \"0\",\n        width: \"98%\",\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"tbody\", {\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"tr\", {\n            children: /*#__PURE__*/(0,jsx_runtime.jsxs)(\"td\", {\n              children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"small\", {\n                children: /*#__PURE__*/(0,jsx_runtime.jsxs)(\"small\", {\n                  children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    face: \"Arial\",\n                    color: \"#FFBF00\",\n                    children: props.numberOfTracks\n                  }), /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    color: \"#409FFF\",\n                    face: \"Arial\",\n                    children: \" track in playlist, average track length: \"\n                  }), /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    face: \"Arial\",\n                    color: \"#FFBF00\",\n                    children: props.averageTrackLength\n                  })]\n                })\n              }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"br\", {}), /*#__PURE__*/(0,jsx_runtime.jsx)(\"small\", {\n                children: /*#__PURE__*/(0,jsx_runtime.jsxs)(\"small\", {\n                  children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    color: \"#409FFF\",\n                    face: \"Arial\",\n                    children: \"Playlist length: \"\n                  }), /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    face: \"Arial\",\n                    color: \"#FFBF00\",\n                    children: props.playlistLengthMinutes\n                  }), /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    color: \"#409FFF\",\n                    face: \"Arial\",\n                    children: \" minutes \"\n                  }), /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    face: \"Arial\",\n                    color: \"#FFBF00\",\n                    children: props.playlistLengthSeconds\n                  }), /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n                    color: \"#409FFF\",\n                    face: \"Arial\",\n                    children: \" second \"\n                  }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"br\", {}), /*#__PURE__*/(0,jsx_runtime.jsxs)(Font, {\n                    color: \"#409FFF\",\n                    face: \"Arial\",\n                    children: [\"Right-click \", /*#__PURE__*/(0,jsx_runtime.jsx)(\"a\", {\n                      href: \"./\",\n                      children: \"here\"\n                    }), \" to save this HTML file.\"]\n                  })]\n                })\n              })]\n            })\n          })\n        })\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"blockquote\", {\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"p\", {\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n          color: \"#FFBF00\",\n          face: \"Arial\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"big\", {\n            children: \"Playlist files:\"\n          })\n        })\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"ul\", {\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(Font, {\n          face: \"Arial\",\n          color: \"#FFFFFF\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"small\", {\n            children: props.tracks.map(track => /*#__PURE__*/(0,jsx_runtime.jsxs)(\"span\", {\n              children: [track, /*#__PURE__*/(0,jsx_runtime.jsx)(\"br\", {})]\n            }, track))\n          })\n        })\n      })]\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Hr, {\n      align: \"left\",\n      width: \"90%\",\n      size: \"1\",\n      color: \"#FFBF00\",\n      style: noshadeStyle\n    })]\n  })]\n});\nconst createPlaylistHTML = props => {\n  const node = document.createElement(\"div\");\n  (0,react_dom.render)( /*#__PURE__*/(0,jsx_runtime.jsx)(Playlist, playlistHtml_objectSpread({}, props)), node);\n  return node.innerHTML;\n};\nconst createPlaylistURL = props => getAsDataURI(createPlaylistHTML(props));\n;// CONCATENATED MODULE: ./js/marqueeUtils.tsx\n\nconst getBalanceText = balance => {\n  if (balance === 0) {\n    return \"Balance: Center\";\n  }\n  const direction = balance > 0 ? \"Right\" : \"Left\";\n  return `Balance: ${Math.abs(balance)}% ${direction}`;\n};\nconst getVolumeText = volume => `Volume: ${volume}%`;\nconst getPositionText = (duration, seekToPercent) => {\n  const newElapsedStr = getTimeStr(duration * seekToPercent / 100, false);\n  const durationStr = getTimeStr(duration, false);\n  return `Seek to: ${newElapsedStr}/${durationStr} (${seekToPercent}%)`;\n};\nconst getDoubleSizeModeText = enabled => `${enabled ? \"Disable\" : \"Enable\"} doublesize mode`;\nconst formatHz = hz => hz < 1000 ? `${hz}HZ` : `${hz / 1000}KHZ`;\n\n// Format a number as a string, ensuring it has a + or - sign\nconst ensureSign = num => num > 0 ? `+${num}` : num.toString();\n\n// Round to 1 and exactly 1 decimal point\nconst roundToTenths = num => (Math.round(num * 10) / 10).toFixed(1);\nconst getEqText = (band, level) => {\n  const db = roundToTenths((level - 50) / 50 * 12);\n  const label = band === \"preamp\" ? \"Preamp\" : formatHz(band);\n  return `EQ: ${label} ${ensureSign(db)} DB`;\n};\n;// CONCATENATED MODULE: ./js/resizeUtils.ts\nfunction getPositionDiff(graph, sizeDiff) {\n  const newGraph = {};\n  const positionDiff = {};\n  for (const key of Object.keys(graph)) {\n    newGraph[key] = {\n      above: [],\n      left: []\n    };\n    positionDiff[key] = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  // Construct an inverted graph\n  for (const [key, neighbors] of Object.entries(graph)) {\n    const {\n      below,\n      right\n    } = neighbors;\n    if (right != null) {\n      newGraph[right].left.push(key);\n    }\n    if (below != null) {\n      newGraph[below].above.push(key);\n    }\n  }\n  function walkRight(key) {\n    const node = newGraph[key];\n    const nodeSizeDiff = sizeDiff[key];\n    node.left.forEach(left => {\n      positionDiff[left].x += nodeSizeDiff.width + positionDiff[key].x;\n      walkRight(left);\n    });\n  }\n  function walkDown(key) {\n    const node = newGraph[key];\n    const nodeSizeDiff = sizeDiff[key];\n    node.above.forEach(above => {\n      positionDiff[above].y += nodeSizeDiff.height + positionDiff[key].y;\n      walkDown(above);\n    });\n  }\n\n  // Find disconnected nodes, and walk\n  for (const [key, neighbors] of Object.entries(graph)) {\n    if (neighbors.below == null) {\n      walkDown(key);\n    }\n    if (neighbors.right == null) {\n      walkRight(key);\n    }\n  }\n  return positionDiff;\n}\nfunction generateGraph(windows) {\n  const bottoms = {};\n  const rights = {};\n  for (const w of windows) {\n    const bottom = w.y + w.height;\n    if (bottoms[bottom]) {\n      bottoms[bottom].push(w);\n    } else {\n      bottoms[bottom] = [w];\n    }\n    const right = w.x + w.width;\n    if (rights[right]) {\n      rights[right].push(w);\n    } else {\n      rights[right] = [w];\n    }\n  }\n  const graph = {};\n  for (const w of windows) {\n    const edges = {};\n    const top = w.y;\n    const left = w.x;\n    const tops = bottoms[top];\n    const lefts = rights[left];\n    if (tops) {\n      for (const below of tops) {\n        const isToTheLeft = below.x + below.width < w.x;\n        const isToTheRight = below.x > w.x + w.width;\n        const overlapsInX = !(isToTheLeft || isToTheRight);\n        if (overlapsInX) {\n          edges.below = below.key;\n          break;\n        }\n      }\n    }\n    if (lefts) {\n      for (const right of lefts) {\n        const isAbove = right.y + right.height < w.y;\n        const isBelow = right.y > w.y + w.height;\n        const overlapsInY = !(isAbove || isBelow);\n        if (overlapsInY) {\n          edges.right = right.key;\n          break;\n        }\n      }\n    }\n    graph[w.key] = edges;\n  }\n  return graph;\n}\n// EXTERNAL MODULE: ../../node_modules/butterchurn-presets/lib/butterchurnPresets.min.js\nvar butterchurnPresets_min = __webpack_require__(6278);\nvar butterchurnPresets_min_default = /*#__PURE__*/__webpack_require__.n(butterchurnPresets_min);\n;// CONCATENATED MODULE: ./js/selectors.ts\n\nfunction selectors_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction selectors_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? selectors_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : selectors_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n\n\n\n\n\n\n\n// @ts-ignore\n\nconst getSliders = state => state.equalizer.sliders;\nconst getEqfData = (0,lib/* createSelector */.P1)(getSliders, sliders => {\n  const preset = {\n    name: \"Entry1\",\n    preamp: denormalizeEqBand(sliders.preamp)\n  };\n  BANDS.forEach(band => {\n    preset[`hz${band}`] = denormalizeEqBand(sliders[band]);\n  });\n  const eqfData = {\n    presets: [preset],\n    type: \"Winamp EQ library file v1.1\"\n  };\n  return eqfData;\n});\nconst getTracks = state => state.tracks;\nconst getTrackUrl = state => {\n  return id => {\n    var _state$tracks$id;\n    return (_state$tracks$id = state.tracks[id]) === null || _state$tracks$id === void 0 ? void 0 : _state$tracks$id.url;\n  };\n};\nconst getTrackOrder = state => state.playlist.trackOrder;\nconst getTrackCount = (0,lib/* createSelector */.P1)(getTrackOrder, trackOrder => trackOrder.length);\nconst getOrderedTracks = (0,lib/* createSelector */.P1)(getTracks, getTrackOrder, (tracks, trackOrder) => trackOrder.filter(id => tracks[id]));\nconst getUserTracks = (0,lib/* createSelector */.P1)(getTracks, getTrackOrder, (tracks, trackOrder) => trackOrder.map(id => {\n  const track = tracks[id];\n  return {\n    url: track.url,\n    metaData: {\n      artist: track.artist || \"\",\n      title: track.title || \"\",\n      album: track.album,\n      albumArtUrl: track.albumArtUrl || \"\"\n    }\n  };\n}));\nconst getOrderedTrackObjects = (0,lib/* createSelector */.P1)(getTracks, getOrderedTracks, (tracks, trackOrder) => trackOrder.map(id => tracks[id]));\nconst getSelectedTrackIds = state => {\n  return state.playlist.selectedTracks;\n};\nconst getSelectedTrackObjects = (0,lib/* createSelector */.P1)(getOrderedTrackObjects, getSelectedTrackIds, (tracks, selectedIds) => tracks.filter(track => selectedIds.has(track.id)));\n\n// If a duration is `null`, it counts as zero, which seems fine enough.\nconst runningTimeFromTracks = tracks => tracks.reduce((time, track) => time + Number(track.duration), 0);\nconst getTotalRunningTime = (0,lib/* createSelector */.P1)(getOrderedTrackObjects, runningTimeFromTracks);\nconst getSelectedRunningTime = (0,lib/* createSelector */.P1)(getSelectedTrackObjects, runningTimeFromTracks);\n\n// Note: We should append \"+\" to these values if some of the tracks are of unknown time.\nconst getRunningTimeMessage = (0,lib/* createSelector */.P1)(getTotalRunningTime, getSelectedRunningTime, (totalRunningTime, selectedRunningTime) => `${getTimeStr(selectedRunningTime)}/${getTimeStr(totalRunningTime)}`);\n\n// TODO: use slectors to get memoization\nconst getCurrentTrackIndex = state => {\n  const {\n    playlist\n  } = state;\n  if (playlist.currentTrack == null) {\n    return -1;\n  }\n  return playlist.trackOrder.indexOf(playlist.currentTrack);\n};\nconst getCurrentTrackNumber = (0,lib/* createSelector */.P1)(getCurrentTrackIndex, currentTrackIndex => currentTrackIndex + 1);\nconst getCurrentTrackId = state => state.playlist.currentTrack;\n\n// TODO: Sigh... Technically, we should detect if we are looping only repeat if we are.\n// I think this would require pre-computing the \"random\" order of a playlist.\nconst getRandomTrackId = state => {\n  const {\n    playlist: {\n      trackOrder,\n      currentTrack\n    }\n  } = state;\n  if (trackOrder.length === 0) {\n    return null;\n  }\n  let nextId;\n  do {\n    nextId = trackOrder[Math.floor(trackOrder.length * Math.random())];\n  } while (nextId === currentTrack && trackOrder.length > 1);\n  return nextId;\n};\nconst getNextTrackId = (state, n = 1) => {\n  const {\n    playlist: {\n      trackOrder\n    },\n    media: {\n      repeat,\n      shuffle\n    }\n  } = state;\n  if (shuffle) {\n    return getRandomTrackId(state);\n  }\n  const trackCount = getTrackCount(state);\n  if (trackCount === 0) {\n    return null;\n  }\n  const currentIndex = getCurrentTrackIndex(state);\n  let nextIndex = currentIndex + n;\n  if (repeat) {\n    nextIndex = nextIndex % trackCount;\n    if (nextIndex < 0) {\n      // Handle wrapping around backwards\n      nextIndex += trackCount;\n    }\n    return trackOrder[nextIndex];\n  }\n  if (currentIndex === trackCount - 1 && n > 0) {\n    return null;\n  } else if (currentIndex === 0 && n < 0) {\n    return null;\n  }\n  nextIndex = clamp(nextIndex, 0, trackCount - 1);\n  return trackOrder[nextIndex];\n};\nconst getGenWindows = state => {\n  return state.windows.genWindows;\n};\nconst selectors_getWindowOpen = (0,lib/* createSelector */.P1)(getGenWindows, genWindows => {\n  return windowId => genWindows[windowId].open;\n});\nconst selectors_getWindowHidden = (0,lib/* createSelector */.P1)(getGenWindows, genWindows => {\n  return windowId => genWindows[windowId].hidden;\n});\nconst selectors_getWindowShade = (0,lib/* createSelector */.P1)(getGenWindows, genWindows => {\n  return windowId => genWindows[windowId].shade;\n});\nconst selectors_getWindowSize = (0,lib/* createSelector */.P1)(getGenWindows, genWindows => {\n  return windowId => genWindows[windowId].size;\n});\nconst getWindowPositions = (0,lib/* createSelector */.P1)(getGenWindows, windows => objectMap(windows, w => w.position));\nconst BASE_WINDOW_HEIGHT = 58;\nconst getNumberOfVisibleTracks = (0,lib/* createSelector */.P1)(selectors_getWindowSize, getWindowSize_ => {\n  const playlistSize = getWindowSize_(\"playlist\");\n  return Math.floor((BASE_WINDOW_HEIGHT + WINDOW_RESIZE_SEGMENT_HEIGHT * playlistSize[1]) / TRACK_HEIGHT);\n});\nconst getOverflowTrackCount = (0,lib/* createSelector */.P1)(getTrackCount, getNumberOfVisibleTracks, (trackCount, numberOfVisibleTracks) => Math.max(0, trackCount - numberOfVisibleTracks));\nconst _getPlaylistScrollPosition = state => state.display.playlistScrollPosition;\nconst getPlaylistScrollPosition = (0,lib/* createSelector */.P1)(getOverflowTrackCount, _getPlaylistScrollPosition, (overflowTrackCount, playlistScrollPosition) => {\n  if (overflowTrackCount === 0) {\n    return 0;\n  }\n  return Math.round(Math.round(overflowTrackCount * playlistScrollPosition / 100) / overflowTrackCount * 100);\n});\nconst getScrollOffset = (0,lib/* createSelector */.P1)(_getPlaylistScrollPosition, getTrackCount, getNumberOfVisibleTracks, (playlistScrollPosition, trackCount, numberOfVisibleTracks) => {\n  const overflow = Math.max(0, trackCount - numberOfVisibleTracks);\n  return percentToIndex(playlistScrollPosition / 100, overflow + 1);\n});\nconst getVisibleTrackIds = (0,lib/* createSelector */.P1)(getScrollOffset, getTrackOrder, getNumberOfVisibleTracks, (offset, trackOrder, numberOfVisibleTracks) => trackOrder.slice(offset, offset + numberOfVisibleTracks));\nfunction getAllTracksAreVisible(state) {\n  return getVisibleTrackIds(state).length === state.playlist.trackOrder.length;\n}\nconst getTrackIsVisibleFunction = (0,lib/* createSelector */.P1)(getVisibleTrackIds, visibleTrackIds => {\n  return id => visibleTrackIds.includes(id);\n});\nconst getVisibleTracks = (0,lib/* createSelector */.P1)(getVisibleTrackIds, getTracks, (visibleTrackIds, tracks) => visibleTrackIds.map(id => tracks[id]));\nconst getPlaylist = state => state.playlist;\nconst getDuration = state => {\n  const {\n    playlist,\n    tracks\n  } = state;\n  if (playlist.currentTrack == null) {\n    return null;\n  }\n  const currentTrack = tracks[playlist.currentTrack];\n  return currentTrack && currentTrack.duration;\n};\nconst selectors_getTrackDisplayName = (0,lib/* createSelector */.P1)(getTracks, tracks => {\n  return (0,lib/* defaultMemoize */.PW)(trackId => getTrackDisplayName(tracks, trackId));\n});\nconst getCurrentTrackDisplayName = (0,lib/* createSelector */.P1)(getCurrentTrackId, selectors_getTrackDisplayName, (id, getName) => {\n  return getName(id);\n});\nconst getMediaStatus = state => {\n  return state.media.status;\n};\nconst getMediaIsPlaying = state => state.media.status === MEDIA_STATUS.PLAYING;\nconst getCurrentTrack = (0,lib/* createSelector */.P1)(getCurrentTrackId, getTracks, (trackId, tracks) => {\n  return trackId == null ? null : tracks[trackId];\n});\nconst getCurrentlyPlayingTrackIdIfLoaded = (0,lib/* createSelector */.P1)(getMediaIsPlaying, getCurrentTrack, (mediaIsPlaying, currentTrack) => {\n  if (!mediaIsPlaying || !currentTrack || currentTrack.mediaTagsRequestStatus === MEDIA_TAG_REQUEST_STATUS.INITIALIZED) {\n    return null;\n  }\n  return currentTrack.id;\n});\nconst getCurrentTrackInfo = (0,lib/* createSelector */.P1)(getCurrentTrack, track => {\n  if (track == null) {\n    return null;\n  }\n  return {\n    url: track.url,\n    metaData: {\n      title: track.title || null,\n      artist: track.artist || null,\n      album: track.album || null,\n      albumArtUrl: track.albumArtUrl || null\n    }\n  };\n});\nconst getMinimalMediaText = (0,lib/* createSelector */.P1)(getCurrentTrackNumber, getCurrentTrackDisplayName, (trackNumber, name) => name == null ? null : `${trackNumber}. ${name}`);\nconst getMediaText = (0,lib/* createSelector */.P1)(getMinimalMediaText, getDuration, (minimalMediaText, duration) => minimalMediaText == null ? null : `${minimalMediaText} (${getTimeStr(duration)})`);\nconst getNumberOfTracks = state => getTrackOrder(state).length;\nconst getPlaylistDuration = (0,lib/* createSelector */.P1)(getTracks, tracks => Object.values(tracks).reduce((total, track) => total + (track.duration || 0), 0));\nconst getPlaylistURL = (0,lib/* createSelector */.P1)(getNumberOfTracks, getPlaylistDuration, getTrackOrder, getTracks, selectors_getTrackDisplayName, (numberOfTracks, playlistDuration, trackOrder, tracks, getDisplayName) => createPlaylistURL({\n  numberOfTracks,\n  averageTrackLength: getTimeStr(playlistDuration / numberOfTracks),\n  // TODO: Handle hours\n  playlistLengthMinutes: Math.floor(playlistDuration / 60),\n  playlistLengthSeconds: Math.floor(playlistDuration % 60),\n  tracks: trackOrder.map((id, i) => `${i + 1}. ${getDisplayName(id)} (${getTimeStr(tracks[id].duration)})`)\n}));\nconst selectors_WINDOW_HEIGHT = 116;\nconst SHADE_WINDOW_HEIGHT = 14;\nfunction getWPixelSize(w, doubled) {\n  const [width, height] = w.size;\n  let doubledMultiplier = doubled && w.canDouble ? 2 : 1;\n  if (w.title == \"Playlist Editor\") {\n    doubledMultiplier = 1;\n  }\n  const pix = {\n    height: selectors_WINDOW_HEIGHT + height * WINDOW_RESIZE_SEGMENT_HEIGHT,\n    width: WINDOW_WIDTH + width * WINDOW_RESIZE_SEGMENT_WIDTH\n  };\n  return {\n    height: (w.shade ? SHADE_WINDOW_HEIGHT : pix.height) * doubledMultiplier,\n    width: pix.width * doubledMultiplier\n  };\n}\nfunction getFocusedWindow(state) {\n  return state.windows.focused;\n}\nfunction getWindowPosition(state) {\n  return windowId => state.windows.genWindows[windowId].position;\n}\nfunction getPositionsAreRelative(state) {\n  return state.windows.positionsAreRelative;\n}\nfunction getDoubled(state) {\n  return state.display.doubled;\n}\nfunction getLlamaMode(state) {\n  return state.display.llama;\n}\nfunction getZIndex(state) {\n  return state.display.zIndex;\n}\n\n// TODO: This is poorly memoized. It invalidates when a window moves.\nconst getWindowSizes = (0,lib/* createSelector */.P1)(getGenWindows, getDoubled, (windows, doubled) => {\n  return objectMap(windows, w => getWPixelSize(w, doubled));\n});\nconst selectors_getWindowPixelSize = (0,lib/* createSelector */.P1)(getWindowSizes, sizes => {\n  return windowId => sizes[windowId];\n});\nconst getWindowOrder = state => state.windows.windowOrder;\nconst getNormalizedWindowOrder = (0,lib/* createSelector */.P1)(getWindowOrder, getGenWindows, (windowOrder, genWindows) => {\n  return [WINDOWS.MAIN, ...windowOrder.filter(windowId => windowId !== WINDOWS.MAIN && genWindows[windowId] != null)];\n});\n\n// TODO: Now that both size and position are stored on genWindows this seems a bit silly.\nconst getWindowsInfo = (0,lib/* createSelector */.P1)(getWindowSizes, getWindowPositions, getNormalizedWindowOrder, (sizes, positions, windowOrder) => {\n  return windowOrder.map(key => selectors_objectSpread(selectors_objectSpread({\n    key\n  }, sizes[key]), positions[key]));\n});\nconst getWindowGraph = (0,lib/* createSelector */.P1)(getWindowsInfo, generateGraph);\nconst defaultPlaylistStyle = {\n  normal: \"#00FF00\",\n  current: \"#FFFFFF\",\n  normalbg: \"#000000\",\n  selectedbg: \"#0000C6\",\n  font: \"Arial\"\n};\nfunction getSkinColors(state) {\n  return state.display.skinColors;\n}\nconst getSkinPlaylistStyle = state => {\n  return state.display.skinPlaylistStyle || defaultPlaylistStyle;\n};\nconst selectors_getVisualizerStyle = state => {\n  const milkdrop = state.windows.genWindows[WINDOWS.MILKDROP];\n  if (milkdrop != null && milkdrop.open) {\n    return VISUALIZERS.MILKDROP;\n  }\n  return getVisualizerStyle(state.display);\n};\nconst getVolume = state => state.media.volume;\nconst getBalance = state => state.media.balance;\nconst getShuffle = state => state.media.shuffle;\nconst getRepeat = state => state.media.repeat;\nconst getChannels = (0,lib/* createSelector */.P1)(getCurrentTrack, track => {\n  return track != null ? track.channels || null : null;\n});\nconst getTimeElapsed = state => {\n  return state.media.timeElapsed;\n};\nfunction getSerlializedState(state) {\n  return {\n    version: 1,\n    media: media_getSerializedState(state.media),\n    equalizer: equalizer_getSerializedState(state.equalizer),\n    display: display_getSerializedState(state.display),\n    windows: getSerializedState(state.windows)\n  };\n}\nfunction getEqualizerEnabled(state) {\n  return state.equalizer.on;\n}\nfunction getEqualizerAuto(state) {\n  return state.equalizer.auto;\n}\nfunction getBrowserWindowSize(state) {\n  return state.windows.browserWindowSize;\n}\nconst getOpenWindows = (0,lib/* createSelector */.P1)(getGenWindows, genWindows => objectFilter(genWindows, w => w.open));\nconst getStackedLayoutPositions = (0,lib/* createSelector */.P1)(getOpenWindows, getDoubled, (openWindows, doubled) => {\n  let offset = 0;\n  return objectMap(openWindows, w => {\n    const position = {\n      x: 0,\n      y: offset\n    };\n    offset += getWPixelSize(w, doubled).height;\n    return position;\n  });\n});\nconst getUserInputFocus = state => {\n  return state.userInput.focus;\n};\nconst getUserInputScrubPosition = state => {\n  return state.userInput.scrubPosition;\n};\n// TODO: Make this a reselect selector\nconst getMarqueeText = state => {\n  const defaultText = \"Winamp 2.91\";\n  if (state.userInput.userMessage != null) {\n    return state.userInput.userMessage;\n  }\n  switch (getUserInputFocus(state)) {\n    case \"balance\":\n      return getBalanceText(state.media.balance);\n    case \"volume\":\n      return getVolumeText(state.media.volume);\n    case \"position\":\n      const duration = getDuration(state);\n      if (duration == null) {\n        // This probably can't ever happen.\n        return defaultText;\n      }\n      return getPositionText(duration, getUserInputScrubPosition(state));\n    case \"double\":\n      return getDoubleSizeModeText(state.display.doubled);\n    case \"eq\":\n      const band = state.userInput.bandFocused;\n      if (band == null) {\n        // This probably can't ever happen.\n        return defaultText;\n      }\n      return getEqText(band, state.equalizer.sliders[band]);\n    default:\n      break;\n  }\n  if (state.playlist.currentTrack != null) {\n    const mediaText = getMediaText(state);\n    if (mediaText == null) {\n      // This probably can't ever happen.\n      return defaultText;\n    }\n    return mediaText;\n  }\n  return defaultText;\n};\nconst getKbps = (0,lib/* createSelector */.P1)(getCurrentTrack, track => {\n  return track != null ? track.kbps || null : null;\n});\nconst getKhz = (0,lib/* createSelector */.P1)(getCurrentTrack, track => {\n  return track != null ? track.khz || null : null;\n});\nfunction getDebugData(state) {\n  return selectors_objectSpread(selectors_objectSpread({}, state), {}, {\n    display: selectors_objectSpread(selectors_objectSpread({}, state.display), {}, {\n      skinGenLetterWidths: \"[[REDACTED]]\",\n      skinImages: \"[[REDACTED]]\",\n      skinCursors: \"[[REDACTED]]\",\n      skinRegion: \"[[REDACTED]]\"\n    })\n  });\n}\nfunction getMilkdropMessage(state) {\n  return state.milkdrop.message;\n}\nfunction getMilkdropWindowEnabled(state) {\n  return state.milkdrop.display === \"WINDOW\";\n}\nfunction getMilkdropDesktopEnabled(state) {\n  return state.milkdrop.display === \"DESKTOP\";\n}\nfunction getMilkdropFullscreenEnabled(state) {\n  return state.milkdrop.display === \"FULLSCREEN\";\n}\nfunction getMilkdropLockEnabled(state) {\n  return state.milkdrop.lock;\n}\nfunction getPresets(state) {\n  return butterchurnPresets.getPresets();\n}\nfunction getButterchurn(state) {\n  return state.milkdrop.butterchurn;\n}\nfunction getPresetTransitionType(state) {\n  return state.milkdrop.transitionType;\n}\nfunction getCurrentPresetIndex(state) {\n  return state.milkdrop.currentPresetIndex;\n}\nfunction getCurrentPreset(state) {\n  const index = getCurrentPresetIndex(state);\n  if (index == null) {\n    return null;\n  }\n  const preset = butterchurnPresets_min_default().getPresets()[index];\n  if (preset == null) {\n    return null;\n  }\n  return preset;\n}\nfunction getPresetNames(state) {\n  return state.milkdrop.presets.map(preset => preset.name);\n}\nfunction getPresetOverlayOpen(state) {\n  return state.milkdrop.overlay;\n}\nfunction getPresetsAreCycling(state) {\n  return state.milkdrop.cycling;\n}\nfunction getRandomizePresets(state) {\n  return state.milkdrop.randomize;\n}\nfunction getClosed(state) {\n  return state.display.closed;\n}\nfunction getSkinImages(state) {\n  return state.display.skinImages;\n}\nfunction getSkinCursors(state) {\n  return state.display.skinCursors;\n}\nfunction getSkinRegion(state) {\n  return state.display.skinRegion;\n}\nfunction getSkinLetterWidths(state) {\n  return state.display.skinGenLetterWidths;\n}\nfunction getPreampLineUrl(state) {\n  return state.display.skinImages.EQ_PREAMP_LINE;\n}\nfunction getLineColorsUrl(state) {\n  return state.display.skinImages.EQ_GRAPH_LINE_COLORS;\n}\nconst getPreampLineImage = (0,lib/* createSelector */.P1)(getPreampLineUrl, async url => {\n  if (url == null) {\n    return null;\n  }\n  return imgFromUrl(url);\n});\nconst getLineColorsImage = (0,lib/* createSelector */.P1)(getLineColorsUrl, async url => {\n  if (url == null) {\n    return null;\n  }\n  return imgFromUrl(url);\n});\nfunction getDummyVizData(state) {\n  return state.display.dummyVizData;\n}\nfunction getMarqueeStep(state) {\n  return state.display.marqueeStep;\n}\nfunction getNetworkConnected(state) {\n  return state.network.connected;\n}\nfunction getTimeMode(state) {\n  return state.media.timeMode;\n}\nfunction getLoading(state) {\n  return state.display.loading;\n}\nfunction getWorking(state) {\n  return state.display.working;\n}\nfunction getAvaliableSkins(state) {\n  return state.settings.availableSkins;\n}\n;// CONCATENATED MODULE: ./js/snapUtils.ts\n\nfunction snapUtils_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction snapUtils_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? snapUtils_ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : snapUtils_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nconst SNAP_DISTANCE = 15;\nconst snapUtils_top = box => box.y;\nconst bottom = box => box.y + box.height;\nconst left = box => box.x;\nconst right = box => box.x + box.width;\nconst near = (a, b) => Math.abs(a - b) < SNAP_DISTANCE;\n\n// http://stackoverflow.com/a/3269471/1263117\nconst overlapX = (a, b) => left(a) <= right(b) + SNAP_DISTANCE && left(b) <= right(a) + SNAP_DISTANCE;\nconst overlapY = (a, b) => snapUtils_top(a) <= bottom(b) + SNAP_DISTANCE && snapUtils_top(b) <= bottom(a) + SNAP_DISTANCE;\n\n// Give a new position for `boxA` that snaps it to `boxB` if neede.\nconst snap = (boxA, boxB) => {\n  let x, y;\n\n  // TODO: Refactor/simplify this code\n  if (overlapY(boxA, boxB)) {\n    if (near(left(boxA), right(boxB))) {\n      x = right(boxB);\n    } else if (near(right(boxA), left(boxB))) {\n      x = left(boxB) - boxA.width;\n    } else if (near(left(boxA), left(boxB))) {\n      x = left(boxB);\n    } else if (near(right(boxA), right(boxB))) {\n      x = right(boxB) - boxA.width;\n    }\n  }\n  if (overlapX(boxA, boxB)) {\n    if (near(snapUtils_top(boxA), bottom(boxB))) {\n      y = bottom(boxB);\n    } else if (near(bottom(boxA), snapUtils_top(boxB))) {\n      y = snapUtils_top(boxB) - boxA.height;\n    } else if (near(snapUtils_top(boxA), snapUtils_top(boxB))) {\n      y = snapUtils_top(boxB);\n    } else if (near(bottom(boxA), bottom(boxB))) {\n      y = bottom(boxB) - boxA.height;\n    }\n  }\n  return {\n    x,\n    y\n  };\n};\nconst snapDiff = (a, b) => {\n  const newPos = snap(a, b);\n  return {\n    x: newPos.x === undefined ? 0 : newPos.x - a.x,\n    y: newPos.y === undefined ? 0 : newPos.y - a.y\n  };\n};\n\n// TODO: Use the first x and y combo\nconst snapDiffManyToMany = (as, bs) => {\n  let x = 0;\n  let y = 0;\n  for (const a of as) {\n    for (const b of bs) {\n      const diff = snapDiff(a, b);\n      x = x || diff.x;\n      y = y || diff.y;\n      if (x !== undefined && x > 0 && y !== undefined && y > 0) {\n        break;\n      }\n    }\n  }\n  return {\n    x,\n    y\n  };\n};\nconst snapToMany = (boxA, otherBoxes) => {\n  let x;\n  let y;\n  otherBoxes.forEach(boxB => {\n    const newPos = snap(boxA, boxB);\n    x = newPos.x || x;\n    y = newPos.y || y;\n  });\n  return {\n    x,\n    y\n  };\n};\nconst snapWithin = (boxA, boundingBox) => {\n  let x, y;\n  if (boxA.x - SNAP_DISTANCE < 0) {\n    x = 0;\n  } else if (boxA.x + boxA.width + SNAP_DISTANCE > boundingBox.width) {\n    x = boundingBox.width - boxA.width;\n  }\n  if (boxA.y - SNAP_DISTANCE < 0) {\n    y = 0;\n  } else if (boxA.y + boxA.height + SNAP_DISTANCE > boundingBox.height) {\n    y = boundingBox.height - boxA.height;\n  }\n  return {\n    x,\n    y\n  };\n};\nconst snapWithinDiff = (a, b) => {\n  const newPos = snapWithin(a, b);\n  return {\n    x: newPos.x === undefined ? 0 : newPos.x - a.x,\n    y: newPos.y === undefined ? 0 : newPos.y - a.y\n  };\n};\nconst applySnap = (original, ...snaps) => snaps.reduce((previous, snapped) => snapUtils_objectSpread(snapUtils_objectSpread({}, previous), {}, {\n  x: typeof snapped.x !== \"undefined\" ? snapped.x : previous.x,\n  y: typeof snapped.y !== \"undefined\" ? snapped.y : previous.y\n}), original);\nconst snapUtils_boundingBox = nodes => {\n  const boxes = nodes.slice();\n  const firstNode = boxes.pop();\n  if (firstNode == null) {\n    throw new Error(\"boundingBox must be called with at least one node\");\n  }\n  const bounding = {\n    top: snapUtils_top(firstNode),\n    right: right(firstNode),\n    bottom: bottom(firstNode),\n    left: left(firstNode)\n  };\n  boxes.forEach(node => {\n    bounding.top = Math.min(bounding.top, snapUtils_top(node));\n    bounding.right = Math.max(bounding.right, right(node));\n    bounding.bottom = Math.max(bounding.bottom, bottom(node));\n    bounding.left = Math.min(bounding.left, left(node));\n  });\n  return {\n    x: bounding.left,\n    y: bounding.top,\n    width: bounding.right - bounding.left,\n    height: bounding.bottom - bounding.top\n  };\n};\nfunction traceConnection(areConnected) {\n  return (candidates, node) => {\n    const connected = new Set();\n    const checkNode = n => {\n      for (const candidate of candidates) {\n        if (!connected.has(candidate) && areConnected(candidate, n)) {\n          connected.add(candidate);\n          checkNode(candidate);\n        }\n      }\n    };\n    checkNode(node);\n    return connected;\n  };\n}\nconst applyDiff = (a, b) => ({\n  x: a.x + b.x,\n  y: a.y + b.y\n});\n\n// TODO: This should not\nconst applyMultipleDiffs = (initial, ...diffs) => {\n  const metaDiff = diffs.reduce((m, diff) => ({\n    // Use the smallest non-zero diff for each axis.\n    // TODO: Min should be the absolute value\n    x: m.x === 0 || diff.x === 0 ? m.x + diff.x : Math.min(m.x, diff.x),\n    y: m.y === 0 || diff.y === 0 ? m.y + diff.y : Math.min(m.y, diff.y)\n  }));\n  return applyDiff(initial, metaDiff);\n};\n;// CONCATENATED MODULE: ./js/actionCreators/windows.ts\n\nfunction actionCreators_windows_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction actionCreators_windows_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? actionCreators_windows_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : actionCreators_windows_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n\n// Dispatch an action and, if needed rearrange the windows to preserve\n// the existing edge relationship.\n//\n// Works by checking the edges before the action is dispatched. Then,\n// after disatching, calculating what position change would be required\n// to restore those relationships.\nfunction withWindowGraphIntegrity(action) {\n  return (dispatch, getState) => {\n    const state = getState();\n    const graph = getWindowGraph(state);\n    const originalSizes = getWindowSizes(state);\n    dispatch(action);\n    const newSizes = getWindowSizes(getState());\n    const sizeDiff = {};\n    for (const window of Object.keys(newSizes)) {\n      const original = originalSizes[window];\n      const current = newSizes[window];\n      sizeDiff[window] = {\n        height: current.height - original.height,\n        width: current.width - original.width\n      };\n    }\n    const positionDiff = getPositionDiff(graph, sizeDiff);\n    const windowPositions = getWindowPositions(state);\n    const newPositions = objectMap(windowPositions, (position, key) => applyDiff(position, positionDiff[key]));\n    dispatch(windows_updateWindowPositions(newPositions));\n  };\n}\nfunction windows_toggleDoubleSizeMode() {\n  return withWindowGraphIntegrity({\n    type: TOGGLE_DOUBLESIZE_MODE\n  });\n}\nfunction toggleLlamaMode() {\n  return {\n    type: TOGGLE_LLAMA_MODE\n  };\n}\nfunction windows_toggleEqualizerShadeMode() {\n  return withWindowGraphIntegrity({\n    type: TOGGLE_WINDOW_SHADE_MODE,\n    windowId: \"equalizer\"\n  });\n}\nfunction windows_toggleMainWindowShadeMode() {\n  return withWindowGraphIntegrity({\n    type: TOGGLE_WINDOW_SHADE_MODE,\n    windowId: \"main\"\n  });\n}\nfunction togglePlaylistShadeMode() {\n  return withWindowGraphIntegrity({\n    type: TOGGLE_WINDOW_SHADE_MODE,\n    windowId: \"playlist\"\n  });\n}\nfunction windows_closeWindow(windowId) {\n  return {\n    type: CLOSE_WINDOW,\n    windowId\n  };\n}\nfunction hideWindow(windowId) {\n  return {\n    type: SET_WINDOW_VISIBILITY,\n    windowId,\n    hidden: true\n  };\n}\nfunction showWindow(windowId) {\n  return {\n    type: SET_WINDOW_VISIBILITY,\n    windowId,\n    hidden: false\n  };\n}\nfunction windows_setFocusedWindow(window) {\n  return {\n    type: SET_FOCUSED_WINDOW,\n    window\n  };\n}\nfunction windows_setWindowSize(windowId, size) {\n  return {\n    type: WINDOW_SIZE_CHANGED,\n    windowId,\n    size\n  };\n}\nfunction windows_toggleWindow(windowId) {\n  return {\n    type: TOGGLE_WINDOW,\n    windowId\n  };\n}\nfunction windows_updateWindowPositions(positions, absolute) {\n  return {\n    type: UPDATE_WINDOW_POSITIONS,\n    positions,\n    absolute\n  };\n}\nfunction centerWindowsInContainer(container) {\n  return (dispatch, getState) => {\n    if (!getPositionsAreRelative(getState())) {\n      return;\n    }\n    const {\n      left,\n      top\n    } = container.getBoundingClientRect();\n    const {\n      scrollWidth: width,\n      scrollHeight: height\n    } = container;\n    dispatch(centerWindows({\n      left,\n      top,\n      width,\n      height\n    }));\n  };\n}\nfunction windows_centerWindowsInView() {\n  return centerWindows({\n    left: window.scrollX,\n    top: window.scrollY,\n    width: window.innerWidth,\n    height: window.innerHeight\n  });\n}\nfunction centerWindows(box) {\n  return (dispatch, getState) => {\n    const state = getState();\n    const windowsInfo = getWindowsInfo(state);\n    const getOpen = selectors_getWindowOpen(state);\n    const {\n      top,\n      left,\n      width,\n      height\n    } = box;\n    const offsetLeft = left + window.scrollX;\n    const offsetTop = top + window.scrollY;\n\n    // A layout has been suplied. We will compute the bounding box and\n    // center the given layout.\n    const bounding = calculateBoundingBox(windowsInfo.filter(w => getOpen(w.key)));\n    if (bounding == null) {\n      // There are no windows to center\n      return;\n    }\n    const boxHeight = bounding.bottom - bounding.top;\n    const boxWidth = bounding.right - bounding.left;\n    const move = {\n      x: Math.ceil(offsetLeft - bounding.left + (width - boxWidth) / 2),\n      y: Math.ceil(offsetTop - bounding.top + (height - boxHeight) / 2)\n    };\n    const newPositions = windowsInfo.reduce((pos, w) => actionCreators_windows_objectSpread(actionCreators_windows_objectSpread({}, pos), {}, {\n      [w.key]: {\n        x: move.x + w.x,\n        y: move.y + w.y\n      }\n    }), {});\n    dispatch(windows_updateWindowPositions(newPositions, true));\n  };\n}\nfunction windows_browserWindowSizeChanged(size) {\n  return dispatch => {\n    dispatch(actionCreators_windows_objectSpread({\n      type: BROWSER_WINDOW_SIZE_CHANGED\n    }, size));\n    dispatch(ensureWindowsAreOnScreen());\n  };\n}\nfunction resetWindowSizes() {\n  return {\n    type: RESET_WINDOW_SIZES\n  };\n}\nfunction stackWindows() {\n  return (dispatch, getState) => {\n    dispatch(windows_updateWindowPositions(getStackedLayoutPositions(getState())));\n  };\n}\nfunction ensureWindowsAreOnScreen() {\n  return (dispatch, getState) => {\n    const state = getState();\n    const windowsInfo = getWindowsInfo(state);\n    const getOpen = selectors_getWindowOpen(state);\n    const {\n      height,\n      width\n    } = getWindowSize();\n    const bounding = calculateBoundingBox(windowsInfo.filter(w => getOpen(w.key)));\n    if (bounding == null) {\n      // There are no windows visible, so there's no work to do.\n      return;\n    }\n    const positions = getWindowPositions(state);\n\n    // Are we good?\n    if (bounding.left >= 0 && bounding.top >= 0 && bounding.right <= width && bounding.bottom <= height) {\n      // My work here is done.\n      return;\n    }\n    const boundingHeight = bounding.bottom - bounding.top;\n    const boundingWidth = bounding.right - bounding.left;\n\n    // Could we simply shift all the windows by a constant offset?\n    if (boundingWidth <= width && boundingHeight <= height) {\n      let moveY = 0;\n      let moveX = 0;\n      if (bounding.top <= 0) {\n        moveY = bounding.top;\n      } else if (bounding.bottom > height) {\n        moveY = bounding.bottom - height;\n      }\n      if (bounding.left <= 0) {\n        moveX = bounding.left;\n      } else if (bounding.right > width) {\n        moveX = bounding.right - width;\n      }\n      const newPositions = objectMap(positions, position => ({\n        x: position.x - moveX,\n        y: position.y - moveY\n      }));\n      dispatch(windows_updateWindowPositions(newPositions));\n      return;\n    }\n\n    // TODO: Try moving the individual groups to try to fit them in\n\n    // I give up. Just reset everything.\n    dispatch(resetWindowSizes());\n    dispatch(stackWindows());\n    dispatch(windows_centerWindowsInView());\n  };\n}\n;// CONCATENATED MODULE: ./js/actionCreators/media.ts\n\n\n\n\n\nfunction playTrack(id) {\n  return (dispatch, getState) => {\n    const state = getState();\n    const isStopped = getMediaStatus(state) === MEDIA_STATUS.STOPPED;\n    if (isStopped) {\n      dispatch({\n        type: BUFFER_TRACK,\n        id\n      });\n    } else {\n      dispatch({\n        type: PLAY_TRACK,\n        id\n      });\n    }\n  };\n}\nfunction media_playTrackNow(id) {\n  return {\n    type: PLAY_TRACK,\n    id\n  };\n}\nfunction media_play() {\n  return (dispatch, getState) => {\n    const state = getState();\n    if (state.media.status === MEDIA_STATUS.STOPPED && state.playlist.currentTrack == null && state.playlist.trackOrder.length === 0) {\n      dispatch(files_openMediaFileDialog());\n    } else {\n      dispatch({\n        type: PLAY\n      });\n    }\n  };\n}\nfunction media_pause() {\n  return (dispatch, getState) => {\n    const {\n      status\n    } = getState().media;\n    if (status === MEDIA_STATUS.PLAYING) {\n      dispatch({\n        type: PAUSE\n      });\n    } else {\n      dispatch({\n        type: PLAY\n      });\n    }\n  };\n}\nfunction media_stop() {\n  return {\n    type: STOP\n  };\n}\nfunction media_nextN(n) {\n  return (dispatch, getState) => {\n    const nextTrackId = getNextTrackId(getState(), n);\n    if (nextTrackId == null) {\n      dispatch({\n        type: IS_STOPPED\n      });\n      return;\n    }\n    dispatch(playTrack(nextTrackId));\n  };\n}\nfunction media_next() {\n  return media_nextN(1);\n}\nfunction media_previous() {\n  return media_nextN(-1);\n}\nfunction seekToTime(seconds) {\n  return function (dispatch, getState) {\n    const state = getState();\n    const duration = getDuration(state);\n    if (duration == null) {\n      return;\n    }\n    dispatch({\n      type: SEEK_TO_PERCENT_COMPLETE,\n      percent: seconds / duration * 100\n    });\n  };\n}\nfunction media_seekForward(seconds) {\n  return function (dispatch, getState) {\n    const timeElapsed = getTimeElapsed(getState());\n    dispatch(seekToTime(timeElapsed + seconds));\n  };\n}\nfunction media_seekBackward(seconds) {\n  return media_seekForward(-seconds);\n}\nfunction media_setVolume(volume) {\n  return {\n    type: SET_VOLUME,\n    volume: clamp(volume, 0, 100)\n  };\n}\nfunction adjustVolume(volumeDiff) {\n  return (dispatch, getState) => {\n    const currentVolume = getState().media.volume;\n    return dispatch(media_setVolume(currentVolume + volumeDiff));\n  };\n}\nfunction media_scrollVolume(e) {\n  e.preventDefault();\n  return (dispatch, getState) => {\n    const currentVolume = getState().media.volume;\n    // Using pixels as percentage difference here is a bit arbirary, but... oh well.\n    return dispatch(media_setVolume(currentVolume + e.deltaY));\n  };\n}\nfunction media_setBalance(balance) {\n  balance = clamp(balance, -100, 100);\n  // The balance clips to the center\n  if (Math.abs(balance) < 25) {\n    balance = 0;\n  }\n  return {\n    type: SET_BALANCE,\n    balance\n  };\n}\nfunction media_toggleRepeat() {\n  return {\n    type: TOGGLE_REPEAT\n  };\n}\nfunction media_toggleShuffle() {\n  return {\n    type: TOGGLE_SHUFFLE\n  };\n}\nfunction media_toggleTimeMode() {\n  return {\n    type: TOGGLE_TIME_MODE\n  };\n}\n;// CONCATENATED MODULE: ./js/actionCreators/equalizer.ts\n\n\nconst BAND_SNAP_DISTANCE = 50; // 5 in old scale (0-100), now 50 in new scale (0-2400) to maintain same snap distance in dB\nconst BAND_MID_POINT_VALUE = 1200; // 50 in old scale (0-100), now 1200 in new scale (0-2400)\n\nfunction _snapBandValue(value) {\n  if (value < BAND_MID_POINT_VALUE + BAND_SNAP_DISTANCE && value > BAND_MID_POINT_VALUE - BAND_SNAP_DISTANCE) {\n    return BAND_MID_POINT_VALUE;\n  }\n  // Round to nearest 0.1 dB step (value divisible by 1)\n  return Math.round(value);\n}\nfunction setEqBand(band, value) {\n  return {\n    type: SET_BAND_VALUE,\n    band,\n    value: _snapBandValue(value)\n  };\n}\nfunction _setEqTo(value) {\n  return dispatch => {\n    Object.values(BANDS).forEach(band => {\n      dispatch({\n        type: SET_BAND_VALUE,\n        value,\n        band: band\n      });\n    });\n  };\n}\nfunction equalizer_setEqToMax() {\n  return _setEqTo(2400);\n}\nfunction equalizer_setEqToMid() {\n  return _setEqTo(1200);\n}\nfunction equalizer_setEqToMin() {\n  return _setEqTo(0);\n}\nfunction setPreamp(value) {\n  return {\n    type: SET_BAND_VALUE,\n    band: \"preamp\",\n    value: _snapBandValue(value)\n  };\n}\nfunction equalizer_toggleEq() {\n  return (dispatch, getState) => {\n    if (getState().equalizer.on) {\n      dispatch({\n        type: SET_EQ_OFF\n      });\n    } else {\n      dispatch({\n        type: SET_EQ_ON\n      });\n    }\n  };\n}\nfunction toggleEqAuto() {\n  return dispatch => {\n    // We don't actually support this feature yet so don't let the user ever turn it on.\n    // dispatch({ type: SET_EQ_AUTO, value: !getState().equalizer.auto });\n    dispatch({\n      type: SET_EQ_AUTO,\n      value: false\n    });\n  };\n}\n// EXTERNAL MODULE: ../../node_modules/winamp-eqf/index.js\nvar winamp_eqf = __webpack_require__(2105);\n;// CONCATENATED MODULE: ./js/skinSprites.ts\n\n/* TODO: There are too many \" \" and \"_\" characters */\nconst FONT_LOOKUP = {\n  a: [0, 0],\n  b: [0, 1],\n  c: [0, 2],\n  d: [0, 3],\n  e: [0, 4],\n  f: [0, 5],\n  g: [0, 6],\n  h: [0, 7],\n  i: [0, 8],\n  j: [0, 9],\n  k: [0, 10],\n  l: [0, 11],\n  m: [0, 12],\n  n: [0, 13],\n  o: [0, 14],\n  p: [0, 15],\n  q: [0, 16],\n  r: [0, 17],\n  s: [0, 18],\n  t: [0, 19],\n  u: [0, 20],\n  v: [0, 21],\n  w: [0, 22],\n  x: [0, 23],\n  y: [0, 24],\n  z: [0, 25],\n  '\"': [0, 26],\n  \"@\": [0, 27],\n  \" \": [0, 30],\n  \"0\": [1, 0],\n  \"1\": [1, 1],\n  \"2\": [1, 2],\n  \"3\": [1, 3],\n  \"4\": [1, 4],\n  \"5\": [1, 5],\n  \"6\": [1, 6],\n  \"7\": [1, 7],\n  \"8\": [1, 8],\n  \"9\": [1, 9],\n  [UTF8_ELLIPSIS]: [1, 10],\n  \".\": [1, 11],\n  \":\": [1, 12],\n  \"(\": [1, 13],\n  \")\": [1, 14],\n  \"-\": [1, 15],\n  \"'\": [1, 16],\n  \"!\": [1, 17],\n  _: [1, 18],\n  \"+\": [1, 19],\n  \"\\\\\": [1, 20],\n  \"/\": [1, 21],\n  \"[\": [1, 22],\n  \"]\": [1, 23],\n  \"^\": [1, 24],\n  \"&\": [1, 25],\n  \"%\": [1, 26],\n  \",\": [1, 27],\n  \"=\": [1, 28],\n  $: [1, 29],\n  \"#\": [1, 30],\n  Å: [2, 0],\n  Ö: [2, 1],\n  Ä: [2, 2],\n  \"?\": [2, 3],\n  \"*\": [2, 4],\n  \"<\": [1, 22],\n  \">\": [1, 23],\n  \"{\": [1, 22],\n  \"}\": [1, 23]\n};\nconst imageConstFromChar = char => `CHARACTER_${char.charCodeAt(0)}`;\nconst CHAR_X = 5;\nconst CHAR_Y = 6;\nconst characterSprites = [];\nfor (const key in FONT_LOOKUP) {\n  if (FONT_LOOKUP.hasOwnProperty(key)) {\n    const position = FONT_LOOKUP[key];\n    characterSprites.push({\n      name: imageConstFromChar(key),\n      y: position[0] * CHAR_Y,\n      x: position[1] * CHAR_X,\n      width: CHAR_X,\n      height: CHAR_Y\n    });\n  }\n}\nconst sprites = {\n  BALANCE: [{\n    name: \"MAIN_BALANCE_BACKGROUND\",\n    x: 9,\n    y: 0,\n    width: 38,\n    height: 420\n  }, {\n    name: \"MAIN_BALANCE_THUMB\",\n    x: 15,\n    y: 422,\n    width: 14,\n    height: 11\n  }, {\n    name: \"MAIN_BALANCE_THUMB_ACTIVE\",\n    x: 0,\n    y: 422,\n    width: 14,\n    height: 11\n  }],\n  CBUTTONS: [{\n    name: \"MAIN_PREVIOUS_BUTTON\",\n    x: 0,\n    y: 0,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_PREVIOUS_BUTTON_ACTIVE\",\n    x: 0,\n    y: 18,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_PLAY_BUTTON\",\n    x: 23,\n    y: 0,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_PLAY_BUTTON_ACTIVE\",\n    x: 23,\n    y: 18,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_PAUSE_BUTTON\",\n    x: 46,\n    y: 0,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_PAUSE_BUTTON_ACTIVE\",\n    x: 46,\n    y: 18,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_STOP_BUTTON\",\n    x: 69,\n    y: 0,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_STOP_BUTTON_ACTIVE\",\n    x: 69,\n    y: 18,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_NEXT_BUTTON\",\n    x: 92,\n    y: 0,\n    width: 23,\n    height: 18\n  }, {\n    name: \"MAIN_NEXT_BUTTON_ACTIVE\",\n    x: 92,\n    y: 18,\n    width: 22,\n    height: 18\n  }, {\n    name: \"MAIN_EJECT_BUTTON\",\n    x: 114,\n    y: 0,\n    width: 22,\n    height: 16\n  }, {\n    name: \"MAIN_EJECT_BUTTON_ACTIVE\",\n    x: 114,\n    y: 16,\n    width: 22,\n    height: 16\n  }],\n  MAIN: [{\n    name: \"MAIN_WINDOW_BACKGROUND\",\n    x: 0,\n    y: 0,\n    width: 275,\n    height: 116\n  }],\n  MONOSTER: [{\n    name: \"MAIN_STEREO\",\n    x: 0,\n    y: 12,\n    width: 29,\n    height: 12\n  }, {\n    name: \"MAIN_STEREO_SELECTED\",\n    x: 0,\n    y: 0,\n    width: 29,\n    height: 12\n  }, {\n    name: \"MAIN_MONO\",\n    x: 29,\n    y: 12,\n    width: 27,\n    height: 12\n  }, {\n    name: \"MAIN_MONO_SELECTED\",\n    x: 29,\n    y: 0,\n    width: 27,\n    height: 12\n  }],\n  NUMBERS: [{\n    name: \"NO_MINUS_SIGN\",\n    x: 9,\n    y: 6,\n    width: 5,\n    height: 1\n  }, {\n    name: \"MINUS_SIGN\",\n    x: 20,\n    y: 6,\n    width: 5,\n    height: 1\n  }, {\n    name: \"DIGIT_0\",\n    x: 0,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_1\",\n    x: 9,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_2\",\n    x: 18,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_3\",\n    x: 27,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_4\",\n    x: 36,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_5\",\n    x: 45,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_6\",\n    x: 54,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_7\",\n    x: 63,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_8\",\n    x: 72,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_9\",\n    x: 81,\n    y: 0,\n    width: 9,\n    height: 13\n  }],\n  NUMS_EX: [{\n    name: \"NO_MINUS_SIGN_EX\",\n    x: 90,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"MINUS_SIGN_EX\",\n    x: 99,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_0_EX\",\n    x: 0,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_1_EX\",\n    x: 9,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_2_EX\",\n    x: 18,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_3_EX\",\n    x: 27,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_4_EX\",\n    x: 36,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_5_EX\",\n    x: 45,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_6_EX\",\n    x: 54,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_7_EX\",\n    x: 63,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_8_EX\",\n    x: 72,\n    y: 0,\n    width: 9,\n    height: 13\n  }, {\n    name: \"DIGIT_9_EX\",\n    x: 81,\n    y: 0,\n    width: 9,\n    height: 13\n  }],\n  PLAYPAUS: [{\n    name: \"MAIN_PLAYING_INDICATOR\",\n    x: 0,\n    y: 0,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_PAUSED_INDICATOR\",\n    x: 9,\n    y: 0,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_STOPPED_INDICATOR\",\n    x: 18,\n    y: 0,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_NOT_WORKING_INDICATOR\",\n    x: 36,\n    y: 0,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_WORKING_INDICATOR\",\n    x: 39,\n    y: 0,\n    width: 9,\n    height: 9\n  }],\n  PLEDIT: [{\n    name: \"PLAYLIST_TOP_TILE\",\n    x: 127,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"PLAYLIST_TOP_LEFT_CORNER\",\n    x: 0,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"PLAYLIST_TITLE_BAR\",\n    x: 26,\n    y: 21,\n    width: 100,\n    height: 20\n  }, {\n    name: \"PLAYLIST_TOP_RIGHT_CORNER\",\n    x: 153,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"PLAYLIST_TOP_TILE_SELECTED\",\n    x: 127,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"PLAYLIST_TOP_LEFT_SELECTED\",\n    x: 0,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"PLAYLIST_TITLE_BAR_SELECTED\",\n    x: 26,\n    y: 0,\n    width: 100,\n    height: 20\n  }, {\n    name: \"PLAYLIST_TOP_RIGHT_CORNER_SELECTED\",\n    x: 153,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"PLAYLIST_LEFT_TILE\",\n    x: 0,\n    y: 42,\n    width: 12,\n    height: 29\n  }, {\n    name: \"PLAYLIST_RIGHT_TILE\",\n    x: 31,\n    y: 42,\n    width: 20,\n    height: 29\n  }, {\n    name: \"PLAYLIST_BOTTOM_TILE\",\n    x: 179,\n    y: 0,\n    width: 25,\n    height: 38\n  }, {\n    name: \"PLAYLIST_BOTTOM_LEFT_CORNER\",\n    x: 0,\n    y: 72,\n    width: 125,\n    height: 38\n  }, {\n    name: \"PLAYLIST_BOTTOM_RIGHT_CORNER\",\n    x: 126,\n    y: 72,\n    width: 150,\n    height: 38\n  }, {\n    name: \"PLAYLIST_VISUALIZER_BACKGROUND\",\n    x: 205,\n    y: 0,\n    width: 75,\n    height: 38\n  }, {\n    name: \"PLAYLIST_SHADE_BACKGROUND\",\n    x: 72,\n    y: 57,\n    width: 25,\n    height: 14\n  }, {\n    name: \"PLAYLIST_SHADE_BACKGROUND_LEFT\",\n    x: 72,\n    y: 42,\n    width: 25,\n    height: 14\n  }, {\n    name: \"PLAYLIST_SHADE_BACKGROUND_RIGHT\",\n    x: 99,\n    y: 57,\n    width: 50,\n    height: 14\n  }, {\n    name: \"PLAYLIST_SHADE_BACKGROUND_RIGHT_SELECTED\",\n    x: 99,\n    y: 42,\n    width: 50,\n    height: 14\n  }, {\n    name: \"PLAYLIST_SCROLL_HANDLE_SELECTED\",\n    x: 61,\n    y: 53,\n    width: 8,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SCROLL_HANDLE\",\n    x: 52,\n    y: 53,\n    width: 8,\n    height: 18\n  }, {\n    name: \"PLAYLIST_ADD_URL\",\n    x: 0,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_ADD_URL_SELECTED\",\n    x: 23,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_ADD_DIR\",\n    x: 0,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_ADD_DIR_SELECTED\",\n    x: 23,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_ADD_FILE\",\n    x: 0,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_ADD_FILE_SELECTED\",\n    x: 23,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_REMOVE_ALL\",\n    x: 54,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_REMOVE_ALL_SELECTED\",\n    x: 77,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_CROP\",\n    x: 54,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_CROP_SELECTED\",\n    x: 77,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_REMOVE_SELECTED\",\n    x: 54,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_REMOVE_SELECTED_SELECTED\",\n    x: 77,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_REMOVE_MISC\",\n    x: 54,\n    y: 168,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_REMOVE_MISC_SELECTED\",\n    x: 77,\n    y: 168,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_INVERT_SELECTION\",\n    x: 104,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_INVERT_SELECTION_SELECTED\",\n    x: 127,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SELECT_ZERO\",\n    x: 104,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SELECT_ZERO_SELECTED\",\n    x: 127,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SELECT_ALL\",\n    x: 104,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SELECT_ALL_SELECTED\",\n    x: 127,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SORT_LIST\",\n    x: 154,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SORT_LIST_SELECTED\",\n    x: 177,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_FILE_INFO\",\n    x: 154,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_FILE_INFO_SELECTED\",\n    x: 177,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_MISC_OPTIONS\",\n    x: 154,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_MISC_OPTIONS_SELECTED\",\n    x: 177,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_NEW_LIST\",\n    x: 204,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_NEW_LIST_SELECTED\",\n    x: 227,\n    y: 111,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SAVE_LIST\",\n    x: 204,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_SAVE_LIST_SELECTED\",\n    x: 227,\n    y: 130,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_LOAD_LIST\",\n    x: 204,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_LOAD_LIST_SELECTED\",\n    x: 227,\n    y: 149,\n    width: 22,\n    height: 18\n  }, {\n    name: \"PLAYLIST_ADD_MENU_BAR\",\n    x: 48,\n    y: 111,\n    width: 3,\n    height: 54\n  }, {\n    name: \"PLAYLIST_REMOVE_MENU_BAR\",\n    x: 100,\n    y: 111,\n    width: 3,\n    height: 72\n  }, {\n    name: \"PLAYLIST_SELECT_MENU_BAR\",\n    x: 150,\n    y: 111,\n    width: 3,\n    height: 54\n  }, {\n    name: \"PLAYLIST_MISC_MENU_BAR\",\n    x: 200,\n    y: 111,\n    width: 3,\n    height: 54\n  }, {\n    name: \"PLAYLIST_LIST_BAR\",\n    x: 250,\n    y: 111,\n    width: 3,\n    height: 54\n  }, {\n    name: \"PLAYLIST_CLOSE_SELECTED\",\n    x: 52,\n    y: 42,\n    width: 9,\n    height: 9\n  }, {\n    name: \"PLAYLIST_COLLAPSE_SELECTED\",\n    x: 62,\n    y: 42,\n    width: 9,\n    height: 9\n  }, {\n    name: \"PLAYLIST_EXPAND_SELECTED\",\n    x: 150,\n    y: 42,\n    width: 9,\n    height: 9\n  }],\n  EQ_EX: [{\n    name: \"EQ_SHADE_BACKGROUND_SELECTED\",\n    x: 0,\n    y: 0,\n    width: 275,\n    height: 14\n  }, {\n    name: \"EQ_SHADE_BACKGROUND\",\n    x: 0,\n    y: 15,\n    width: 275,\n    height: 14\n  }, {\n    name: \"EQ_SHADE_VOLUME_SLIDER_LEFT\",\n    x: 1,\n    y: 30,\n    width: 3,\n    height: 7\n  }, {\n    name: \"EQ_SHADE_VOLUME_SLIDER_CENTER\",\n    x: 4,\n    y: 30,\n    width: 3,\n    height: 7\n  }, {\n    name: \"EQ_SHADE_VOLUME_SLIDER_RIGHT\",\n    x: 7,\n    y: 30,\n    width: 3,\n    height: 7\n  }, {\n    name: \"EQ_SHADE_BALANCE_SLIDER_LEFT\",\n    x: 11,\n    y: 30,\n    width: 3,\n    height: 7\n  }, {\n    name: \"EQ_SHADE_BALANCE_SLIDER_CENTER\",\n    x: 14,\n    y: 30,\n    width: 3,\n    height: 7\n  }, {\n    name: \"EQ_SHADE_BALANCE_SLIDER_RIGHT\",\n    x: 17,\n    y: 30,\n    width: 3,\n    height: 7\n  }, {\n    name: \"EQ_MAXIMIZE_BUTTON_ACTIVE\",\n    x: 1,\n    y: 38,\n    width: 9,\n    height: 9\n  }, {\n    name: \"EQ_MINIMIZE_BUTTON_ACTIVE\",\n    x: 1,\n    y: 47,\n    width: 9,\n    height: 9\n  }, {\n    name: \"EQ_SHADE_CLOSE_BUTTON\",\n    x: 11,\n    y: 38,\n    width: 9,\n    height: 9\n  }, {\n    name: \"EQ_SHADE_CLOSE_BUTTON_ACTIVE\",\n    x: 11,\n    y: 47,\n    width: 9,\n    height: 9\n  }],\n  EQMAIN: [{\n    name: \"EQ_WINDOW_BACKGROUND\",\n    x: 0,\n    y: 0,\n    width: 275,\n    height: 116\n  }, {\n    name: \"EQ_TITLE_BAR\",\n    x: 0,\n    y: 149,\n    width: 275,\n    height: 14\n  }, {\n    name: \"EQ_TITLE_BAR_SELECTED\",\n    x: 0,\n    y: 134,\n    width: 275,\n    height: 14\n  }, {\n    name: \"EQ_SLIDER_BACKGROUND\",\n    x: 13,\n    y: 164,\n    width: 209,\n    height: 129\n  }, {\n    name: \"EQ_SLIDER_THUMB\",\n    x: 0,\n    y: 164,\n    width: 11,\n    height: 11\n  }, {\n    name: \"EQ_SLIDER_THUMB_SELECTED\",\n    x: 0,\n    y: 176,\n    width: 11,\n    height: 11\n  }, {\n    name: \"EQ_CLOSE_BUTTON\",\n    x: 0,\n    y: 116,\n    width: 9,\n    height: 9\n  }, {\n    name: \"EQ_CLOSE_BUTTON_ACTIVE\",\n    x: 0,\n    y: 125,\n    width: 9,\n    height: 9\n  },\n  // This is technically not a sprite, it's just part of the background.\n  // However, we extract it to use it as a fallback for\n  // `EQ_MAXIMIZE_BUTTON_ACTIVE`. Without this, skins that don't implement\n  // `eq_ex.bmp` would show the default skin's `EQ_MAXIMIZE_BUTTON_ACTIVE`\n  // instead of showing no sprite aka, just showing through to this portion of\n  // the title bar image.\n  {\n    name: \"EQ_MAXIMIZE_BUTTON_ACTIVE_FALLBACK\",\n    x: 254,\n    y: 152,\n    width: 9,\n    height: 9\n  }, {\n    name: \"EQ_ON_BUTTON\",\n    x: 10,\n    y: 119,\n    width: 26,\n    height: 12\n  }, {\n    name: \"EQ_ON_BUTTON_DEPRESSED\",\n    x: 128,\n    y: 119,\n    width: 26,\n    height: 12\n  }, {\n    name: \"EQ_ON_BUTTON_SELECTED\",\n    x: 69,\n    y: 119,\n    width: 26,\n    height: 12\n  }, {\n    name: \"EQ_ON_BUTTON_SELECTED_DEPRESSED\",\n    x: 187,\n    y: 119,\n    width: 26,\n    height: 12\n  }, {\n    name: \"EQ_AUTO_BUTTON\",\n    x: 36,\n    y: 119,\n    width: 32,\n    height: 12\n  }, {\n    name: \"EQ_AUTO_BUTTON_DEPRESSED\",\n    x: 154,\n    y: 119,\n    width: 32,\n    height: 12\n  }, {\n    name: \"EQ_AUTO_BUTTON_SELECTED\",\n    x: 95,\n    y: 119,\n    width: 32,\n    height: 12\n  }, {\n    name: \"EQ_AUTO_BUTTON_SELECTED_DEPRESSED\",\n    x: 213,\n    y: 119,\n    width: 32,\n    height: 12\n  }, {\n    name: \"EQ_GRAPH_BACKGROUND\",\n    x: 0,\n    y: 294,\n    width: 113,\n    height: 19\n  }, {\n    name: \"EQ_GRAPH_LINE_COLORS\",\n    x: 115,\n    y: 294,\n    width: 1,\n    height: 19\n  }, {\n    name: \"EQ_PRESETS_BUTTON\",\n    x: 224,\n    y: 164,\n    width: 44,\n    height: 12\n  }, {\n    name: \"EQ_PRESETS_BUTTON_SELECTED\",\n    x: 224,\n    y: 176,\n    width: 44,\n    height: 12\n  }, {\n    name: \"EQ_PREAMP_LINE\",\n    x: 0,\n    y: 314,\n    width: 113,\n    height: 1\n  }],\n  POSBAR: [{\n    name: \"MAIN_POSITION_SLIDER_BACKGROUND\",\n    x: 0,\n    y: 0,\n    width: 248,\n    height: 10\n  }, {\n    name: \"MAIN_POSITION_SLIDER_THUMB\",\n    x: 248,\n    y: 0,\n    width: 29,\n    height: 10\n  }, {\n    name: \"MAIN_POSITION_SLIDER_THUMB_SELECTED\",\n    x: 278,\n    y: 0,\n    width: 29,\n    height: 10\n  }],\n  SHUFREP: [{\n    name: \"MAIN_SHUFFLE_BUTTON\",\n    x: 28,\n    y: 0,\n    width: 47,\n    height: 15\n  }, {\n    name: \"MAIN_SHUFFLE_BUTTON_DEPRESSED\",\n    x: 28,\n    y: 15,\n    width: 47,\n    height: 15\n  }, {\n    name: \"MAIN_SHUFFLE_BUTTON_SELECTED\",\n    x: 28,\n    y: 30,\n    width: 47,\n    height: 15\n  }, {\n    name: \"MAIN_SHUFFLE_BUTTON_SELECTED_DEPRESSED\",\n    x: 28,\n    y: 45,\n    width: 47,\n    height: 15\n  }, {\n    name: \"MAIN_REPEAT_BUTTON\",\n    x: 0,\n    y: 0,\n    width: 28,\n    height: 15\n  }, {\n    name: \"MAIN_REPEAT_BUTTON_DEPRESSED\",\n    x: 0,\n    y: 15,\n    width: 28,\n    height: 15\n  }, {\n    name: \"MAIN_REPEAT_BUTTON_SELECTED\",\n    x: 0,\n    y: 30,\n    width: 28,\n    height: 15\n  }, {\n    name: \"MAIN_REPEAT_BUTTON_SELECTED_DEPRESSED\",\n    x: 0,\n    y: 45,\n    width: 28,\n    height: 15\n  }, {\n    name: \"MAIN_EQ_BUTTON\",\n    x: 0,\n    y: 61,\n    width: 23,\n    height: 12\n  }, {\n    name: \"MAIN_EQ_BUTTON_SELECTED\",\n    x: 0,\n    y: 73,\n    width: 23,\n    height: 12\n  }, {\n    name: \"MAIN_EQ_BUTTON_DEPRESSED\",\n    x: 46,\n    y: 61,\n    width: 23,\n    height: 12\n  }, {\n    name: \"MAIN_EQ_BUTTON_DEPRESSED_SELECTED\",\n    x: 46,\n    y: 73,\n    width: 23,\n    height: 12\n  }, {\n    name: \"MAIN_PLAYLIST_BUTTON\",\n    x: 23,\n    y: 61,\n    width: 23,\n    height: 12\n  }, {\n    name: \"MAIN_PLAYLIST_BUTTON_SELECTED\",\n    x: 23,\n    y: 73,\n    width: 23,\n    height: 12\n  }, {\n    name: \"MAIN_PLAYLIST_BUTTON_DEPRESSED\",\n    x: 69,\n    y: 61,\n    width: 23,\n    height: 12\n  }, {\n    name: \"MAIN_PLAYLIST_BUTTON_DEPRESSED_SELECTED\",\n    x: 69,\n    y: 73,\n    width: 23,\n    height: 12\n  }],\n  TEXT: characterSprites,\n  TITLEBAR: [{\n    name: \"MAIN_TITLE_BAR\",\n    x: 27,\n    y: 15,\n    width: 275,\n    height: 14\n  }, {\n    name: \"MAIN_TITLE_BAR_SELECTED\",\n    x: 27,\n    y: 0,\n    width: 275,\n    height: 14\n  }, {\n    name: \"MAIN_EASTER_EGG_TITLE_BAR\",\n    x: 27,\n    y: 72,\n    width: 275,\n    height: 14\n  }, {\n    name: \"MAIN_EASTER_EGG_TITLE_BAR_SELECTED\",\n    x: 27,\n    y: 57,\n    width: 275,\n    height: 14\n  }, {\n    name: \"MAIN_OPTIONS_BUTTON\",\n    x: 0,\n    y: 0,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_OPTIONS_BUTTON_DEPRESSED\",\n    x: 0,\n    y: 9,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_MINIMIZE_BUTTON\",\n    x: 9,\n    y: 0,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_MINIMIZE_BUTTON_DEPRESSED\",\n    x: 9,\n    y: 9,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_SHADE_BUTTON\",\n    x: 0,\n    y: 18,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_SHADE_BUTTON_DEPRESSED\",\n    x: 9,\n    y: 18,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_CLOSE_BUTTON\",\n    x: 18,\n    y: 0,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_CLOSE_BUTTON_DEPRESSED\",\n    x: 18,\n    y: 9,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_CLUTTER_BAR_BACKGROUND\",\n    x: 304,\n    y: 0,\n    width: 8,\n    height: 43\n  }, {\n    name: \"MAIN_CLUTTER_BAR_BACKGROUND_DISABLED\",\n    x: 312,\n    y: 0,\n    width: 8,\n    height: 43\n  }, {\n    name: \"MAIN_CLUTTER_BAR_BUTTON_O_SELECTED\",\n    x: 304,\n    y: 47,\n    width: 8,\n    height: 8\n  }, {\n    name: \"MAIN_CLUTTER_BAR_BUTTON_A_SELECTED\",\n    x: 312,\n    y: 55,\n    width: 8,\n    height: 7\n  }, {\n    name: \"MAIN_CLUTTER_BAR_BUTTON_I_SELECTED\",\n    x: 320,\n    y: 62,\n    width: 8,\n    height: 7\n  }, {\n    name: \"MAIN_CLUTTER_BAR_BUTTON_D_SELECTED\",\n    x: 328,\n    y: 69,\n    width: 8,\n    height: 8\n  }, {\n    name: \"MAIN_CLUTTER_BAR_BUTTON_V_SELECTED\",\n    x: 336,\n    y: 77,\n    width: 8,\n    height: 7\n  }, {\n    name: \"MAIN_SHADE_BACKGROUND\",\n    x: 27,\n    y: 42,\n    width: 275,\n    height: 14\n  }, {\n    name: \"MAIN_SHADE_BACKGROUND_SELECTED\",\n    x: 27,\n    y: 29,\n    width: 275,\n    height: 14\n  }, {\n    name: \"MAIN_SHADE_BUTTON_SELECTED\",\n    x: 0,\n    y: 27,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_SHADE_BUTTON_SELECTED_DEPRESSED\",\n    x: 9,\n    y: 27,\n    width: 9,\n    height: 9\n  }, {\n    name: \"MAIN_SHADE_POSITION_BACKGROUND\",\n    x: 0,\n    y: 36,\n    width: 17,\n    height: 7\n  }, {\n    name: \"MAIN_SHADE_POSITION_THUMB\",\n    x: 20,\n    y: 36,\n    width: 3,\n    height: 7\n  }, {\n    name: \"MAIN_SHADE_POSITION_THUMB_LEFT\",\n    x: 17,\n    y: 36,\n    width: 3,\n    height: 7\n  }, {\n    name: \"MAIN_SHADE_POSITION_THUMB_RIGHT\",\n    x: 23,\n    y: 36,\n    width: 3,\n    height: 7\n  }],\n  VOLUME: [{\n    name: \"MAIN_VOLUME_BACKGROUND\",\n    x: 0,\n    y: 0,\n    width: 68,\n    height: 420\n  }, {\n    name: \"MAIN_VOLUME_THUMB\",\n    x: 15,\n    y: 422,\n    width: 14,\n    height: 11\n  }, {\n    name: \"MAIN_VOLUME_THUMB_SELECTED\",\n    x: 0,\n    y: 422,\n    width: 14,\n    height: 11\n  }],\n  GEN: [{\n    name: \"GEN_TOP_LEFT_SELECTED\",\n    x: 0,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_LEFT_END_SELECTED\",\n    x: 26,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_CENTER_FILL_SELECTED\",\n    x: 52,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_RIGHT_END_SELECTED\",\n    x: 78,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_LEFT_RIGHT_FILL_SELECTED\",\n    x: 104,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_RIGHT_SELECTED\",\n    x: 130,\n    y: 0,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_LEFT\",\n    x: 0,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_LEFT_END\",\n    x: 26,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_CENTER_FILL\",\n    x: 52,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_RIGHT_END\",\n    x: 78,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_LEFT_RIGHT_FILL\",\n    x: 104,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_TOP_RIGHT\",\n    x: 130,\n    y: 21,\n    width: 25,\n    height: 20\n  }, {\n    name: \"GEN_BOTTOM_LEFT\",\n    x: 0,\n    y: 42,\n    width: 125,\n    height: 14\n  }, {\n    name: \"GEN_BOTTOM_RIGHT\",\n    x: 0,\n    y: 57,\n    width: 125,\n    height: 14\n  }, {\n    name: \"GEN_BOTTOM_FILL\",\n    x: 127,\n    y: 72,\n    width: 25,\n    height: 14\n  }, {\n    name: \"GEN_MIDDLE_LEFT\",\n    x: 127,\n    y: 42,\n    width: 11,\n    height: 29\n  }, {\n    name: \"GEN_MIDDLE_LEFT_BOTTOM\",\n    x: 158,\n    y: 42,\n    width: 11,\n    height: 24\n  }, {\n    name: \"GEN_MIDDLE_RIGHT\",\n    x: 139,\n    y: 42,\n    width: 8,\n    height: 29\n  }, {\n    name: \"GEN_MIDDLE_RIGHT_BOTTOM\",\n    x: 170,\n    y: 42,\n    width: 8,\n    height: 24\n  }, {\n    name: \"GEN_CLOSE_SELECTED\",\n    x: 148,\n    y: 42,\n    width: 9,\n    height: 9\n  }]\n  /*\n    We don't currently support the Media Library, so there are disabled\n  GENEX: [\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_LEFT_UNPRESSED\",\n      x: 0,\n      y: 0,\n      height: 15,\n      width: 4,\n    },\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_CENTER_UNPRESSED\",\n      x: 4,\n      y: 0,\n      height: 15,\n      width: 39,\n    },\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_RIGHT_UNPRESSED\",\n      x: 43,\n      y: 0,\n      height: 15,\n      width: 4,\n    },\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_PRESSED\",\n      x: 0,\n      y: 1,\n      height: 15,\n      width: 47,\n    },\n    { name: \"GENEX_SCROLL_UP_UNPRESSED\", x: 0, y: 31, height: 14, width: 14 },\n    {\n      name: \"GENEX_SCROLL_DOWN_UNPRESSED\",\n      x: 14,\n      y: 31,\n      height: 14,\n      width: 14,\n    },\n    { name: \"GENEX_SCROLL_UP_PRESSED\", x: 28, y: 31, height: 14, width: 14 },\n    { name: \"GENEX_SCROLL_DOWN_PRESSED\", x: 42, y: 31, height: 14, width: 14 },\n    { name: \"GENEX_SCROLL_LEFT_UNPRESSED\", x: 0, y: 45, height: 14, width: 14 },\n    {\n      name: \"GENEX_SCROLL_RIGHT_UNPRESSED\",\n      x: 14,\n      y: 45,\n      height: 14,\n      width: 14,\n    },\n    { name: \"GENEX_SCROLL_LEFT_PRESSED\", x: 28, y: 45, height: 14, width: 14 },\n    { name: \"GENEX_SCROLL_RIGHT_PRESSED\", x: 42, y: 45, height: 14, width: 14 },\n    {\n      name: \"GENEX_VERTICAL_SCROLL_HANDLE_UNPRESSED\",\n      x: 56,\n      y: 31,\n      height: 28,\n      width: 14,\n    },\n    {\n      name: \"GENEX_VERTICAL_SCROLL_HANDLE_PRESSED\",\n      x: 70,\n      y: 31,\n      height: 28,\n      width: 14,\n    },\n    {\n      name: \"GENEX_HORIZONTAL_SCROLL_HANDLE_UNPRESSED\",\n      x: 84,\n      y: 31,\n      height: 14,\n      width: 28,\n    },\n    {\n      name: \"GENEX_HORIZONTAL_SCROLL_HANDLE_PRESSED\",\n      x: 84,\n      y: 45,\n      height: 14,\n      width: 28,\n    },\n  ],\n  */\n};\n\n/* harmony default export */ const skinSprites = (sprites);\n;// CONCATENATED MODULE: ./js/regionParser.ts\n\nfunction pointPairs(arr) {\n  const pairedValues = [];\n  for (let i = 0; i < arr.length; i += 2) {\n    pairedValues.push(`${arr[i]},${arr[i + 1]}`);\n  }\n  return pairedValues;\n}\nfunction regionParser(regionStr) {\n  const iniData = parseIni(regionStr);\n  const data = {};\n  Object.keys(iniData).forEach(section => {\n    const {\n      numpoints,\n      pointlist\n    } = iniData[section];\n    if (!numpoints || !pointlist) {\n      return;\n    }\n    const pointCounts = numpoints.split(/\\s*,\\s*/).filter(val => val !== \"\");\n    const points = pointPairs(\n    // points can be separated by spaces, or by commas\n    pointlist.split(/\\s*[, ]\\s*/).filter(val => val !== \"\"));\n    let pointIndex = 0;\n    const polygons = pointCounts.map(numStr => {\n      const num = Number(numStr);\n      if (num < 3) {\n        // What use is a polygon with less than three sides?\n        pointIndex += num;\n        return null;\n      }\n      const polygon = points.slice(pointIndex, pointIndex + num).join(\" \");\n      if (!polygon.length) {\n        // It's possible that the skin author specified more polygons than provided points.\n        return null;\n      }\n      pointIndex += num;\n      return polygon;\n    });\n    const validPolygons = polygons.filter(polygon => polygon != null);\n    if (validPolygons.length) {\n      data[section] = validPolygons;\n    }\n  });\n  return data;\n}\n;// CONCATENATED MODULE: ./js/skinParserUtils.ts\n\nfunction skinParserUtils_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction skinParserUtils_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? skinParserUtils_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : skinParserUtils_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\nconst getFileExtension = fileName => {\n  const matches = /\\.([a-z]{3,4})$/i.exec(fileName);\n  return matches ? matches[1].toLowerCase() : null;\n};\nfunction getFilenameRegex(base, ext) {\n  return new RegExp(`^(.*/)?${base}.(${ext})$`, \"i\");\n}\nasync function getFileFromZip(zip, fileName, ext, mode) {\n  const files = zip.file(getFilenameRegex(fileName, ext));\n  if (!files.length) {\n    return null;\n  }\n\n  // Windows file system is case insensitve, but zip files are not.\n  // This means that it's possible for a zip to contain both `main.bmp` _and_\n  // `main.BMP` but in Winamp only one will be materialized onto disk when\n  // decompressing. I suspect that in this case later files in the archive\n  // overwrite earlier ones. To mimic that behavior we use the last matching\n  // file.\n  //\n  // This works because `JSZip.file` filters the files by iterating the\n  // underlying `files` object under the hood:\n  // https://github.com/Stuk/jszip/blob/25d401e104926fef8528d670ecfe53f14e77a297/lib/object.js#L182\n  // Since JavaScript objects are iterable in the order that the keys were\n  // added this _should_ mean that by taking the last file here we will get\n  // the last file that JSZip extracted.\n  const lastFile = files[files.length - 1];\n  try {\n    const contents = await lastFile.async(mode);\n    return {\n      contents,\n      name: lastFile.name\n    };\n  } catch (e) {\n    console.warn(`Failed to extract \"${fileName}.${ext}\" from the skin archive.`);\n    return null;\n  }\n}\nfunction fallbackGetImgFromBlob(blob) {\n  return imgFromUrl(URL.createObjectURL(blob));\n}\nasync function getImgFromBlob(blob) {\n  try {\n    // Use this faster native browser API if available.\n    // NOTE: In some browsers `window.createImageBitmap` may not exist so this will throw.\n    return await window.createImageBitmap(blob);\n  } catch (e) {\n    try {\n      return await fallbackGetImgFromBlob(blob);\n    } catch (ee) {\n      // Like Winamp we will silently fail on images that don't parse.\n      return null;\n    }\n  }\n}\nfunction getSpriteUrisFromImg(img, sprites) {\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n  if (context == null) {\n    throw new Error(\"Failed to get canvas context\");\n  }\n  const images = {};\n  sprites.forEach(sprite => {\n    canvas.height = sprite.height;\n    canvas.width = sprite.width;\n    context.drawImage(img, -sprite.x, -sprite.y);\n    const image = canvas.toDataURL();\n    images[sprite.name] = image;\n  });\n  return images;\n}\nasync function getImgFromFilename(zip, fileName) {\n  // Winamp only supports .bmp images, but WACUP set a precidence of supporting\n  // .png as well to reduce size. Since we care about size as well, we follow\n  // suit. Our default skin uses .png to save 14kb.\n  const file = await getFileFromZip(zip, fileName, \"(png|bmp)\", \"blob\");\n  if (!file) {\n    return null;\n  }\n  const mimeType = `image/${getFileExtension(file.name) || \"*\"}`;\n  // The spec for createImageBitmap() says the browser should try to sniff the\n  // mime type, but it looks like Firefox does not. So we specify it here\n  // explicitly.\n  const typedBlob = new Blob([file.contents], {\n    type: mimeType\n  });\n  return getImgFromBlob(typedBlob);\n}\nasync function getSpriteUrisFromFilename(zip, fileName) {\n  const img = await getImgFromFilename(zip, fileName);\n  if (img == null) {\n    return {};\n  }\n  return getSpriteUrisFromImg(img, skinSprites[fileName]);\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/xaudio2/resource-interchange-file-format--riff-\nconst RIFF_MAGIC = \"RIFF\".split(\"\").map(c => c.charCodeAt(0));\nfunction arrayStartsWith(arr, matcher) {\n  return matcher.every((item, i) => arr[i] === item);\n}\nasync function getCursorFromFilename(zip, fileName) {\n  const file = await getFileFromZip(zip, fileName, \"CUR\", \"uint8array\");\n  if (file == null) {\n    return null;\n  }\n  const contents = file.contents;\n  if (arrayStartsWith(contents, RIFF_MAGIC)) {\n    try {\n      return {\n        type: \"ani\",\n        aniData: contents\n      };\n    } catch (e) {\n      console.error(e);\n      return null;\n    }\n  }\n  return {\n    type: \"cur\",\n    url: curUrlFromByteArray(contents)\n  };\n}\nasync function getPlaylistStyle(zip) {\n  const files = zip.file(getFilenameRegex(\"PLEDIT\", \"txt\"));\n  const file = files[0];\n  if (file == null) {\n    return DEFAULT_SKIN.playlistStyle;\n  }\n  const ini = await file.async(\"text\");\n  if (ini == null) {\n    return DEFAULT_SKIN.playlistStyle;\n  }\n  const data = ini && parseIni(ini).text;\n  if (!data) {\n    // Corrupt or missing PLEDIT.txt file.\n    return DEFAULT_SKIN.playlistStyle;\n  }\n\n  // Winamp seems to permit colors that contain too many characters.\n  // For compatibility with existing skins, we normalize them here.\n  [\"normal\", \"current\", \"normalbg\", \"selectedbg\", \"mbFG\", \"mbBG\"].forEach(colorKey => {\n    let color = data[colorKey];\n    if (!color) {\n      return;\n    }\n    if (color[0] !== \"#\") {\n      color = `#${color}`;\n    }\n    data[colorKey] = color.slice(0, 7);\n  });\n  return skinParserUtils_objectSpread(skinParserUtils_objectSpread({}, DEFAULT_SKIN.playlistStyle), data);\n}\nasync function getGenExColors(zip) {\n  const img = await getImgFromFilename(zip, \"GENEX\");\n  if (img == null) {\n    return null;\n  }\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n  if (context == null) {\n    return null;\n  }\n  canvas.width = img.width;\n  canvas.height = img.height;\n  context.drawImage(img, 0, 0);\n  const getColorAt = x => `rgb(${context.getImageData(x, 0, 1, 1)\n  // Discard the alpha channel\n  .data.slice(0, 3).join(\",\")})`;\n\n  // Ideally we would just have a map from key to the x value and map over\n  // that with getColorAt, but I don't know a great way to make that type\n  // safe. So, we'll just do this for now, where we explicitly call getColorAt\n  // for each key.\n  return {\n    // (1) x=48: item background (background to edits, listviews, etc.)\n    itemBackground: getColorAt(48),\n    // (2) x=50: item foreground (text colour of edits, listviews, etc.)\n    itemForeground: getColorAt(50),\n    // (3) x=52: window background (used to set the bg color for the dialog)\n    windowBackground: getColorAt(52),\n    // (4) x=54: button text colour\n    buttonText: getColorAt(54),\n    // (5) x=56: window text colour\n    windowText: getColorAt(56),\n    // (6) x=58: colour of dividers and sunken borders\n    divider: getColorAt(58),\n    // (7) x=60: selection colour for entries inside playlists (nothing else yet)\n    playlistSelection: getColorAt(60),\n    // (8) x=62: listview header background colour\n    listHeaderBackground: getColorAt(62),\n    // (9) x=64: listview header text colour\n    listHeaderText: getColorAt(64),\n    // (10) x=66: listview header frame top and left colour\n    listHeaderFrameTopAndLeft: getColorAt(66),\n    // (11) x=68: listview header frame bottom and right colour\n    listHeaderFrameBottomAndRight: getColorAt(68),\n    // (12) x=70: listview header frame colour, when pressed\n    listHeaderFramePressed: getColorAt(70),\n    // (13) x=72: listview header dead area colour\n    listHeaderDeadArea: getColorAt(72),\n    // (14) x=74: scrollbar colour #1\n    scrollbarOne: getColorAt(74),\n    // (15) x=76: scrollbar colour #2\n    scrollbarTwo: getColorAt(76),\n    // (16) x=78: pressed scrollbar colour #1\n    pressedScrollbarOne: getColorAt(78),\n    // (17) x=80: pressed scrollbar colour #2\n    pressedScrollbarTwo: getColorAt(80),\n    // (18) x=82: scrollbar dead area colour\n    scrollbarDeadArea: getColorAt(82),\n    // (19) x=84 List view text colour highlighted\n    listTextHighlighted: getColorAt(84),\n    // (20) x=86 List view background colour highlighted\n    listTextHighlightedBackground: getColorAt(86),\n    // (21) x=88 List view text colour selected\n    listTextSelected: getColorAt(88),\n    // (22) x=90 List view background colour selected\n    listTextSelectedBackground: getColorAt(90)\n  };\n}\n;// CONCATENATED MODULE: ./js/skinParser.js\n\nfunction skinParser_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction skinParser_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? skinParser_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : skinParser_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n\nconst shallowMerge = objs => objs.reduce((prev, img) => Object.assign(prev, img), {});\nconst CURSORS = [\"CLOSE\", \"EQCLOSE\", \"EQNORMAL\", \"EQSLID\", \"EQTITLE\", \"MAINMENU\", \"MMENU\", \"MIN\", \"NORMAL\", \"PCLOSE\", \"PNORMAL\", \"POSBAR\", \"PSIZE\", \"PTBAR\", \"PVSCROLL\", \"PWINBUT\", \"PWSNORM\", \"PWSSIZE\", \"SONGNAME\", \"TITLEBAR\", \"VOLBAL\", \"WINBUT\", \"WSNORMAL\", \"WSPOSBAR\"\n/*\n * > There are usually 4 more cursors in the skins: volbar.cur, wsclose.cur,\n * > wswinbut.cur, wsmin.cur, but they are never used, at least in the last\n * > versions of winamp, so there's no need of including them. The cursors\n * > shown when the mouse is over the app-buttons are the same in normal and\n * > winshade mode, except for the main menu button. You can make animated\n * > cursors, but you have to name them with the extension .cur (animated\n * > cursors are usually .ani files).\n *\n * -- Skinners Atlas\n *\n * \"VOLBAR\",\n * \"WSCLOSE\",\n * \"WSWINBUT\",\n * \"WSMIN\",\n *\n */];\n\nasync function genVizColors(zip) {\n  const viscolor = await getFileFromZip(zip, \"VISCOLOR\", \"txt\", \"text\");\n  return viscolor ? parseViscolors(viscolor.contents) : DEFAULT_SKIN.colors;\n}\nasync function genImages(zip) {\n  const imageObjs = await Promise.all(Object.keys(skinSprites).map(fileName => getSpriteUrisFromFilename(zip, fileName)));\n  // Merge all the objects into a single object. Tests assert that sprite keys are unique.\n  return shallowMerge(imageObjs);\n}\nasync function genCursors(zip) {\n  const cursorObjs = await Promise.all(CURSORS.map(async cursorName => ({\n    [cursorName]: await getCursorFromFilename(zip, cursorName)\n  })));\n  return shallowMerge(cursorObjs);\n}\nasync function genRegion(zip) {\n  const region = await getFileFromZip(zip, \"REGION\", \"txt\", \"text\");\n  return region ? regionParser(region.contents) : {};\n}\nasync function genGenTextSprites(zip) {\n  const img = await getImgFromFilename(zip, \"GEN\");\n  if (img == null) {\n    return null;\n  }\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n  canvas.width = img.width;\n  canvas.height = img.height;\n  context.drawImage(img, 0, 0);\n  const getLetters = (y, prefix) => {\n    const getColorAt = x => context.getImageData(x, y, 1, 1).data.join(\",\");\n    let x = 1;\n    const backgroundColor = getColorAt(0);\n    const height = 7;\n    return LETTERS.map(letter => {\n      let nextBackground = x;\n      while (getColorAt(nextBackground) !== backgroundColor && nextBackground < canvas.width) {\n        nextBackground++;\n      }\n      const width = nextBackground - x;\n      const name = `${prefix}_${letter}`;\n      const sprite = {\n        x,\n        y,\n        height,\n        width,\n        name\n      };\n      x = nextBackground + 1;\n      return sprite;\n    });\n  };\n  const letterWidths = {};\n  const sprites = [...getLetters(88, \"GEN_TEXT_SELECTED\"), ...getLetters(96, \"GEN_TEXT\")];\n  sprites.forEach(sprite => {\n    letterWidths[sprite.name] = sprite.width;\n  });\n  return [letterWidths, getSpriteUrisFromImg(img, sprites)];\n}\n\n// A promise that, given an array buffer returns a skin style object\nasync function skinParser(zipFileBuffer, JSZip) {\n  const zip = await JSZip.loadAsync(zipFileBuffer);\n  const [colors, playlistStyle, images, cursors, region, genTextSprites, genExColors] = await Promise.all([genVizColors(zip), getPlaylistStyle(zip), genImages(zip), genCursors(zip), genRegion(zip), genGenTextSprites(zip), getGenExColors(zip)]);\n  const [genLetterWidths, genTextImages] = genTextSprites || [null, {}];\n  return {\n    colors,\n    playlistStyle,\n    images: skinParser_objectSpread(skinParser_objectSpread({}, images), genTextImages),\n    genLetterWidths,\n    cursors,\n    region,\n    genExColors\n  };\n}\n/* harmony default export */ const js_skinParser = (skinParser);\n// EXTERNAL MODULE: ../../node_modules/tinyqueue/index.js\nvar tinyqueue = __webpack_require__(1195);\nvar tinyqueue_default = /*#__PURE__*/__webpack_require__.n(tinyqueue);\n;// CONCATENATED MODULE: ./js/loadQueue.js\n\n\n\n// Push promises onto a queue with a priority.\n// Run a given number of jobs in parallel\n// Useful for prioritizing network requests\nclass LoadQueue {\n  constructor({\n    threads\n  }) {\n    // TODO: Consider not running items with zero priority\n    // Priority is a function so that items can change their priority between\n    // when their priority is evaluated.\n    // For example, we might add a track to the playlist and then scroll to/away\n    // from it before it gets processed.\n    this._queue = new (tinyqueue_default())([], (a, b) => a.priority() - b.priority());\n    this._availableThreads = threads;\n  }\n  push(task, priority) {\n    const t = {\n      task,\n      priority\n    };\n    this._queue.push(t);\n    // Wait until the next event loop to pick a task to run. This way, we can\n    // enqueue multiple items in an event loop, and be sure they will be run in\n    // priority order.\n    setTimeout(() => {\n      this._run();\n    }, 0);\n    return () => {\n      // TODO: Could return a boolean representing if the task has already been\n      // kicked off.\n      this._queue = this._queue.filter(t1 => t1 !== t);\n    };\n  }\n  _run() {\n    while (this._availableThreads > 0) {\n      if (this._queue.length === 0) {\n        return;\n      }\n      this._availableThreads--;\n      const t = this._queue.pop();\n      const promise = t.task();\n      browser_default()(typeof promise.then === \"function\", `LoadQueue only supports loading Promises. Got ${promise}`);\n      promise.then(() => {\n        this._availableThreads++;\n        this._run();\n      });\n    }\n  }\n}\n;// CONCATENATED MODULE: ./js/actionCreators/playlist.ts\n\n\n\n\nfunction cropPlaylist() {\n  return (dispatch, getState) => {\n    const state = getState();\n    if (getSelectedTrackObjects(state).length === 0) {\n      return;\n    }\n    const selectedTrackIds = getSelectedTrackIds(state);\n    const {\n      playlist: {\n        trackOrder\n      }\n    } = state;\n    dispatch({\n      type: REMOVE_TRACKS,\n      // @ts-ignore The keys are numbers, but TypeScript does not trust us.\n      // https://github.com/Microsoft/TypeScript/pull/12253#issuecomment-263132208\n      ids: trackOrder.filter(id => !selectedTrackIds.has(id))\n    });\n  };\n}\nfunction removeSelectedTracks() {\n  return (dispatch, getState) => {\n    dispatch({\n      type: REMOVE_TRACKS,\n      // @ts-ignore The keys are numbers, but TypeScript does not trust us.\n      // https://github.com/Microsoft/TypeScript/pull/12253#issuecomment-263132208\n      ids: Array.from(getSelectedTrackIds(getState()))\n    });\n  };\n}\nfunction playlist_removeAllTracks() {\n  return dispatch => {\n    // It's a bit funky that we need to do both of these.\n    dispatch({\n      type: STOP\n    });\n    dispatch({\n      type: REMOVE_ALL_TRACKS\n    });\n  };\n}\nfunction playlist_reverseList() {\n  return {\n    type: REVERSE_LIST\n  };\n}\nfunction playlist_randomizeList() {\n  return {\n    type: RANDOMIZE_LIST\n  };\n}\nfunction playlist_sortListByTitle() {\n  return (dispatch, getState) => {\n    const state = getState();\n    const tracks = getTracks(state);\n    const trackOrder = sort(getTrackOrder(state), i => `${tracks[i].title}`.toLowerCase());\n    return dispatch({\n      type: SET_TRACK_ORDER,\n      trackOrder\n    });\n  };\n}\nfunction playlist_setPlaylistScrollPosition(position) {\n  return {\n    type: SET_PLAYLIST_SCROLL_POSITION,\n    position\n  };\n}\nfunction scrollNTracks(n) {\n  return (dispatch, getState) => {\n    const state = getState();\n    const overflow = getOverflowTrackCount(state);\n    const currentOffset = getScrollOffset(state);\n    const position = overflow ? clamp((currentOffset + n) / overflow, 0, 1) : 0;\n    return dispatch({\n      type: SET_PLAYLIST_SCROLL_POSITION,\n      position: position * 100\n    });\n  };\n}\nfunction playlist_scrollPlaylistByDelta(e) {\n  e.preventDefault();\n  return (dispatch, getState) => {\n    const state = getState();\n    if (getOverflowTrackCount(state)) {\n      e.stopPropagation();\n    }\n    const totalPixelHeight = state.playlist.trackOrder.length * TRACK_HEIGHT;\n    const percentDelta = e.deltaY / totalPixelHeight * 100;\n    dispatch({\n      type: SET_PLAYLIST_SCROLL_POSITION,\n      position: clamp(state.display.playlistScrollPosition + percentDelta, 0, 100)\n    });\n  };\n}\nfunction playlist_scrollUpFourTracks() {\n  return scrollNTracks(-4);\n}\nfunction playlist_scrollDownFourTracks() {\n  return scrollNTracks(4);\n}\nfunction playlist_dragSelected(offset) {\n  return (dispatch, getState) => {\n    const state = getState();\n    const tracks = getTracks(state);\n    const trackOrder = getTrackOrder(state);\n    const selectedIds = getSelectedTrackIds(state);\n    const firstSelected = trackOrder.findIndex(trackId => tracks[trackId] && selectedIds.has(trackId));\n    if (firstSelected === -1) {\n      return;\n    }\n    const lastSelected = findLastIndex(trackOrder, trackId => tracks[trackId] && selectedIds.has(trackId));\n    if (lastSelected === -1) {\n      throw new Error(\"We found a first selected, but not a last selected.\");\n    }\n    // Ensure we don't try to drag off either end.\n    const min = -firstSelected;\n    const max = trackOrder.length - 1 - lastSelected;\n    const normalizedOffset = clamp(offset, min, max);\n    if (normalizedOffset !== 0) {\n      dispatch({\n        type: DRAG_SELECTED,\n        offset: normalizedOffset\n      });\n    }\n  };\n}\nfunction invertSelection() {\n  return {\n    type: INVERT_SELECTION\n  };\n}\nfunction playlist_selectZero() {\n  return {\n    type: SELECT_ZERO\n  };\n}\nfunction selectAll() {\n  return {\n    type: SELECT_ALL\n  };\n}\n;// CONCATENATED MODULE: ./js/actionCreators/files.ts\n\n\n\n\n\n\n\n\n\n\nconst {\n  ipcRenderer\n} = window.require('electron');\n\n// Lower is better\nconst DURATION_VISIBLE_PRIORITY = 5;\nconst META_DATA_VISIBLE_PRIORITY = 10;\nconst DURATION_PRIORITY = 15;\nconst META_DATA_PRIORITY = 20;\nconst loadQueue = new LoadQueue({\n  threads: 4\n});\nfunction addTracksFromReferences(fileReferences, loadStyle, atIndex) {\n  const tracks = Array.from(fileReferences).map(file => ({\n    blob: file,\n    defaultName: file.name\n  }));\n  return files_loadMediaFiles(tracks, loadStyle, atIndex);\n}\nconst SKIN_FILENAME_MATCHER = new RegExp(\"(wsz|zip)$\", \"i\");\nconst EQF_FILENAME_MATCHER = new RegExp(\"eqf$\", \"i\");\nfunction loadFilesFromReferences(fileReferences, loadStyle = LOAD_STYLE.PLAY, atIndex = undefined) {\n  return dispatch => {\n    if (fileReferences.length < 1) {\n      return;\n    } else if (fileReferences.length === 1) {\n      const fileReference = fileReferences[0];\n      if (SKIN_FILENAME_MATCHER.test(fileReference.name)) {\n        dispatch(setSkinFromBlob(fileReference));\n        return;\n      } else if (EQF_FILENAME_MATCHER.test(fileReference.name)) {\n        dispatch(setEqFromFileReference(fileReference));\n        return;\n      }\n    }\n    dispatch(addTracksFromReferences(fileReferences, loadStyle, atIndex));\n  };\n}\nfunction setSkinFromBlob(blob) {\n  return async (dispatch, getState, {\n    requireJSZip\n  }) => {\n    if (!requireJSZip) {\n      alert(\"Yaamp has not been configured to support custom skins.\");\n      return;\n    }\n    dispatch({\n      type: LOADING\n    });\n    let JSZip;\n    try {\n      JSZip = await requireJSZip();\n    } catch (e) {\n      console.error(e);\n      dispatch({\n        type: LOADED\n      });\n      alert(\"Failed to load the skin parser.\");\n      return;\n    }\n    try {\n      const skinData = await js_skinParser(blob, JSZip);\n      ipcRenderer.invoke(\"setSkin\", {\n        link: JSON.stringify(skinData)\n      }).then(() => {});\n      dispatch({\n        type: SET_SKIN_DATA,\n        data: {\n          skinImages: skinData.images,\n          skinColors: skinData.colors,\n          skinPlaylistStyle: skinData.playlistStyle,\n          skinCursors: skinData.cursors,\n          skinRegion: skinData.region,\n          skinGenLetterWidths: skinData.genLetterWidths,\n          skinGenExColors: skinData.genExColors\n        }\n      });\n    } catch (e) {\n      console.error(e);\n      dispatch({\n        type: LOADED\n      });\n      alert(`Failed to parse skin`);\n    }\n  };\n}\nfunction setSkinFromClient(data) {\n  return async (dispatch, getState, {\n    requireJSZip\n  }) => {\n    if (!requireJSZip) {\n      alert(\"Yaamp has not been configured to support custom skins.\");\n      return;\n    }\n    dispatch({\n      type: LOADING\n    });\n    let JSZip;\n    try {\n      JSZip = await requireJSZip();\n    } catch (e) {\n      console.error(e);\n      dispatch({\n        type: LOADED\n      });\n      alert(\"Failed to load the skin parser.\");\n      return;\n    }\n    try {\n      const skinData = JSON.parse(data);\n      dispatch({\n        type: SET_SKIN_DATA,\n        data: {\n          skinImages: skinData.images,\n          skinColors: skinData.colors,\n          skinPlaylistStyle: skinData.playlistStyle,\n          skinCursors: skinData.cursors,\n          skinRegion: skinData.region,\n          skinGenLetterWidths: skinData.genLetterWidths,\n          skinGenExColors: skinData.genExColors\n        }\n      });\n    } catch (e) {\n      console.error(e);\n      dispatch({\n        type: LOADED\n      });\n      alert(`Failed to parse skin`);\n      ipcRenderer.invoke(\"deleteSkin\").then(() => {});\n    }\n  };\n}\nfunction setSkinFromUrl(url) {\n  return async dispatch => {\n    dispatch({\n      type: LOADING\n    });\n    try {\n      const response = await fetch(url);\n      if (!response.ok) {\n        throw new Error(response.statusText);\n      }\n      dispatch(setSkinFromBlob(response.blob()));\n    } catch (e) {\n      console.error(e);\n      dispatch({\n        type: LOADED\n      });\n      alert(`Failed to download skin from ${url}`);\n    }\n  };\n}\n\n// This function is private, since Winamp consumers can provide means for\n// opening files via other methods. Only use the file type specific\n// versions below, since they can defer to the user-defined behavior.\nfunction _openFileDialog(accept, expectedType) {\n  return async dispatch => {\n    var _fileReferences$;\n    const fileReferences = await promptForFileReferences({\n      accept\n    });\n    dispatch({\n      type: \"OPENED_FILES\",\n      expectedType,\n      count: fileReferences.length,\n      firstFileName: (_fileReferences$ = fileReferences[0]) === null || _fileReferences$ === void 0 ? void 0 : _fileReferences$.name\n    });\n    dispatch(loadFilesFromReferences(fileReferences));\n  };\n}\nfunction files_openEqfFileDialog() {\n  return _openFileDialog(\".eqf\", \"EQ\");\n}\nfunction files_openMediaFileDialog() {\n  return _openFileDialog(\".mp3\", \"MEDIA\");\n}\nfunction files_openSkinFileDialog() {\n  return _openFileDialog(\".zip, .wsz\", \"SKIN\");\n}\nfunction fetchMediaDuration(url, id) {\n  return (dispatch, getState) => {\n    loadQueue.push(async () => {\n      try {\n        const duration = await genMediaDuration(url);\n        dispatch({\n          type: SET_MEDIA_DURATION,\n          duration,\n          id\n        });\n      } catch (e) {\n        // TODO: Should we update the state to indicate that we don't know the length?\n      }\n    }, () => {\n      const trackIsVisible = getTrackIsVisibleFunction(getState());\n      return trackIsVisible(id) ? DURATION_VISIBLE_PRIORITY : DURATION_PRIORITY;\n    });\n  };\n}\nfunction files_loadMedia(e, loadStyle = LOAD_STYLE.NONE, atIndex = 0) {\n  const {\n    files\n  } = e.dataTransfer;\n  return async (dispatch, getState, {\n    handleTrackDropEvent\n  }) => {\n    if (handleTrackDropEvent) {\n      const tracks = await handleTrackDropEvent(e);\n      if (tracks != null) {\n        dispatch(files_loadMediaFiles(tracks, loadStyle, atIndex));\n        return;\n      }\n    }\n    dispatch(loadFilesFromReferences(files, loadStyle, atIndex));\n  };\n}\nfunction files_loadMediaFiles(tracks, loadStyle = LOAD_STYLE.NONE, atIndex = 0) {\n  return dispatch => {\n    if (loadStyle === LOAD_STYLE.PLAY) {\n      // I'm the worst. It just so happens that in every case that we autoPlay,\n      // we should also clear all tracks.\n      dispatch(playlist_removeAllTracks());\n    }\n    tracks.forEach((track, i) => {\n      const priority = i === 0 ? loadStyle : LOAD_STYLE.NONE;\n      dispatch(loadMediaFile(track, priority, atIndex + i));\n    });\n  };\n}\nfunction loadMediaFile(track, priority = LOAD_STYLE.NONE, atIndex = 0) {\n  return dispatch => {\n    const id = uniqueId();\n    const {\n      defaultName,\n      metaData,\n      duration\n    } = track;\n    let canonicalUrl;\n    if (\"url\" in track) {\n      canonicalUrl = track.url.toString();\n    } else if (\"blob\" in track) {\n      canonicalUrl = URL.createObjectURL(track.blob);\n    } else {\n      throw new Error(\"Expected track to have either a blob or a url\");\n    }\n    dispatch({\n      type: ADD_TRACK_FROM_URL,\n      url: canonicalUrl,\n      duration: track.duration,\n      defaultName,\n      id,\n      atIndex\n    });\n    switch (priority) {\n      case LOAD_STYLE.BUFFER:\n        dispatch({\n          type: BUFFER_TRACK,\n          id\n        });\n        break;\n      case LOAD_STYLE.PLAY:\n        dispatch({\n          type: PLAY_TRACK,\n          id\n        });\n        break;\n      case LOAD_STYLE.NONE:\n      default:\n        // If we're not going to load this right away,\n        // we should set duration on our own\n        if (duration != null) {\n          dispatch({\n            type: SET_MEDIA_DURATION,\n            duration,\n            id\n          });\n        } else {\n          dispatch(fetchMediaDuration(canonicalUrl, id));\n        }\n    }\n    if (metaData != null) {\n      const {\n        artist,\n        title,\n        album\n      } = metaData;\n      dispatch({\n        type: SET_MEDIA_TAGS,\n        artist,\n        title,\n        album,\n        // For now, we lie about these next three things.\n        // TODO: Ideally we would leave these as null and force a media data\n        // fetch when the user starts playing.\n        sampleRate: 44000,\n        bitrate: 320000,\n        numberOfChannels: 2,\n        id\n      });\n    } else if (\"blob\" in track) {\n      // Blobs can be loaded quickly\n      dispatch(fetchMediaTags(track.blob, id));\n    } else {\n      dispatch(queueFetchingMediaTags(id));\n    }\n  };\n}\nfunction queueFetchingMediaTags(id) {\n  return (dispatch, getState) => {\n    const track = getTracks(getState())[id];\n    loadQueue.push(() => dispatch(fetchMediaTags(track.url, id)), () => {\n      const trackIsVisible = getTrackIsVisibleFunction(getState());\n      return trackIsVisible(id) ? META_DATA_VISIBLE_PRIORITY : META_DATA_PRIORITY;\n    });\n  };\n}\nfunction fetchMediaTags(file, id) {\n  return async (dispatch, getState, {\n    requireMusicMetadata\n  }) => {\n    dispatch({\n      type: MEDIA_TAG_REQUEST_INITIALIZED,\n      id\n    });\n    try {\n      const metadata = await genMediaTags(file, await requireMusicMetadata());\n      // There's more data here, but we don't have a use for it yet:\n      const {\n        artist,\n        title,\n        album,\n        picture\n      } = metadata.common;\n      const {\n        numberOfChannels,\n        bitrate,\n        sampleRate\n      } = metadata.format;\n      let albumArtUrl = null;\n      if (picture && picture.length >= 1) {\n        const byteArray = new Uint8Array(picture[0].data);\n        const blob = new Blob([byteArray], {\n          type: picture[0].format\n        });\n        albumArtUrl = URL.createObjectURL(blob);\n      }\n      dispatch({\n        type: SET_MEDIA_TAGS,\n        artist: artist ? artist : \"\",\n        title: title ? title : \"\",\n        album,\n        albumArtUrl,\n        numberOfChannels,\n        bitrate,\n        sampleRate,\n        id\n      });\n    } catch (e) {\n      dispatch({\n        type: MEDIA_TAG_REQUEST_FAILED,\n        id\n      });\n    }\n  };\n}\nfunction setEqFromFileReference(fileReference) {\n  return async dispatch => {\n    const arrayBuffer = await genArrayBufferFromFileReference(fileReference);\n    const eqf = (0,winamp_eqf.parser)(arrayBuffer);\n    const preset = eqf.presets[0];\n    dispatch(files_setEqFromObject(preset));\n  };\n}\nfunction setEqFromClient(data) {\n  return async dispatch => {\n    const eqf = JSON.parse(data);\n    const preset = eqf.presets[0];\n    dispatch(files_setEqFromObject(preset));\n  };\n}\nfunction files_setEqFromObject(preset) {\n  return dispatch => {\n    dispatch(setPreamp(normalizeEqBand(preset.preamp)));\n    BANDS.forEach(band => {\n      // @ts-ignore band and EqfPreset align\n      dispatch(setEqBand(band, normalizeEqBand(preset[`hz${band}`])));\n    });\n  };\n}\nfunction files_downloadPreset() {\n  return (dispatch, getState) => {\n    const state = getState();\n    const data = getEqfData(state);\n    console.log(data);\n    const arrayBuffer = (0,winamp_eqf.creator)(data);\n    // const base64 = Utils.base64FromArrayBuffer(arrayBuffer);\n    // const dataURI = `data:application/zip;base64,${base64}`;\n    ipcRenderer.invoke(\"setEQ\", {\n      link: JSON.stringify(data)\n    }).then(() => {});\n\n    // Utils.downloadURI(dataURI, \"entry.eqf\");\n  };\n}\n\nfunction files_downloadHtmlPlaylist() {\n  return (dispatch, getState) => {\n    const uri = getPlaylistURL(getState());\n    downloadURI(uri, \"Winamp Playlist.html\");\n  };\n}\nlet el = document.createElement(\"input\");\nel.type = \"file\";\n// @ts-ingore\nconst DIR_SUPPORT =\n// @ts-ignore\ntypeof el.webkitdirectory !== \"undefined\" ||\n// @ts-ignore\ntypeof el.mozdirectory !== \"undefined\" ||\n// @ts-ignore\ntypeof el.directory !== \"undefined\";\n// Release our reference\nel = null;\nfunction files_addFilesAtIndex(nextIndex) {\n  return async dispatch => {\n    const fileReferences = await promptForFileReferences();\n    dispatch(addTracksFromReferences(fileReferences, LOAD_STYLE.NONE, nextIndex));\n  };\n}\nfunction files_addDirAtIndex(nextIndex) {\n  return async dispatch => {\n    if (!DIR_SUPPORT) {\n      alert(\"Not supported in your browser\");\n      return;\n    }\n    const fileReferences = await promptForFileReferences({\n      directory: true\n    });\n    dispatch(addTracksFromReferences(fileReferences, LOAD_STYLE.NONE, nextIndex));\n  };\n}\nfunction files_addFilesFromUrl(atIndex = 0) {\n  return async (dispatch, getState, {\n    handleAddUrlEvent\n  }) => {\n    if (handleAddUrlEvent) {\n      const tracks = await handleAddUrlEvent();\n      if (tracks != null) {\n        dispatch(files_loadMediaFiles(tracks, LOAD_STYLE.NONE, atIndex));\n        return;\n      }\n    } else {\n      alert(\"Not supported in Yaamp\");\n    }\n  };\n}\nfunction files_addFilesFromList() {\n  return async (dispatch, getState, {\n    handleLoadListEvent\n  }) => {\n    if (handleLoadListEvent) {\n      const tracks = await handleLoadListEvent();\n      if (tracks != null) {\n        dispatch(playlist_removeAllTracks());\n        dispatch(files_loadMediaFiles(tracks, LOAD_STYLE.NONE, 0));\n        return;\n      }\n    } else {\n      alert(\"Not supported in Yaamp\");\n    }\n  };\n}\nfunction files_saveFilesToList() {\n  return (dispatch, getState, {\n    handleSaveListEvent\n  }) => {\n    if (handleSaveListEvent) {\n      handleSaveListEvent(getUserTracks(getState()));\n    } else {\n      alert(\"Not supported in Yaamp\");\n    }\n  };\n}\nfunction files_droppedFiles(e, windowId) {\n  return dispatch => {\n    var _e$dataTransfer$files;\n    return dispatch({\n      type: \"DROPPED_FILES\",\n      count: e.dataTransfer.files.length,\n      firstFileName: (_e$dataTransfer$files = e.dataTransfer.files[0]) === null || _e$dataTransfer$files === void 0 ? void 0 : _e$dataTransfer$files.name,\n      windowId\n    });\n  };\n}\n;// CONCATENATED MODULE: ./js/actionCreators/milkdrop.ts\n\n\n\n// @ts-ignore\n\nfunction normalizePresetTypes(preset) {\n  const {\n    name\n  } = preset;\n  if (\"butterchurnPresetObject\" in preset) {\n    return {\n      type: \"RESOLVED\",\n      name,\n      preset: preset.butterchurnPresetObject\n    };\n  } else if (\"getButterchrunPresetObject\" in preset) {\n    return {\n      type: \"UNRESOLVED\",\n      name,\n      getPreset: preset.getButterchrunPresetObject\n    };\n  } else if (\"butterchurnPresetUrl\" in preset) {\n    return {\n      type: \"UNRESOLVED\",\n      name,\n      getPreset: async () => {\n        const resp = await fetch(preset.butterchurnPresetUrl);\n        return resp.json();\n      }\n    };\n  }\n  throw new Error(\"Invalid preset object\");\n}\nfunction initializePresets(presetOptions) {\n  return async dispatch => {\n    const {\n      getPresets,\n      importButterchurn\n    } = presetOptions;\n    importButterchurn().then(butterchurn => {\n      dispatch({\n        type: GOT_BUTTERCHURN,\n        butterchurn: butterchurn.default\n      });\n    });\n    const presets = await getPresets();\n    const normalizePresets = presets.map(normalizePresetTypes);\n    dispatch(loadPresets(normalizePresets));\n  };\n}\nfunction loadPresets(presets) {\n  return (dispatch, getState) => {\n    const state = getState();\n    const presetsLength = state.milkdrop.presets.length;\n    dispatch({\n      type: GOT_BUTTERCHURN_PRESETS,\n      presets\n    });\n    if (presetsLength === 0 && getRandomizePresets(state)) {\n      dispatch(selectRandomPreset());\n    } else {\n      dispatch(milkdrop_requestPresetAtIndex(presetsLength, TransitionType.IMMEDIATE, true));\n    }\n  };\n}\nfunction milkdrop_appendPresetFileList(fileList) {\n  return async (dispatch, getState, {\n    convertPreset\n  }) => {\n    const presets = butterchurnPresets_min_default().getPresets();\n    dispatch(loadPresets(presets));\n  };\n}\nfunction milkdrop_selectNextPreset(transitionType = TransitionType.DEFAULT) {\n  return (dispatch, getState) => {\n    const state = getState();\n    if (getRandomizePresets(state)) {\n      return dispatch(selectRandomPreset(transitionType));\n    }\n    const currentPresetIndex = getCurrentPresetIndex(state);\n    if (currentPresetIndex == null) {\n      return;\n    }\n    const nextPresetIndex = currentPresetIndex + 1;\n    dispatch(milkdrop_requestPresetAtIndex(nextPresetIndex, transitionType, true));\n  };\n}\nfunction milkdrop_selectPreset(presetKey, transitionType = TransitionType.DEFAULT) {\n  return (dispatch, getState) => {\n    dispatch({\n      type: SELECT_PRESET_AT_INDEX,\n      index: presetKey,\n      transitionType\n    });\n    const state = getState();\n    const currentPresetIndex = getCurrentPresetIndex(state);\n    console.log(currentPresetIndex);\n  };\n}\nfunction milkdrop_selectPreviousPreset(transitionType = TransitionType.DEFAULT) {\n  return (dispatch, getState) => {\n    const state = getState();\n    const {\n      presetHistory\n    } = state.milkdrop;\n    if (presetHistory.length < 1) {\n      return;\n    }\n    // Awkward. We do -2 becuase the the last track is the current track.\n    const lastPresetIndex = presetHistory[presetHistory.length - 2];\n    dispatch(milkdrop_requestPresetAtIndex(lastPresetIndex, transitionType, false));\n  };\n}\nfunction selectRandomPreset(transitionType = TransitionType.DEFAULT) {\n  return (dispatch, getState) => {\n    const state = getState();\n    // TODO: Make this a selector.\n    const randomIndex = Math.floor(Math.random() * state.milkdrop.presets.length);\n    dispatch(milkdrop_requestPresetAtIndex(randomIndex, transitionType, true));\n  };\n}\n\n// TODO: Technically there's a race here. If you request two presets in a row, the\n// first one may resolve before the second.\nfunction milkdrop_requestPresetAtIndex(index, transitionType, addToHistory) {\n  return async (dispatch, getState) => {\n    const state = getState();\n    const preset = state.milkdrop.presets[index];\n    if (preset == null) {\n      // Index might be out of range.\n      return;\n    }\n    dispatch({\n      type: PRESET_REQUESTED,\n      index,\n      addToHistory\n    });\n    switch (preset.type) {\n      case \"RESOLVED\":\n        dispatch({\n          type: SELECT_PRESET_AT_INDEX,\n          index,\n          transitionType\n        });\n        return;\n      case \"UNRESOLVED\":\n        const json = await preset.getPreset();\n        // TODO: Ensure that this works correctly even if requests resolve out of order\n        dispatch({\n          type: RESOLVE_PRESET_AT_INDEX,\n          index,\n          json\n        });\n        dispatch({\n          type: SELECT_PRESET_AT_INDEX,\n          index,\n          transitionType\n        });\n        return;\n    }\n  };\n}\nfunction milkdrop_handlePresetDrop(e) {\n  return milkdrop_appendPresetFileList(e.dataTransfer.files);\n}\nfunction toggleRandomizePresets() {\n  return {\n    type: TOGGLE_RANDOMIZE_PRESETS\n  };\n}\nfunction togglePresetCycling() {\n  return {\n    type: TOGGLE_PRESET_CYCLING\n  };\n}\nfunction milkdrop_scheduleMilkdropMessage(message) {\n  return {\n    type: SCHEDULE_MILKDROP_MESSAGE,\n    message\n  };\n}\n;// CONCATENATED MODULE: ./js/actionCreators/index.ts\n\n\n\n\nconst {\n  ipcRenderer: actionCreators_ipcRenderer\n} = window.require('electron');\n\n\n\n\n\n\nfunction actionCreators_close() {\n  return dispatch => {\n    // TODO: This could probably be improved by adding a \"PREVENT_CLOSE\" action\n    // or something, but this works okay for now.\n    let defaultPrevented = false;\n    const cancel = () => {\n      defaultPrevented = true;\n    };\n    dispatch({\n      type: CLOSE_REQUESTED,\n      cancel\n    });\n    if (!defaultPrevented) {\n      dispatch({\n        type: STOP\n      });\n      dispatch({\n        type: CLOSE_WINAMP\n      });\n    }\n  };\n}\nfunction actionCreators_open() {\n  return {\n    type: OPEN_WINAMP\n  };\n}\nfunction actionCreators_toggleVisualizerStyle() {\n  return {\n    type: TOGGLE_VISUALIZER_STYLE\n  };\n}\nfunction actionCreators_minimize() {\n  return {\n    type: MINIMIZE_WINAMP\n  };\n}\nfunction actionCreators_setFocus(input) {\n  return {\n    type: SET_FOCUS,\n    input\n  };\n}\nfunction actionCreators_unsetFocus() {\n  return {\n    type: UNSET_FOCUS\n  };\n}\nfunction actionCreators_focusBand(band) {\n  return {\n    type: SET_BAND_FOCUS,\n    input: \"eq\",\n    bandFocused: band\n  };\n}\nfunction loadSerializedState(\n// In the future this type should be the union of all versioned types.\nserializedState) {\n  return dispatch => {\n    dispatch({\n      type: LOAD_SERIALIZED_STATE,\n      serializedState\n    });\n    dispatch(ensureWindowsAreOnScreen());\n  };\n}\nfunction actionCreators_loadDefaultSkin() {\n  return {\n    type: LOAD_DEFAULT_SKIN\n  };\n}\nfunction toggleMilkdropDesktop() {\n  return (dispatch, getState) => {\n    if (getMilkdropDesktopEnabled(getState())) {\n      dispatch(showWindow(WINDOWS.MILKDROP));\n      dispatch({\n        type: SET_MILKDROP_DESKTOP,\n        enabled: false\n      });\n    } else {\n      dispatch(hideWindow(WINDOWS.MILKDROP));\n      dispatch({\n        type: SET_MILKDROP_DESKTOP,\n        enabled: true\n      });\n    }\n  };\n}\nfunction setMilkdropFullscreen(enabled) {\n  return (dispatch, getState) => {\n    dispatch({\n      type: SET_MILKDROP_FULLSCREEN,\n      enabled\n    });\n    actionCreators_ipcRenderer.invoke('toggle-milkdrop-fullscreen', enabled);\n  };\n}\nfunction toggleMilkdropFullscreen() {\n  return (dispatch, getState) => {\n    const currentState = getMilkdropFullscreenEnabled(getState());\n    dispatch(setMilkdropFullscreen(!currentState));\n  };\n}\nfunction setMilkdropLock(enabled) {\n  return (dispatch, getState) => {\n    dispatch({\n      type: SET_MILKDROP_LOCK,\n      enabled\n    });\n  };\n}\nfunction toggleMilkdropLock() {\n  return (dispatch, getState) => {\n    const currentState = getMilkdropLockEnabled(getState());\n    dispatch(setMilkdropLock(!currentState));\n  };\n}\nfunction actionCreators_togglePresetOverlay() {\n  return (dispatch, getState) => {\n    if (getPresetOverlayOpen(getState())) {\n      dispatch(windows_setFocusedWindow(WINDOWS.MILKDROP));\n    }\n    dispatch({\n      type: TOGGLE_PRESET_OVERLAY\n    });\n  };\n}\nfunction actionCreators_stepMarquee() {\n  return {\n    type: STEP_MARQUEE\n  };\n}\n;// CONCATENATED MODULE: ./js/mediaMiddleware.ts\n\n\n\n\n/* harmony default export */ const mediaMiddleware = (media => store => {\n  const {\n    media: {\n      volume,\n      balance\n    },\n    equalizer: {\n      sliders\n    }\n  } = store.getState();\n\n  // Ensure the default state is the canonical value.\n  media.setVolume(volume);\n  media.setBalance(balance);\n  media.setPreamp(sliders.preamp);\n  // TODO: Ensure other values like bands are in sync\n\n  media.on(\"timeupdate\", () => {\n    store.dispatch({\n      type: UPDATE_TIME_ELAPSED,\n      elapsed: media.timeElapsed()\n    });\n  });\n  media.on(\"ended\", () => {\n    store.dispatch(media_next());\n  });\n  media.on(\"playing\", () => {\n    store.dispatch({\n      type: IS_PLAYING\n    });\n  });\n  media.on(\"waiting\", () => {\n    store.dispatch({\n      type: START_WORKING\n    });\n  });\n  media.on(\"stopWaiting\", () => {\n    store.dispatch({\n      type: STOP_WORKING\n    });\n  });\n  media.on(\"fileLoaded\", () => {\n    const id = getCurrentTrackId(store.getState());\n    if (id == null) {\n      // Attempted to set the metadata for a track that was already removed.\n      // Really, the media should have been stopped when the track was removed.\n      return;\n    }\n    store.dispatch({\n      id,\n      type: SET_MEDIA,\n      kbps: \"320\",\n      khz: \"44\",\n      channels: 2,\n      length: media.duration()\n    });\n  });\n  return next => action => {\n    const returnValue = next(action);\n    const state = store.getState();\n    switch (action.type) {\n      case PLAY:\n        media.play();\n        break;\n      case PAUSE:\n        media.pause();\n        break;\n      case STOP:\n        media.stop();\n        break;\n      case SET_VOLUME:\n        media.setVolume(getVolume(state));\n        break;\n      case SET_BALANCE:\n        media.setBalance(getBalance(state));\n        break;\n      case SEEK_TO_PERCENT_COMPLETE:\n        media.seekToPercentComplete(action.percent);\n        break;\n      case PLAY_TRACK:\n        {\n          const url = getTrackUrl(store.getState())(action.id);\n          if (url != null) {\n            media.loadFromUrl(url, true);\n          }\n          break;\n        }\n      case BUFFER_TRACK:\n        {\n          const url = getTrackUrl(store.getState())(action.id);\n          if (url != null) {\n            media.loadFromUrl(url, false);\n          }\n          break;\n        }\n      case SET_BAND_VALUE:\n        if (action.band === \"preamp\") {\n          media.setPreamp(action.value);\n        } else {\n          media.setEqBand(action.band, action.value);\n        }\n        break;\n      case SET_EQ_OFF:\n        media.disableEq();\n        break;\n      case SET_EQ_ON:\n        media.enableEq();\n        break;\n      case LOAD_SERIALIZED_STATE:\n        {\n          // Set ALL THE THINGS!\n          if (getEqualizerEnabled(state)) {\n            media.enableEq();\n          } else {\n            media.disableEq();\n          }\n          media.setVolume(getVolume(state));\n          media.setBalance(getBalance(state));\n          objectForEach(state.equalizer.sliders, (value, slider) => {\n            if (slider === \"preamp\") {\n              media.setPreamp(value);\n            } else {\n              // @ts-ignore I don't know how to teach TypeScript about objects\n              // that use Slider as keys\n              media.setEqBand(slider, value);\n            }\n          });\n          break;\n        }\n    }\n    return returnValue;\n  };\n});\n;// CONCATENATED MODULE: ./js/store.ts\n\n\n\n\n\n\n\n// TODO: Move to demo\nconst compose = (0,redux_devtools_extension/* composeWithDevTools */.Uo)({\n  actionsBlacklist: [UPDATE_TIME_ELAPSED, STEP_MARQUEE]\n});\n/* harmony default export */ function store(media, actionEmitter, customMiddlewares = [], stateOverrides, extras) {\n  let initialState;\n  if (stateOverrides) {\n    initialState = merge(reducers(undefined, {\n      type: \"@@init\"\n    }), stateOverrides);\n  }\n  const emitterMiddleware = () => next => action => {\n    actionEmitter.trigger(action.type, action);\n    return next(action);\n  };\n  const enhancer = compose((0,redux/* applyMiddleware */.md)(...[es.withExtraArgument(extras), mediaMiddleware(media), emitterMiddleware, ...customMiddlewares].filter(Boolean)));\n\n  // The Redux types are a bit confused, and don't realize that passing an\n  // undefined initialState is allowed.\n  const store = initialState ? (0,redux/* createStore */.MT)(reducers, initialState, enhancer) : (0,redux/* createStore */.MT)(reducers, enhancer);\n  return store;\n}\n;// CONCATENATED MODULE: ../../node_modules/fscreen/dist/fscreen.esm.js\nvar key = {\n    fullscreenEnabled: 0,\n    fullscreenElement: 1,\n    requestFullscreen: 2,\n    exitFullscreen: 3,\n    fullscreenchange: 4,\n    fullscreenerror: 5,\n    fullscreen: 6\n};\nvar webkit = [\n    'webkitFullscreenEnabled',\n    'webkitFullscreenElement',\n    'webkitRequestFullscreen',\n    'webkitExitFullscreen',\n    'webkitfullscreenchange',\n    'webkitfullscreenerror',\n    '-webkit-full-screen',\n];\nvar moz = [\n    'mozFullScreenEnabled',\n    'mozFullScreenElement',\n    'mozRequestFullScreen',\n    'mozCancelFullScreen',\n    'mozfullscreenchange',\n    'mozfullscreenerror',\n    '-moz-full-screen',\n];\nvar ms = [\n    'msFullscreenEnabled',\n    'msFullscreenElement',\n    'msRequestFullscreen',\n    'msExitFullscreen',\n    'MSFullscreenChange',\n    'MSFullscreenError',\n    '-ms-fullscreen',\n];\n// so it doesn't throw if no window or document\nvar fscreen_esm_document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\nvar vendor = (('fullscreenEnabled' in fscreen_esm_document && Object.keys(key)) ||\n    (webkit[0] in fscreen_esm_document && webkit) ||\n    (moz[0] in fscreen_esm_document && moz) ||\n    (ms[0] in fscreen_esm_document && ms) ||\n    []);\nvar fscreen = {\n    requestFullscreen: function (element) { return element[vendor[key.requestFullscreen]](); },\n    requestFullscreenFunction: function (element) { return element[vendor[key.requestFullscreen]]; },\n    get exitFullscreen() { return fscreen_esm_document[vendor[key.exitFullscreen]].bind(fscreen_esm_document); },\n    get fullscreenPseudoClass() { return \":\" + vendor[key.fullscreen]; },\n    addEventListener: function (type, handler, options) { return fscreen_esm_document.addEventListener(vendor[key[type]], handler, options); },\n    removeEventListener: function (type, handler, options) { return fscreen_esm_document.removeEventListener(vendor[key[type]], handler, options); },\n    get fullscreenEnabled() { return Boolean(fscreen_esm_document[vendor[key.fullscreenEnabled]]); },\n    set fullscreenEnabled(val) { },\n    get fullscreenElement() { return fscreen_esm_document[vendor[key.fullscreenElement]]; },\n    set fullscreenElement(val) { },\n    get onfullscreenchange() { return fscreen_esm_document[(\"on\" + vendor[key.fullscreenchange]).toLowerCase()]; },\n    set onfullscreenchange(handler) { return fscreen_esm_document[(\"on\" + vendor[key.fullscreenchange]).toLowerCase()] = handler; },\n    get onfullscreenerror() { return fscreen_esm_document[(\"on\" + vendor[key.fullscreenerror]).toLowerCase()]; },\n    set onfullscreenerror(handler) { return fscreen_esm_document[(\"on\" + vendor[key.fullscreenerror]).toLowerCase()] = handler; },\n};\n\n/* harmony default export */ const fscreen_esm = (fscreen);\n//# sourceMappingURL=fscreen.esm.js.map\n\n;// CONCATENATED MODULE: ./js/components/Fullscreen.tsx\n// Adapted from https://github.com/snakesilk/react-fullscreen\n\n\n\nfunction leaveFullScreen() {\n  if (fscreen_esm.fullscreenEnabled) {\n    fscreen_esm.exitFullscreen();\n  }\n}\nfunction enterFullScreen(node) {\n  if (fscreen_esm.fullscreenEnabled) {\n    fscreen_esm.requestFullscreen(node);\n  }\n}\nfunction FullScreen(props) {\n  const {\n    onChange,\n    enabled\n  } = props;\n  const ref = (0,react.useRef)(null);\n  (0,react.useEffect)(() => {\n    function detectFullScreen() {\n      if (onChange) {\n        onChange(fscreen_esm.fullscreenElement === ref.current);\n      }\n    }\n    fscreen_esm.addEventListener(\"fullscreenchange\", detectFullScreen);\n    return () => {\n      fscreen_esm.removeEventListener(\"fullscreenchange\", detectFullScreen);\n    };\n  }, [onChange]);\n\n  // This must run in response to a click event, so we'll use useLayoutEffect just in case.\n  (0,react.useLayoutEffect)(() => {\n    const isEnabled = fscreen_esm.fullscreenElement === ref.current;\n    if (isEnabled && !enabled) {\n      leaveFullScreen();\n    } else if (!isEnabled && enabled && ref.current != null) {\n      enterFullScreen(ref.current);\n    }\n  }, [enabled]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    ref: ref,\n    style: props.enabled ? {\n      height: \"100%\",\n      width: \"100%\"\n    } : undefined,\n    children: props.children\n  });\n}\n/* harmony default export */ const Fullscreen = (FullScreen);\n;// CONCATENATED MODULE: ./js/hooks.ts\n\n\n\nfunction useUnmountedRef() {\n  const unmountedRef = (0,react.useRef)(false);\n  (0,react.useEffect)(() => {\n    return () => {\n      unmountedRef.current = true;\n    };\n  }, []);\n  return unmountedRef;\n}\nfunction usePromiseValueOrNull(propValue) {\n  const [value, setValue] = (0,react.useState)(null);\n  (0,react.useEffect)(() => {\n    let disposed = false;\n    propValue.then(resolvedValue => {\n      if (disposed) {\n        return;\n      }\n      setValue(resolvedValue);\n    });\n    return () => {\n      disposed = true;\n    };\n  }, [propValue]);\n  return value;\n}\nfunction useScreenSize() {\n  const [size] = (0,react.useState)(getScreenSize());\n  // TODO: We could subscribe to screen size changes.\n  return size;\n}\nfunction useWindowSize() {\n  const [size, setSize] = (0,react.useState)(getWindowSize());\n  const handler = (0,react.useCallback)(throttle(() => {\n    setSize(getWindowSize());\n  }, 100), []);\n  (0,react.useEffect)(() => {\n    window.addEventListener(\"resize\", handler);\n    return () => {\n      window.removeEventListener(\"resize\", handler);\n    };\n  }, [handler]);\n  return size;\n}\nconst cursorPositionRef = {\n  current: {\n    pageX: 0,\n    pageY: 0\n  }\n};\nwindow.document.addEventListener(\"mousemove\", ({\n  pageX,\n  pageY\n}) => {\n  cursorPositionRef.current = {\n    pageX,\n    pageY\n  };\n});\n\n// We use a single global event listener because there is no way to get the\n// mouse position aside from an event. Ideally we could create/clean up the\n// event listener in the hook, but in the case where we want to check the cursor\n// position on mount, that we wouldn't have had time to capture an event.\nfunction useCursorPositionRef() {\n  return cursorPositionRef;\n}\n\n// CSS hover state is not respected if the cursor is already over the node when\n// it is added to the DOM. This hook allows your component to know its hover\n// state on mount without waiting for the mouse to move.\n// https://stackoverflow.com/a/13259049/1263117\nfunction useIsHovered() {\n  const cursorRef = useCursorPositionRef();\n  const [hover, setHover] = (0,react.useState)(false);\n  const [node, setNode] = (0,react.useState)(null);\n  (0,react.useLayoutEffect)(() => {\n    if (node == null) {\n      setHover(false);\n      return;\n    }\n    const domRect = node.getBoundingClientRect();\n    const {\n      pageX,\n      pageY\n    } = cursorRef.current;\n    setHover(pageX >= domRect.left && pageX <= domRect.right && pageY >= domRect.top && pageY <= domRect.bottom);\n    const enter = () => setHover(true);\n    const leave = () => setHover(false);\n    node.addEventListener(\"mouseenter\", enter);\n    node.addEventListener(\"mouseleave\", leave);\n    return () => {\n      node.removeEventListener(\"mouseenter\", enter);\n      node.removeEventListener(\"mouseleave\", leave);\n    };\n  }, [node, cursorRef]);\n  return {\n    ref: setNode,\n    hover\n  };\n}\nfunction useOnClickAway(ref, callback) {\n  (0,react.useEffect)(() => {\n    if (ref == null || callback == null) {\n      return;\n    }\n    const handleClickOut = ee => {\n      const clickOutTarget = ee.target;\n      if (!(clickOutTarget instanceof Element)) {\n        // TypeScript doesn't realize this will always be true\n        return;\n      }\n      if (ref.contains(clickOutTarget)) {\n        return;\n      }\n      // If the click is _not_ inside the menu.\n      callback();\n      window.document.removeEventListener(\"click\", handleClickOut, {\n        capture: true\n      });\n    };\n    window.document.addEventListener(\"click\", handleClickOut, {\n      capture: true\n    });\n    return () => {\n      window.document.removeEventListener(\"click\", handleClickOut, {\n        capture: true\n      });\n    };\n  }, [ref, callback]);\n}\n\n// TODO: Return useSelector directly and apply the type without wrapping\nfunction useTypedSelector(selector) {\n  return useSelector(selector);\n}\nfunction useActionCreator(actionCreator) {\n  const dispatch = useDispatch();\n  return (0,react.useCallback)((...args) => dispatch(actionCreator(...args)), [dispatch, actionCreator]);\n}\nfunction useTypedDispatch() {\n  return useDispatch();\n}\n// EXTERNAL MODULE: ../../node_modules/classnames/index.js\nvar classnames = __webpack_require__(2779);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: ./css/gen-window.css\nvar gen_window = __webpack_require__(6237);\n;// CONCATENATED MODULE: ./js/components/ResizeTarget.tsx\n\n\nconst ResizeTarget_excluded = [\"currentSize\", \"setWindowSize\", \"widthOnly\"];\nfunction ResizeTarget_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction ResizeTarget_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ResizeTarget_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ResizeTarget_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\nconst {\n  ipcRenderer: ResizeTarget_ipcRenderer\n} = window.require('electron');\nfunction ResizeTarget(props) {\n  const {\n      currentSize,\n      setWindowSize,\n      widthOnly\n    } = props,\n    passThroughProps = _objectWithoutProperties(props, ResizeTarget_excluded);\n  const [mouseDown, setMouseDown] = (0,react.useState)(false);\n  const [mouseStart, setMouseStart] = (0,react.useState)(null);\n  let currentNewSize = [0, 0];\n  (0,react.useEffect)(() => {\n    if (mouseDown === false || mouseStart == null) {\n      return;\n    }\n    const [width, height] = currentSize;\n    const handleMove = ee => {\n      const x = ee.clientX - mouseStart.x;\n      const y = ee.clientY - mouseStart.y;\n      const newWidth = Math.max(0, width + Math.round(x / WINDOW_RESIZE_SEGMENT_WIDTH));\n      const newHeight = widthOnly ? width : Math.max(0, height + Math.round(y / WINDOW_RESIZE_SEGMENT_HEIGHT));\n      const newSize = [newWidth, newHeight];\n      currentNewSize = newSize;\n      ResizeTarget_ipcRenderer.invoke(\"movingWindowStarted\").then(() => {});\n      props.setWindowSize(newSize);\n    };\n    window.addEventListener(\"mousemove\", handleMove);\n    const handleMouseUp = () => {\n      setMouseDown(false);\n      ResizeTarget_ipcRenderer.invoke('setSize', {\n        size: currentNewSize,\n        id: props.id\n      }).then(rs => {\n        ResizeTarget_ipcRenderer.invoke(\"movingWindowEnded\");\n      });\n    };\n    window.addEventListener(\"mouseup\", handleMouseUp);\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMove);\n      window.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n    // We pruposefully close over the props from when the mouse went down\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [mouseStart, mouseDown]);\n  const handleMouseDown = e => {\n    // Prevent dragging from highlighting text.\n    e.preventDefault();\n    setMouseStart({\n      x: e.clientX,\n      y: e.clientY\n    });\n    setMouseDown(true);\n  };\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", ResizeTarget_objectSpread({\n    onMouseDown: handleMouseDown\n  }, passThroughProps));\n}\n/* harmony default export */ const components_ResizeTarget = (/*#__PURE__*/(0,react.memo)(ResizeTarget));\n;// CONCATENATED MODULE: ./js/components/FocusTarget.tsx\n\n\n\n\n\nfunction FocusTarget({\n  onKeyDown,\n  windowId,\n  children\n}) {\n  const focusedWindowId = useTypedSelector(getFocusedWindow);\n  const setFocus = useActionCreator(windows_setFocusedWindow);\n  const focusHandler = (0,react.useCallback)(() => {\n    if (windowId !== focusedWindowId) {\n      setFocus(windowId);\n    }\n  }, [windowId, focusedWindowId, setFocus]);\n  const [ref, setRef] = (0,react.useState)(null);\n  (0,react.useEffect)(() => {\n    if (ref == null || onKeyDown == null) {\n      return;\n    }\n    ref.addEventListener(\"keydown\", onKeyDown);\n    return () => ref.removeEventListener(\"keydown\", onKeyDown);\n  }, [onKeyDown, windowId, focusedWindowId, ref]);\n\n  // It's possible for a child component to gain focus and then become\n  // unmounted. In that case, the browser will return focus to the `<body>`.\n  // In the following hook, use a `MutationObserver` to watch for that behavior\n  // and refocus the containing FocusTarget when it happens.\n  //\n  // I tried a number of other approaches using `focus/blur/focusin/focusout` on\n  // various DOM nodes, and was unable to find a solution which would trigger in\n  // this senario in Firefox. Therefore we use this `MutationObserver` approach.\n  (0,react.useEffect)(() => {\n    // Only create the `MutationObserver` within the currently focused target.\n    if (ref == null || windowId !== focusedWindowId) {\n      return;\n    }\n    const observer = new MutationObserver(mutations => {\n      // In the common case we won't have focused the body, so we can do this\n      // inexpensive check first to avoid calling the more expensive `O(n)`\n      // check of the individual mutations.\n      if (document.activeElement !== document.body) {\n        return;\n      }\n      if (mutations.some(mutation => mutation.removedNodes.length > 0)) {\n        ref.focus();\n      }\n    });\n    observer.observe(ref, {\n      subtree: true,\n      attributes: false,\n      childList: true\n    });\n    return () => observer.disconnect();\n  }, [windowId, focusedWindowId, ref]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    ref: setRef,\n    onMouseDown: focusHandler,\n    onFocus: focusHandler,\n    tabIndex: -1,\n    style: {\n      height: \"100%\",\n      width: \"100%\"\n    },\n    children: children\n  });\n}\n/* harmony default export */ const components_FocusTarget = (FocusTarget);\n;// CONCATENATED MODULE: ./js/components/GenWindow/index.tsx\n\n\n\n\n\n\n\n\n\n\nconst Text = ({\n  children\n}) => {\n  const letters = children.split(\"\");\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(react.Fragment, {\n    children: letters.map((letter, i) => /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: `draggable gen-text-letter gen-text-${letter === \" \" ? \"space\" : letter.toLowerCase()}`\n    }, i))\n  });\n};\nconst CHROME_WIDTH = 19;\nconst CHROME_HEIGHT = 34;\n// Named export for testing\nconst GenWindow = ({\n  children,\n  title,\n  windowId,\n  onKeyDown\n}) => {\n  const setWindowSize = useActionCreator(windows_setWindowSize);\n  const closeWindow = useActionCreator(windows_closeWindow);\n  const getWindowPixelSize = useTypedSelector(selectors_getWindowPixelSize);\n  const focusedWindow = useTypedSelector(getFocusedWindow);\n  const getWindowSize = useTypedSelector(selectors_getWindowSize);\n  const windowSize = getWindowSize(windowId);\n  const selected = focusedWindow === windowId;\n  const {\n    width,\n    height\n  } = getWindowPixelSize(windowId);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_FocusTarget, {\n    windowId: windowId,\n    onKeyDown: onKeyDown,\n    children: /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n      id: \"gen-window\",\n      className: classnames_default()(\"gen-window\", \"window\", {\n        selected\n      }),\n      style: {\n        width,\n        height\n      },\n      children: [/*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"gen-top draggable\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-top-left draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-top-left-fill draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-top-left-end draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-top-title draggable\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(Text, {\n            children: title\n          })\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-top-right-end draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-top-right-fill draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-top-right draggable\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            className: \"gen-close selected\",\n            onClick: () => closeWindow(windowId)\n          })\n        })]\n      }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"gen-middle\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-middle-left draggable\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            className: \"gen-middle-left-bottom draggable\"\n          })\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-middle-center\",\n          children: children({\n            width: width - CHROME_WIDTH,\n            height: height - CHROME_HEIGHT\n          })\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-middle-right draggable\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            className: \"gen-middle-right-bottom draggable\"\n          })\n        })]\n      }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"gen-bottom draggable\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-bottom-left draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"gen-bottom-right draggable\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_ResizeTarget, {\n            currentSize: windowSize,\n            setWindowSize: size => setWindowSize(windowId, size),\n            id: \"gen-resize-target\"\n          })\n        })]\n      })]\n    })\n  });\n};\n/* harmony default export */ const components_GenWindow = (GenWindow);\n// EXTERNAL MODULE: ../../node_modules/lodash/lodash.js\nvar lodash = __webpack_require__(6635);\nvar lodash_default = /*#__PURE__*/__webpack_require__.n(lodash);\n// EXTERNAL MODULE: ../../node_modules/butterchurn/lib/butterchurn.js\nvar butterchurn = __webpack_require__(6900);\nvar butterchurn_default = /*#__PURE__*/__webpack_require__.n(butterchurn);\n;// CONCATENATED MODULE: ./js/components/MilkdropWindow/Visualizer.tsx\n// webamp/packages/webamp/js/components/MilkdropWindow/Visualizer.tsx\n\n\n\n\n\n\n\n\n// @ts-ignore\n\n// @ts-ignore\n\n\nconst TRANSITION_TYPE_DURATIONS = {\n  [TransitionType.DEFAULT]: 2.7,\n  [TransitionType.IMMEDIATE]: 0,\n  [TransitionType.USER_PRESET]: 5.7\n};\nfunction Visualizer({\n  analyser,\n  width,\n  height\n}) {\n  const visualizerStyle = useTypedSelector(selectors_getVisualizerStyle);\n  const playing = useTypedSelector(getMediaIsPlaying);\n  const trackTitle = useTypedSelector(getCurrentTrackDisplayName);\n  const currentPreset = useTypedSelector(getCurrentPreset);\n  const lock = useTypedSelector(getMilkdropLockEnabled);\n  const transitionType = useTypedSelector(getPresetTransitionType);\n  const message = useTypedSelector(getMilkdropMessage);\n  const selectPreset = useActionCreator(milkdrop_selectPreset);\n  const isEnabledVisualizer = visualizerStyle === VISUALIZERS.MILKDROP;\n  const canvasRef = (0,react.useRef)(null);\n  const [visualizer, setVisualizer] = (0,react.useState)(null);\n  const lastShownMessage = (0,react.useRef)(null);\n  const presets = butterchurnPresets_min_default().getPresets();\n  const presetKeys = lodash_default().keys(presets);\n  (0,react.useEffect)(() => {\n    if (canvasRef.current == null || (butterchurn_default()) == null) {\n      console.error(\"Canvas or Butterchurn is not initialized!\");\n      return;\n    }\n    if (visualizer != null) {\n      // Note: The visualizer does not offer anyway to clean itself up. So, we\n      // don't offer any way to recreate it. So, if you swap out the analyser\n      // node, or the canvas, that change won't be respected.\n      return;\n    }\n    const _visualizer = butterchurn_default().createVisualizer(analyser.context, canvasRef.current, {\n      width,\n      height,\n      meshWidth: 32,\n      meshHeight: 24,\n      pixelRatio: window.devicePixelRatio || 1\n    });\n    _visualizer.connectAudio(analyser);\n    if (!lock) {\n      const randomPresetKey = presetKeys[Math.floor(Math.random() * presetKeys.length)];\n      const preset = presets[randomPresetKey];\n      _visualizer.loadPreset(preset, 0.3);\n      setVisualizer(_visualizer);\n      selectPreset(randomPresetKey);\n    } else {\n      _visualizer.loadPreset(currentPreset, 0.3);\n      setVisualizer(_visualizer);\n    }\n  }, [(butterchurn_default()), analyser, height, width, visualizer]);\n\n  // Ensure render size stays up to date\n  (0,react.useEffect)(() => {\n    if (visualizer == null) {\n      return;\n    }\n    visualizer.setRendererSize(width, height);\n  }, [visualizer, width, height]);\n\n  // Load presets when they change\n  const hasLoadedPreset = (0,react.useRef)(false);\n  (0,react.useEffect)(() => {\n    if (visualizer == null || currentPreset == null) {\n      return;\n    }\n    if (hasLoadedPreset.current) {\n      visualizer.loadPreset(currentPreset, TRANSITION_TYPE_DURATIONS[transitionType]);\n    } else {\n      visualizer.loadPreset(currentPreset, TRANSITION_TYPE_DURATIONS[TransitionType.IMMEDIATE]);\n      hasLoadedPreset.current = true;\n    }\n    // We don't want to trigger the transition if the transition type changes.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [visualizer, currentPreset]);\n\n  // Handle title animations and change preset\n  (0,react.useEffect)(() => {\n    if (visualizer == null || !trackTitle) {\n      return;\n    }\n    if (!lock) {\n      const randomPresetKey = presetKeys[Math.floor(Math.random() * presetKeys.length)];\n      const preset = presets[randomPresetKey];\n      selectPreset(randomPresetKey);\n      visualizer.loadPreset(preset, 0.3);\n    } else {\n      visualizer.loadPreset(currentPreset, 0.3);\n      setVisualizer(visualizer);\n    }\n    visualizer.launchSongTitleAnim(trackTitle);\n  }, [visualizer, trackTitle]);\n  (0,react.useEffect)(() => {\n    if (visualizer == null || message == null) {\n      return;\n    }\n    if (lastShownMessage.current == null || message.time > lastShownMessage.current) {\n      lastShownMessage.current = Date.now();\n      const randomPresetKey = presetKeys[Math.floor(Math.random() * presetKeys.length)];\n      const preset = presets[randomPresetKey];\n      visualizer.loadPreset(preset, 0.3);\n      visualizer.launchSongTitleAnim(message.text);\n    }\n  }, [visualizer, message]);\n  const shouldAnimate = playing && isEnabledVisualizer;\n\n  // Kick off the animation loop\n  (0,react.useEffect)(() => {\n    if (!shouldAnimate || visualizer == null) {\n      return;\n    }\n    let animationFrameRequest = null;\n    const loop = () => {\n      visualizer.render();\n      animationFrameRequest = window.requestAnimationFrame(loop);\n    };\n    loop();\n    return () => {\n      if (animationFrameRequest != null) {\n        window.cancelAnimationFrame(animationFrameRequest);\n      }\n    };\n  }, [visualizer, shouldAnimate]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"canvas\", {\n    height: height,\n    width: width,\n    style: {\n      height: \"100%\",\n      width: \"100%\",\n      display: isEnabledVisualizer ? \"block\" : \"none\"\n    },\n    ref: canvasRef\n  });\n}\n/* harmony default export */ const MilkdropWindow_Visualizer = (Visualizer);\n;// CONCATENATED MODULE: ./js/components/MilkdropWindow/Background.tsx\n\n\nconst Background = props => {\n  const {\n    innerRef\n  } = props;\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    ref: innerRef,\n    className: \"draggable\",\n    style: {\n      // This color will be used until Butterchurn is loaded\n      backgroundColor: \"#000\",\n      position: \"absolute\",\n      top: 0,\n      bottom: 0,\n      left: 0,\n      right: 0,\n      height: \"100%\",\n      width: \"100%\"\n    },\n    tabIndex: 0,\n    children: props.children\n  });\n};\n/* harmony default export */ const MilkdropWindow_Background = (Background);\n;// CONCATENATED MODULE: ./js/components/MilkdropWindow/PresetOverlay.tsx\n\nfunction PresetOverlay_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction PresetOverlay_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? PresetOverlay_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : PresetOverlay_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n\n\n\n\nconst ENTRY_HEIGHT = 14;\nconst HEIGHT_PADDING = 15;\nconst WIDTH_PADDING = 20;\nconst LOADING_STYLE = {\n  position: \"absolute\",\n  top: 0,\n  left: 0,\n  color: \"white\",\n  background: \"rgba(0.33, 0.33, 0.33, 0.33)\"\n};\nconst OUTER_WRAPPER_STYLE = {\n  position: \"absolute\",\n  top: 0,\n  left: 0,\n  padding: \"15px 10px 0 10px\"\n};\nconst INNER_WRAPPER_STYLE = {\n  display: \"inline-block\",\n  whiteSpace: \"nowrap\",\n  overflow: \"hidden\",\n  background: \"rgba(0, 0, 0, 0.815)\",\n  fontSize: \"12px\"\n};\nfunction presetIndexFromListIndex(listIndex) {\n  return listIndex - 1;\n}\nfunction listIndexFromPresetIndex(listIndex) {\n  return listIndex + 1;\n}\nfunction PresetOverlay({\n  height,\n  width\n}) {\n  const presetKeys = useTypedSelector(getPresetNames);\n  const currentPresetIndex = useTypedSelector(getCurrentPresetIndex);\n  const requestPresetAtIndex = useActionCreator(milkdrop_requestPresetAtIndex);\n  const togglePresetOverlay = useActionCreator(actionCreators_togglePresetOverlay);\n  const appendPresetFileList = useActionCreator(milkdrop_appendPresetFileList);\n  const unmountedRef = useUnmountedRef();\n  const [selectedListIndex, setSelectedListIndex] = (0,react.useState)(() => {\n    if (currentPresetIndex != null) {\n      return listIndexFromPresetIndex(currentPresetIndex);\n    }\n    return 0;\n  });\n\n  // Number of presets, plus one for the \"Load Local Directory\" option, minus\n  // one to convert a length to an index.\n  const maxListIndex = presetKeys.length; // - 1 + 1;\n\n  const renderList = (0,react.useCallback)(() => {\n    const maxVisibleRows = Math.floor((height - HEIGHT_PADDING) / ENTRY_HEIGHT);\n    const rowsToShow = Math.floor(maxVisibleRows * 0.75); // Only fill 3/4 of the screen.\n    const [startIndex, endIndex] = getRangeCenteredOnIndex(maxListIndex + 1,\n    // Add one to convert an index to a length\n    rowsToShow, selectedListIndex);\n    const presetElms = [];\n    for (let i = startIndex; i <= endIndex; i++) {\n      const presetIndex = presetIndexFromListIndex(i);\n      const isSelected = i === selectedListIndex;\n      const isCurrent = presetIndex === currentPresetIndex;\n      let color;\n      if (isSelected) {\n        color = isCurrent ? \"#FFCC22\" : \"#FF5050\";\n      } else {\n        color = isCurrent ? \"#CCFF03\" : \"#CCCCCC\";\n      }\n      presetElms.push( /*#__PURE__*/(0,jsx_runtime.jsx)(\"li\", {\n        style: {\n          color,\n          lineHeight: `${ENTRY_HEIGHT}px`\n        },\n        children: i === 0 ? \"Load Local Directory\" : presetKeys[presetIndex]\n      }, i));\n    }\n    return presetElms;\n  }, [currentPresetIndex, height, maxListIndex, presetKeys, selectedListIndex]);\n  const loadLocalDir = (0,react.useCallback)(async () => {\n    const fileReferences = await promptForFileReferences({\n      directory: true\n    });\n    if (unmountedRef.current) {\n      return;\n    }\n    appendPresetFileList(fileReferences);\n  }, [appendPresetFileList, unmountedRef]);\n  const handleFocusedKeyboardInput = (0,react.useCallback)(e => {\n    switch (e.keyCode) {\n      case 38:\n        // up arrow\n        setSelectedListIndex(value => Math.max(value - 1, 0));\n        e.stopPropagation();\n        break;\n      case 40:\n        // down arrow\n        setSelectedListIndex(value => Math.min(value + 1, maxListIndex));\n        e.stopPropagation();\n        break;\n      case 13:\n        // enter\n        if (selectedListIndex === 0) {\n          loadLocalDir();\n        } else {\n          requestPresetAtIndex(presetIndexFromListIndex(selectedListIndex), TransitionType.DEFAULT, true);\n        }\n        e.stopPropagation();\n        break;\n      case 27:\n        // escape\n        togglePresetOverlay();\n        e.stopPropagation();\n        break;\n    }\n  }, [loadLocalDir, maxListIndex, requestPresetAtIndex, selectedListIndex, togglePresetOverlay]);\n  const handleNode = (0,react.useCallback)(node => {\n    if (node != null && document.activeElement !== node) {\n      node.focus();\n    }\n  }, []);\n  if (presetKeys == null) {\n    return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      style: LOADING_STYLE,\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"span\", {\n        children: \"Loading presets\"\n      })\n    });\n  }\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    ref: handleNode,\n    tabIndex: -1,\n    style: OUTER_WRAPPER_STYLE,\n    onKeyDown: handleFocusedKeyboardInput,\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      style: PresetOverlay_objectSpread(PresetOverlay_objectSpread({}, INNER_WRAPPER_STYLE), {}, {\n        width: width - 20 - WIDTH_PADDING,\n        maxHeight: height - HEIGHT_PADDING\n      }),\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"ul\", {\n        style: {\n          listStyleType: \"none\",\n          padding: 0,\n          margin: 0\n        },\n        children: renderList()\n      })\n    })\n  });\n}\n\n// Find a tuple `[startIndex, endIndex]` representing start/end indexes into an\n// array of length `length`, that descripe a range of size up to `rangeSize`\n// where a best effort is made to center `indexToCenter`.\nfunction getRangeCenteredOnIndex(length, maxRangeSize, indexToCenter) {\n  const rangeSize = Math.min(length, maxRangeSize);\n  const halfRangeSize = Math.floor(rangeSize / 2);\n  const idealStartIndex = indexToCenter - halfRangeSize;\n  const startIndex = clamp(idealStartIndex, 0, length - rangeSize);\n  const endIndex = startIndex + rangeSize - 1;\n  return [startIndex, endIndex];\n}\n/* harmony default export */ const MilkdropWindow_PresetOverlay = (PresetOverlay);\n;// CONCATENATED MODULE: ./js/components/DropTarget.tsx\n\n\nconst DropTarget_excluded = [\"handleDrop\", \"windowId\"];\nfunction DropTarget_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction DropTarget_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? DropTarget_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : DropTarget_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\nfunction supress(e) {\n  e.stopPropagation();\n  e.preventDefault();\n  e.dataTransfer.dropEffect = \"link\";\n  e.dataTransfer.effectAllowed = \"link\";\n}\nconst DropTarget = props => {\n  const {\n      // eslint-disable-next-line no-shadow, no-unused-vars\n      handleDrop,\n      windowId\n    } = props,\n    passThroughProps = _objectWithoutProperties(props, DropTarget_excluded);\n  const droppedFiles = useActionCreator(files_droppedFiles);\n  const onDrop = (0,react.useCallback)(e => {\n    supress(e);\n    droppedFiles(e, windowId);\n    // TODO: We could probably move this coordinate logic into the playlist.\n    // I think that's the only place it gets used.\n    const {\n      currentTarget\n    } = e;\n    if (!(currentTarget instanceof Element)) {\n      return;\n    }\n    const {\n      left: x,\n      top: y\n    } = currentTarget.getBoundingClientRect();\n    handleDrop(e, {\n      x,\n      y\n    });\n  }, [handleDrop, droppedFiles, windowId]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", DropTarget_objectSpread(DropTarget_objectSpread({}, passThroughProps), {}, {\n    onDragStart: supress,\n    onDragEnter: supress,\n    onDragOver: supress,\n    onDrop: onDrop\n  }));\n};\n/* harmony default export */ const components_DropTarget = (DropTarget);\n// EXTERNAL MODULE: ./css/context-menu.css\nvar context_menu = __webpack_require__(3234);\n;// CONCATENATED MODULE: ./js/components/ContextMenu.tsx\n\n\nconst ContextMenu_excluded = [\"label\", \"checked\", \"className\"];\nfunction ContextMenu_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction ContextMenu_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ContextMenu_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ContextMenu_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n\n\n\n\nconst Portal = props => {\n  const node = (0,react.useMemo)(() => {\n    const div = document.createElement(\"div\");\n    div.id = \"webamp-context-menu\";\n    div.style.position = \"absolute\";\n    div.style.top = \"0\";\n    div.style.left = \"0\";\n    div.style.zIndex = String(props.zIndex + 1);\n    return div;\n  }, [props.zIndex]);\n  (0,react.useEffect)(() => {\n    document.body.appendChild(node);\n    return () => {\n      document.body.removeChild(node);\n    };\n  }, [node]);\n  const style = {\n    top: props.top,\n    left: props.left,\n    position: \"absolute\"\n  };\n  return /*#__PURE__*/(0,react_dom.createPortal)( /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    style: style,\n    children: props.children\n  }), node);\n};\nconst ContextMenu_Hr = () => /*#__PURE__*/(0,jsx_runtime.jsx)(\"li\", {\n  className: \"hr\",\n  children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"hr\", {})\n});\nconst Parent = ({\n  children,\n  label\n}) => /*#__PURE__*/(0,jsx_runtime.jsxs)(\"li\", {\n  className: \"parent\",\n  children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"ul\", {\n    children: children\n  }), label]\n});\nconst LinkNode = props => /*#__PURE__*/_jsx(\"li\", {\n  children: /*#__PURE__*/_jsx(\"a\", ContextMenu_objectSpread(ContextMenu_objectSpread({}, props), {}, {\n    children: props.label\n  }))\n});\nconst Node = props => {\n  const {\n      label,\n      checked,\n      className = \"\"\n    } = props,\n    passThroughProps = _objectWithoutProperties(props, ContextMenu_excluded);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"li\", ContextMenu_objectSpread(ContextMenu_objectSpread({\n    className: classnames_default()(className, {\n      checked\n    })\n  }, passThroughProps), {}, {\n    children: label\n  }));\n};\nfunction ContextMenu({\n  children,\n  offsetTop,\n  offsetLeft,\n  top,\n  bottom,\n  selected\n}) {\n  const zIndex = useTypedSelector(getZIndex);\n  if (!selected) {\n    return null;\n  }\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(Portal, {\n    top: offsetTop,\n    left: offsetLeft,\n    zIndex: zIndex,\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"ul\", {\n      className: classnames_default()(\"context-menu\", {\n        top,\n        bottom\n      }),\n      children: children\n    })\n  });\n}\n;// CONCATENATED MODULE: ./js/components/ContextMenuWrapper.tsx\n\n\nconst ContextMenuWrapper_excluded = [\"children\", \"renderContents\"];\nfunction ContextMenuWrapper_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction ContextMenuWrapper_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ContextMenuWrapper_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ContextMenuWrapper_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n// Trigger a context menu at the user's cursor position when the user right\n// clicks within this component.\n// For a component that triggers relative to a given component when the user\n// left-clicks see `<ContextMenuTarget />`.\n\n// TODO: Consider using nested contexts to ensure we don't ever have multiple\n// non-nested context menus open at a time.\nfunction ContextMenuWraper(_ref) {\n  var _openPosition$y, _openPosition$x;\n  let {\n      children,\n      renderContents\n    } = _ref,\n    passThroughProps = _objectWithoutProperties(_ref, ContextMenuWrapper_excluded);\n  const [openPosition, setOpenPosition] = (0,react.useState)(null);\n  const closeMenu = (0,react.useCallback)(() => {\n    setOpenPosition(null);\n  }, []);\n  const handleGlobalClick = (0,react.useCallback)(e => {\n    if (e.button !== 2) {\n      if (e.target instanceof Element && e.target.id !== \"notClose\") {\n        closeMenu();\n      }\n    }\n  }, [closeMenu]);\n  const handleRightClick = (0,react.useCallback)(e => {\n    const {\n      pageX,\n      pageY\n    } = e;\n    // TODO: We could do an initial render to see if the menu fits here\n    // and do a second render if it does not.\n    setOpenPosition({\n      x: pageX,\n      y: pageY\n    });\n    e.preventDefault();\n    e.stopPropagation();\n  }, []);\n\n  // Add click-away listeners when window is open\n  (0,react.useEffect)(() => {\n    if (openPosition == null) {\n      return;\n    }\n    document.addEventListener(\"click\", handleGlobalClick);\n    document.body.addEventListener(\"contextmenu\", closeMenu);\n    return () => {\n      document.removeEventListener(\"click\", handleGlobalClick);\n      document.body.removeEventListener(\"contextmenu\", closeMenu);\n    };\n  }, [openPosition, closeMenu, handleGlobalClick]);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", ContextMenuWrapper_objectSpread(ContextMenuWrapper_objectSpread({\n    onContextMenu: handleRightClick,\n    style: {\n      width: \"100%\",\n      height: \"100%\"\n    }\n  }, passThroughProps), {}, {\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu, {\n      selected: openPosition != null,\n      offsetTop: (_openPosition$y = openPosition === null || openPosition === void 0 ? void 0 : openPosition.y) !== null && _openPosition$y !== void 0 ? _openPosition$y : 0,\n      offsetLeft: (_openPosition$x = openPosition === null || openPosition === void 0 ? void 0 : openPosition.x) !== null && _openPosition$x !== void 0 ? _openPosition$x : 0,\n      children: renderContents()\n    }), children]\n  }));\n}\n;// CONCATENATED MODULE: ./js/components/MilkdropWindow/MilkdropContextMenu.tsx\n\n\n\n\n\n\n// @ts-ignore\n\n\n\n\n\nconst MilkdropContextMenu = props => {\n  const desktop = useTypedSelector(getMilkdropDesktopEnabled);\n  const currentPreset = useTypedSelector(getCurrentPreset);\n  const currentLock = useTypedSelector(getMilkdropLockEnabled);\n  const closeWindow = useActionCreator(windows_closeWindow);\n  const toggleDesktop = useActionCreator(toggleMilkdropDesktop);\n  const toggleFullscreen = useActionCreator(toggleMilkdropFullscreen);\n  const toggleLock = useActionCreator(toggleMilkdropLock);\n  const selectNextPreset = useActionCreator(milkdrop_selectNextPreset);\n  const selectPreset = useActionCreator(milkdrop_selectPreset);\n  const presets = butterchurnPresets_min_default().getPresets();\n  const presetKeys = lodash_default().keys(presets);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenuWraper, {\n    renderContents: () => {\n      return /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: toggleFullscreen,\n          label: \"Fullscreen\",\n          hotkey: \"Alt+Enter\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: toggleLock,\n          label: \"Lock preset\",\n          checked: currentLock\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n          label: \"Select preset\",\n          children: presetKeys.map(presetKey => {\n            return /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n              onClick: () => selectPreset(presetKey),\n              label: presetKey,\n              checked: presetKey == currentPreset\n            });\n          })\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: () => closeWindow(WINDOWS.MILKDROP),\n          label: \"Quit\"\n        })]\n      });\n    },\n    children: props.children\n  });\n};\n/* harmony default export */ const MilkdropWindow_MilkdropContextMenu = (MilkdropContextMenu);\n;// CONCATENATED MODULE: ./js/components/MilkdropWindow/Desktop.tsx\n\n\nconst Desktop = /*#__PURE__*/react.memo(({\n  children\n}) => {\n  const [desktopNode] = react.useState(() => document.createElement(\"div\"));\n  react.useEffect(() => {\n    desktopNode.classList.add(\"webamp-desktop\");\n    document.body.appendChild(desktopNode);\n    return () => {\n      document.body.removeChild(desktopNode);\n    };\n  }, [desktopNode]);\n  return /*#__PURE__*/react_dom.createPortal(children, desktopNode);\n});\n/* harmony default export */ const MilkdropWindow_Desktop = (Desktop);\n;// CONCATENATED MODULE: ./js/components/MilkdropWindow/index.tsx\n\nfunction MilkdropWindow_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction MilkdropWindow_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? MilkdropWindow_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : MilkdropWindow_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst MILLISECONDS_BETWEEN_PRESET_TRANSITIONS = 15000;\nfunction useKeyHandler() {\n  const trackTitle = useTypedSelector(getCurrentTrackDisplayName);\n  const selectNextPreset = useActionCreator(milkdrop_selectNextPreset);\n  const selectPreviousPreset = useActionCreator(milkdrop_selectPreviousPreset);\n  const toggleRandomize = useActionCreator(toggleRandomizePresets);\n  const togglePresetOverlay = useActionCreator(actionCreators_togglePresetOverlay);\n  const scheduleMilkdropMessage = useActionCreator(milkdrop_scheduleMilkdropMessage);\n  const toggleCycling = useActionCreator(togglePresetCycling);\n\n  // Handle keyboard events\n  return (0,react.useCallback)(e => {\n    switch (e.keyCode) {\n      case 32:\n        // spacebar\n        selectNextPreset();\n        break;\n      case 8:\n        // backspace\n        selectPreviousPreset(TransitionType.IMMEDIATE);\n        break;\n      case 72:\n        // H\n        selectNextPreset(TransitionType.IMMEDIATE);\n        break;\n      case 82:\n        // R\n        toggleRandomize();\n        break;\n      case 76:\n        // L\n        togglePresetOverlay();\n        e.stopPropagation();\n        break;\n      case 84:\n        // T\n        if (trackTitle != null) {\n          scheduleMilkdropMessage(trackTitle);\n        }\n        e.stopPropagation();\n        break;\n      case 145: // scroll lock\n      case 125:\n        // F14 (scroll lock for OS X)\n        toggleCycling();\n        break;\n    }\n  }, [scheduleMilkdropMessage, selectNextPreset, selectPreviousPreset, toggleCycling, togglePresetOverlay, toggleRandomize, trackTitle]);\n}\nfunction Milkdrop({\n  analyser\n}) {\n  const desktop = useTypedSelector(getMilkdropDesktopEnabled);\n  const fullscreen = useTypedSelector(getMilkdropFullscreenEnabled);\n  const overlay = useTypedSelector(getPresetOverlayOpen);\n  const presetsAreCycling = useTypedSelector(getPresetsAreCycling);\n  const currentPresetIndex = useTypedSelector(getCurrentPresetIndex);\n  const mediaIsPlaying = useTypedSelector(getMediaIsPlaying);\n  const toggleFullscreen = useActionCreator(toggleMilkdropFullscreen);\n  const selectNextPreset = useActionCreator(milkdrop_selectNextPreset);\n  const handlePresetDrop = useActionCreator(milkdrop_handlePresetDrop);\n  const setFullscreen = useActionCreator(setMilkdropFullscreen);\n  const handleKeyDown = useKeyHandler();\n\n  // Cycle presets\n  (0,react.useEffect)(() => {\n    if (!presetsAreCycling || !mediaIsPlaying) {\n      return;\n    }\n    const intervalId = setInterval(selectNextPreset, MILLISECONDS_BETWEEN_PRESET_TRANSITIONS);\n    return () => clearInterval(intervalId);\n  }, [presetsAreCycling, currentPresetIndex, mediaIsPlaying, selectNextPreset]);\n  const screenSize = useScreenSize();\n  const windowSize = useWindowSize();\n  if (desktop) {\n    return /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow_Desktop, {\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow_MilkdropContextMenu, {\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow_Visualizer, MilkdropWindow_objectSpread(MilkdropWindow_objectSpread({}, windowSize), {}, {\n          analyser: analyser\n        }))\n      })\n    });\n  }\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_GenWindow, {\n    title: \"Milkdrop\",\n    windowId: WINDOWS.MILKDROP,\n    onKeyDown: handleKeyDown,\n    children: genWindowSize => {\n      const size = fullscreen ? screenSize : genWindowSize;\n      return /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow_MilkdropContextMenu, {\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow_Background, {\n          children: /*#__PURE__*/(0,jsx_runtime.jsxs)(components_DropTarget, {\n            windowId: WINDOWS.MILKDROP,\n            handleDrop: handlePresetDrop,\n            children: [overlay && /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow_PresetOverlay, MilkdropWindow_objectSpread({}, size)), /*#__PURE__*/(0,jsx_runtime.jsx)(Fullscreen, {\n              enabled: fullscreen,\n              onChange: setFullscreen,\n              children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n                onDoubleClick: toggleFullscreen,\n                children: /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow_Visualizer, MilkdropWindow_objectSpread(MilkdropWindow_objectSpread({}, size), {}, {\n                  analyser: analyser\n                }))\n              })\n            })]\n          })\n        })\n      });\n    }\n  });\n}\n/* harmony default export */ const MilkdropWindow = (Milkdrop);\n;// CONCATENATED MODULE: ./js/components/PlaybackContextMenu.tsx\n\n\n\n\n\n\nconst PlaybackContextMenu = () => {\n  const previous = useActionCreator(media_previous);\n  const play = useActionCreator(media_play);\n  const pause = useActionCreator(media_pause);\n  const stop = useActionCreator(media_stop);\n  const next = useActionCreator(media_next);\n  const seekForward = useActionCreator(media_seekForward);\n  const seekBackward = useActionCreator(media_seekBackward);\n  const nextN = useActionCreator(media_nextN);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(react.Fragment, {\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Previous\",\n      hotkey: \"Z\",\n      onClick: previous\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Play\",\n      hotkey: \"X\",\n      onClick: play\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Pause\",\n      hotkey: \"C\",\n      onClick: pause\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Stop\",\n      hotkey: \"V\",\n      onClick: stop\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Next\",\n      hotkey: \"B\",\n      onClick: next\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Back 5 seconds\",\n      hotkey: \"Left\",\n      onClick: () => seekBackward(5)\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Fwd 5 seconds\",\n      hotkey: \"Right\",\n      onClick: () => seekForward(5)\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"10 tracks back\",\n      hotkey: \"Num. 1\",\n      onClick: () => nextN(-10)\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"10 tracks fwd\",\n      hotkey: \"Num. 3\",\n      onClick: () => nextN(10)\n    })]\n  });\n};\n/* harmony default export */ const components_PlaybackContextMenu = (PlaybackContextMenu);\n;// CONCATENATED MODULE: ./js/components/OptionsContextMenu.tsx\n\n\n\n\n\n\n\n\nconst {\n  ipcRenderer: OptionsContextMenu_ipcRenderer\n} = window.require('electron');\nconst OptionsContextMenu = () => {\n  const toggleTimeMode = useActionCreator(media_toggleTimeMode);\n  const toggleDoubleSizeMode = useActionCreator(windows_toggleDoubleSizeMode);\n  const toggleRepeat = useActionCreator(media_toggleRepeat);\n  const toggleShuffle = useActionCreator(media_toggleShuffle);\n  const doubled = useTypedSelector(getDoubled);\n  const timeMode = useTypedSelector(getTimeMode);\n  const repeat = useTypedSelector(getRepeat);\n  const shuffle = useTypedSelector(getShuffle);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"\\u0421\\u0431\\u0440\\u043E\\u0441\\u0438\\u0442\\u044C \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438\",\n      onClick: async () => {\n        OptionsContextMenu_ipcRenderer.invoke(\"resetSettings\").then(() => {});\n      }\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Time elapsed\",\n      hotkey: \"(Ctrl+T toggles)\",\n      onClick: toggleTimeMode,\n      checked: timeMode === TIME_MODE.ELAPSED\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Time remaining\",\n      hotkey: \"(Ctrl+T toggles)\",\n      onClick: toggleTimeMode,\n      checked: timeMode === TIME_MODE.REMAINING\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Double Size\",\n      hotkey: \"Ctrl+D\",\n      onClick: toggleDoubleSizeMode,\n      checked: doubled\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Repeat\",\n      hotkey: \"R\",\n      onClick: toggleRepeat,\n      checked: repeat\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: \"Shuffle\",\n      hotkey: \"S\",\n      onClick: toggleShuffle,\n      checked: shuffle\n    })]\n  });\n};\n/* harmony default export */ const components_OptionsContextMenu = (OptionsContextMenu);\n;// CONCATENATED MODULE: ./js/components/SkinsContextMenu.tsx\n\n\n\n\n\n\nconst SkinContextMenu = () => {\n  const loadDefaultSkin = useActionCreator(actionCreators_loadDefaultSkin);\n  const openSkinFileDialog = useActionCreator(files_openSkinFileDialog);\n  const setSkin = useActionCreator(setSkinFromUrl);\n  const availableSkins = useTypedSelector(getAvaliableSkins);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(Parent, {\n    label: \"Skins\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: openSkinFileDialog,\n      label: \"Load Skin...\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: loadDefaultSkin,\n      label: \"<Base Skin>\"\n    }), availableSkins.map(skin => /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: () => setSkin(skin.url),\n      label: skin.name\n    }, skin.url))]\n  });\n};\n/* harmony default export */ const SkinsContextMenu = (SkinContextMenu);\n;// CONCATENATED MODULE: ./js/components/MainWindow/MainContextMenu.tsx\n\nconst {\n  ipcRenderer: MainContextMenu_ipcRenderer\n} = window.require('electron');\n\n\n\n\n\n\n\n\n\n\nconst MainContextMenu = /*#__PURE__*/(0,react.memo)(({\n  filePickers\n}) => {\n  var _userSettings$api2, _userSettings$api3;\n  const networkConnected = useTypedSelector(getNetworkConnected);\n  const genWindows = useTypedSelector(getGenWindows);\n  const close = useActionCreator(actionCreators_close);\n  const openMediaFileDialog = useActionCreator(files_openMediaFileDialog);\n  const loadMediaFiles = useActionCreator(files_loadMediaFiles);\n  const toggleWindow = useActionCreator(windows_toggleWindow);\n  const menuOpened = useActionCreator(() => ({\n    type: \"MAIN_CONTEXT_MENU_OPENED\"\n  }));\n  const [playlists, setPlaylists] = (0,react.useState)([]);\n  const [artists, setArtists] = (0,react.useState)([]);\n  const [albums, setAlbums] = (0,react.useState)([]);\n  const [rotors, setRotors] = (0,react.useState)([]);\n  const [playlistgetted, setPlaylistgetted] = (0,react.useState)(false);\n  const [searchResult, setsearchResult] = (0,react.useState)([]);\n  const [lendings, setLendings] = (0,react.useState)([]);\n  const [data, setData] = (0,react.useState)([]);\n  const [userSettings, setUserSettings] = (0,react.useState)([]);\n  const [apiPort, setApiPort] = (0,react.useState)('8080');\n  const handleChange = event => {\n    MainContextMenu_ipcRenderer.invoke(\"search\", {\n      searchText: event.target.value\n    }).then(rs => {\n      setsearchResult(rs);\n    });\n  };\n  const handleApiPortChange = event => {\n    const port = event.target.value.toString();\n    setApiPort(port);\n  };\n  const handleApiPortSave = async () => {\n    const port = parseInt(apiPort) || 8080;\n    await MainContextMenu_ipcRenderer.invoke(\"setApiSettings\", {\n      port: port\n    });\n    MainContextMenu_ipcRenderer.invoke('getSettings').then(rs => {\n      setUserSettings(JSON.parse(rs));\n    });\n  };\n  const handleApiToggle = async () => {\n    var _userSettings$api;\n    const newEnabled = !((_userSettings$api = userSettings.api) !== null && _userSettings$api !== void 0 && _userSettings$api.enabled || false);\n    await MainContextMenu_ipcRenderer.invoke(\"setApiSettings\", {\n      enabled: newEnabled\n    });\n    MainContextMenu_ipcRenderer.invoke('getSettings').then(rs => {\n      setUserSettings(JSON.parse(rs));\n    });\n  };\n  (0,react.useEffect)(() => {\n    if (!playlistgetted) {\n      setPlaylistgetted(true);\n      MainContextMenu_ipcRenderer.invoke(\"nowPlaylist\").then(data => {\n        setData(data);\n      });\n      MainContextMenu_ipcRenderer.invoke('getUserPlaylists').then(rs => {\n        setPlaylists(rs);\n      });\n      MainContextMenu_ipcRenderer.invoke('getUserArtists').then(rs => {\n        setArtists(rs);\n      });\n      MainContextMenu_ipcRenderer.invoke('getUserAlbums').then(rs => {\n        setAlbums(rs);\n      });\n      MainContextMenu_ipcRenderer.invoke('getRotor').then(rs => {\n        setRotors(rs);\n      });\n      MainContextMenu_ipcRenderer.invoke('lendings').then(rs => {\n        setLendings(rs);\n      });\n      MainContextMenu_ipcRenderer.invoke('getSettings').then(rs => {\n        var _settings$api;\n        const settings = JSON.parse(rs);\n        setUserSettings(settings);\n        if ((_settings$api = settings.api) !== null && _settings$api !== void 0 && _settings$api.port) {\n          setApiPort(settings.api.port.toString());\n        }\n      });\n    }\n    menuOpened();\n  }, [menuOpened]);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(react.Fragment, {\n    children: [data.uid ? /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: async () => {\n          MainContextMenu_ipcRenderer.invoke(\"openLink\", {\n            link: \"https://yaamp.ru/\"\n          }).then(() => {});\n        },\n        label: data.title\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: async () => {\n          MainContextMenu_ipcRenderer.invoke(\"setPlaylistRecomendation\", {\n            uid: data.uid,\n            kind: data.kind\n          }).then(() => {});\n        },\n        label: \"\\u0420\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0430\\u0446\\u0438\\u0438 \\u043F\\u043E \\u043F\\u043B\\u0435\\u0439\\u043B\\u0438\\u0441\\u0442\\u0443\"\n      })]\n    }) : /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"openLink\", {\n          link: \"https://yaamp.ru/\"\n        }).then(() => {});\n      },\n      label: \"Yaamp\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"setMywave\").then(() => {});\n      },\n      label: \"\\u041C\\u043E\\u044F \\u0432\\u043E\\u043B\\u043D\\u0430\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"setMyloved\").then(() => {});\n      },\n      label: \"\\u041B\\u044E\\u0431\\u0438\\u043C\\u044B\\u0435 \\u0442\\u0440\\u0435\\u043A\\u0438\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n      label: \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u044C\\u043D\\u044B\\u0435 \\u043F\\u043B\\u0435\\u0439\\u043B\\u0438\\u0441\\u0442\\u044B\",\n      children: lendings.map(result => {\n        return /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: async () => {\n            MainContextMenu_ipcRenderer.invoke(\"setPlaylist\", {\n              uid: result.data.data.uid,\n              kind: result.data.data.kind\n            }).then(() => {});\n          },\n          label: result.data.data.title\n        });\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsxs)(Parent, {\n      label: \"\\u041F\\u043E\\u0438\\u0441\\u043A...\",\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"li\", {\n        className: \"input\",\n        id: \"notClose\",\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"input\", {\n          className: \"searchField\",\n          type: \"text\",\n          id: \"notClose\",\n          placeholder: \"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u0442\\u0435\\u043A\\u0441\\u0442...\",\n          onChange: handleChange\n        })\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), searchResult.map(result => {\n        return /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: async () => {\n            if (result.type == 'artist') {\n              MainContextMenu_ipcRenderer.invoke(\"setArtist\", {\n                id: result.id\n              }).then(() => {});\n            }\n            if (result.type == 'album') {\n              MainContextMenu_ipcRenderer.invoke(\"setAlbum\", {\n                id: result.id\n              }).then(() => {});\n            }\n          },\n          label: result.name\n        });\n      })]\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n      label: \"\\u041F\\u043B\\u0435\\u0439\\u043B\\u0438\\u0441\\u0442\\u044B\",\n      children: playlists.map(playlist => {\n        return /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: async () => {\n            MainContextMenu_ipcRenderer.invoke(\"setPlaylist\", {\n              uid: playlist.uid,\n              kind: playlist.kind\n            }).then(() => {});\n          },\n          label: playlist.title\n        });\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n      label: \"\\u0418\\u0441\\u043F\\u043E\\u043B\\u043D\\u0438\\u0442\\u0435\\u043B\\u0438\",\n      children: artists.map(artist => {\n        return /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: async () => {\n            MainContextMenu_ipcRenderer.invoke(\"setArtist\", {\n              id: artist.id\n            }).then(() => {});\n          },\n          label: artist.title\n        });\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n      label: \"\\u0410\\u043B\\u044C\\u0431\\u043E\\u043C\\u044B\",\n      children: albums.map(album => {\n        return /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: async () => {\n            MainContextMenu_ipcRenderer.invoke(\"setAlbum\", {\n              id: album.id\n            }).then(() => {});\n          },\n          label: album.title\n        });\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n      label: \"\\u0421\\u0442\\u0430\\u043D\\u0446\\u0438\\u0438\",\n      children: rotors.map(rotor => {\n        return /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: async () => {\n            MainContextMenu_ipcRenderer.invoke(\"setRotor\", {\n              id: rotor.id\n            }).then(() => {});\n          },\n          label: rotor.title\n        });\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"openPlayNow\").then(() => {});\n      },\n      label: \"\\u0421\\u0435\\u0439\\u0447\\u0430\\u0441 \\u0438\\u0433\\u0440\\u0430\\u0435\\u0442...\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"setLike\").then(() => {});\n      },\n      label: \"\\u041B\\u0430\\u0439\\u043A\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"setDislike\").then(() => {});\n      },\n      label: \"\\u0414\\u0438\\u0437\\u043B\\u0430\\u0439\\u043A\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), Object.keys(genWindows).map(i => /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      label: genWindows[i].title,\n      checked: genWindows[i].open,\n      onClick: () => toggleWindow(i),\n      hotkey: genWindows[i].hotkey\n    }, i)), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(SkinsContextMenu, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsxs)(Parent, {\n      label: \"\\u0423\\u0432\\u0435\\u043B\\u0438\\u0447\\u0435\\u043D\\u0438\\u0435\",\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: async () => {\n          MainContextMenu_ipcRenderer.invoke(\"setRatio\", {\n            value: 1\n          }).then(() => {});\n        },\n        label: \"x1\",\n        checked: userSettings.zoom === 1\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: async () => {\n          MainContextMenu_ipcRenderer.invoke(\"setRatio\", {\n            value: 1.2\n          }).then(() => {});\n        },\n        label: \"x1.2\",\n        checked: userSettings.zoom === 1.2\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: async () => {\n          MainContextMenu_ipcRenderer.invoke(\"setRatio\", {\n            value: 1.4\n          }).then(() => {});\n        },\n        label: \"x1.4\",\n        checked: userSettings.zoom === 1.4\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: async () => {\n          MainContextMenu_ipcRenderer.invoke(\"setRatio\", {\n            value: 1.6\n          }).then(() => {});\n        },\n        label: \"x1.6\",\n        checked: userSettings.zoom === 1.6\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: async () => {\n          MainContextMenu_ipcRenderer.invoke(\"setRatio\", {\n            value: 1.8\n          }).then(() => {});\n        },\n        label: \"x1.8\",\n        checked: userSettings.zoom === 1.8\n      })]\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n      label: \"Options\",\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_OptionsContextMenu, {})\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Parent, {\n      label: \"Playback\",\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_PlaybackContextMenu, {})\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsxs)(Parent, {\n      label: \"API\",\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: handleApiToggle,\n        label: (_userSettings$api2 = userSettings.api) !== null && _userSettings$api2 !== void 0 && _userSettings$api2.enabled ? \"Выключить API\" : \"Включить API\",\n        checked: ((_userSettings$api3 = userSettings.api) === null || _userSettings$api3 === void 0 ? void 0 : _userSettings$api3.enabled) || false\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(\"li\", {\n        className: \"input\",\n        id: \"notClose\",\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"input\", {\n          className: \"searchField\",\n          type: \"number\",\n          id: \"notClose\",\n          placeholder: \"\\u041F\\u043E\\u0440\\u0442 (8080)\",\n          value: apiPort,\n          onChange: handleApiPortChange,\n          onBlur: handleApiPortSave,\n          min: \"1024\",\n          max: \"65535\"\n        })\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: handleApiPortSave,\n        label: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C \\u043F\\u043E\\u0440\\u0442\"\n      })]\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"openLink\", {\n          link: \"https://yaamp.ru/donate.php\"\n        }).then(() => {});\n      },\n      label: \"\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0430\\u0442\\u044C \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: async () => {\n        MainContextMenu_ipcRenderer.invoke(\"logout\").then(() => {});\n      },\n      label: \"\\u0412\\u044B\\u0439\\u0442\\u0438 \\u0438\\u0437 \\u0430\\u043A\\u043A\\u0430\\u0443\\u043D\\u0442\\u0430\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: close,\n      label: \"Exit\"\n    })]\n  });\n});\n/* harmony default export */ const MainWindow_MainContextMenu = (MainContextMenu);\n;// CONCATENATED MODULE: ./js/components/WindowManager.tsx\n\nfunction WindowManager_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction WindowManager_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? WindowManager_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : WindowManager_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\n\n\n\nconst {\n  ipcRenderer: WindowManager_ipcRenderer\n} = window.require('electron');\nconst abuts = (a, b) => {\n  // TODO: This is kinda a hack. They should really be touching, not just within snapping distance.\n  // Also, overlapping should not count.\n  const wouldMoveTo = snap(a, b);\n  return wouldMoveTo.x !== undefined || wouldMoveTo.y !== undefined;\n};\nlet posOnStart = false;\nfunction useHandleMouseDown(propsWindows) {\n  const windowsInfo = useTypedSelector(getWindowsInfo);\n  const getOpen = useTypedSelector(selectors_getWindowOpen);\n  const getWindowHidden = useTypedSelector(selectors_getWindowHidden);\n  const browserWindowSize = useTypedSelector(getBrowserWindowSize);\n  const updateWindowPositions = useActionCreator(windows_updateWindowPositions);\n  const [draggingState, setDraggingState] = (0,react.useState)(null);\n\n  // When the mouse is down, attach a listener to track mouse move events.\n  (0,react.useEffect)(() => {\n    if (draggingState == null) {\n      return;\n    }\n    const {\n      boundingBox,\n      moving,\n      stationary,\n      mouseStart\n    } = draggingState;\n    const handleMouseMove = ee => {\n      const proposedDiff = {\n        x: ee.clientX - mouseStart.x,\n        y: ee.clientY - mouseStart.y\n      };\n      const proposedWindows = moving.map(node => WindowManager_objectSpread(WindowManager_objectSpread({}, node), applyDiff(node, proposedDiff)));\n      const proposedBox = WindowManager_objectSpread(WindowManager_objectSpread({}, boundingBox), applyDiff(boundingBox, proposedDiff));\n      const snapDiff = snapDiffManyToMany(proposedWindows, stationary);\n      const withinDiff = snapWithinDiff(proposedBox, browserWindowSize);\n      const finalDiff = applyMultipleDiffs(proposedDiff, snapDiff, withinDiff);\n      const windowPositionDiff = {};\n      moving.forEach(w => {\n        windowPositionDiff[w.key] = applyDiff(w, finalDiff);\n      });\n\n      // Log the updated positions of the windows being moved\n      WindowManager_ipcRenderer.invoke(\"movingWindowStarted\", {\n        windows: windowsInfo\n      }).then(() => {});\n      updateWindowPositions(windowPositionDiff, false);\n    };\n    function handleMouseUp() {\n      setDraggingState(null);\n      // Log that window movement has ended\n      WindowManager_ipcRenderer.invoke(\"movingWindowEnded\", {\n        windows: windowsInfo\n      }).then(() => {});\n    }\n    window.addEventListener(\"mouseup\", handleMouseUp);\n    window.addEventListener(\"mousemove\", handleMouseMove);\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMouseMove);\n      window.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n  }, [browserWindowSize, draggingState, updateWindowPositions]);\n\n  // Mouse down handler\n  return (0,react.useCallback)((key, e) => {\n    if (!e.target.classList.contains(\"draggable\")) {\n      return;\n    }\n    if (getWindowHidden(key)) {\n      // The user may be clicking on full screen Milkdrop.\n      return;\n    }\n    const windows = windowsInfo.filter(w => propsWindows[w.key] != null && !getWindowHidden(w.key));\n    const targetNode = windows.find(node => node.key === key);\n    if (targetNode == null) {\n      throw new Error(`Tried to move a node that does not exist: ${key}`);\n    }\n    let movingSet = new Set([targetNode]);\n    // Only the main window brings other windows along.\n    if (key === \"main\") {\n      const findAllConnected = traceConnection(abuts);\n      movingSet = findAllConnected(windows, targetNode);\n    }\n    const stationary = windows.filter(w => !movingSet.has(w));\n    const moving = Array.from(movingSet);\n    const mouseStart = {\n      x: e.clientX,\n      y: e.clientY\n    };\n    const boundingBox = snapUtils_boundingBox(moving);\n    setDraggingState({\n      boundingBox,\n      moving,\n      stationary,\n      mouseStart\n    });\n  }, [getWindowHidden, propsWindows, windowsInfo]);\n}\nfunction WindowManager({\n  windows: propsWindows\n}) {\n  const windowsInfo = useTypedSelector(getWindowsInfo);\n  const setFocusedWindow = useActionCreator(windows_setFocusedWindow);\n  const handleMouseDown = useHandleMouseDown(propsWindows);\n  const updateWindowPositions = useActionCreator(windows_updateWindowPositions);\n  const centerWindowsInView = useActionCreator(windows_centerWindowsInView);\n  const setWindowSize = useActionCreator(windows_setWindowSize);\n  const toggleWindow = useActionCreator(windows_toggleWindow);\n  const windows = windowsInfo.filter(w => propsWindows[w.key]);\n  if (!posOnStart) {\n    if (document.getElementById('playlist-window')) {\n      WindowManager_ipcRenderer.invoke('getSettings').then(rs => {\n        const settingsData = JSON.parse(rs);\n        console.log(settingsData);\n        if (settingsData.windows) {\n          WindowManager_ipcRenderer.invoke('movingWindowStarted').then(() => {\n            let obj = windows.find((o, i) => {\n              if (o.key === 'main') {\n                windows[i].x = settingsData.windows.mainWindow.x;\n                windows[i].y = settingsData.windows.mainWindow.y;\n              }\n              if (o.key === 'playlist') {\n                windows[i].x = settingsData.windows.playlistWindow.x;\n                windows[i].y = settingsData.windows.playlistWindow.y;\n                setWindowSize(o.key, settingsData.windows.playlistWindow.size);\n              }\n              if (o.key === 'equalizer') {\n                windows[i].x = settingsData.windows.equalizerWindow.x;\n                windows[i].y = settingsData.windows.equalizerWindow.y;\n              }\n              if (o.key === 'milkdrop') {\n                windows[i].x = settingsData.windows.milkdropWindow.x;\n                windows[i].y = settingsData.windows.milkdropWindow.y;\n                setWindowSize(o.key, settingsData.windows.milkdropWindow.size);\n              }\n            });\n            const newPositions = windowsInfo.reduce((pos, w) => WindowManager_objectSpread(WindowManager_objectSpread({}, pos), {}, {\n              [w.key]: {\n                x: w.x,\n                y: w.y\n              }\n            }), {});\n            updateWindowPositions(newPositions, false);\n            centerWindowsInView();\n            if (!settingsData.windows.playlistWindow.visible) {\n              toggleWindow('playlist');\n            }\n            if (!settingsData.windows.equalizerWindow.visible) {\n              toggleWindow('equalizer');\n            }\n            WindowManager_ipcRenderer.invoke('movingWindowEndedWithoutSave').then(() => {});\n            posOnStart = true;\n          });\n        }\n      });\n    }\n  }\n  const onBlur = (0,react.useCallback)(\n  // I give up on trying to type things with `relatedTarget`.\n  e => {\n    const {\n      currentTarget,\n      relatedTarget\n    } = e;\n    if (currentTarget === relatedTarget || currentTarget.contains(relatedTarget)) {\n      return;\n    }\n    setFocusedWindow(null);\n  }, [setFocusedWindow]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(jsx_runtime.Fragment, {\n    children: windows.map(w => /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: w.key,\n      onBlur: onBlur,\n      onMouseDown: e => {\n        handleMouseDown(w.key, e);\n      },\n      style: {\n        position: \"absolute\",\n        top: 0,\n        left: 0,\n        transform: `translate(${w.x}px, ${w.y}px)`\n      },\n      children: propsWindows[w.key]\n    }, w.key))\n  });\n}\n// EXTERNAL MODULE: ../../node_modules/lodash/deburr.js\nvar deburr = __webpack_require__(7329);\nvar deburr_default = /*#__PURE__*/__webpack_require__.n(deburr);\n;// CONCATENATED MODULE: ./js/components/Character.tsx\n\n\nconst Character_excluded = [\"children\", \"className\"];\nfunction Character_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction Character_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? Character_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : Character_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\nconst characterClassName = char => `character-${deburr_default()(char.toString()).toLowerCase().charCodeAt(0)}`;\nconst Character = /*#__PURE__*/react.memo(_ref => {\n  let {\n      children: char,\n      className\n    } = _ref,\n    passThrough = _objectWithoutProperties(_ref, Character_excluded);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"span\", Character_objectSpread(Character_objectSpread({}, passThrough), {}, {\n    className: `${className || \"\"} character ${characterClassName(char)}`,\n    children: char\n  }));\n});\n/* harmony default export */ const components_Character = (Character);\n// EXTERNAL MODULE: ./css/mini-time.css\nvar mini_time = __webpack_require__(3362);\n;// CONCATENATED MODULE: ./js/components/MiniTime.tsx\n\n\n\n\n\n\n\n\n\n\n// Sigh. When the display is blinking (say when it's paused) we need to\n// alternate between the actual character and the space character. Not\n// Possible to do that in pure CSS with the background being dynamically generated.\n// All \"space\" characters is also how Winamp renders no content.\n\n\nconst MiniTime_Background = () => /*#__PURE__*/(0,jsx_runtime.jsx)(react.Fragment, {\n  children: [1, 7, 12, 20, 25].map((left, i) => /*#__PURE__*/(0,jsx_runtime.jsx)(components_Character, {\n    style: {\n      left\n    },\n    className: \"background-character\",\n    children: \" \"\n  }, i))\n});\nconst MiniTime = () => {\n  const status = useTypedSelector(getMediaStatus);\n  const duration = useTypedSelector(getDuration);\n  const timeElapsed = useTypedSelector(getTimeElapsed);\n  const timeMode = useTypedSelector(getTimeMode);\n  const toggle = useActionCreator(media_toggleTimeMode);\n  let seconds = null;\n  // TODO: Clean this up: If stopped, just render the background, rather than\n  // rendering spaces twice.\n  if (status !== MEDIA_STATUS.STOPPED && duration != null) {\n    seconds = timeMode === TIME_MODE.ELAPSED ? timeElapsed : duration - timeElapsed;\n  }\n  const timeObj = getTimeObj(seconds);\n  const showMinus = timeMode === TIME_MODE.REMAINING && status !== MEDIA_STATUS.STOPPED;\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    onClick: toggle,\n    className: classnames_default()(\"mini-time\", \"countdown\", {\n      blinking: status === MEDIA_STATUS.PAUSED\n    }),\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(MiniTime_Background, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(components_Character, {\n      style: {\n        left: 1\n      },\n      children: showMinus ? \"-\" : \" \"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(components_Character, {\n      style: {\n        left: 7\n      },\n      children: timeObj.minutesFirstDigit\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(components_Character, {\n      style: {\n        left: 12\n      },\n      children: timeObj.minutesSecondDigit\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(components_Character, {\n      style: {\n        left: 20\n      },\n      children: timeObj.secondsFirstDigit\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(components_Character, {\n      style: {\n        left: 25\n      },\n      children: timeObj.secondsSecondDigit\n    })]\n  });\n};\n/* harmony default export */ const components_MiniTime = (MiniTime);\n;// CONCATENATED MODULE: ./js/components/ClickedDiv.tsx\n\nfunction ClickedDiv_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction ClickedDiv_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ClickedDiv_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ClickedDiv_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n// Winamp has a strange behavior for the buttons at the top of the main window.\n// It shows through to the main background sprite until the first time that it's\n// clicked, and then it shows the dedicated undepressed sprite thereafter.\n// This component is an abstraction that tracks if a div has ever been clicked.\n// Look in `skinSelectors` for CSS selectors that look like `#some-id.clicked`\n// for examples of this functionality in use.\nfunction ClickedDiv(props) {\n  const [clicked, setClicked] = (0,react.useState)(false);\n  function handleMouseDown(e) {\n    setClicked(true);\n    if (props.onMouseDown) {\n      props.onMouseDown(e);\n    }\n  }\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", ClickedDiv_objectSpread(ClickedDiv_objectSpread({}, props), {}, {\n    className: classnames_default()(props.className, {\n      clicked\n    }),\n    onMouseDown: handleMouseDown\n  }));\n}\n/* harmony default export */ const components_ClickedDiv = (ClickedDiv);\n;// CONCATENATED MODULE: ./js/components/ContextMenuTarget.tsx\n\n\nconst ContextMenuTarget_excluded = [\"renderMenu\", \"children\", \"top\", \"bottom\"];\nfunction ContextMenuTarget_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction ContextMenuTarget_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ContextMenuTarget_ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ContextMenuTarget_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\n\nfunction getNodeOffset(node) {\n  if (node == null) {\n    return {\n      top: 0,\n      left: 0\n    };\n  }\n  const rect = node.getBoundingClientRect();\n  const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n  const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n  return {\n    top: rect.top + scrollTop,\n    left: rect.left + scrollLeft\n  };\n}\n\n// Trigger a context menu relative to the child element when the user\n// left-clicks on the child.\n//\n// For a component that triggers relative to the user's cursor on right-click\n// see `<ContextMenuWrapper />`.\nfunction ContextMenuTarget(props) {\n  const handleNode = (0,react.useRef)(null);\n  const [selected, setSelected] = (0,react.useState)(false);\n  (0,react.useEffect)(() => {\n    if (!selected) {\n      return;\n    }\n    function handleGlobalClick(e) {\n      if (selected &&\n      // Typescript does not believe that these click events are always fired on DOM nodes.\n      e.target instanceof Element && selected &&\n      // Not sure how, but it's possible for this to get called when handleNode is null/undefined.\n      // https://sentry.io/share/issue/2066cd79f21e4f279791319f4d2ea35d/\n      handleNode.current && !handleNode.current.contains(e.target)) {\n        setSelected(false);\n      }\n    }\n    document.addEventListener(\"click\", handleGlobalClick);\n    return () => {\n      document.removeEventListener(\"click\", handleGlobalClick);\n    };\n  }, [selected]);\n  const offset = (0,react.useMemo)(() => {\n    return selected ? getNodeOffset(handleNode.current) :\n    // Kinda awkward. This is a nonsense return value since we only use\n    //this value when we are selected.\n    {\n      top: 0,\n      left: 0\n    };\n  }, [selected]);\n  const {\n      renderMenu,\n      children,\n      top,\n      bottom\n    } = props,\n    passThroughProps = _objectWithoutProperties(props, ContextMenuTarget_excluded);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", ContextMenuTarget_objectSpread(ContextMenuTarget_objectSpread({}, passThroughProps), {}, {\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"handle\",\n      style: {\n        width: \"100%\",\n        height: \"100%\"\n      },\n      ref: handleNode,\n      onClick: () => setSelected(!selected),\n      children: children\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu, {\n      selected: selected,\n      offsetTop: offset.top,\n      offsetLeft: offset.left,\n      top: top,\n      bottom: bottom,\n      children: renderMenu()\n    })]\n  }));\n}\n/* harmony default export */ const components_ContextMenuTarget = (ContextMenuTarget);\n;// CONCATENATED MODULE: ./js/components/useOscilloscopeVisualizer.ts\n\n\n\nconst PIXEL_DENSITY = 2;\n\n// Return the average value in a slice of dataArray\nfunction sliceAverage(dataArray, sliceWidth, sliceNumber) {\n  const start = sliceWidth * sliceNumber;\n  const end = start + sliceWidth;\n  let sum = 0;\n  for (let i = start; i < end; i++) {\n    sum += dataArray[i];\n  }\n  return sum / sliceWidth;\n}\nfunction usePaintOscilloscopeFrame({\n  analyser,\n  height,\n  width,\n  renderWidth\n}) {\n  const colors = useTypedSelector(getSkinColors);\n  const bufferLength = analyser.fftSize;\n  const dataArray = (0,react.useMemo)(() => {\n    return new Uint8Array(bufferLength);\n  }, [bufferLength]);\n  return (0,react.useCallback)(canvasCtx => {\n    analyser.getByteTimeDomainData(dataArray);\n    canvasCtx.lineWidth = PIXEL_DENSITY;\n\n    // Just use one of the viscolors for now\n    canvasCtx.strokeStyle = colors[18];\n\n    // Since dataArray has more values than we have pixels to display, we\n    // have to average several dataArray values per pixel. We call these\n    // groups slices.\n    //\n    // We use the  2x scale here since we only want to plot values for\n    // \"real\" pixels.\n    const sliceWidth = Math.floor(bufferLength / width) * PIXEL_DENSITY;\n    const h = height;\n    canvasCtx.beginPath();\n\n    // Iterate over the width of the canvas in \"real\" pixels.\n    for (let j = 0; j <= renderWidth; j++) {\n      const amplitude = sliceAverage(dataArray, sliceWidth, j);\n      const percentAmplitude = amplitude / 255; // dataArray gives us bytes\n      const y = (1 - percentAmplitude) * h; // flip y\n      const x = j * PIXEL_DENSITY;\n\n      // Canvas coordinates are in the middle of the pixel by default.\n      // When we want to draw pixel perfect lines, we will need to\n      // account for that here\n      if (x === 0) {\n        canvasCtx.moveTo(x, y);\n      } else {\n        canvasCtx.lineTo(x, y);\n      }\n    }\n    canvasCtx.stroke();\n  }, [analyser, bufferLength, colors, dataArray, height, renderWidth, width]);\n}\n;// CONCATENATED MODULE: ./js/components/useBarVisualizer.ts\n\n\n\nconst useBarVisualizer_PIXEL_DENSITY = 2;\nconst BAR_WIDTH = 3 * useBarVisualizer_PIXEL_DENSITY;\nconst GRADIENT_COLOR_COUNT = 16;\nconst PEAK_COLOR_INDEX = 23;\nconst BAR_PEAK_DROP_RATE = 0.01;\nconst NUM_BARS = 20;\nfunction octaveBucketsForBufferLength(bufferLength) {\n  const octaveBuckets = new Array(NUM_BARS).fill(0);\n  const minHz = 200;\n  const maxHz = 22050;\n  const octaveStep = Math.pow(maxHz / minHz, 1 / NUM_BARS);\n  octaveBuckets[0] = 0;\n  octaveBuckets[1] = minHz;\n  for (let i = 2; i < NUM_BARS - 1; i++) {\n    octaveBuckets[i] = octaveBuckets[i - 1] * octaveStep;\n  }\n  octaveBuckets[NUM_BARS - 1] = maxHz;\n  for (let i = 0; i < NUM_BARS; i++) {\n    const octaveIdx = Math.floor(octaveBuckets[i] / maxHz * bufferLength);\n    octaveBuckets[i] = octaveIdx;\n  }\n  return octaveBuckets;\n}\nfunction preRenderBar(height, colors, renderHeight) {\n  /**\n   * The order of the colours is commented in the file: the fist two colours\n   * define the background and dots (check it to see what are the dots), the\n   * next 16 colours are the analyzer's colours from top to bottom, the next\n   * 5 colours are the oscilloscope's ones, from center to top/bottom, the\n   * last colour is for the analyzer's peak markers.\n   */\n\n  // Off-screen canvas for pre-rendering a single bar gradient\n  const barCanvas = document.createElement(\"canvas\");\n  barCanvas.width = BAR_WIDTH;\n  barCanvas.height = height;\n  const offset = 2; // The first two colors are for the background;\n  const gradientColors = colors.slice(offset, offset + GRADIENT_COLOR_COUNT);\n  const barCanvasCtx = barCanvas.getContext(\"2d\");\n  if (barCanvasCtx == null) {\n    throw new Error(\"Could not construct canvas context\");\n  }\n  const multiplier = GRADIENT_COLOR_COUNT / renderHeight;\n  // In shade mode, the five colors are, from top to bottom:\n  // 214, 102, 0 -- 3\n  // 222, 165, 24 -- 6\n  // 148, 222, 33 -- 9\n  // 57, 181, 16 -- 12\n  // 24, 132, 8 -- 15\n  // TODO: This could probably be improved by iterating backwards\n  for (let i = 0; i < renderHeight; i++) {\n    const colorIndex = GRADIENT_COLOR_COUNT - 1 - Math.floor(i * multiplier);\n    barCanvasCtx.fillStyle = gradientColors[colorIndex];\n    const y = height - i * useBarVisualizer_PIXEL_DENSITY;\n    barCanvasCtx.fillRect(0, y, BAR_WIDTH, useBarVisualizer_PIXEL_DENSITY);\n  }\n  return barCanvas;\n}\nfunction usePaintBar({\n  renderHeight,\n  height\n}) {\n  const colors = useTypedSelector(getSkinColors);\n  const getWindowShade = useTypedSelector(selectors_getWindowShade);\n  const windowShade = getWindowShade(\"main\");\n  const barCanvas = (0,react.useMemo)(() => {\n    return preRenderBar(height, colors, renderHeight);\n  }, [colors, height, renderHeight]);\n  return (0,react.useCallback)((ctx, x, barHeight, peakHeight) => {\n    barHeight = Math.ceil(barHeight) * useBarVisualizer_PIXEL_DENSITY;\n    peakHeight = Math.ceil(peakHeight) * useBarVisualizer_PIXEL_DENSITY;\n    if (barHeight > 0 || peakHeight > 0) {\n      const y = height - barHeight;\n      // Draw the gradient\n      const b = BAR_WIDTH;\n      if (height > 0) {\n        ctx.drawImage(barCanvas, 0, y, b, height, x, y, b, height);\n      }\n\n      // Draw the gray peak line\n      if (!windowShade) {\n        const peakY = height - peakHeight;\n        ctx.fillStyle = colors[PEAK_COLOR_INDEX];\n        ctx.fillRect(x, peakY, b, useBarVisualizer_PIXEL_DENSITY);\n      }\n    }\n  }, [barCanvas, colors, height, windowShade]);\n}\nfunction usePaintBarFrame({\n  renderHeight,\n  height,\n  analyser\n}) {\n  const [barPeaks] = (0,react.useState)(() => new Array(NUM_BARS).fill(0));\n  const [barPeakFrames] = (0,react.useState)(() => new Array(NUM_BARS).fill(0));\n  const bufferLength = analyser.frequencyBinCount;\n  const octaveBuckets = (0,react.useMemo)(() => {\n    return octaveBucketsForBufferLength(bufferLength);\n  }, [bufferLength]);\n  const dataArray = (0,react.useMemo)(() => {\n    return new Uint8Array(bufferLength);\n  }, [bufferLength]);\n  const paintBar = usePaintBar({\n    height,\n    renderHeight\n  });\n  return (0,react.useCallback)(canvasCtx => {\n    analyser.getByteFrequencyData(dataArray);\n    const heightMultiplier = renderHeight / 256;\n    const xOffset = BAR_WIDTH + useBarVisualizer_PIXEL_DENSITY; // Bar width, plus a pixel of spacing to the right.\n    for (let j = 0; j < NUM_BARS - 1; j++) {\n      const start = octaveBuckets[j];\n      const end = octaveBuckets[j + 1];\n      let amplitude = 0;\n      for (let k = start; k < end; k++) {\n        amplitude += dataArray[k];\n      }\n      amplitude /= end - start;\n\n      // The drop rate should probably be normalized to the rendering FPS, for now assume 60 FPS\n      let barPeak = barPeaks[j] - BAR_PEAK_DROP_RATE * Math.pow(barPeakFrames[j], 2);\n      if (barPeak < amplitude) {\n        barPeak = amplitude;\n        barPeakFrames[j] = 0;\n      } else {\n        barPeakFrames[j] += 1;\n      }\n      barPeaks[j] = barPeak;\n      paintBar(canvasCtx, j * xOffset, amplitude * heightMultiplier, barPeak * heightMultiplier);\n    }\n  }, [analyser, barPeakFrames, barPeaks, dataArray, octaveBuckets, paintBar, renderHeight]);\n}\n;// CONCATENATED MODULE: ./js/components/Visualizer.tsx\n\n\n\n\n\n\n\n\nconst Visualizer_PIXEL_DENSITY = 2;\n// Pre-render the background grid\nfunction preRenderBg(width, height, bgColor, fgColor, windowShade) {\n  // Off-screen canvas for pre-rendering the background\n  const bgCanvas = document.createElement(\"canvas\");\n  bgCanvas.width = width;\n  bgCanvas.height = height;\n  const distance = 2 * Visualizer_PIXEL_DENSITY;\n  const bgCanvasCtx = bgCanvas.getContext(\"2d\");\n  if (bgCanvasCtx == null) {\n    throw new Error(\"Could not construct canvas context\");\n  }\n  bgCanvasCtx.fillStyle = bgColor;\n  bgCanvasCtx.fillRect(0, 0, width, height);\n  if (!windowShade) {\n    bgCanvasCtx.fillStyle = fgColor;\n    for (let x = 0; x < width; x += distance) {\n      for (let y = Visualizer_PIXEL_DENSITY; y < height; y += distance) {\n        bgCanvasCtx.fillRect(x, y, Visualizer_PIXEL_DENSITY, Visualizer_PIXEL_DENSITY);\n      }\n    }\n  }\n  return bgCanvas;\n}\nfunction Visualizer_Visualizer({\n  analyser\n}) {\n  (0,react.useLayoutEffect)(() => {\n    analyser.fftSize = 2048;\n  }, [analyser.fftSize]);\n  const colors = useTypedSelector(getSkinColors);\n  const style = useTypedSelector(selectors_getVisualizerStyle);\n  const status = useTypedSelector(getMediaStatus);\n  const getWindowShade = useTypedSelector(selectors_getWindowShade);\n  const dummyVizData = useTypedSelector(getDummyVizData);\n  const toggleVisualizerStyle = useActionCreator(actionCreators_toggleVisualizerStyle);\n  const windowShade = getWindowShade(\"main\");\n  const renderWidth = windowShade ? 38 : 76;\n  const renderHeight = windowShade ? 5 : 16;\n  const width = renderWidth * Visualizer_PIXEL_DENSITY;\n  const height = renderHeight * Visualizer_PIXEL_DENSITY;\n  const bgCanvas = (0,react.useMemo)(() => {\n    return preRenderBg(width, height, colors[0], colors[1], Boolean(windowShade));\n  }, [colors, height, width, windowShade]);\n  const paintOscilloscopeFrame = usePaintOscilloscopeFrame({\n    analyser,\n    height,\n    width,\n    renderWidth\n  });\n  const paintBarFrame = usePaintBarFrame({\n    analyser,\n    height,\n    renderHeight\n  });\n  const paintBar = usePaintBar({\n    height,\n    renderHeight\n  });\n  const paintFrame = (0,react.useCallback)(canvasCtx => {\n    if (status !== MEDIA_STATUS.PLAYING) {\n      return;\n    }\n    if (dummyVizData) {\n      canvasCtx.drawImage(bgCanvas, 0, 0);\n      Object.entries(dummyVizData).forEach(([i, value]) => {\n        paintBar(canvasCtx, Number(i), value, -1);\n      });\n      return;\n    }\n    switch (style) {\n      case VISUALIZERS.OSCILLOSCOPE:\n        canvasCtx.drawImage(bgCanvas, 0, 0);\n        paintOscilloscopeFrame(canvasCtx);\n        break;\n      case VISUALIZERS.BAR:\n        canvasCtx.drawImage(bgCanvas, 0, 0);\n        paintBarFrame(canvasCtx);\n        break;\n      default:\n        canvasCtx.clearRect(0, 0, width, height);\n    }\n  }, [bgCanvas, dummyVizData, height, paintBar, paintBarFrame, paintOscilloscopeFrame, status, style, width]);\n  const [canvas, setCanvas] = (0,react.useState)(null);\n  (0,react.useLayoutEffect)(() => {\n    if (canvas == null) {\n      return;\n    }\n    const canvasCtx = canvas.getContext(\"2d\");\n    if (canvasCtx == null) {\n      return;\n    }\n    canvasCtx.imageSmoothingEnabled = false;\n    let animationRequest = null;\n    // Kick off the animation loop\n    const loop = () => {\n      paintFrame(canvasCtx);\n      animationRequest = window.requestAnimationFrame(loop);\n    };\n    loop();\n    return () => {\n      if (animationRequest != null) {\n        window.cancelAnimationFrame(animationRequest);\n      }\n    };\n  }, [canvas, paintFrame]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"canvas\", {\n    id: \"visualizer\",\n    ref: setCanvas,\n    style: {\n      width: renderWidth,\n      height: renderHeight\n    },\n    width: width,\n    height: height,\n    onClick: toggleVisualizerStyle\n  });\n}\n/* harmony default export */ const components_Visualizer = (Visualizer_Visualizer);\n;// CONCATENATED MODULE: ./js/components/MainWindow/ActionButtons.tsx\n\n\n\n\n\nconst ActionButtons = /*#__PURE__*/(0,react.memo)(() => {\n  const previous = useActionCreator(media_previous);\n  const play = useActionCreator(media_play);\n  const pause = useActionCreator(media_pause);\n  const next = useActionCreator(media_next);\n  const stop = useActionCreator(media_stop);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    className: \"actions\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"previous\",\n      onClick: previous,\n      title: \"Previous Track\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"play\",\n      onClick: play,\n      title: \"Play\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"pause\",\n      onClick: pause,\n      title: \"Pause\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"stop\",\n      onClick: stop,\n      title: \"Stop\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"next\",\n      onClick: next,\n      title: \"Next Track\"\n    })]\n  });\n});\n/* harmony default export */ const MainWindow_ActionButtons = (ActionButtons);\n;// CONCATENATED MODULE: ./js/components/Balance.tsx\n\n\n\n\n\nfunction Balance({\n  style,\n  className,\n  id\n}) {\n  const balance = useTypedSelector(getBalance);\n  const setBalance = useActionCreator(media_setBalance);\n  const setFocus = useActionCreator(actionCreators_setFocus);\n  const unsetFocus = useActionCreator(actionCreators_unsetFocus);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"input\", {\n    id: id,\n    className: className,\n    type: \"range\",\n    min: \"-100\",\n    max: \"100\",\n    step: \"1\",\n    value: balance,\n    style: style,\n    onChange: e => setBalance(Number(e.target.value)),\n    onMouseDown: () => setFocus(\"balance\"),\n    onMouseUp: unsetFocus,\n    title: \"Balance\"\n  });\n}\n;// CONCATENATED MODULE: ./js/components/MainWindow/MainBalance.tsx\n\n\n\n\n\nconst offsetFromBalance = balance => {\n  const percent = Math.abs(balance) / 100;\n  const sprite = Math.floor(percent * 27);\n  const offset = sprite * 15;\n  return offset;\n};\nconst MainBalance = /*#__PURE__*/(0,react.memo)(() => {\n  const balance = useTypedSelector(getBalance);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(Balance, {\n    id: \"balance\",\n    style: {\n      backgroundPosition: `0 -${offsetFromBalance(balance)}px`\n    }\n  });\n});\n/* harmony default export */ const MainWindow_MainBalance = (MainBalance);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Close.tsx\n\n\n\n\n\nconst Close = /*#__PURE__*/(0,react.memo)(() => {\n  const close = useActionCreator(actionCreators_close);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_ClickedDiv, {\n    id: \"close\",\n    onClick: close,\n    title: \"Close\"\n  });\n});\n/* harmony default export */ const MainWindow_Close = (Close);\n;// CONCATENATED MODULE: ./js/components/MainWindow/ClutterBar.tsx\n\n\n\n\n\n\n\n\n\nconst {\n  ipcRenderer: ClutterBar_ipcRenderer\n} = window.require('electron');\nfunction setFocusDouble() {\n  return actionCreators_setFocus(\"double\");\n}\nfunction mouseUp() {\n  return dispatch => {\n    dispatch(windows_toggleDoubleSizeMode());\n    dispatch(actionCreators_unsetFocus());\n  };\n}\nconst ClutterBar = /*#__PURE__*/(0,react.memo)(() => {\n  const handleMouseDown = useActionCreator(setFocusDouble);\n  const handleMouseUp = useActionCreator(mouseUp);\n  const doubled = useTypedSelector(getDoubled);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    id: \"clutter-bar\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(components_ContextMenuTarget, {\n      bottom: true,\n      renderMenu: () => /*#__PURE__*/(0,jsx_runtime.jsx)(components_OptionsContextMenu, {}),\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n        id: \"button-o\"\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"button-a\",\n      title: \"Лайк\",\n      onMouseUp: async () => {\n        ClutterBar_ipcRenderer.invoke(\"setLike\").then(() => {});\n      }\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"button-i\",\n      title: \"Моя волна\",\n      onMouseUp: async () => {\n        ClutterBar_ipcRenderer.invoke(\"setMywave\").then(() => {});\n      }\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      title: \"Toggle Doublesize Mode\",\n      id: \"button-d\",\n      className: classnames_default()({\n        selected: doubled\n      }),\n      onMouseUp: handleMouseUp,\n      onMouseDown: handleMouseDown\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"button-v\"\n    })]\n  });\n});\n/* harmony default export */ const MainWindow_ClutterBar = (ClutterBar);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Eject.tsx\n\n\n\n\nconst Eject = /*#__PURE__*/(0,react.memo)(() => {\n  const openMediaFileDialog = useActionCreator(files_openMediaFileDialog);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"eject\",\n    onClick: openMediaFileDialog,\n    title: \"Open File(s)\"\n  });\n});\n/* harmony default export */ const MainWindow_Eject = (Eject);\n;// CONCATENATED MODULE: ./js/components/MainWindow/EqToggleButton.tsx\n\n\n\n\n\n\nfunction toggleEqualizer() {\n  return windows_toggleWindow(\"equalizer\");\n}\nconst EqToggleButton = /*#__PURE__*/(0,react.memo)(() => {\n  const handleClick = useActionCreator(toggleEqualizer);\n  const windowOpen = useTypedSelector(selectors_getWindowOpen)(\"equalizer\");\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"equalizer-button\",\n    className: classnames_default()({\n      selected: windowOpen\n    }),\n    onClick: handleClick,\n    title: \"Toggle Graphical Equalizer\"\n  });\n});\n/* harmony default export */ const MainWindow_EqToggleButton = (EqToggleButton);\n;// CONCATENATED MODULE: ./js/components/MainWindow/PlaylistToggleButton.tsx\n\n\n\n\n\n\nfunction togglePlaylist() {\n  return windows_toggleWindow(\"playlist\");\n}\nconst PlaylistToggleButton = /*#__PURE__*/(0,react.memo)(() => {\n  const selected = useTypedSelector(selectors_getWindowOpen)(\"playlist\");\n  const handleClick = useActionCreator(togglePlaylist);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"playlist-button\",\n    className: classnames_default()({\n      selected\n    }),\n    onClick: handleClick,\n    title: \"Toggle Playlist Editor\"\n  });\n});\n/* harmony default export */ const MainWindow_PlaylistToggleButton = (PlaylistToggleButton);\n;// CONCATENATED MODULE: ./js/components/CharacterString.tsx\n\n\n\nconst CharacterString = /*#__PURE__*/(0,react.memo)(props => {\n  const text = `${props.children}` || \"\";\n  const chars = text.split(\"\");\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(react.Fragment, {\n    children: chars.map((character, index) => /*#__PURE__*/(0,jsx_runtime.jsx)(components_Character, {\n      children: character\n    }, index + character))\n  });\n});\n/* harmony default export */ const components_CharacterString = (CharacterString);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Kbps.tsx\n\n\n\n\n\nconst Kbps = /*#__PURE__*/(0,react.memo)(() => {\n  const kbps = useTypedSelector(getKbps);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"kbps\",\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_CharacterString, {\n      children: kbps || \"\"\n    })\n  });\n});\n/* harmony default export */ const MainWindow_Kbps = (Kbps);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Khz.tsx\n\n\n\n\n\nconst Khz = /*#__PURE__*/(0,react.memo)(() => {\n  const khz = useTypedSelector(getKhz);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"khz\",\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_CharacterString, {\n      children: khz || \"\"\n    })\n  });\n});\n/* harmony default export */ const MainWindow_Khz = (Khz);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Marquee.tsx\n// Single line text display that can animate and hold multiple registers\n// Knows how to display various modes like tracking, volume, balance, etc.\n\n\n\n\n\n\nconst SEPARATOR = \"  ***  \";\nconst CHAR_WIDTH = 5;\nconst MARQUEE_MAX_LENGTH = 31;\n\n// Always positive modulus\nconst mod = (n, m) => (n % m + m) % m;\nconst isLong = text => text.length >= MARQUEE_MAX_LENGTH;\n\n// Given text and step, how many pixels should it be shifted?\nconst stepOffset = (text, step, pixels) => {\n  if (!isLong(text)) {\n    return 0;\n  }\n  const stepOffsetWidth = step * CHAR_WIDTH; // Steps move one char at a time\n  const offset = stepOffsetWidth + pixels;\n  const stringLength = (text.length + SEPARATOR.length) * CHAR_WIDTH;\n  return mod(offset, stringLength);\n};\n\n// Format an int as pixels\nconst pixelUnits = pixels => `${pixels}px`;\n\n// If text is wider than the marquee, it needs to loop\nconst loopText = text => isLong(text) ? `${text}${SEPARATOR}${text}` : text.padEnd(MARQUEE_MAX_LENGTH, \" \");\n// Call `step` every second, except when dragging. Resume stepping 1 second after dragging ceases.\nfunction useStepper({\n  step,\n  dragging\n}) {\n  const [stepping, setStepping] = react.useState(true);\n  react.useEffect(() => {\n    if (stepping === false) {\n      return;\n    }\n    const stepHandle = setInterval(step, 220);\n    return () => clearInterval(stepHandle);\n  }, [step, stepping]);\n  react.useEffect(() => {\n    if (dragging) {\n      setStepping(false);\n      return;\n    }\n    const steppingTimeout = window.setTimeout(() => {\n      setStepping(true);\n    }, 1000);\n    return () => {\n      window.clearTimeout(steppingTimeout);\n    };\n  }, [dragging]);\n}\n\n// When user calls `handleMouseDown`, and moves the mouse, `dragOffset` will update as they drag.\nfunction useDragX() {\n  const [mouseDownX, setMouseDownX] = react.useState(null);\n  const [dragOffset, setDragOffset] = react.useState(0);\n  react.useEffect(() => {\n    if (mouseDownX == null) {\n      return;\n    }\n    const xStart = mouseDownX;\n    const handleMouseMove = ee => {\n      const diff = ee.clientX - xStart;\n      setDragOffset(-diff);\n    };\n\n    // TODO: Use `once` or something instead of this flag nonsense\n    let cleanedUp = false;\n    const handleMouseUp = () => {\n      if (cleanedUp) {\n        return;\n      }\n      document.removeEventListener(\"mousemove\", handleMouseMove);\n      document.removeEventListener(\"mouseUp\", handleMouseUp);\n      setMouseDownX(null);\n      cleanedUp = true;\n    };\n    document.addEventListener(\"mousemove\", handleMouseMove);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n    return handleMouseUp;\n  }, [mouseDownX]);\n  const handleMouseDown = react.useCallback(e => {\n    setMouseDownX(e.clientX);\n  }, []);\n  return {\n    handleMouseDown,\n    dragOffset,\n    dragging: mouseDownX != null\n  };\n}\nconst Marquee = /*#__PURE__*/react.memo(() => {\n  const text = useTypedSelector(getMarqueeText);\n  const doubled = useTypedSelector(getDoubled);\n  const marqueeStep = useTypedSelector(getMarqueeStep);\n  const stepMarquee = useActionCreator(actionCreators_stepMarquee);\n  const {\n    handleMouseDown,\n    dragOffset,\n    dragging\n  } = useDragX();\n  const offset = stepOffset(text, marqueeStep, dragOffset);\n  const offsetPixels = pixelUnits(-offset);\n  useStepper({\n    step: stepMarquee,\n    dragging\n  });\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"marquee\",\n    className: \"text\",\n    onMouseDown: handleMouseDown,\n    title: \"Song Title\",\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      style: {\n        whiteSpace: \"nowrap\",\n        willChange: \"transform\",\n        transform: `translateX(${offsetPixels})`\n      }\n      // Force the DOM node to be recreated when the doubled size changes.\n      // This works around a Chrome browser bug where the `will-change: transform;`\n      // on this node seems to cause a change to the `image-rendering:\n      // pixelated;` which we inherit from `#webamp` not to be respected.\n      ,\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_CharacterString, {\n        children: loopText(text)\n      })\n    }, doubled ? \"doubled\" : \"not-doubled\")\n  });\n});\n/* harmony default export */ const MainWindow_Marquee = (Marquee);\n;// CONCATENATED MODULE: ./js/components/MainWindow/MonoStereo.tsx\n\n\n\n\n\n\nconst MonoStereo = /*#__PURE__*/(0,react.memo)(() => {\n  const channels = useTypedSelector(getChannels);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    className: \"mono-stereo\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"stereo\",\n      className: classnames_default()({\n        selected: channels === 2\n      })\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"mono\",\n      className: classnames_default()({\n        selected: channels === 1\n      })\n    })]\n  });\n});\n/* harmony default export */ const MainWindow_MonoStereo = (MonoStereo);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Position.tsx\n\n\n\n\n\nfunction usePosition() {\n  const duration = useTypedSelector(getDuration);\n  const timeElapsed = useTypedSelector(getTimeElapsed);\n  const position = duration ? Math.floor(timeElapsed) / duration * 100 : 0;\n  const scrubPosition = useTypedSelector(getUserInputScrubPosition);\n  const userInputFocus = useTypedSelector(getUserInputFocus);\n  const displayedPosition = userInputFocus === \"position\" ? scrubPosition : position;\n  return [position, displayedPosition];\n}\nconst Position = /*#__PURE__*/(0,react.memo)(() => {\n  const [position, displayedPosition] = usePosition();\n  const dispatch = useTypedDispatch();\n  const seekToPercentComplete = (0,react.useCallback)(e => {\n    dispatch({\n      type: SEEK_TO_PERCENT_COMPLETE,\n      percent: Number(e.target.value)\n    });\n    dispatch({\n      type: UNSET_FOCUS\n    });\n  }, [dispatch]);\n  const setPosition = (0,react.useCallback)(e => {\n    dispatch({\n      type: SET_FOCUS,\n      input: \"position\"\n    });\n    dispatch({\n      type: SET_SCRUB_POSITION,\n      position: Number(e.target.value)\n    });\n  }, [dispatch]);\n\n  // In shade mode, the position slider shows up differently depending on if\n  // it's near the start, middle or end of its progress\n  let className = \"\";\n  if (position <= 33) {\n    className = \"left\";\n  } else if (position >= 66) {\n    className = \"right\";\n  }\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"input\", {\n    id: \"position\",\n    className: className,\n    type: \"range\",\n    min: \"0\",\n    max: \"100\",\n    step: \"1\",\n    value: displayedPosition,\n    onInput: setPosition,\n    onChange: () => {} /* React complains without this, can probably rename onInput to onChange */,\n\n    onMouseUp: seekToPercentComplete,\n    onMouseDown: setPosition,\n    title: \"Seeking Bar\"\n  });\n});\n/* harmony default export */ const MainWindow_Position = (Position);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Repeat.tsx\n\n\n\n\n\n\n\n\nconst Repeat = /*#__PURE__*/(0,react.memo)(() => {\n  const repeat = useTypedSelector(getRepeat);\n  const handleClick = useActionCreator(media_toggleRepeat);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenuWraper, {\n    renderContents: () => /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      checked: repeat,\n      label: \"Repeat\",\n      onClick: handleClick,\n      hotkey: \"(R)\"\n    }),\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"repeat\",\n      className: classnames_default()({\n        selected: repeat\n      }),\n      onClick: handleClick,\n      title: \"Toggle Repeat\"\n    })\n  });\n});\n/* harmony default export */ const MainWindow_Repeat = (Repeat);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Shade.tsx\n\n\n\n\n\nconst Shade = /*#__PURE__*/(0,react.memo)(() => {\n  const handleClick = useActionCreator(windows_toggleMainWindowShadeMode);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_ClickedDiv, {\n    id: \"shade\",\n    onMouseDown: handleClick,\n    onDoubleClick: e => e.stopPropagation(),\n    title: \"Toggle Windowshade Mode\"\n  });\n});\n/* harmony default export */ const MainWindow_Shade = (Shade);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Minimize.tsx\n\n\n\n\n\nconst Minimize = /*#__PURE__*/(0,react.memo)(() => {\n  const minimize = useActionCreator(actionCreators_minimize);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_ClickedDiv, {\n    id: \"minimize\",\n    title: \"Minimize\",\n    onClick: minimize\n  });\n});\n/* harmony default export */ const MainWindow_Minimize = (Minimize);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Shuffle.tsx\n\n\n\n\n\n\n\n\nconst Shuffle = /*#__PURE__*/(0,react.memo)(() => {\n  const shuffle = useTypedSelector(getShuffle);\n  const handleClick = useActionCreator(media_toggleShuffle);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenuWraper, {\n    renderContents: () => /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      checked: shuffle,\n      label: \"Shuffle\",\n      onClick: handleClick,\n      hotkey: \"(S)\"\n    }),\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"shuffle\",\n      className: classnames_default()({\n        selected: shuffle\n      }),\n      onClick: handleClick,\n      title: \"Toggle Shuffle\"\n    })\n  });\n});\n/* harmony default export */ const MainWindow_Shuffle = (Shuffle);\n;// CONCATENATED MODULE: ./js/components/MainWindow/Time.tsx\n\n\n\n\n\n\n\n\nconst Time = /*#__PURE__*/(0,react.memo)(() => {\n  const toggleTimeMode = useActionCreator(media_toggleTimeMode);\n  const timeElapsed = useTypedSelector(getTimeElapsed);\n  const duration = useTypedSelector(getDuration) || 0;\n  const timeMode = useTypedSelector(getTimeMode);\n  const seconds = timeMode === TIME_MODE.ELAPSED ? timeElapsed : duration - timeElapsed;\n  const timeObj = getTimeObj(seconds);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    id: \"time\",\n    onClick: toggleTimeMode,\n    className: \"countdown\",\n    children: [timeMode === TIME_MODE.REMAINING && /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"minus-sign\"\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"minute-first-digit\",\n      className: `digit digit-${timeObj.minutesFirstDigit}`\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"minute-second-digit\",\n      className: `digit digit-${timeObj.minutesSecondDigit}`\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"second-first-digit\",\n      className: `digit digit-${timeObj.secondsFirstDigit}`\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"second-second-digit\",\n      className: `digit digit-${timeObj.secondsSecondDigit}`\n    })]\n  });\n});\n/* harmony default export */ const MainWindow_Time = (Time);\n;// CONCATENATED MODULE: ./js/components/Volume.tsx\n\n\n\n\n\nfunction Volume({\n  id,\n  style,\n  className\n}) {\n  const volume = useTypedSelector(getVolume);\n  const setFocus = useActionCreator(actionCreators_setFocus);\n  const unsetFocus = useActionCreator(actionCreators_unsetFocus);\n  const setVolume = useActionCreator(media_setVolume);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"input\", {\n    id: id,\n    type: \"range\",\n    min: \"0\",\n    max: \"100\",\n    step: \"1\",\n    value: volume,\n    style: style,\n    className: className,\n    onChange: e => setVolume(Number(e.target.value)),\n    onMouseDown: () => setFocus(\"volume\"),\n    onMouseUp: unsetFocus,\n    title: \"Volume Bar\"\n  });\n}\n;// CONCATENATED MODULE: ./js/components/MainWindow/MainVolume.tsx\n\n\n\n\n\nconst MainVolume = /*#__PURE__*/(0,react.memo)(() => {\n  const volume = useTypedSelector(getVolume);\n  const percent = volume / 100;\n  const sprite = Math.round(percent * 28);\n  const offset = (sprite - 1) * 15;\n  const style = {\n    backgroundPosition: `0 -${offset}px`\n  };\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"volume\",\n    style: style,\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(Volume, {})\n  });\n});\n/* harmony default export */ const MainWindow_MainVolume = (MainVolume);\n// EXTERNAL MODULE: ./css/main-window.css\nvar main_window = __webpack_require__(6289);\n;// CONCATENATED MODULE: ./js/components/MainWindow/index.tsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst {\n  ipcRenderer: MainWindow_ipcRenderer\n} = window.require('electron');\nfunction loadMediaAndPlay(e) {\n  return files_loadMedia(e, LOAD_STYLE.PLAY);\n}\nconst MainWindow = /*#__PURE__*/react.memo(({\n  analyser,\n  filePickers\n}) => {\n  const mainShade = useTypedSelector(selectors_getWindowShade)(\"main\");\n  const status = useTypedSelector(getMediaStatus);\n  const focused = useTypedSelector(getFocusedWindow);\n  const loading = useTypedSelector(getLoading);\n  const doubled = useTypedSelector(getDoubled);\n  const llama = useTypedSelector(getLlamaMode);\n  const working = useTypedSelector(getWorking);\n  const className = classnames_default()({\n    window: true,\n    play: status === MEDIA_STATUS.PLAYING,\n    stop: status === MEDIA_STATUS.STOPPED,\n    pause: status === MEDIA_STATUS.PAUSED,\n    selected: focused === WINDOWS.MAIN,\n    shade: mainShade,\n    draggable: true,\n    loading,\n    doubled,\n    llama\n  });\n  const toggleMainWindowShadeMode = useActionCreator(windows_toggleMainWindowShadeMode);\n  const scrollVolume = useActionCreator(media_scrollVolume);\n  const loadMedia = useActionCreator(loadMediaAndPlay);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_DropTarget, {\n    id: \"main-window\",\n    windowId: WINDOWS.MAIN,\n    className: className,\n    handleDrop: loadMedia,\n    children: /*#__PURE__*/(0,jsx_runtime.jsxs)(components_FocusTarget, {\n      windowId: WINDOWS.MAIN,\n      children: [/*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        id: \"title-bar\",\n        className: \"selected draggable\",\n        onDoubleClick: toggleMainWindowShadeMode,\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(components_ContextMenuTarget, {\n          id: \"option-context\",\n          bottom: true,\n          renderMenu: () => /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_MainContextMenu, {\n            filePickers: filePickers\n          }),\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_ClickedDiv, {\n            id: \"option\",\n            title: \"Winamp Menu\"\n          })\n        }), mainShade && /*#__PURE__*/(0,jsx_runtime.jsx)(components_MiniTime, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Minimize, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Shade, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Close, {})]\n      }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"status\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_ClutterBar, {}), !working && /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"play-pause\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"work-indicator\",\n          className: classnames_default()({\n            selected: working\n          })\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Time, {})]\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(components_Visualizer\n      // @ts-ignore Visualizer is not typed yet\n      , {\n        analyser: analyser\n      }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"media-info\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Marquee, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Kbps, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Khz, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_MonoStereo, {})]\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_MainVolume, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_MainBalance, {}), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"windows\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_EqToggleButton, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_PlaylistToggleButton, {})]\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Position, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_ActionButtons, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Eject, {}), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"shuffle-repeat\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Shuffle, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_Repeat, {})]\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"a\", {\n        id: \"about\",\n        href: \"#\",\n        title: \"Yaamp\",\n        onClick: async () => {\n          MainWindow_ipcRenderer.invoke(\"openLink\", {\n            link: \"https://yaamp.ru/\"\n          }).then(() => {});\n        }\n      })]\n    })\n  });\n});\n/* harmony default export */ const components_MainWindow = (MainWindow);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/PlaylistResizeTarget.tsx\n\n\n\n\n\nfunction PlaylistResizeTarget({\n  widthOnly\n}) {\n  const windowSize = useTypedSelector(selectors_getWindowSize);\n  const setWindowSize = useActionCreator(windows_setWindowSize);\n  const currentSize = windowSize(\"playlist\");\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_ResizeTarget, {\n    currentSize: currentSize,\n    id: \"playlist-resize-target\",\n    setWindowSize: size => {\n      setWindowSize(\"playlist\", size);\n    },\n    widthOnly: widthOnly\n  });\n}\n/* harmony default export */ const PlaylistWindow_PlaylistResizeTarget = (PlaylistResizeTarget);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/PlaylistShade.tsx\n\n\n\n\n\n\n\n\n\n\n\nfunction PlaylistShade() {\n  const focused = useTypedSelector(getFocusedWindow);\n  const getWindowSize = useTypedSelector(selectors_getWindowSize);\n  const playlistSize = getWindowSize(\"playlist\");\n  const duration = useTypedSelector(getDuration);\n  const name = useTypedSelector(getMinimalMediaText);\n  const closeWindow = useActionCreator(windows_closeWindow);\n  const toggleShade = useActionCreator(togglePlaylistShadeMode);\n  const focusWindow = useActionCreator(windows_setFocusedWindow);\n  const addedWidth = playlistSize[0] * WINDOW_RESIZE_SEGMENT_WIDTH;\n  const trimmedName = (0,react.useMemo)(() => {\n    if (name == null) {\n      return \"[No file]\";\n    }\n    const MIN_NAME_WIDTH = 205;\n    const nameLength = (MIN_NAME_WIDTH + addedWidth) / CHARACTER_WIDTH;\n    return name.length > nameLength ? name.slice(0, nameLength - 1) + UTF8_ELLIPSIS : name;\n  }, [addedWidth, name]);\n  const time = (0,react.useMemo)(() => {\n    return name == null ? \"\" : getTimeStr(duration);\n  }, [duration, name]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"playlist-window-shade\",\n    className: classnames_default()(\"window\", \"draggable\", {\n      selected: focused === WINDOWS.PLAYLIST\n    }),\n    style: {\n      width: `${WINDOW_WIDTH + addedWidth}px`\n    },\n    onMouseDown: () => focusWindow(\"playlist\"),\n    onDoubleClick: toggleShade,\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"left\",\n      children: /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"right draggable\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"playlist-shade-track-title\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_CharacterString, {\n            children: trimmedName\n          })\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"playlist-shade-time\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_CharacterString, {\n            children: time\n          })\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_PlaylistResizeTarget, {\n          widthOnly: true\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"playlist-shade-button\",\n          onClick: toggleShade\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"playlist-close-button\",\n          onClick: () => closeWindow(\"playlist\")\n        })]\n      })\n    })\n  });\n}\n/* harmony default export */ const PlaylistWindow_PlaylistShade = (PlaylistShade);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/PlaylistMenuEntry.tsx\n\n\n\n\n// We implement hover ourselves, because we hate ourselves and https://stackoverflow.com/a/13259049/1263117\nfunction PlaylistMenuEntry({\n  children\n}) {\n  const {\n    ref,\n    hover\n  } = useIsHovered();\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"li\", {\n    ref: ref,\n    className: classnames_default()({\n      hover\n    }),\n    children: children\n  });\n}\n/* harmony default export */ const PlaylistWindow_PlaylistMenuEntry = (/*#__PURE__*/(0,react.memo)(PlaylistMenuEntry));\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/PlaylistMenu.tsx\n\n\n\n\n\n\nfunction PlaylistMenu(props) {\n  const [selected, setSelected] = (0,react.useState)(false);\n  const [ref, setRef] = (0,react.useState)(null);\n  const callback = (0,react.useCallback)(() => {\n    // If we've clicked on a Context Menu spawed inside this menu, it will\n    // register as an external click. However, hiding the menu will remove\n    // the Context Menu from the DOM. Therefore, we wait until the next\n    // event loop to actually hide ourselves.\n    setTimeout(() => {\n      // Close the menu\n      setSelected(false);\n    }, 0);\n  }, []);\n  useOnClickAway(ref, selected ? callback : null);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    id: props.id,\n    className: classnames_default()(\"playlist-menu\", {\n      selected\n    }),\n    ref: setRef,\n    onClick: () => setSelected(selected_ => !selected_),\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"bar\"\n    }), selected && /*#__PURE__*/(0,jsx_runtime.jsx)(\"ul\", {\n      children: react.Children.map(props.children, (child, i) => /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_PlaylistMenuEntry, {\n        children: child\n      }, i))\n    })]\n  });\n}\n/* harmony default export */ const PlaylistWindow_PlaylistMenu = (/*#__PURE__*/(0,react.memo)(PlaylistMenu));\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/AddMenu.tsx\n\n\n\n\n\n\nconst AddMenu = () => {\n  const nextIndex = useTypedSelector(getTrackCount);\n  const addDirAtIndex = useActionCreator(files_addDirAtIndex);\n  const addFilesAtIndex = useActionCreator(files_addFilesAtIndex);\n  const addFilesFromUrl = useActionCreator(files_addFilesFromUrl);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(PlaylistWindow_PlaylistMenu, {\n    id: \"playlist-add-menu\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"add-url\",\n      onClick: () => addFilesFromUrl(nextIndex)\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"add-dir\",\n      onClick: () => addDirAtIndex(nextIndex)\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"add-file\",\n      onClick: () => addFilesAtIndex(nextIndex)\n    })]\n  });\n};\n/* harmony default export */ const PlaylistWindow_AddMenu = (AddMenu);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/RemoveMenu.tsx\n\n\n\n\n/* eslint-disable no-alert */\n\n\nconst RemoveMenu = () => {\n  const removeSelected = useActionCreator(removeSelectedTracks);\n  const removeAll = useActionCreator(playlist_removeAllTracks);\n  const crop = useActionCreator(cropPlaylist);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(PlaylistWindow_PlaylistMenu, {\n    id: \"playlist-remove-menu\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"remove-misc\",\n      onClick: () => alert(\"Not supported in Yaamp\")\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"remove-all\",\n      onClick: removeAll\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"crop\",\n      onClick: crop\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"remove-selected\",\n      onClick: removeSelected\n    })]\n  });\n};\n/* harmony default export */ const PlaylistWindow_RemoveMenu = (RemoveMenu);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/SelectionMenu.tsx\n\n\n\n\n\nfunction SelectionMenu() {\n  const invert = useActionCreator(invertSelection);\n  const zero = useActionCreator(playlist_selectZero);\n  const all = useActionCreator(selectAll);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(PlaylistWindow_PlaylistMenu, {\n    id: \"playlist-selection-menu\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"invert-selection\",\n      onClick: invert\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"select-zero\",\n      onClick: zero\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"select-all\",\n      onClick: all\n    })]\n  });\n}\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/SortContextMenu.tsx\n\n\n\n\n\n\n\n/* eslint-disable no-alert */\n/* TODO: This should really be kitty-corner to the upper right hand corner of the MiscMenu */\nfunction SortContextMenu() {\n  const reverseList = useActionCreator(playlist_reverseList);\n  const randomizeList = useActionCreator(playlist_randomizeList);\n  const sortListByTitle = useActionCreator(playlist_sortListByTitle);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_ContextMenuTarget, {\n    style: {\n      width: \"100%\",\n      height: \"100%\"\n    },\n    top: true,\n    renderMenu: () => /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        label: \"Sort list by title\",\n        onClick: sortListByTitle\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        label: \"Reverse list\",\n        onClick: reverseList\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        label: \"Randomize list\",\n        onClick: randomizeList\n      })]\n    }),\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {})\n  });\n}\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/MiscOptionsContextMenu.tsx\n\n\n\n\n\nconst MiscOptionsContextMenu = () => {\n  const downloadHtmlPlaylist = useActionCreator(files_downloadHtmlPlaylist);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_ContextMenuTarget, {\n    top: true,\n    renderMenu: () => /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n      onClick: downloadHtmlPlaylist,\n      label: \"Generate HTML playlist\"\n    }),\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {})\n  });\n};\n/* harmony default export */ const PlaylistWindow_MiscOptionsContextMenu = (MiscOptionsContextMenu);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/MiscMenu.tsx\n\n\n\n\n\nconst MiscMenu = () => /*#__PURE__*/(0,jsx_runtime.jsxs)(PlaylistWindow_PlaylistMenu, {\n  id: \"playlist-misc-menu\",\n  children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    className: \"sort-list\",\n    onClick: e => e.stopPropagation(),\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(SortContextMenu, {})\n  }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    className: \"file-info\",\n    onClick: () => alert(\"Not supported in Yaamp\")\n  }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    className: \"misc-options\",\n    onClick: e => e.stopPropagation(),\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_MiscOptionsContextMenu, {})\n  })]\n});\n/* harmony default export */ const PlaylistWindow_MiscMenu = (MiscMenu);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/ListMenu.tsx\n\n\n\n\n/* eslint-disable no-alert */\n\n\nfunction ListMenu() {\n  const removeAllTracks = useActionCreator(playlist_removeAllTracks);\n  const addFilesFromList = useActionCreator(files_addFilesFromList);\n  const saveFilesToList = useActionCreator(files_saveFilesToList);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(PlaylistWindow_PlaylistMenu, {\n    id: \"playlist-list-menu\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"new-list\",\n      onClick: removeAllTracks\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"save-list\",\n      onClick: saveFilesToList\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"load-list\",\n      onClick: addFilesFromList\n    })]\n  });\n}\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/RunningTimeDisplay.tsx\n\n\n\n\n\n// While all the browsers I care about support String.prototype.padEnd,\n// Not all node versions do, and I want tests to pass in Jest...\n// Sigh.\n\nfunction rightPad(str, len, fillChar) {\n  while (str.length < len) {\n    str += fillChar;\n  }\n  return str;\n}\nconst RunningTimeDisplay = () => {\n  const runningTimeMessage = useTypedSelector(getRunningTimeMessage);\n  const text = (0,react.useMemo)(() => rightPad(runningTimeMessage, 18, \" \"), [runningTimeMessage]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    className: \"playlist-running-time-display draggable\",\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_CharacterString, {\n        children: text\n      })\n    })\n  });\n};\n/* harmony default export */ const PlaylistWindow_RunningTimeDisplay = (RunningTimeDisplay);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/PlaylistActionArea.tsx\n\n\n\n\n\n\n\nconst PlaylistWindow = () => {\n  const play = useActionCreator(media_play);\n  const pause = useActionCreator(media_pause);\n  const stop = useActionCreator(media_stop);\n  const openMediaFileDialog = useActionCreator(files_openMediaFileDialog);\n  const next = useActionCreator(media_next);\n  const previous = useActionCreator(media_previous);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(react.Fragment, {\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_RunningTimeDisplay, {}), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n      className: \"playlist-action-buttons\",\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n        className: \"playlist-previous-button\",\n        onClick: previous\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n        className: \"playlist-play-button\",\n        onClick: play\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n        className: \"playlist-pause-button\",\n        onClick: pause\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n        className: \"playlist-stop-button\",\n        onClick: stop\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n        className: \"playlist-next-button\",\n        onClick: next\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n        className: \"playlist-eject-button\",\n        onClick: openMediaFileDialog\n      })]\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(components_MiniTime, {})]\n  });\n};\n/* harmony default export */ const PlaylistActionArea = (PlaylistWindow);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/TrackCell.tsx\n\n\n\n\n\n\n\nfunction TrackCell({\n  children,\n  handleMoveClick,\n  index,\n  id\n}) {\n  const skinPlaylistStyle = useTypedSelector(getSkinPlaylistStyle);\n  const selectedTrackIds = useTypedSelector(getSelectedTrackIds);\n  const currentTrackId = useTypedSelector(getCurrentTrackId);\n  const selected = selectedTrackIds.has(id);\n  const current = currentTrackId === id;\n  const dispatch = useTypedDispatch();\n  const playTrackNow = useActionCreator(media_playTrackNow);\n  const onMouseDown = (0,react.useCallback)(e => {\n    if (e.shiftKey) {\n      e.preventDefault();\n      dispatch({\n        type: SHIFT_CLICKED_TRACK,\n        index\n      });\n      return;\n    } else if (e.metaKey || e.ctrlKey) {\n      e.preventDefault();\n      dispatch({\n        type: CTRL_CLICKED_TRACK,\n        index\n      });\n      return;\n    }\n    if (!selected) {\n      dispatch({\n        type: CLICKED_TRACK,\n        index\n      });\n    }\n    handleMoveClick(e);\n  }, [dispatch, handleMoveClick, index, selected]);\n  const style = {\n    backgroundColor: selected ? skinPlaylistStyle.selectedbg : undefined,\n    color: current ? skinPlaylistStyle.current : undefined\n  };\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    className: classnames_default()(\"track-cell\", {\n      selected,\n      current\n    }),\n    style: style,\n    onClick: e => e.stopPropagation(),\n    onMouseDown: onMouseDown,\n    onContextMenu: e => e.preventDefault(),\n    onDoubleClick: () => playTrackNow(id),\n    children: children\n  });\n}\n/* harmony default export */ const PlaylistWindow_TrackCell = (TrackCell);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/TrackTitle.tsx\n\n\n\nconst TrackTitle = ({\n  id,\n  paddedTrackNumber\n}) => {\n  const title = useTypedSelector(selectors_getTrackDisplayName)(id);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"span\", {\n    children: [paddedTrackNumber, \". \", title]\n  });\n};\n/* harmony default export */ const PlaylistWindow_TrackTitle = (TrackTitle);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/TrackList.tsx\n\n\n\n\n\n\n\n\n\n\nfunction getNumberLength(number) {\n  return number.toString().length;\n}\nfunction TrackList() {\n  const offset = useTypedSelector(getScrollOffset);\n  const trackIds = useTypedSelector(getVisibleTrackIds);\n  const tracks = useTypedSelector(getTracks);\n  const numberOfTracks = useTypedSelector(getNumberOfTracks);\n  const selectZero = useActionCreator(playlist_selectZero);\n  const dragSelected = useActionCreator(playlist_dragSelected);\n  const scrollPlaylistByDelta = useActionCreator(playlist_scrollPlaylistByDelta);\n  const [node, setNode] = (0,react.useState)(null);\n  const [moving, setMoving] = (0,react.useState)(false);\n  const [mouseStartY, setMouseStartY] = (0,react.useState)(null);\n  const _handleMoveClick = e => {\n    setMoving(true);\n    setMouseStartY(e.clientY);\n  };\n  (0,react.useEffect)(() => {\n    if (node == null || mouseStartY == null || moving === false) {\n      return;\n    }\n    const {\n      top,\n      bottom,\n      left,\n      right\n    } = node.getBoundingClientRect();\n    let lastDiff = 0;\n    const handleMouseMove = ee => {\n      const {\n        clientY: y,\n        clientX: x\n      } = ee;\n      if (y < top || y > bottom || x < left || x > right) {\n        // Mouse is outside the track list\n        return;\n      }\n      const proposedDiff = Math.floor((y - mouseStartY) / TRACK_HEIGHT);\n      if (proposedDiff !== lastDiff) {\n        const diffDiff = proposedDiff - lastDiff;\n        dragSelected(diffDiff);\n        lastDiff = proposedDiff;\n      }\n    };\n    const handleMouseUp = () => setMoving(false);\n    window.addEventListener(\"mouseup\", handleMouseUp);\n    window.addEventListener(\"mousemove\", handleMouseMove);\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMouseMove);\n      window.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n    // I'm not 100% sure how well this would work if it rebound mid drag, so\n    // we'll just pretend it's okay that we have stale values in there.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [moving]);\n  function _renderTracks(format) {\n    return trackIds.map((id, i) => /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_TrackCell, {\n      id: id,\n      index: offset + i,\n      handleMoveClick: _handleMoveClick,\n      children: format(id, i)\n    }, id));\n  }\n  const maxTrackNumberLength = getNumberLength(numberOfTracks);\n  const paddedTrackNumForIndex = i => (i + 1 + offset).toString().padStart(maxTrackNumberLength, \"\\u00A0\");\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    ref: setNode,\n    className: \"playlist-tracks\",\n    style: {\n      height: \"100%\"\n    },\n    onClick: selectZero,\n    onWheel: scrollPlaylistByDelta,\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"playlist-track-titles\",\n      children: _renderTracks((id, i) => /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_TrackTitle, {\n        id: id,\n        paddedTrackNumber: paddedTrackNumForIndex(i)\n      }))\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      className: \"playlist-track-durations\",\n      children: _renderTracks(id => getTimeStr(tracks[id].duration))\n    })]\n  });\n}\n/* harmony default export */ const PlaylistWindow_TrackList = (TrackList);\n;// CONCATENATED MODULE: ./js/components/VerticalSlider.tsx\n\n\n\n// `<input type=\"range\" />` can be rotated to become a vertical slider using\n// CSS, but that makes it impossible to style the handle in a pixel perfect\n// manner. Instead we reimplement it in React.\nfunction VerticalSlider({\n  value,\n  height,\n  width,\n  handle,\n  handleHeight,\n  onBeforeChange,\n  onChange,\n  onAfterChange,\n  disabled\n}) {\n  const ref = (0,react.useRef)(null);\n  const handleRef = (0,react.useRef)(null);\n  function handleMouseDown(e) {\n    const sliderNode = ref.current;\n    const handleNode = handleRef.current;\n    if (sliderNode == null || handleNode == null) {\n      // I don't think this could ever happen in practice\n      return null;\n    }\n    const sliderRect = sliderNode.getBoundingClientRect();\n    const handleRect = handleNode.getBoundingClientRect();\n    const {\n      top: sliderTop,\n      height: sliderHeight\n    } = sliderRect;\n    const {\n      top: handleTop,\n      height: realHandleHeight\n    } = handleRect;\n\n    // If the user clicks on the handle we want them to continue to hold onto\n    // that point of te handle. If they click outside of the handle (in the\n    // slider itself) we want to center the handle at that point and have them\n    // move the handle from the center.\n    const handleOffset = handleNode.contains(e.target) ? e.clientY - handleTop : realHandleHeight / 2;\n    const baseOffset = sliderTop + handleOffset;\n    // Measure the actual rect height rather than use the `height` prop, becuase\n    // we might be in double-size mode.\n    const spanSize = sliderHeight - realHandleHeight;\n    function moveToCursor(event) {\n      // Ensure dragging does not cause elements/text to be selected.\n      // https://stackoverflow.com/a/19164149/1263117\n      event.preventDefault();\n      const startOffset = event.clientY - baseOffset;\n      onChange(clamp(startOffset / spanSize, 0, 1));\n    }\n    function handleMouseUp() {\n      if (onAfterChange != null) {\n        onAfterChange();\n      }\n      document.removeEventListener(\"mousemove\", moveToCursor);\n      document.removeEventListener(\"mouseup\", handleMouseUp);\n    }\n    document.addEventListener(\"mousemove\", moveToCursor);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n    if (onBeforeChange != null) {\n      onBeforeChange();\n    }\n\n    // Move the slider to where they've started.\n    moveToCursor(e.nativeEvent);\n  }\n  const offset = Math.floor((height - handleHeight) * value);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    style: {\n      height,\n      width\n    },\n    onMouseDown: disabled ? undefined : handleMouseDown,\n    ref: ref,\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      style: {\n        transform: `translateY(${offset}px)`\n      },\n      ref: handleRef,\n      children: handle\n    })\n  });\n}\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/PlaylistScrollBar.tsx\n\n\n\n\n\n\nconst HANDLE_HEIGHT = 18;\nconst Handle = () => /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n  className: \"playlist-scrollbar-handle\",\n  style: {\n    height: HANDLE_HEIGHT\n  }\n});\nfunction PlaylistScrollBar() {\n  const getWindowPixelSize = useTypedSelector(selectors_getWindowPixelSize);\n  const playlistHeight = getWindowPixelSize(WINDOWS.PLAYLIST).height;\n  const playlistScrollPosition = useTypedSelector(getPlaylistScrollPosition);\n  const allTracksAreVisible = useTypedSelector(getAllTracksAreVisible);\n  const setPlaylistScrollPosition = useActionCreator(playlist_setPlaylistScrollPosition);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    className: \"playlist-scrollbar\",\n    style: {\n      marginLeft: 5\n    },\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(VerticalSlider, {\n      height: playlistHeight - 58,\n      handleHeight: HANDLE_HEIGHT,\n      width: 8,\n      value: playlistScrollPosition / 100,\n      onChange: val => setPlaylistScrollPosition(val * 100),\n      handle: /*#__PURE__*/(0,jsx_runtime.jsx)(Handle, {}),\n      disabled: allTracksAreVisible\n    })\n  });\n}\n// EXTERNAL MODULE: ./css/playlist-window.css\nvar playlist_window = __webpack_require__(383);\n;// CONCATENATED MODULE: ./js/components/PlaylistWindow/index.tsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _maxTrackIndex(state) {\n  return state.playlist.trackOrder.length - 1;\n}\nfunction PlaylistWindow_PlaylistWindow({\n  analyser\n}) {\n  const offset = useTypedSelector(getScrollOffset);\n  const getWindowSize = useTypedSelector(selectors_getWindowSize);\n  const selectedWindow = useTypedSelector(getFocusedWindow);\n  const getWindowShade = useTypedSelector(selectors_getWindowShade);\n  const getWindowOpen = useTypedSelector(selectors_getWindowOpen);\n  const maxTrackIndex = useTypedSelector(_maxTrackIndex);\n  const skinPlaylistStyle = useTypedSelector(getSkinPlaylistStyle);\n  const getWindowPixelSize = useTypedSelector(selectors_getWindowPixelSize);\n  const selected = selectedWindow === WINDOWS.PLAYLIST;\n  const playlistShade = Boolean(getWindowShade(WINDOWS.PLAYLIST));\n  const playlistSize = getWindowSize(WINDOWS.PLAYLIST);\n  const playlistWindowPixelSize = getWindowPixelSize(WINDOWS.PLAYLIST);\n  const doubled = useTypedSelector(getDoubled);\n  const close = useActionCreator(windows_closeWindow);\n  const toggleShade = useActionCreator(togglePlaylistShadeMode);\n  const scrollUpFourTracks = useActionCreator(playlist_scrollUpFourTracks);\n  const scrollDownFourTracks = useActionCreator(playlist_scrollDownFourTracks);\n  const scrollVolume = useActionCreator(media_scrollVolume);\n  const loadMedia = useActionCreator(files_loadMedia);\n  const showVisualizer = playlistSize[0] > 2;\n  const activateVisualizer = !getWindowOpen(WINDOWS.MAIN);\n  const handleDrop = (0,react.useCallback)((e, targetCoords) => {\n    const top = e.clientY - targetCoords.y;\n    const atIndex = clamp(offset + Math.round((top - 23) / TRACK_HEIGHT), 0, maxTrackIndex + 1);\n    loadMedia(e, LOAD_STYLE.NONE, atIndex);\n  }, [loadMedia, maxTrackIndex, offset]);\n  if (playlistShade) {\n    return /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_PlaylistShade, {});\n  }\n  const style = {\n    color: skinPlaylistStyle.normal,\n    backgroundColor: skinPlaylistStyle.normalbg,\n    fontFamily: `${skinPlaylistStyle.font}, Arial, sans-serif`,\n    height: `${playlistWindowPixelSize.height}px`,\n    width: `${playlistWindowPixelSize.width}px`\n  };\n  const classes = classnames_default()(\"window\", \"draggable\", {\n    selected,\n    doubled\n  });\n  const showSpacers = playlistSize[0] % 2 === 0;\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_FocusTarget, {\n    windowId: WINDOWS.PLAYLIST,\n    children: /*#__PURE__*/(0,jsx_runtime.jsxs)(components_DropTarget, {\n      id: \"playlist-window\",\n      windowId: WINDOWS.PLAYLIST,\n      className: classes,\n      style: style,\n      handleDrop: handleDrop,\n      children: [/*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"playlist-top draggable\",\n        onDoubleClick: toggleShade,\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-top-left draggable\"\n        }), showSpacers && /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-top-left-spacer draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-top-left-fill draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-top-title draggable\"\n        }), showSpacers && /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-top-right-spacer draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-top-right-fill draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n          className: \"playlist-top-right draggable\",\n          children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            id: \"playlist-shade-button\",\n            onClick: toggleShade\n          }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            id: \"playlist-close-button\",\n            onClick: () => close(WINDOWS.PLAYLIST)\n          })]\n        })]\n      }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"playlist-middle draggable\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-middle-left draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-middle-center\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_TrackList, {})\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-middle-right draggable\",\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistScrollBar, {})\n        })]\n      }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        className: \"playlist-bottom draggable\",\n        children: [/*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n          className: \"playlist-bottom-left draggable\",\n          children: [/*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_AddMenu, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_RemoveMenu, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(SelectionMenu, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_MiscMenu, {})]\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"playlist-bottom-center draggable\"\n        }), /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n          className: \"playlist-bottom-right draggable\",\n          children: [showVisualizer && /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            className: \"playlist-visualizer\",\n            children: activateVisualizer && /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n              className: \"visualizer-wrapper\",\n              children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_Visualizer\n              // @ts-ignore Visualizer is not yet typed\n              , {\n                analyser: analyser\n              })\n            })\n          }), /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistActionArea, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(ListMenu, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            id: \"playlist-scroll-up-button\",\n            onClick: scrollUpFourTracks\n          }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n            id: \"playlist-scroll-down-button\",\n            onClick: scrollDownFourTracks\n          }), /*#__PURE__*/(0,jsx_runtime.jsx)(PlaylistWindow_PlaylistResizeTarget, {})]\n        })]\n      })]\n    })\n  });\n}\n/* harmony default export */ const components_PlaylistWindow = (PlaylistWindow_PlaylistWindow);\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/Band.tsx\n\n\n\n\n\n\nconst MAX_VALUE = 2400; // New range for 0.1 dB precision\n\n// Given a value between 0-2400, return the sprite number (0-27)\nconst spriteNumber = value => {\n  const percent = value / MAX_VALUE;\n  return Math.round(percent * 27);\n};\n\n// Given a sprite number, return the x,y\nconst spriteOffsets = number => {\n  const x = number % 14;\n  const y = Math.floor(number / 14);\n  return {\n    x,\n    y\n  };\n};\nconst Band_Handle = () => {\n  const style = {\n    width: 11,\n    height: 11,\n    marginLeft: 1\n  };\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    style: style,\n    className: \"slider-handle\"\n  });\n};\nfunction Band({\n  id,\n  onChange,\n  band\n}) {\n  const sliders = useTypedSelector(getSliders);\n  const value = sliders[band];\n  const backgroundPosition = (0,react.useMemo)(() => {\n    const {\n      x,\n      y\n    } = spriteOffsets(spriteNumber(value));\n    const xOffset = x * 15; // Each sprite is 15px wide\n    const yOffset = y * 65; // Each sprite is 15px tall\n    return `-${xOffset}px -${yOffset}px`;\n  }, [value]);\n  const focusBand = useActionCreator(actionCreators_focusBand);\n  const usetFocus = useActionCreator(actionCreators_unsetFocus);\n\n  // Round to nearest 0.1 dB step (24 dB / 2400 = 0.01 dB per unit, but we want 0.1 dB steps)\n  // Each 0.1 dB step = 10 units in our 0-2400 range\n  const roundToStep = val => {\n    return Math.round(val / 10) * 10;\n  };\n\n  // Note: The band background is actually one pixel taller (63) than the slider\n  // it contains (62).\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: id,\n    className: \"band\",\n    style: {\n      backgroundPosition,\n      height: 63\n    },\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(VerticalSlider, {\n      height: 62,\n      width: 14,\n      handleHeight: 11,\n      value: 1 - value / MAX_VALUE,\n      onBeforeChange: () => focusBand(band),\n      onChange: val => {\n        const newValue = (1 - val) * MAX_VALUE;\n        onChange(roundToStep(newValue));\n      },\n      onAfterChange: usetFocus,\n      handle: /*#__PURE__*/(0,jsx_runtime.jsx)(Band_Handle, {})\n    })\n  });\n}\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/EqOn.tsx\n\n\n\n\n\nconst EqOn = () => {\n  const toggleEq = useActionCreator(equalizer_toggleEq);\n  const on = useTypedSelector(getEqualizerEnabled);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"on\",\n    className: classnames_default()({\n      selected: on\n    }),\n    onClick: toggleEq\n  });\n};\n/* harmony default export */ const EqualizerWindow_EqOn = (EqOn);\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/EqAuto.tsx\n\n\n\n\n\nconst EqAuto = /*#__PURE__*/(0,react.memo)(() => {\n  const selected = useTypedSelector(state => state.equalizer.auto);\n  const toggleAuto = useActionCreator(toggleEqAuto);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"auto\",\n    className: classnames_default()({\n      selected\n    }),\n    onClick: toggleAuto\n  });\n});\n/* harmony default export */ const EqualizerWindow_EqAuto = (EqAuto);\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/spline.js\n// Adapted from https://github.com/morganherlocker/cubic-spline\n\nfunction spline(xs, ys) {\n  const ks = getNaturalKs(xs, ys);\n  const maxX = xs[xs.length - 1];\n  const allYs = [];\n  let i = 1;\n  for (let x = 0; x <= maxX; x++) {\n    while (xs[i] < x) i++;\n    const t = (x - xs[i - 1]) / (xs[i] - xs[i - 1]);\n    const a = ks[i - 1] * (xs[i] - xs[i - 1]) - (ys[i] - ys[i - 1]);\n    const b = -ks[i] * (xs[i] - xs[i - 1]) + (ys[i] - ys[i - 1]);\n    const q = (1 - t) * ys[i - 1] + t * ys[i] + t * (1 - t) * (a * (1 - t) + b * t);\n    allYs.push(q);\n  }\n  return allYs;\n}\nfunction getNaturalKs(xs, ys) {\n  const ks = xs.map(() => 0);\n  const n = xs.length - 1;\n  const matrix = zerosMatrix(n + 1, n + 2);\n  for (let i = 1; i < n; i++ // rows\n  ) {\n    matrix[i][i - 1] = 1 / (xs[i] - xs[i - 1]);\n    matrix[i][i] = 2 * (1 / (xs[i] - xs[i - 1]) + 1 / (xs[i + 1] - xs[i]));\n    matrix[i][i + 1] = 1 / (xs[i + 1] - xs[i]);\n    matrix[i][n + 1] = 3 * ((ys[i] - ys[i - 1]) / ((xs[i] - xs[i - 1]) * (xs[i] - xs[i - 1])) + (ys[i + 1] - ys[i]) / ((xs[i + 1] - xs[i]) * (xs[i + 1] - xs[i])));\n  }\n  matrix[0][0] = 2 / (xs[1] - xs[0]);\n  matrix[0][1] = 1 / (xs[1] - xs[0]);\n  matrix[0][n + 1] = 3 * (ys[1] - ys[0]) / ((xs[1] - xs[0]) * (xs[1] - xs[0]));\n  matrix[n][n - 1] = 1 / (xs[n] - xs[n - 1]);\n  matrix[n][n] = 2 / (xs[n] - xs[n - 1]);\n  matrix[n][n + 1] = 3 * (ys[n] - ys[n - 1]) / ((xs[n] - xs[n - 1]) * (xs[n] - xs[n - 1]));\n  return solve(matrix, ks);\n}\nfunction solve(matrix, ks) {\n  const m = matrix.length;\n  // column\n  for (let k = 0; k < m; k++) {\n    // pivot for column\n    let iMax = 0;\n    let vali = Number.NEGATIVE_INFINITY;\n    for (let i = k; i < m; i++) if (matrix[i][k] > vali) {\n      iMax = i;\n      vali = matrix[i][k];\n    }\n    swapRows(matrix, k, iMax);\n\n    // for all rows below pivot\n    for (let i = k + 1; i < m; i++) {\n      for (let j = k + 1; j < m + 1; j++) matrix[i][j] = matrix[i][j] - matrix[k][j] * (matrix[i][k] / matrix[k][k]);\n      matrix[i][k] = 0;\n    }\n  }\n  // rows = columns\n  for (let i = m - 1; i >= 0; i--) {\n    const v = matrix[i][m] / matrix[i][i];\n    ks[i] = v;\n    // rows\n    for (let j = i - 1; j >= 0; j--) {\n      matrix[j][m] -= matrix[j][i] * v;\n      matrix[j][i] = 0;\n    }\n  }\n  return ks;\n}\nfunction zerosMatrix(rows, columns) {\n  const matrix = [];\n  for (let i = 0; i < rows; i++) {\n    matrix.push([]);\n    for (let j = 0; j < columns; j++) {\n      matrix[i].push(0);\n    }\n  }\n  return matrix;\n}\nfunction swapRows(m, k, l) {\n  const p = m[k];\n  m[k] = m[l];\n  m[l] = p;\n}\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/EqGraph.tsx\n\n\n\n\n\n\n\nconst GRAPH_HEIGHT = 19;\nconst GRAPH_WIDTH = 113;\nfunction EqGraph() {\n  const sliders = useTypedSelector(getSliders);\n  const preampLineImagePromise = useTypedSelector(getPreampLineImage);\n  const preampLineImage = usePromiseValueOrNull(preampLineImagePromise);\n  const [canvasNode, setCanvasNode] = (0,react.useState)(null);\n  const canvasCtx = (0,react.useMemo)(() => {\n    var _canvasNode$getContex;\n    return (_canvasNode$getContex = canvasNode === null || canvasNode === void 0 ? void 0 : canvasNode.getContext(\"2d\")) !== null && _canvasNode$getContex !== void 0 ? _canvasNode$getContex : null;\n  }, [canvasNode]);\n  const colorPattern = useColorPattern(canvasCtx);\n  (0,react.useLayoutEffect)(() => {\n    if (canvasCtx == null || canvasNode == null || preampLineImage == null || colorPattern == null) {\n      return;\n    }\n    const width = Number(canvasNode.width);\n    const height = Number(canvasNode.height);\n    canvasCtx.clearRect(0, 0, width, height);\n    drawEqLine({\n      colorPattern,\n      sliders,\n      canvasCtx,\n      preampLineImage\n    });\n  }, [canvasCtx, canvasNode, colorPattern, preampLineImage, sliders]);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"canvas\", {\n    id: \"eqGraph\",\n    ref: setCanvasNode,\n    width: GRAPH_WIDTH,\n    height: GRAPH_HEIGHT\n  });\n}\nfunction useColorPattern(canvasCtx) {\n  const lineColorsImagePromise = useTypedSelector(getLineColorsImage);\n  const lineColorsImage = usePromiseValueOrNull(lineColorsImagePromise);\n  return (0,react.useMemo)(() => {\n    if (canvasCtx == null || lineColorsImage == null) {\n      return null;\n    }\n    return canvasCtx.createPattern(lineColorsImage, \"repeat-x\");\n  }, [canvasCtx, lineColorsImage]);\n}\nfunction drawEqLine({\n  colorPattern,\n  sliders,\n  canvasCtx,\n  preampLineImage\n}) {\n  const preampValue = percentToRange(sliders.preamp / 100, 0, GRAPH_HEIGHT - 1);\n  canvasCtx.drawImage(preampLineImage, 0, preampValue, preampLineImage.width, preampLineImage.height);\n  const amplitudes = BANDS.map(band => sliders[band]);\n  canvasCtx.fillStyle = colorPattern;\n  const paddingLeft = 2; // TODO: This should be 1.5\n\n  const min = 0;\n  const max = GRAPH_HEIGHT - 1;\n  const xs = [];\n  const ys = [];\n  amplitudes.forEach((value, i) => {\n    const percent = (100 - value) / 100;\n    // Each band is 12 pixels widex\n    xs.push(i * 12);\n    ys.push(percentToRange(percent, min, max));\n  });\n  const allYs = spline(xs, ys);\n  const maxX = xs[xs.length - 1];\n  let lastY = ys[0];\n  for (let x = 0; x <= maxX; x++) {\n    const y = clamp(Math.round(allYs[x]), 0, GRAPH_HEIGHT - 1);\n    const yTop = Math.min(y, lastY);\n    const height = 1 + Math.abs(lastY - y);\n    canvasCtx.fillRect(paddingLeft + x, yTop, 1, height);\n    lastY = y;\n  }\n}\n/* harmony default export */ const EqualizerWindow_EqGraph = (EqGraph);\n;// CONCATENATED MODULE: ./presets/builtin.json\nconst builtin_namespaceObject = JSON.parse('{\"u\":[{\"name\":\"Classical\",\"hz60\":33,\"hz170\":33,\"hz310\":33,\"hz600\":33,\"hz1000\":33,\"hz3000\":33,\"hz6000\":20,\"hz12000\":20,\"hz14000\":20,\"hz16000\":16,\"preamp\":33},{\"name\":\"Club\",\"hz60\":33,\"hz170\":33,\"hz310\":38,\"hz600\":42,\"hz1000\":42,\"hz3000\":42,\"hz6000\":38,\"hz12000\":33,\"hz14000\":33,\"hz16000\":33,\"preamp\":33},{\"name\":\"Dance\",\"hz60\":48,\"hz170\":44,\"hz310\":36,\"hz600\":32,\"hz1000\":32,\"hz3000\":22,\"hz6000\":20,\"hz12000\":20,\"hz14000\":32,\"hz16000\":32,\"preamp\":33},{\"name\":\"Laptop speakers/headphones\",\"hz60\":40,\"hz170\":50,\"hz310\":41,\"hz600\":26,\"hz1000\":28,\"hz3000\":35,\"hz6000\":40,\"hz12000\":48,\"hz14000\":53,\"hz16000\":56,\"preamp\":33},{\"name\":\"Large hall\",\"hz60\":49,\"hz170\":49,\"hz310\":42,\"hz600\":42,\"hz1000\":33,\"hz3000\":24,\"hz6000\":24,\"hz12000\":24,\"hz14000\":33,\"hz16000\":33,\"preamp\":33},{\"name\":\"Party\",\"hz60\":44,\"hz170\":44,\"hz310\":33,\"hz600\":33,\"hz1000\":33,\"hz3000\":33,\"hz6000\":33,\"hz12000\":33,\"hz14000\":44,\"hz16000\":44,\"preamp\":33},{\"name\":\"Pop\",\"hz60\":29,\"hz170\":40,\"hz310\":44,\"hz600\":45,\"hz1000\":41,\"hz3000\":30,\"hz6000\":28,\"hz12000\":28,\"hz14000\":29,\"hz16000\":29,\"preamp\":33},{\"name\":\"Reggae\",\"hz60\":33,\"hz170\":33,\"hz310\":31,\"hz600\":22,\"hz1000\":33,\"hz3000\":43,\"hz6000\":43,\"hz12000\":33,\"hz14000\":33,\"hz16000\":33,\"preamp\":33},{\"name\":\"Rock\",\"hz60\":45,\"hz170\":40,\"hz310\":23,\"hz600\":19,\"hz1000\":26,\"hz3000\":39,\"hz6000\":47,\"hz12000\":50,\"hz14000\":50,\"hz16000\":50,\"preamp\":33},{\"name\":\"Soft\",\"hz60\":40,\"hz170\":35,\"hz310\":30,\"hz600\":28,\"hz1000\":30,\"hz3000\":39,\"hz6000\":46,\"hz12000\":48,\"hz14000\":50,\"hz16000\":52,\"preamp\":33},{\"name\":\"Ska\",\"hz60\":28,\"hz170\":24,\"hz310\":25,\"hz600\":31,\"hz1000\":39,\"hz3000\":42,\"hz6000\":47,\"hz12000\":48,\"hz14000\":50,\"hz16000\":48,\"preamp\":33},{\"name\":\"Full Bass\",\"hz60\":48,\"hz170\":48,\"hz310\":48,\"hz600\":42,\"hz1000\":35,\"hz3000\":25,\"hz6000\":18,\"hz12000\":15,\"hz14000\":14,\"hz16000\":14,\"preamp\":33},{\"name\":\"Soft Rock\",\"hz60\":39,\"hz170\":39,\"hz310\":36,\"hz600\":31,\"hz1000\":25,\"hz3000\":23,\"hz6000\":26,\"hz12000\":31,\"hz14000\":37,\"hz16000\":47,\"preamp\":33},{\"name\":\"Full Treble\",\"hz60\":16,\"hz170\":16,\"hz310\":16,\"hz600\":25,\"hz1000\":37,\"hz3000\":50,\"hz6000\":58,\"hz12000\":58,\"hz14000\":58,\"hz16000\":60,\"preamp\":33},{\"name\":\"Full Bass & Treble\",\"hz60\":44,\"hz170\":42,\"hz310\":33,\"hz600\":20,\"hz1000\":24,\"hz3000\":35,\"hz6000\":46,\"hz12000\":50,\"hz14000\":52,\"hz16000\":52,\"preamp\":33},{\"name\":\"Live\",\"hz60\":24,\"hz170\":33,\"hz310\":39,\"hz600\":41,\"hz1000\":42,\"hz3000\":42,\"hz6000\":39,\"hz12000\":37,\"hz14000\":37,\"hz16000\":36,\"preamp\":33},{\"name\":\"Techno\",\"hz60\":45,\"hz170\":42,\"hz310\":33,\"hz600\":23,\"hz1000\":24,\"hz3000\":33,\"hz6000\":45,\"hz12000\":48,\"hz14000\":48,\"hz16000\":47,\"preamp\":33}]}');\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/PresetsContextMenu.tsx\n\n\n\n\n\n\n\n\nconst PresetsContextMenu = () => {\n  const openEqfFileDialog = useActionCreator(files_openEqfFileDialog);\n  const downloadPreset = useActionCreator(files_downloadPreset);\n  const setEqFromObject = useActionCreator(files_setEqFromObject);\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(components_ContextMenuTarget, {\n    top: true,\n    id: \"presets-context\",\n    renderMenu: () => /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n      children: [/*#__PURE__*/(0,jsx_runtime.jsxs)(Parent, {\n        label: \"Load\",\n        children: [builtin_namespaceObject.u.map(preset => /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: () => setEqFromObject(preset),\n          label: preset.name\n        }, preset.name)), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenu_Hr, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n          onClick: openEqfFileDialog,\n          label: \"From Eqf...\"\n        })]\n      }), /*#__PURE__*/(0,jsx_runtime.jsx)(Node, {\n        onClick: downloadPreset,\n        label: \"Save\"\n      })]\n    }),\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"presets\"\n    })\n  });\n};\n/* harmony default export */ const EqualizerWindow_PresetsContextMenu = (PresetsContextMenu);\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/EqTitleButtons.tsx\n\n\n\n\n\n\n\nfunction EqTitleButtons() {\n  const focusedWindow = useTypedSelector(getFocusedWindow);\n  const selected = focusedWindow === WINDOWS.EQUALIZER;\n  const closeWindow = useActionCreator(windows_closeWindow);\n  const toggleEqualizerShadeMode = useActionCreator(windows_toggleEqualizerShadeMode);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(components_ClickedDiv, {\n    id: \"eq-buttons\",\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"equalizer-shade\",\n      onClick: toggleEqualizerShadeMode\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n      id: \"equalizer-close\",\n      onClick: () => closeWindow(WINDOWS.EQUALIZER)\n    })]\n  }, selected ? \"selected\" : \"unselected\");\n}\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/EqualizerShade.tsx\n\n\n\n\n\n\n\n\n\nconst EqualizerShade = () => {\n  const volume = useTypedSelector(getVolume);\n  const balance = useTypedSelector(getBalance);\n  const toggleEqualizerShadeMode = useActionCreator(windows_toggleEqualizerShadeMode);\n  const classes = [\"left\", \"center\", \"right\"];\n  const eqVolumeClassName = segment(0, 100, volume, classes);\n  const eqBalanceClassName = segment(-100, 100, balance, classes);\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n    className: \"draggable\",\n    onDoubleClick: toggleEqualizerShadeMode,\n    style: {\n      width: \"100%\",\n      height: \"100%\"\n    },\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(EqTitleButtons, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Volume, {\n      id: \"equalizer-volume\",\n      className: eqVolumeClassName\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(Balance, {\n      id: \"equalizer-balance\",\n      className: eqBalanceClassName\n    })]\n  });\n};\n/* harmony default export */ const EqualizerWindow_EqualizerShade = (EqualizerShade);\n// EXTERNAL MODULE: ./css/equalizer-window.css\nvar equalizer_window = __webpack_require__(4522);\n;// CONCATENATED MODULE: ./js/components/EqualizerWindow/index.tsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst bandClassName = band => `band-${band}`;\nconst EqualizerWindow = () => {\n  const doubled = useTypedSelector(getDoubled);\n  const focusedWindow = useTypedSelector(getFocusedWindow);\n  const getWindowShade = useTypedSelector(selectors_getWindowShade);\n  const selected = focusedWindow === WINDOWS.EQUALIZER;\n  const shade = getWindowShade(WINDOWS.EQUALIZER);\n  const setPreampValue = useActionCreator(setPreamp);\n  const setEqToMin = useActionCreator(equalizer_setEqToMin);\n  const setEqToMid = useActionCreator(equalizer_setEqToMid);\n  const setEqToMax = useActionCreator(equalizer_setEqToMax);\n  const setHertzValue = useActionCreator(setEqBand);\n  const toggleEqualizerShadeMode = useActionCreator(windows_toggleEqualizerShadeMode);\n  const className = classnames_default()({\n    selected,\n    doubled,\n    shade,\n    window: true,\n    draggable: true\n  });\n  return /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n    id: \"equalizer-window\",\n    className: className,\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(components_FocusTarget, {\n      windowId: WINDOWS.EQUALIZER,\n      children: shade ? /*#__PURE__*/(0,jsx_runtime.jsx)(EqualizerWindow_EqualizerShade, {}) : /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n        children: [/*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          className: \"equalizer-top title-bar draggable\",\n          onDoubleClick: toggleEqualizerShadeMode,\n          children: /*#__PURE__*/(0,jsx_runtime.jsx)(EqTitleButtons, {})\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(EqualizerWindow_EqOn, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(EqualizerWindow_EqAuto, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(EqualizerWindow_EqGraph, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(EqualizerWindow_PresetsContextMenu, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(Band, {\n          id: \"preamp\",\n          band: \"preamp\",\n          onChange: setPreampValue\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"plus12db\",\n          onClick: setEqToMax\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"zerodb\",\n          onClick: setEqToMid\n        }), /*#__PURE__*/(0,jsx_runtime.jsx)(\"div\", {\n          id: \"minus12db\",\n          onClick: setEqToMin\n        }), BANDS.map(hertz => /*#__PURE__*/(0,jsx_runtime.jsx)(Band, {\n          id: bandClassName(hertz),\n          band: hertz,\n          onChange: value => setHertzValue(hertz, value)\n        }, hertz))]\n      })\n    })\n  });\n};\n/* harmony default export */ const components_EqualizerWindow = (EqualizerWindow);\n;// CONCATENATED MODULE: ./js/skinSelectors.ts\n\n\nconst imageSelectors = {\n  MAIN_BALANCE_BACKGROUND: [\"#balance\"],\n  MAIN_BALANCE_THUMB: [\"#balance::-webkit-slider-thumb\", \"#balance::-moz-range-thumb\"],\n  MAIN_BALANCE_THUMB_ACTIVE: [\"#balance:active::-webkit-slider-thumb\", \"#balance:active::-moz-range-thumb\"],\n  MAIN_PREVIOUS_BUTTON: [\".actions #previous\"],\n  MAIN_PREVIOUS_BUTTON_ACTIVE: [\".actions #previous:active\"],\n  MAIN_PLAY_BUTTON: [\".actions #play\"],\n  MAIN_PLAY_BUTTON_ACTIVE: [\".actions #play:active\"],\n  MAIN_PAUSE_BUTTON: [\".actions #pause\"],\n  MAIN_PAUSE_BUTTON_ACTIVE: [\".actions #pause:active\"],\n  MAIN_STOP_BUTTON: [\".actions #stop\"],\n  MAIN_STOP_BUTTON_ACTIVE: [\".actions #stop:active\"],\n  MAIN_NEXT_BUTTON: [\".actions #next\"],\n  MAIN_NEXT_BUTTON_ACTIVE: [\".actions #next:active\"],\n  MAIN_EJECT_BUTTON: [\"#eject\"],\n  MAIN_EJECT_BUTTON_ACTIVE: [\"#eject:active\"],\n  MAIN_WINDOW_BACKGROUND: [\"#main-window\"],\n  MAIN_STEREO: [\".media-info #stereo\", \".stop .media-info #stereo.selected\"],\n  MAIN_STEREO_SELECTED: [\".media-info #stereo.selected\"],\n  MAIN_MONO: [\".media-info #mono\", \".stop .media-info #mono.selected\"],\n  MAIN_MONO_SELECTED: [\".media-info #mono.selected\"],\n  NO_MINUS_SIGN: [\"#time #minus-sign\"],\n  MINUS_SIGN: [\"#time.countdown #minus-sign\"],\n  DIGIT_0: [\".digit-0\"],\n  DIGIT_1: [\".digit-1\"],\n  DIGIT_2: [\".digit-2\"],\n  DIGIT_3: [\".digit-3\"],\n  DIGIT_4: [\".digit-4\"],\n  DIGIT_5: [\".digit-5\"],\n  DIGIT_6: [\".digit-6\"],\n  DIGIT_7: [\".digit-7\"],\n  DIGIT_8: [\".digit-8\"],\n  DIGIT_9: [\".digit-9\"],\n  NO_MINUS_SIGN_EX: [\"#time #minus-sign\"],\n  MINUS_SIGN_EX: [\"#time.countdown #minus-sign\"],\n  DIGIT_0_EX: [\".digit-0\"],\n  DIGIT_1_EX: [\".digit-1\"],\n  DIGIT_2_EX: [\".digit-2\"],\n  DIGIT_3_EX: [\".digit-3\"],\n  DIGIT_4_EX: [\".digit-4\"],\n  DIGIT_5_EX: [\".digit-5\"],\n  DIGIT_6_EX: [\".digit-6\"],\n  DIGIT_7_EX: [\".digit-7\"],\n  DIGIT_8_EX: [\".digit-8\"],\n  DIGIT_9_EX: [\".digit-9\"],\n  MAIN_PLAYING_INDICATOR: [\".play #play-pause\"],\n  MAIN_PAUSED_INDICATOR: [\".pause #play-pause\"],\n  MAIN_STOPPED_INDICATOR: [\".stop #play-pause\"],\n  MAIN_NOT_WORKING_INDICATOR: [\"#work-indicator\"],\n  MAIN_WORKING_INDICATOR: [\"#work-indicator.selected\"],\n  PLAYLIST_TOP_TILE: [\".playlist-top-left-fill\", \".playlist-top-left-spacer\", \".playlist-top-right-fill\", \".playlist-top-right-spacer\"],\n  PLAYLIST_TOP_LEFT_CORNER: [\".playlist-top-left\"],\n  PLAYLIST_TITLE_BAR: [\".playlist-top-title\"],\n  PLAYLIST_TOP_RIGHT_CORNER: [\".playlist-top-right\"],\n  PLAYLIST_TOP_TILE_SELECTED: [\".selected .playlist-top-left-fill\", \".selected .playlist-top-left-spacer\", \".selected .playlist-top-right-fill\", \".selected .playlist-top-right-spacer\"],\n  PLAYLIST_TOP_LEFT_SELECTED: [\".selected .playlist-top-left\"],\n  PLAYLIST_TITLE_BAR_SELECTED: [\".selected .playlist-top-title\"],\n  PLAYLIST_TOP_RIGHT_CORNER_SELECTED: [\".selected .playlist-top-right\"],\n  PLAYLIST_LEFT_TILE: [\".playlist-middle-left\"],\n  PLAYLIST_RIGHT_TILE: [\".playlist-middle-right\"],\n  PLAYLIST_SCROLL_HANDLE: [\".playlist-scrollbar-handle\"],\n  PLAYLIST_SCROLL_HANDLE_SELECTED: [\".playlist-middle-right:active .playlist-scrollbar-handle\"],\n  PLAYLIST_BOTTOM_TILE: [\".playlist-bottom\"],\n  PLAYLIST_BOTTOM_LEFT_CORNER: [\".playlist-bottom-left\"],\n  PLAYLIST_BOTTOM_RIGHT_CORNER: [\".playlist-bottom-right\"],\n  PLAYLIST_VISUALIZER_BACKGROUND: [\".playlist-visualizer\"],\n  PLAYLIST_SHADE_BACKGROUND: [\"#playlist-window-shade\"],\n  PLAYLIST_SHADE_BACKGROUND_LEFT: [\"#playlist-window-shade .left\"],\n  PLAYLIST_SHADE_BACKGROUND_RIGHT: [\"#playlist-window-shade .right\"],\n  PLAYLIST_SHADE_BACKGROUND_RIGHT_SELECTED: [\"#playlist-window-shade.selected .right\"],\n  PLAYLIST_ADD_MENU_BAR: [\"#playlist-add-menu.selected .bar\"],\n  PLAYLIST_ADD_URL: [\"#playlist-add-menu .add-url\"],\n  PLAYLIST_ADD_URL_SELECTED: [\"#playlist-add-menu .hover .add-url\"],\n  PLAYLIST_ADD_DIR: [\"#playlist-add-menu .add-dir\"],\n  PLAYLIST_ADD_DIR_SELECTED: [\"#playlist-add-menu .hover .add-dir\"],\n  PLAYLIST_ADD_FILE: [\"#playlist-add-menu .add-file\"],\n  PLAYLIST_ADD_FILE_SELECTED: [\"#playlist-add-menu .hover .add-file\"],\n  PLAYLIST_REMOVE_MENU_BAR: [\"#playlist-remove-menu.selected .bar\"],\n  PLAYLIST_REMOVE_ALL: [\"#playlist-remove-menu .remove-all\"],\n  PLAYLIST_REMOVE_ALL_SELECTED: [\"#playlist-remove-menu .hover .remove-all\"],\n  PLAYLIST_CROP: [\"#playlist-remove-menu .crop\"],\n  PLAYLIST_CROP_SELECTED: [\"#playlist-remove-menu .hover .crop\"],\n  PLAYLIST_REMOVE_SELECTED: [\"#playlist-remove-menu .remove-selected\"],\n  PLAYLIST_REMOVE_SELECTED_SELECTED: [\"#playlist-remove-menu .hover .remove-selected\"],\n  PLAYLIST_REMOVE_MISC: [\"#playlist-remove-menu .remove-misc\"],\n  PLAYLIST_REMOVE_MISC_SELECTED: [\"#playlist-remove-menu .hover .remove-misc\"],\n  PLAYLIST_SELECT_MENU_BAR: [\"#playlist-selection-menu.selected .bar\"],\n  PLAYLIST_INVERT_SELECTION: [\"#playlist-selection-menu .invert-selection\"],\n  PLAYLIST_INVERT_SELECTION_SELECTED: [\"#playlist-selection-menu .hover .invert-selection\"],\n  PLAYLIST_SELECT_ZERO: [\"#playlist-selection-menu .select-zero\"],\n  PLAYLIST_SELECT_ZERO_SELECTED: [\"#playlist-selection-menu .hover .select-zero\"],\n  PLAYLIST_SELECT_ALL: [\"#playlist-selection-menu .select-all\"],\n  PLAYLIST_SELECT_ALL_SELECTED: [\"#playlist-selection-menu .hover .select-all\"],\n  PLAYLIST_CLOSE_SELECTED: [\"#playlist-close-button:active\"],\n  PLAYLIST_COLLAPSE_SELECTED: [\"#playlist-window #playlist-shade-button:active\"],\n  PLAYLIST_EXPAND_SELECTED: [\"#playlist-window-shade #playlist-shade-button:active\"],\n  PLAYLIST_MISC_MENU_BAR: [\"#playlist-misc-menu.selected .bar\"],\n  PLAYLIST_MISC_OPTIONS: [\"#playlist-misc-menu .misc-options\"],\n  PLAYLIST_MISC_OPTIONS_SELECTED: [\"#playlist-misc-menu .hover .misc-options\"],\n  PLAYLIST_FILE_INFO: [\"#playlist-misc-menu .file-info\"],\n  PLAYLIST_FILE_INFO_SELECTED: [\"#playlist-misc-menu .hover .file-info\"],\n  PLAYLIST_SORT_LIST: [\"#playlist-misc-menu .sort-list\"],\n  PLAYLIST_SORT_LIST_SELECTED: [\"#playlist-misc-menu .hover .sort-list\"],\n  PLAYLIST_LIST_BAR: [\"#playlist-list-menu.selected .bar\"],\n  PLAYLIST_NEW_LIST: [\"#playlist-list-menu .new-list\"],\n  PLAYLIST_NEW_LIST_SELECTED: [\"#playlist-list-menu .hover .new-list\"],\n  PLAYLIST_LOAD_LIST: [\"#playlist-list-menu .load-list\"],\n  PLAYLIST_LOAD_LIST_SELECTED: [\"#playlist-list-menu .hover .load-list\"],\n  PLAYLIST_SAVE_LIST: [\"#playlist-list-menu .save-list\"],\n  PLAYLIST_SAVE_LIST_SELECTED: [\"#playlist-list-menu .hover .save-list\"],\n  EQ_WINDOW_BACKGROUND: [\"#equalizer-window:not(.shade)\"],\n  EQ_TITLE_BAR: [\".equalizer-top\"],\n  EQ_TITLE_BAR_SELECTED: [\".selected .equalizer-top\"],\n  EQ_SLIDER_BACKGROUND: [\".band\"],\n  EQ_SLIDER_THUMB: [\".band .slider-handle\"],\n  // But the \"active\" pseudo selector on the parent, since clicking\n  // anywhere on the track moves the slider.\n  EQ_SLIDER_THUMB_SELECTED: [\".band:active .slider-handle\"],\n  EQ_ON_BUTTON: [\"#on\"],\n  EQ_ON_BUTTON_DEPRESSED: [\"#on:active\"],\n  EQ_ON_BUTTON_SELECTED: [\"#on.selected\"],\n  EQ_ON_BUTTON_SELECTED_DEPRESSED: [\"#on.selected:active\"],\n  EQ_AUTO_BUTTON: [\"#auto\"],\n  EQ_AUTO_BUTTON_DEPRESSED: [\"#auto:active\"],\n  EQ_AUTO_BUTTON_SELECTED: [\"#auto.selected\"],\n  EQ_AUTO_BUTTON_SELECTED_DEPRESSED: [\"#auto.selected:active\"],\n  EQ_GRAPH_BACKGROUND: [\"#eqGraph\"],\n  EQ_PRESETS_BUTTON: [\"#presets\"],\n  EQ_PRESETS_BUTTON_SELECTED: [\"#presets:active\"],\n  EQ_PREAMP_LINE: [\"#preamp-line\"],\n  EQ_SHADE_BACKGROUND: [\"#equalizer-window.shade\"],\n  EQ_SHADE_BACKGROUND_SELECTED: [\"#equalizer-window.shade.selected\"],\n  EQ_SHADE_VOLUME_SLIDER_LEFT: [\"#equalizer-volume.left::-webkit-slider-thumb\", \"#equalizer-volume.left::-moz-range-thumb\"],\n  EQ_SHADE_VOLUME_SLIDER_CENTER: [\"#equalizer-volume.center::-webkit-slider-thumb\", \"#equalizer-volume.center::-moz-range-thumb\"],\n  EQ_SHADE_VOLUME_SLIDER_RIGHT: [\"#equalizer-volume.right::-webkit-slider-thumb\", \"#equalizer-volume.right::-moz-range-thumb\"],\n  EQ_SHADE_BALANCE_SLIDER_LEFT: [\"#equalizer-balance.left::-webkit-slider-thumb\", \"#equalizer-balance.left::-moz-range-thumb\"],\n  EQ_SHADE_BALANCE_SLIDER_CENTER: [\"#equalizer-balance.center::-webkit-slider-thumb\", \"#equalizer-balance.center::-moz-range-thumb\"],\n  EQ_SHADE_BALANCE_SLIDER_RIGHT: [\"#equalizer-balance.right::-webkit-slider-thumb\", \"#equalizer-balance.right::-moz-range-thumb\"],\n  EQ_MAXIMIZE_BUTTON_ACTIVE: [\"#equalizer-shade:active\"],\n  EQ_MINIMIZE_BUTTON_ACTIVE: [\"#equalizer-window.shade #equalizer-shade:active\"],\n  EQ_CLOSE_BUTTON: [\"#equalizer-window.selected #eq-buttons.clicked #equalizer-close\"],\n  EQ_CLOSE_BUTTON_ACTIVE: [\"#equalizer-window.selected #eq-buttons.clicked #equalizer-close:active\"],\n  EQ_SHADE_CLOSE_BUTTON: [\"#equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close\"],\n  EQ_SHADE_CLOSE_BUTTON_ACTIVE: [\"#equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close:active\"],\n  MAIN_POSITION_SLIDER_BACKGROUND: [\"#position\"],\n  MAIN_POSITION_SLIDER_THUMB: [\"#position::-webkit-slider-thumb\", \"#position::-moz-range-thumb\"],\n  MAIN_POSITION_SLIDER_THUMB_SELECTED: [\"#position:active::-webkit-slider-thumb\", \"#position:active::-moz-range-thumb\"],\n  MAIN_SHUFFLE_BUTTON: [\"#shuffle\"],\n  MAIN_SHUFFLE_BUTTON_DEPRESSED: [\"#shuffle:active\"],\n  MAIN_SHUFFLE_BUTTON_SELECTED: [\"#shuffle.selected\"],\n  MAIN_SHUFFLE_BUTTON_SELECTED_DEPRESSED: [\"#shuffle.selected:active\"],\n  MAIN_REPEAT_BUTTON: [\"#repeat\"],\n  MAIN_REPEAT_BUTTON_DEPRESSED: [\"#repeat:active\"],\n  MAIN_REPEAT_BUTTON_SELECTED: [\"#repeat.selected\"],\n  MAIN_REPEAT_BUTTON_SELECTED_DEPRESSED: [\"#repeat.selected:active\"],\n  MAIN_EQ_BUTTON: [\"#equalizer-button\"],\n  MAIN_EQ_BUTTON_SELECTED: [\"#equalizer-button.selected\"],\n  MAIN_EQ_BUTTON_DEPRESSED: [\"#equalizer-button:active\"],\n  MAIN_EQ_BUTTON_DEPRESSED_SELECTED: [\"#equalizer-button.selected:active\"],\n  MAIN_PLAYLIST_BUTTON: [\"#playlist-button\"],\n  MAIN_PLAYLIST_BUTTON_SELECTED: [\"#playlist-button.selected\"],\n  MAIN_PLAYLIST_BUTTON_DEPRESSED: [\"#playlist-button:active\"],\n  MAIN_PLAYLIST_BUTTON_DEPRESSED_SELECTED: [\"#playlist-button.selected:active\"],\n  MAIN_TITLE_BAR: [\"#title-bar\"],\n  MAIN_TITLE_BAR_SELECTED: [\".selected #title-bar\"],\n  MAIN_EASTER_EGG_TITLE_BAR: [\".llama #title-bar\"],\n  MAIN_EASTER_EGG_TITLE_BAR_SELECTED: [\".llama.selected #title-bar\"],\n  MAIN_OPTIONS_BUTTON: [\".selected #title-bar #option.clicked\"],\n  MAIN_OPTIONS_BUTTON_DEPRESSED: [\".selected #title-bar #option:active\", \".selected #title-bar #option.selected\"],\n  MAIN_MINIMIZE_BUTTON: [\".selected #title-bar #minimize.clicked\"],\n  MAIN_MINIMIZE_BUTTON_DEPRESSED: [\".selected #title-bar #minimize:active\"],\n  MAIN_SHADE_BUTTON: [\".selected #title-bar #shade.clicked\"],\n  MAIN_SHADE_BUTTON_DEPRESSED: [\".selected #title-bar #shade:active\"],\n  MAIN_CLOSE_BUTTON: [\".selected #title-bar #close.clicked\"],\n  MAIN_CLOSE_BUTTON_DEPRESSED: [\".selected #title-bar #close:active\"],\n  MAIN_CLUTTER_BAR_BACKGROUND: [\"#clutter-bar\"],\n  MAIN_CLUTTER_BAR_BACKGROUND_DISABLED: [\"#clutter-bar.disabled\"],\n  MAIN_CLUTTER_BAR_BUTTON_O_SELECTED: [\"#button-o:active\", \"#button-0.selected\"],\n  MAIN_CLUTTER_BAR_BUTTON_A_SELECTED: [\"#button-a:active\", \"#button-a.selected\"],\n  MAIN_CLUTTER_BAR_BUTTON_I_SELECTED: [\"#button-i:active\", \"#button-i.selected\"],\n  MAIN_CLUTTER_BAR_BUTTON_D_SELECTED: [\"#button-d:active\", \"#button-d.selected\"],\n  MAIN_CLUTTER_BAR_BUTTON_V_SELECTED: [\"#button-v:active\", \"#button-v.selected\"],\n  MAIN_SHADE_BACKGROUND: [\".shade #title-bar\"],\n  MAIN_SHADE_BACKGROUND_SELECTED: [\".shade.selected #title-bar\"],\n  MAIN_SHADE_BUTTON_SELECTED: [\".shade.selected #title-bar #shade\"],\n  MAIN_SHADE_BUTTON_SELECTED_DEPRESSED: [\".shade #title-bar #shade:active\"],\n  MAIN_SHADE_POSITION_BACKGROUND: [\".shade #position\"],\n  MAIN_SHADE_POSITION_THUMB: [\".shade #position::-moz-range-thumb\", \".shade #position::-webkit-slider-thumb\"],\n  MAIN_SHADE_POSITION_THUMB_LEFT: [\".shade #position.left::-moz-range-thumb\", \".shade #position.left::-webkit-slider-thumb\"],\n  MAIN_SHADE_POSITION_THUMB_RIGHT: [\".shade #position.right::-moz-range-thumb\", \".shade #position.right::-webkit-slider-thumb\"],\n  MAIN_VOLUME_BACKGROUND: [\"#volume\"],\n  MAIN_VOLUME_THUMB: [\"#volume input::-webkit-slider-thumb\", \"#volume input::-moz-range-thumb\"],\n  MAIN_VOLUME_THUMB_SELECTED: [\"#volume input:active::-webkit-slider-thumb\", \"#volume input:active::-moz-range-thumb\"],\n  GEN_TOP_CENTER_FILL: [\".gen-window .gen-top\"],\n  GEN_TOP_LEFT: [\".gen-window .gen-top-left\"],\n  GEN_TOP_LEFT_END: [\".gen-window .gen-top-left-end\"],\n  GEN_TOP_RIGHT: [\".gen-window .gen-top-right\"],\n  GEN_TOP_RIGHT_END: [\".gen-window .gen-top-right-end\"],\n  GEN_TOP_LEFT_RIGHT_FILL: [\".gen-window .gen-top-left-fill\", \".gen-window .gen-top-right-fill\"],\n  GEN_TOP_CENTER_FILL_SELECTED: [\".gen-window.selected .gen-top\"],\n  GEN_TOP_LEFT_SELECTED: [\".gen-window.selected .gen-top-left\"],\n  GEN_TOP_LEFT_END_SELECTED: [\".gen-window.selected .gen-top-left-end\"],\n  GEN_TOP_RIGHT_SELECTED: [\".gen-window.selected .gen-top-right\"],\n  GEN_TOP_RIGHT_END_SELECTED: [\".gen-window.selected .gen-top-right-end\"],\n  GEN_TOP_LEFT_RIGHT_FILL_SELECTED: [\".gen-window.selected .gen-top-left-fill\", \".gen-window.selected .gen-top-right-fill\"],\n  GEN_BOTTOM_LEFT: [\".gen-window .gen-bottom-left\"],\n  GEN_BOTTOM_RIGHT: [\".gen-window .gen-bottom-right\"],\n  GEN_BOTTOM_FILL: [\".gen-window .gen-bottom\"],\n  GEN_MIDDLE_LEFT: [\".gen-window .gen-middle-left\"],\n  GEN_MIDDLE_LEFT_BOTTOM: [\".gen-window .gen-middle-left-bottom\"],\n  GEN_MIDDLE_RIGHT: [\".gen-window .gen-middle-right\"],\n  GEN_MIDDLE_RIGHT_BOTTOM: [\".gen-window .gen-middle-right-bottom\"],\n  GEN_CLOSE_SELECTED: [\".gen-window .gen-close:active\"]\n};\nObject.keys(FONT_LOOKUP).forEach(character => {\n  const key = imageConstFromChar(character);\n  const code = character.charCodeAt(0);\n  imageSelectors[key] = [`.character-${code}`];\n});\nLETTERS.forEach(character => {\n  imageSelectors[`GEN_TEXT_${character}`] = [`.gen-text-${character.toLowerCase()}`];\n  imageSelectors[`GEN_TEXT_SELECTED_${character}`] = [`.gen-window.selected .gen-text-${character.toLowerCase()}`];\n});\nconst cursorSelectors = {\n  CLOSE: [\"#title-bar #close\"],\n  // This is not quite right. There are some areas that show this cursor\n  // but are not clickable.\n  EQSLID: [\"#equalizer-window .band\"],\n  EQNORMAL: [\"#equalizer-window\"],\n  EQCLOSE: [\"#equalizer-window #equalizer-close\"],\n  EQTITLE: [\"#equalizer-window .title-bar\", \"#equalizer-window.shade\", \"#equalizer-window.shade input\"],\n  MAINMENU: [\"#main-window #option\", \"#webamp-context-menu .context-menu\"],\n  MIN: [\"#main-window #minimize\"],\n  NORMAL: [\n  // Use this as the default cursor.\n  \".window\", \".window input\",\n  // Otherwise\n  \"#main-window\", \"#main-window.shade #title-bar\"],\n  MMENU: [\"#main-window.shade #option\"],\n  PNORMAL: [\"#playlist-window\"],\n  // TODO: This is should really only apply to the top part of the top.\n  // The chrome around the playlist window is larger than others. The\n  // cursor only applies to the same height as the other window's chrome.\n  PTBAR: [\"#playlist-window .playlist-top\"],\n  PCLOSE: [\"#playlist-window #playlist-close-button\", \"#playlist-window-shade #playlist-close-button\"],\n  PWINBUT: [\"#playlist-window #playlist-shade-button\", \"#playlist-window-shade #playlist-shade-button\"],\n  POSBAR: [\"#main-window #position\"],\n  PSIZE: [\"#playlist-window #playlist-resize-target\"],\n  PWSSIZE: [\"#playlist-window-shade #playlist-resize-target\"],\n  PWSNORM: [\"#playlist-window-shade\"],\n  // TODO: The target for this is not quite right.\n  PVSCROLL: [\"#playlist-window .playlist-scrollbar\"],\n  SONGNAME: [\"#main-window #marquee\"],\n  TITLEBAR: [\"#main-window #title-bar\"],\n  VOLBAL: [\"#volume\", \"#volume input\", \"#balance\"],\n  WINBUT: [\"#main-window #shade\"],\n  WSNORMAL: [\"#main-window.shade #title-bar\"],\n  WSPOSBAR: [\"#main-window.shade #position\"]\n};\n;// CONCATENATED MODULE: ./js/components/Css.tsx\n\n\nfunction Css({\n  children,\n  id\n}) {\n  const style = (0,react.useMemo)(() => {\n    const s = document.createElement(\"style\");\n    s.type = \"text/css\";\n    s.id = id;\n    return s;\n  }, [id]);\n  (0,react.useLayoutEffect)(() => {\n    document.head.appendChild(style);\n    return () => style.remove();\n  }, [style]);\n  return /*#__PURE__*/(0,react_dom.createPortal)(children, style);\n}\n;// CONCATENATED MODULE: ./js/components/ClipPaths.tsx\n\n\n\n// this.props.children should be an object containing arrays of strings. The\n// keys are ids, and the arrays are arrays of polygon point strings\nfunction ClipPaths({\n  children\n}) {\n  const paths = (0,react.useMemo)(() => {\n    return document.createElement(\"div\");\n  }, []);\n  (0,react.useLayoutEffect)(() => {\n    document.body.appendChild(paths);\n    return () => paths.remove();\n  }, [paths]);\n  return /*#__PURE__*/(0,react_dom.createPortal)( /*#__PURE__*/(0,jsx_runtime.jsx)(\"svg\", {\n    height: 0,\n    width: 0,\n    children: /*#__PURE__*/(0,jsx_runtime.jsx)(\"defs\", {\n      children: Object.keys(children).map(id => /*#__PURE__*/(0,jsx_runtime.jsx)(\"clipPath\", {\n        id: id,\n        children: children[id].map((points, i) => /*#__PURE__*/(0,jsx_runtime.jsx)(\"polygon\", {\n          points: points\n        }, i))\n      }, id))\n    })\n  }), paths);\n}\n// EXTERNAL MODULE: ../ani-cursor/dist/index.js\nvar dist = __webpack_require__(1894);\n;// CONCATENATED MODULE: ./js/components/Skin.tsx\n// Dynamically set the css background images for all the sprites\n\n\n\n\n\n\n\n\n\n\n\nconst CSS_PREFIX = \"#webamp\";\nconst mapRegionNamesToIds = {\n  normal: \"mainWindowClipPath\",\n  windowshade: \"shadeMainWindowClipPath\",\n  equalizer: \"equalizerWindowClipPath\",\n  equalizerws: \"shadeEqualizerWindowClipPath\"\n};\nconst mapRegionNamesToMatcher = {\n  normal: \"#main-window:not(.shade)\",\n  windowshade: \"#main-window.shade\",\n  equalizer: \"#equalizer-window:not(.shade)\",\n  equalizerws: \"#equalizer-window.shade\"\n};\nconst numExIsUsed = skinImages => Boolean(skinImages.DIGIT_0_EX);\nconst FALLBACKS = {\n  MAIN_BALANCE_BACKGROUND: \"MAIN_VOLUME_BACKGROUND\",\n  MAIN_BALANCE_THUMB: \"MAIN_VOLUME_THUMB\",\n  MAIN_BALANCE_THUMB_ACTIVE: \"MAIN_VOLUME_THUMB_SELECTED\",\n  EQ_MAXIMIZE_BUTTON_ACTIVE: \"EQ_MAXIMIZE_BUTTON_ACTIVE_FALLBACK\"\n};\n\n// Cursors might appear in context menus which are not nested inside the window layout div.\nfunction normalizeCursorSelector(selector) {\n  return `${\n  // TODO: Fix this hack\n  // Maybe our CSS name spacing should be based on some other class/id\n  // than the one we use for defining the main div.\n  // That way it could be shared by both the player and the context menu.\n  selector.startsWith(\"#webamp-context-menu\") ? \"\" : CSS_PREFIX} ${selector}`;\n}\nconst getCssRules = (0,lib/* createSelector */.P1)(getSkinImages, getSkinCursors, getSkinLetterWidths, getSkinRegion, (skinImages, skinCursors, skinGenLetterWidths, skinRegion) => {\n  if (!skinImages || !skinCursors) {\n    return null;\n  }\n  const cssRules = [];\n  Object.keys(imageSelectors).forEach(imageName => {\n    const imageUrl = skinImages[imageName] || skinImages[FALLBACKS[imageName]];\n    if (imageUrl) {\n      imageSelectors[imageName].forEach(selector => {\n        cssRules.push(`${CSS_PREFIX} ${selector} {background-image: url(${imageUrl})}`);\n      });\n    }\n  });\n  if (skinGenLetterWidths != null) {\n    LETTERS.forEach(letter => {\n      const width = skinGenLetterWidths[`GEN_TEXT_${letter}`];\n      const selectedWidth = skinGenLetterWidths[`GEN_TEXT_SELECTED_${letter}`];\n      cssRules.push(`${CSS_PREFIX} .gen-text-${letter.toLowerCase()} {width: ${width}px;}`);\n      cssRules.push(`${CSS_PREFIX} .selected .gen-text-${letter.toLowerCase()} {width: ${selectedWidth}px;}`);\n    });\n  }\n  Object.entries(cursorSelectors).forEach(([cursorName, cursorSelector]) => {\n    const cursor = skinCursors[cursorName];\n    if (cursor == null) {\n      return;\n    }\n    const cursorRules = cursorSelector.map(normalizeCursorSelector).map(selector => {\n      switch (cursor.type) {\n        case \"cur\":\n          return `${selector} {cursor: url(${cursor.url}), auto}`;\n        case \"ani\":\n          {\n            return (0,dist.convertAniBinaryToCSS)(selector, cursor.aniData);\n          }\n      }\n    });\n    cssRules.push(...cursorRules);\n  });\n  if (numExIsUsed(skinImages)) {\n    // This alternate number file requires that the minus sign be\n    // formatted differently.\n    cssRules.push(`${CSS_PREFIX} .status #time #minus-sign { top: 0px; left: -1px; width: 9px; height: 13px; }`);\n  }\n  for (const [regionName, polygons] of Object.entries(skinRegion)) {\n    if (polygons) {\n      const matcher = mapRegionNamesToMatcher[regionName];\n      const id = mapRegionNamesToIds[regionName];\n      cssRules.push(`${CSS_PREFIX} ${matcher} { clip-path: url(#${id}); }`);\n    }\n  }\n  return cssRules.join(\"\\n\");\n});\nconst getClipPaths = (0,lib/* createSelector */.P1)(getSkinRegion, skinRegion => {\n  const clipPaths = {};\n  for (const [regionName, polygons] of Object.entries(skinRegion)) {\n    if (polygons) {\n      const id = mapRegionNamesToIds[regionName];\n      clipPaths[id] = polygons;\n    }\n  }\n  return clipPaths;\n});\nfunction Skin() {\n  const cssRules = useTypedSelector(getCssRules);\n  const clipPaths = useTypedSelector(getClipPaths);\n  if (cssRules == null) {\n    return null;\n  }\n  return /*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment, {\n    children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Css, {\n      id: \"webamp-skin\",\n      children: cssRules\n    }), /*#__PURE__*/(0,jsx_runtime.jsx)(ClipPaths, {\n      children: clipPaths\n    })]\n  });\n}\n// EXTERNAL MODULE: ./css/webamp.css\nvar webamp = __webpack_require__(9479);\n;// CONCATENATED MODULE: ./js/components/App.tsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Constructs the windows to render\n */\nfunction App({\n  media,\n  filePickers\n}) {\n  const closed = useTypedSelector(getClosed);\n  const genWindowsInfo = useTypedSelector(getGenWindows);\n  const zIndex = useTypedSelector(getZIndex);\n  const browserWindowSizeChanged = useActionCreator(windows_browserWindowSizeChanged);\n  const setFocusedWindow = useActionCreator(windows_setFocusedWindow);\n  const [webampNode] = (0,react.useState)(() => {\n    const node = document.createElement(\"div\");\n    node.id = \"webamp\";\n    // @ts-ignore I think I'm supposed to set this with setAttribute, but I can't confirm.\n    node.role = \"application\";\n    return node;\n  });\n  (0,react.useLayoutEffect)(() => {\n    webampNode.style.zIndex = String(zIndex);\n  }, [webampNode, zIndex]);\n  (0,react.useLayoutEffect)(() => {\n    document.body.appendChild(webampNode);\n    return () => {\n      document.body.removeChild(webampNode);\n    };\n  }, [webampNode]);\n  (0,react.useEffect)(() => {\n    const handleWindowResize = () => {\n      if (webampNode == null) {\n        return;\n      }\n      // It's a bit tricky to measure the \"natural\" size of the browser window.\n      // Specifically we want to know how large the window would be without our\n      // own Webamp windows influencing it. To achieve this, we temporarily make\n      // our container `overflow: hidden;`. We then make our container full\n      // screen by setting the bottom/right properties to zero. This second part\n      // allows our Webamp windows to stay visible during the resize. After we\n      // measure, we set the style back so that we don't end up interfering with\n      // click events outside of our Webamp windows.\n      webampNode.style.right = \"0\";\n      webampNode.style.bottom = \"0\";\n      webampNode.style.overflow = \"hidden\";\n      browserWindowSizeChanged(getWindowSize());\n      webampNode.style.right = \"auto\";\n      webampNode.style.bottom = \"auto\";\n      webampNode.style.overflow = \"visible\";\n    };\n    handleWindowResize();\n    window.addEventListener(\"resize\", handleWindowResize);\n    return () => {\n      window.removeEventListener(\"resize\", handleWindowResize);\n    };\n  }, [browserWindowSizeChanged, webampNode]);\n  const renderWindows = (0,react.useCallback)(() => {\n    return objectMap(genWindowsInfo, (w, id) => {\n      if (!w.open) {\n        return null;\n      }\n      switch (id) {\n        case WINDOWS.MAIN:\n          return /*#__PURE__*/(0,jsx_runtime.jsx)(components_MainWindow, {\n            analyser: media.getAnalyser(),\n            filePickers: filePickers\n          });\n        case WINDOWS.EQUALIZER:\n          return /*#__PURE__*/(0,jsx_runtime.jsx)(components_EqualizerWindow, {});\n        case WINDOWS.PLAYLIST:\n          return /*#__PURE__*/(0,jsx_runtime.jsx)(components_PlaylistWindow, {\n            analyser: media.getAnalyser()\n          });\n        case WINDOWS.MILKDROP:\n          return /*#__PURE__*/(0,jsx_runtime.jsx)(MilkdropWindow, {\n            analyser: media.getAnalyser()\n          });\n        default:\n          throw new Error(`Tried to render an unknown window: ${id}`);\n      }\n    });\n  }, [media, filePickers, genWindowsInfo]);\n  const handleBlur = e => {\n    if (!e.currentTarget.contains(e.relatedTarget)) {\n      setFocusedWindow(null);\n    }\n  };\n  if (closed) {\n    return null;\n  }\n  return /*#__PURE__*/react_dom.createPortal( /*#__PURE__*/(0,jsx_runtime.jsx)(react.StrictMode, {\n    children: /*#__PURE__*/(0,jsx_runtime.jsxs)(\"div\", {\n      onBlur: handleBlur,\n      children: [/*#__PURE__*/(0,jsx_runtime.jsx)(Skin, {}), /*#__PURE__*/(0,jsx_runtime.jsx)(ContextMenuWraper, {\n        renderContents: () => /*#__PURE__*/(0,jsx_runtime.jsx)(MainWindow_MainContextMenu, {\n          filePickers: filePickers\n        }),\n        children: /*#__PURE__*/(0,jsx_runtime.jsx)(WindowManager, {\n          windows: renderWindows()\n        })\n      })]\n    })\n  }), webampNode);\n}\n;// CONCATENATED MODULE: ./js/hotkeys.ts\n\n\nconst IGNORE_EVENTS_FROM_TAGS = new Set([\"input\", \"textarea\", \"select\"]);\nfunction bindHotkeys(dispatch) {\n  let currentPos = 0;\n  const trigger = [78,\n  // N\n  85,\n  // U\n  76,\n  // L\n  76,\n  // L\n  83,\n  // S\n  79,\n  // O\n  70,\n  // F\n  84 // T\n  ];\n\n  const listener = e => {\n    if (e.target instanceof Element && IGNORE_EVENTS_FROM_TAGS.has(e.target.tagName.toLowerCase())) {\n      return;\n    }\n    if (e.ctrlKey) {\n      switch (e.keyCode) {\n        case 68:\n          // CTRL+D\n          dispatch(windows_toggleDoubleSizeMode());\n          e.preventDefault(); // Supress the \"Bookmark\" action on windows.\n          break;\n        case 76:\n          // CTRL+L FIXME\n          break;\n        case 82:\n          // CTRL+R\n          dispatch(playlist_reverseList());\n          break;\n        case 84:\n          // CTRL+T\n          dispatch({\n            type: TOGGLE_TIME_MODE\n          });\n          break;\n      }\n    } else if (e.altKey) {\n      switch (e.keyCode) {\n        case 87:\n          // ALT+W\n          dispatch(windows_toggleWindow(\"main\"));\n          break;\n        case 69:\n          // ALT+E\n          dispatch(windows_toggleWindow(\"playlist\"));\n          break;\n        case 71:\n          // ALT+G\n          dispatch(windows_toggleWindow(\"equalizer\"));\n          break;\n      }\n    } else {\n      switch (e.keyCode) {\n        case 37:\n          // left arrow\n          dispatch(media_seekBackward(5));\n          break;\n        case 38:\n          // up arrow\n          dispatch(adjustVolume(1));\n          break;\n        case 39:\n          // right arrow\n          dispatch(media_seekForward(5));\n          break;\n        case 40:\n          // down arrow\n          dispatch(adjustVolume(-1));\n          break;\n        case 66:\n          // B\n          dispatch(media_next());\n          break;\n        case 67:\n          // C\n          dispatch(media_pause());\n          break;\n        case 76:\n          // L\n          dispatch(files_openMediaFileDialog());\n          break;\n        case 82:\n          // R\n          dispatch(media_toggleRepeat());\n          break;\n        case 83:\n          // S\n          dispatch(media_toggleShuffle());\n          break;\n        case 86:\n          // V\n          dispatch(media_stop());\n          break;\n        case 88:\n          // X\n          dispatch(media_play());\n          break;\n        case 90:\n          // Z\n          dispatch(media_previous());\n          break;\n        case 96:\n          // numpad 0\n          dispatch(files_openMediaFileDialog());\n          break;\n        case 97:\n          // numpad 1\n          dispatch(media_nextN(-10));\n          break;\n        case 98:\n          // numpad 2\n          dispatch(adjustVolume(-1));\n          break;\n        case 99:\n          // numpad 3\n          dispatch(media_nextN(10));\n          break;\n        case 100:\n          // numpad 4\n          dispatch(media_previous());\n          break;\n        case 101:\n          // numpad 5\n          dispatch(media_play());\n          break;\n        case 102:\n          // numpad 6\n          dispatch(media_next());\n          break;\n        case 103:\n          // numpad 7\n          dispatch(media_seekBackward(5));\n          break;\n        case 104:\n          // numpad 8\n          dispatch(adjustVolume(1));\n          break;\n        case 105:\n          // numpad 9\n          dispatch(media_seekForward(5));\n          break;\n      }\n    }\n\n    // Easter Egg\n\n    // Ignore escape. Usually this gets swallowed by the browser, but not always.\n    if (e.keyCode !== 27) {\n      currentPos = e.keyCode === trigger[currentPos] ? currentPos + 1 : 0;\n      if (currentPos === trigger.length) {\n        dispatch({\n          type: actionTypes_TOGGLE_LLAMA_MODE\n        });\n      }\n    }\n  };\n  document.addEventListener(\"keydown\", listener);\n  return () => {\n    document.removeEventListener(\"keydown\", listener);\n  };\n}\n;// CONCATENATED MODULE: ./js/emitter.ts\n\nclass Emitter {\n  constructor() {\n    (0,defineProperty/* default */.Z)(this, \"_listeners\", void 0);\n    this._listeners = {};\n  }\n  on(event, callback) {\n    const eventListeners = this._listeners[event] || [];\n    eventListeners.push(callback);\n    this._listeners[event] = eventListeners;\n    const unsubscribe = () => {\n      this._listeners[event] = eventListeners.filter(cb => cb !== callback);\n    };\n    return unsubscribe;\n  }\n  trigger(event, ...args) {\n    const callbacks = this._listeners[event];\n    if (callbacks) {\n      callbacks.forEach(cb => cb(...args));\n    }\n  }\n  dispose() {\n    this._listeners = {};\n  }\n}\n;// CONCATENATED MODULE: ./js/media/StereoBalanceNode.js\n// The Web Audio API does not offer an easy way to make a stereo balance\n// control. This is an attempt to fill that void, using an API similar to\n// [StereoPannerNode](https://developer.mozilla.org/en-US/docs/Web/API/StereoPannerNode)\nfunction StereoBalanceNode(context, options = {\n  balance: 0\n}) {\n  let balance = 0;\n\n  // ChannelSplitterNode cannot be told to use a `channelInterperatation` of\n  // \"speakers\". This means that if we get a mono file, we will end up only\n  // playing in the left speaker. So instead we use this dummy gain node to\n  // convert whatever source we get (stereo, mono, or n channels) into a stereo\n  // signal.\n  // Idea credit: https://github.com/WebAudio/web-audio-api/issues/975#issue-177242377\n  const upMixer = context.createGain();\n  upMixer.channelCount = 2;\n  upMixer.channelCountMode = \"explicit\";\n  upMixer.channelInterpretation = \"speakers\";\n  const splitter = context.createChannelSplitter(2);\n\n  // Create the gains for left and right\n  const leftGain = context.createGain();\n  const rightGain = context.createGain();\n  const merger = context.createChannelMerger(2);\n  upMixer.connect(splitter);\n  splitter.connect(leftGain, 0);\n  splitter.connect(rightGain, 1);\n  leftGain.connect(merger, 0, 0);\n  rightGain.connect(merger, 0, 1);\n\n  // -1 (left) to 1 (right)\n  function set(rawValue) {\n    const value = Number(rawValue);\n    leftGain.gain.value = value > 0 ? 1 - value : 1;\n    rightGain.gain.value = value > 0 ? 1 : 1 + value;\n    balance = value;\n  }\n  function get() {\n    return balance;\n  }\n\n  // Create our own version of an [AudioParam](https://developer.mozilla.org/en-US/docs/Web/API/AudioParam).\n  // We don't currently support any of the \"over time\" methods, but maybe some day\n  // we'll want to.\n  const audioParam = {};\n  Object.defineProperties(audioParam, {\n    value: {\n      get,\n      set,\n      enumerable: true,\n      configurable: true\n    }\n  });\n\n  // The way the `.connect` API works, we can't actually construct our own\n  // AudioNode. Instead we have to take an existing node and monkey patch it.\n  Object.defineProperties(upMixer, {\n    balance: {\n      value: audioParam,\n      enumerable: true,\n      writable: false,\n      configurable: true\n    },\n    connect: {\n      value: AudioNode.prototype.connect.bind(merger),\n      enumerable: false,\n      writable: false,\n      configurable: true\n    },\n    disconnect: {\n      value: AudioNode.prototype.disconnect.bind(merger),\n      enumerable: false,\n      writable: false,\n      configurable: true\n    }\n  });\n  if (balance !== options.balance) {\n    set(options.balance);\n  }\n  return upMixer;\n}\n;// CONCATENATED MODULE: ./js/media/elementSource.ts\n\n\n\n\nconst {\n  ipcRenderer: elementSource_ipcRenderer\n} = window.require('electron');\nclass ElementSource {\n  on(eventType, cb) {\n    return this._emitter.on(eventType, cb);\n  }\n  constructor(context, destination) {\n    (0,defineProperty/* default */.Z)(this, \"_emitter\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_context\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_source\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_destination\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_audio\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_stalled\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_status\", void 0);\n    this._emitter = new Emitter();\n    this._context = context;\n    this._destination = destination;\n    this._audio = document.createElement(\"audio\");\n    this._audio.crossOrigin = \"anonymous\";\n    this._stalled = false;\n    this._status = MEDIA_STATUS.STOPPED;\n\n    // TODO: #leak\n    this._audio.addEventListener(\"suspend\", () => {\n      this._setStalled(true);\n    });\n\n    // TODO: #leak\n    this._audio.addEventListener(\"durationchange\", () => {\n      this._emitter.trigger(\"loaded\");\n      this._setStalled(false);\n    });\n\n    // TODO: #leak\n    this._audio.addEventListener(\"ended\", () => {\n      this._emitter.trigger(\"ended\");\n      this._setStatus(MEDIA_STATUS.STOPPED);\n    });\n\n    // TODO: Throttle to 50 (if needed)\n    // TODO: #leak\n    this._audio.addEventListener(\"timeupdate\", () => {\n      this._emitter.trigger(\"positionChange\");\n    });\n\n    // TODO: #leak\n    this._audio.addEventListener(\"error\", e => {\n      switch (this._audio.error.code) {\n        case 1:\n          // The fetching of the associated resource was aborted by the user's request.\n          console.error(\"MEDIA_ERR_ABORTED\", e);\n          break;\n        case 2:\n          console.error(\"MEDIA_ERR_NETWORK\", e);\n          // Some kind of network error occurred which prevented the media from being successfully fetched, despite having previously been available.\n          break;\n        case 3:\n          // Despite having previously been determined to be usable, an error occurred while trying to decode the media resource, resulting in an error.\n\n          // There is a bug in Chrome where improperly terminated mp3s can cuase this error.\n          // https://bugs.chromium.org/p/chromium/issues/detail?id=794782\n          // Related: Commit f44e826c83c74fef04c2c448af30cfb353b28312\n          console.error(\"PIPELINE_ERROR_DECODE\", e);\n          break;\n        case 4:\n          console.error(\"MEDIA_ERR_SRC_NOT_SUPPORTED\", e);\n          // The associated resource or media provider object (such as a MediaStream) has been found to be unsuitable.\n          break;\n      }\n      // Rather than just geting stuck in this error state, we can just pretend this is\n      // the end of the track.\n\n      this._emitter.trigger(\"ended\");\n      this._setStatus(MEDIA_STATUS.STOPPED);\n    });\n    this._source = this._context.createMediaElementSource(this._audio);\n    this._source.connect(destination);\n  }\n  _setStalled(stalled) {\n    this._stalled = stalled;\n    this._emitter.trigger(\"stallChanged\");\n  }\n  disconnect() {\n    this._source.disconnect();\n  }\n\n  // Async for now, for compatibility with BufferAudioSource\n  // TODO: This does not need to be async\n  async loadUrl(url) {\n    if (/^\\d+$/.test(url) || /^.*-.*-.*-.*-.*$/.test(url)) {\n      await elementSource_ipcRenderer.invoke('getTrackByID', url).then(link => {\n        this._audio.src = link;\n      });\n    } else {\n      this._audio.src = url;\n    }\n  }\n  async play() {\n    if (this._status !== MEDIA_STATUS.PAUSED) {\n      this.seekToTime(0);\n    }\n    try {\n      await this._audio.play();\n      // TODO #race\n    } catch (err) {\n      //\n    }\n    this._setStatus(MEDIA_STATUS.PLAYING);\n  }\n  pause() {\n    this._audio.pause();\n    this._setStatus(MEDIA_STATUS.PAUSED);\n  }\n  stop() {\n    this._audio.pause();\n    this._audio.currentTime = 0;\n    this._setStatus(MEDIA_STATUS.STOPPED);\n  }\n  seekToTime(time) {\n    /* TODO: We could check if this is actually seekable:\n    const { seekable } = this._audio;\n    for (let i = 0; i < seekable.length; i++) {\n      console.log(\"start\", seekable.start(i), \"end\", seekable.end(i));\n    }\n    */\n    this._audio.currentTime = clamp(time, 0, this.getDuration());\n    this._emitter.trigger(\"positionChange\");\n  }\n  getStalled() {\n    return this._stalled;\n  }\n  getStatus() {\n    return this._status;\n  }\n  getDuration() {\n    const {\n      duration\n    } = this._audio;\n    // Safari on iOS currently has a strange behavior where it reports\n    // the duration as infinity if an Accept-Ranges header is not returned.\n    // For now, 0 is better even though it's still wrong.\n    return isNaN(duration) || duration === Infinity ? 0 : duration;\n  }\n  getTimeElapsed() {\n    return this._audio.currentTime;\n  }\n  _setStatus(status) {\n    this._status = status;\n    this._emitter.trigger(\"statusChange\");\n  }\n  dispose() {\n    // TODO: Dispose subscriptions to this.audio\n    this.stop();\n    this._emitter.dispose();\n  }\n}\n;// CONCATENATED MODULE: ./js/media/index.ts\n\n/* Emulate the native <audio> element with Web Audio API */\n\n\n\n\n// NOTE: While this is not technically a public API, https://winampify.io/ is\n// replacing this class with a custom version. Breaking changes to this API\n// surface should be communicated to Remi.\nclass Media {\n  constructor() {\n    (0,defineProperty/* default */.Z)(this, \"_emitter\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_context\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_balance\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_staticSource\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_preamp\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_analyser\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_gainNode\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_source\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_bands\", void 0);\n    this._emitter = new Emitter();\n    // @ts-ignore Typescript does not know about webkitAudioContext\n    this._context = new (window.AudioContext || window.webkitAudioContext)();\n    // Fix for iOS and Chrome (Canary) which require that the context be created\n    // or resumed by a user interaction.\n    // https://developers.google.com/web/updates/2017/09/autoplay-policy-changes\n    // https://gist.github.com/laziel/7aefabe99ee57b16081c\n    // Via: https://stackoverflow.com/a/43395068/1263117\n    // TODO #leak\n    if (this._context.state === \"suspended\") {\n      const resume = async () => {\n        await this._context.resume();\n        if (this._context.state === \"running\") {\n          // TODO: Add this to the disposable\n          document.body.removeEventListener(\"touchend\", resume, false);\n          document.body.removeEventListener(\"click\", resume, false);\n          document.body.removeEventListener(\"keydown\", resume, false);\n        }\n      };\n      document.body.addEventListener(\"touchend\", resume, false);\n      document.body.addEventListener(\"click\", resume, false);\n      document.body.addEventListener(\"keydown\", resume, false);\n    }\n\n    // TODO: Maybe we can get rid of this now that we are using AudioAbstraction?\n    this._staticSource = this._context.createGain(); // Just a noop node\n\n    // @ts-ignore The way this class has to be monkey patched, makes it very hard to type.\n    this._balance = new StereoBalanceNode(this._context);\n\n    // Create the preamp node\n    this._preamp = this._context.createGain();\n\n    // Create the analyser node for the visualizer\n    this._analyser = this._context.createAnalyser();\n    this._analyser.fftSize = 2048;\n    // don't smooth audio analysis\n    this._analyser.smoothingTimeConstant = 0.0;\n\n    // Create the gain node for the volume control\n    this._gainNode = this._context.createGain();\n\n    // Connect all the nodes in the correct way\n    // (Note, source is created and connected later)\n    //\n    //                <source>\n    //                    |\n    //                    |_____________\n    //                    |             \\\n    //                <preamp>          |\n    //                    |             | <-- Optional bypass\n    //           [...biquadFilters]     |\n    //                    |_____________/\n    //                    |\n    //              <staticSource>\n    //                    |\n    //                <balance>\n    //                    |\n    //                    |\\\n    //                    | <analyser>\n    //                  <gain>\n    //                    |\n    //              <destination>\n\n    this._source = new ElementSource(this._context, this._staticSource);\n    this._source.on(\"positionChange\", () => {\n      this._emitter.trigger(\"timeupdate\");\n    });\n    this._source.on(\"ended\", () => {\n      this._emitter.trigger(\"ended\");\n    });\n    this._source.on(\"statusChange\", () => {\n      switch (this._source.getStatus()) {\n        case MEDIA_STATUS.PLAYING:\n          this._emitter.trigger(\"playing\");\n          break;\n      }\n      this._emitter.trigger(\"timeupdate\");\n    });\n    this._source.on(\"loaded\", () => {\n      this._emitter.trigger(\"fileLoaded\");\n    });\n    this._staticSource.connect(this._preamp);\n    let output = this._preamp;\n    this._bands = {};\n    BANDS.forEach((band, i) => {\n      const filter = this._context.createBiquadFilter();\n      this._bands[band] = filter;\n      if (i === 0) {\n        // The first filter, includes all lower frequencies\n        filter.type = \"lowshelf\";\n      } else if (i === BANDS.length - 1) {\n        // The last filter, includes all higher frequencies\n        filter.type = \"highshelf\";\n      } else {\n        filter.type = \"peaking\";\n      }\n      filter.frequency.value = band;\n      filter.gain.value = 0;\n      output.connect(filter);\n      output = filter;\n    });\n    output.connect(this._balance);\n    this._balance.connect(this._gainNode);\n    this._balance.connect(this._analyser);\n    this._gainNode.connect(this._context.destination);\n  }\n  getAnalyser() {\n    return this._analyser;\n  }\n\n  /* Properties */\n  duration() {\n    return this._source.getDuration();\n  }\n  timeElapsed() {\n    return this._source.getTimeElapsed();\n  }\n  timeRemaining() {\n    return this.duration() - this.timeElapsed();\n  }\n  percentComplete() {\n    return this.timeElapsed() / this.duration() * 100;\n  }\n\n  /* Actions */\n  async play() {\n    await this._source.play();\n  }\n  pause() {\n    this._source.pause();\n  }\n  stop() {\n    this._source.stop();\n  }\n\n  /* Actions with arguments */\n  seekToPercentComplete(percent) {\n    const seekTime = this.duration() * (percent / 100);\n    this.seekToTime(seekTime);\n  }\n\n  // From 0-1\n  setVolume(volume) {\n    this._gainNode.gain.value = volume / 100;\n  }\n\n  // from 0 to 2400\n  // The input value here is 0-2400 which represents -12db to 12db with 0.1 dB steps.\n  // Value 1200 is 0db (no change).\n  // Equation used is: 10^((dB)/20) = x, where x (preamp.gain.value) is passed on to gainnode for boosting or attenuation.\n  setPreamp(value) {\n    const db = value / 2400 * 24 - 12;\n    this._preamp.gain.value = Math.pow(10, db / 20);\n  }\n\n  // From -100 to 100\n  setBalance(balance) {\n    // Yo Dawg.\n    this._balance.balance.value = balance / 100;\n  }\n  setEqBand(band, value) {\n    const db = value / 2400 * 24 - 12;\n    this._bands[band].gain.value = db;\n  }\n  disableEq() {\n    this._staticSource.disconnect();\n    this._staticSource.connect(this._balance);\n  }\n  enableEq() {\n    this._staticSource.disconnect();\n    this._staticSource.connect(this._preamp);\n  }\n\n  /* Listeners */\n  on(event, callback) {\n    this._emitter.on(event, callback);\n  }\n  seekToTime(time) {\n    this._source.seekToTime(time);\n  }\n\n  // Used only for the initial load, since it must have a CORS header\n  async loadFromUrl(url, autoPlay) {\n    this._emitter.trigger(\"waiting\");\n    await this._source.loadUrl(url);\n    // TODO #race\n    this._emitter.trigger(\"stopWaiting\");\n    if (autoPlay) {\n      this.play();\n    }\n  }\n  dispose() {\n    this._source.dispose();\n    this._emitter.dispose();\n  }\n}\n// EXTERNAL MODULE: ./css/base-skin.css\nvar base_skin = __webpack_require__(6704);\n;// CONCATENATED MODULE: ./js/Disposable.ts\n\nclass Disposable {\n  constructor() {\n    (0,defineProperty/* default */.Z)(this, \"_teardowns\", []);\n    (0,defineProperty/* default */.Z)(this, \"disposed\", void 0);\n    this.disposed = false;\n  }\n  add(...teardowns) {\n    if (this.disposed) {\n      throw new Error(\"Attempted to add a new teardown to a disposed disposable.\");\n    }\n    this._teardowns.push(...teardowns);\n  }\n  dispose() {\n    if (this.disposed) {\n      throw new Error(\"Attempted to dispose disposable which is already disposed.\");\n    }\n    this._teardowns.forEach(teardown => {\n      if (typeof teardown === \"function\") {\n        teardown();\n      } else if (typeof teardown.dispose === \"function\") {\n        teardown.dispose();\n      }\n    });\n    this._teardowns = [];\n    this.disposed = true;\n  }\n}\n;// CONCATENATED MODULE: ./js/webampLazy.tsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Return a promise that resolves when the store matches a predicate.\n// TODO #leak\nconst storeHas = (store, predicate) => new Promise(resolve => {\n  if (predicate(store.getState())) {\n    resolve();\n    return;\n  }\n  const unsubscribe = store.subscribe(() => {\n    if (predicate(store.getState())) {\n      resolve();\n      unsubscribe();\n    }\n  });\n});\nclass Winamp {\n  // TODO: Make this _private\n  static browserIsSupported() {\n    const supportsAudioApi = !!(window.AudioContext ||\n    // @ts-ignore\n    window.webkitAudioContext);\n    const supportsCanvas = !!window.document.createElement(\"canvas\").getContext;\n    const supportsPromises = typeof Promise !== \"undefined\";\n    return supportsAudioApi && supportsCanvas && supportsPromises;\n  }\n  constructor(options) {\n    (0,defineProperty/* default */.Z)(this, \"_actionEmitter\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_node\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"_disposable\", void 0);\n    (0,defineProperty/* default */.Z)(this, \"options\", void 0);\n    // TODO: Make this _private\n    (0,defineProperty/* default */.Z)(this, \"media\", void 0);\n    // TODO: Make this _private\n    (0,defineProperty/* default */.Z)(this, \"store\", void 0);\n    this._node = null;\n    this._disposable = new Disposable();\n    this._actionEmitter = new Emitter();\n    this.options = options;\n    const {\n      initialTracks,\n      initialSkin,\n      avaliableSkins,\n      // Old misspelled name\n      availableSkins,\n      enableHotkeys = false,\n      zIndex,\n      requireJSZip,\n      requireMusicMetadata,\n      handleTrackDropEvent,\n      handleAddUrlEvent,\n      handleLoadListEvent,\n      handleSaveListEvent,\n      __butterchurnOptions,\n      __customMediaClass\n    } = this.options;\n\n    // TODO: Make this much cleaner\n    let convertPreset = null;\n    if (__butterchurnOptions != null) {\n      const {\n        importConvertPreset,\n        presetConverterEndpoint\n      } = __butterchurnOptions;\n      if (importConvertPreset != null && presetConverterEndpoint != null) {\n        convertPreset = async file => {\n          const {\n            convertPreset: convert\n          } = await importConvertPreset();\n          return convert(await genStringFromFileReference(file), presetConverterEndpoint);\n        };\n      }\n    }\n\n    // TODO: Validate required options\n\n    this.media = new (__customMediaClass || Media)();\n    this.store = store(this.media, this._actionEmitter, this.options.__customMiddlewares, this.options.__initialState, {\n      requireJSZip,\n      requireMusicMetadata,\n      convertPreset,\n      // @ts-ignore Typescript is drunk\n      handleTrackDropEvent,\n      handleAddUrlEvent,\n      handleLoadListEvent,\n      handleSaveListEvent\n    });\n    if (navigator.onLine) {\n      this.store.dispatch({\n        type: NETWORK_CONNECTED\n      });\n    } else {\n      this.store.dispatch({\n        type: NETWORK_DISCONNECTED\n      });\n    }\n    if (zIndex != null) {\n      this.store.dispatch({\n        type: SET_Z_INDEX,\n        zIndex\n      });\n    }\n    if (options.__butterchurnOptions) {\n      this.store.dispatch({\n        type: ENABLE_MILKDROP,\n        open: options.__butterchurnOptions.butterchurnOpen\n      });\n      this.store.dispatch(initializePresets(options.__butterchurnOptions));\n    }\n    const handleOnline = () => this.store.dispatch({\n      type: NETWORK_CONNECTED\n    });\n    const handleOffline = () => this.store.dispatch({\n      type: NETWORK_DISCONNECTED\n    });\n    window.addEventListener(\"online\", handleOnline);\n    window.addEventListener(\"offline\", handleOffline);\n    this._disposable.add(() => {\n      window.removeEventListener(\"online\", handleOnline);\n      window.removeEventListener(\"offline\", handleOffline);\n    });\n    if (initialSkin) {\n      this.store.dispatch(setSkinFromUrl(initialSkin.url));\n    } else {\n      // We are using the default skin.\n      this.store.dispatch({\n        type: LOADED\n      });\n    }\n    if (initialTracks) {\n      this._bufferTracks(initialTracks);\n    }\n    if (avaliableSkins != null) {\n      console.warn(\"The misspelled option `avaliableSkins` is deprecated. Please use `availableSkins` instead.\");\n      this.store.dispatch({\n        type: SET_AVAILABLE_SKINS,\n        skins: avaliableSkins\n      });\n    } else if (availableSkins != null) {\n      this.store.dispatch({\n        type: SET_AVAILABLE_SKINS,\n        skins: availableSkins\n      });\n    }\n    const layout = options.__initialWindowLayout;\n    if (layout == null) {\n      this.store.dispatch(stackWindows());\n    } else {\n      objectForEach(layout, (w, windowId) => {\n        if (w.size != null) {\n          this.store.dispatch(windows_setWindowSize(windowId, w.size));\n        }\n      });\n      this.store.dispatch(windows_updateWindowPositions(objectMap(layout, w => w.position), false));\n    }\n    if (enableHotkeys) {\n      this._disposable.add(bindHotkeys(this.store.dispatch));\n    }\n  }\n  play() {\n    this.store.dispatch(media_play());\n  }\n  pause() {\n    this.store.dispatch(media_pause());\n  }\n  stop() {\n    this.store.dispatch(media_stop());\n  }\n  seekBackward(seconds) {\n    this.store.dispatch(media_seekBackward(seconds));\n  }\n  seekForward(seconds) {\n    this.store.dispatch(media_seekForward(seconds));\n  }\n  seekToTime(seconds) {\n    this.store.dispatch(seekToTime(seconds));\n  }\n  nextTrack() {\n    this.store.dispatch(media_next());\n  }\n  centerWindowsInView() {\n    this.store.dispatch(windows_centerWindowsInView());\n  }\n  previousTrack() {\n    this.store.dispatch(media_previous());\n  }\n  _bufferTracks(tracks) {\n    const nextIndex = getTrackCount(this.store.getState());\n    this.store.dispatch(files_loadMediaFiles(tracks, LOAD_STYLE.BUFFER, nextIndex));\n  }\n\n  // Append this array of tracks to the end of the current playlist.\n  appendTracks(tracks) {\n    const nextIndex = getTrackCount(this.store.getState());\n    this.store.dispatch(files_loadMediaFiles(tracks, LOAD_STYLE.NONE, nextIndex));\n  }\n\n  // Replace any existing tracks with this array of tracks, and begin playing.\n  setTracksToPlay(tracks) {\n    this.store.dispatch(files_loadMediaFiles(tracks, LOAD_STYLE.PLAY));\n  }\n  getMediaStatus() {\n    return getMediaStatus(this.store.getState());\n  }\n  onWillClose(cb) {\n    return this._actionEmitter.on(CLOSE_REQUESTED, action => {\n      cb(action.cancel);\n    });\n  }\n  onClose(cb) {\n    return this._actionEmitter.on(CLOSE_WINAMP, cb);\n  }\n  close() {\n    this.store.dispatch(actionCreators_close());\n  }\n  reopen() {\n    this.store.dispatch(actionCreators_open());\n  }\n  onTrackDidChange(cb) {\n    let previousTrackId = null;\n    // TODO #leak\n    return this.store.subscribe(() => {\n      const state = this.store.getState();\n      const trackId = getCurrentlyPlayingTrackIdIfLoaded(state);\n      if (trackId === previousTrackId) {\n        return;\n      }\n      previousTrackId = trackId;\n      cb(trackId == null ? null : getCurrentTrackInfo(state));\n    });\n  }\n  onMinimize(cb) {\n    return this._actionEmitter.on(MINIMIZE_WINAMP, cb);\n  }\n  setSkinFromUrl(url) {\n    this.store.dispatch(setSkinFromUrl(url));\n  }\n  setSkinFromClient(data) {\n    this.store.dispatch(setSkinFromClient(data));\n  }\n  setEqFromClient(data) {\n    this.store.dispatch(setEqFromClient(data));\n  }\n  async skinIsLoaded() {\n    // Wait for the skin to load.\n    // TODO #leak\n    await storeHas(this.store, state => !state.display.loading);\n    // We attempt to pre-resolve these promises before we declare the skin\n    // loaded. That's because `<EqGraph>` needs these in order to render fully.\n    // As long as these are resolved before we attempt to render, we can ensure\n    // that we will have all the data we need on first paint.\n    //\n    // Note: This won't help for non-initial skin loads.\n    await Promise.all([getPreampLineImage(this.store.getState()), getLineColorsImage(this.store.getState())]);\n    return;\n  }\n  __loadSerializedState(serializedState) {\n    this.store.dispatch(loadSerializedState(serializedState));\n  }\n  __getSerializedState() {\n    return getSerlializedState(this.store.getState());\n  }\n  __onStateChange(cb) {\n    // TODO #leak\n    return this.store.subscribe(cb);\n  }\n  async renderWhenReady(node) {\n    this.store.dispatch(centerWindowsInContainer(node));\n    await this.skinIsLoaded();\n    // TODO #race We may have been destroyed\n    if (this._node != null) {\n      throw new Error(\"Cannot render a Webamp instance twice\");\n    }\n    this._node = node;\n    this._disposable.add(() => {\n      if (this._node != null) {\n        react_dom.unmountComponentAtNode(this._node);\n        this._node = null;\n      }\n    });\n    react_dom.render( /*#__PURE__*/(0,jsx_runtime.jsx)(components_Provider, {\n      store: this.store,\n      children: /*#__PURE__*/(0,jsx_runtime.jsx)(App, {\n        media: this.media,\n        filePickers: this.options.filePickers || []\n      })\n    }), node);\n  }\n  dispose() {\n    // TODO: Clean up store subscription in onTrackDidChange\n    // TODO: Every storeHas call represents a potential race condition\n    this.media.dispose();\n    this._actionEmitter.dispose();\n    this._disposable.dispose();\n  }\n}\n/* harmony default export */ const webampLazy = (Winamp);\n\n/***/ }),\n\n/***/ 6278:\n/***/ (function(module) {\n\n!function(a,e){ true?module.exports=e():0}(\"undefined\"!=typeof self?self:this,function(){return function(a){var e={};function t(r){if(e[r])return e[r].exports;var n=e[r]={i:r,l:!1,exports:{}};return a[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}return t.m=a,t.c=e,t.d=function(a,e,r){t.o(a,e)||Object.defineProperty(a,e,{configurable:!1,enumerable:!0,get:r})},t.n=function(a){var e=a&&a.__esModule?function(){return a.default}:function(){return a};return t.d(e,\"a\",e),e},t.o=function(a,e){return Object.prototype.hasOwnProperty.call(a,e)},t.p=\"\",t(t.s=165)}([function(a,e,t){a.exports=!t(5)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},function(a,e){a.exports=function(a){return\"object\"==typeof a?null!==a:\"function\"==typeof a}},function(a,e){var t=a.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=t)},function(a,e){var t=a.exports={version:\"2.5.3\"};\"number\"==typeof __e&&(__e=t)},function(a,e,t){var r=t(15),n=t(16),_=t(18),s=Object.defineProperty;e.f=t(0)?Object.defineProperty:function(a,e,t){if(r(a),e=_(e,!0),r(t),n)try{return s(a,e,t)}catch(a){}if(\"get\"in t||\"set\"in t)throw TypeError(\"Accessors not supported!\");return\"value\"in t&&(a[e]=t.value),a}},function(a,e){a.exports=function(a){try{return!!a()}catch(a){return!0}}},function(a,e,t){\"use strict\";e.__esModule=!0,e.default=function(a,e){if(!(a instanceof e))throw new TypeError(\"Cannot call a class as a function\")}},function(a,e,t){\"use strict\";e.__esModule=!0;var r,n=t(8),_=(r=n)&&r.__esModule?r:{default:r};e.default=function(){function a(a,e){for(var t=0;t<e.length;t++){var r=e[t];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),(0,_.default)(a,r.key,r)}}return function(e,t,r){return t&&a(e.prototype,t),r&&a(e,r),e}}()},function(a,e,t){a.exports={default:t(9),__esModule:!0}},function(a,e,t){t(10);var r=t(3).Object;a.exports=function(a,e,t){return r.defineProperty(a,e,t)}},function(a,e,t){var r=t(11);r(r.S+r.F*!t(0),\"Object\",{defineProperty:t(4).f})},function(a,e,t){var r=t(2),n=t(3),_=t(12),s=t(14),v=function(a,e,t){var m,i,p,b=a&v.F,l=a&v.G,x=a&v.S,o=a&v.P,d=a&v.B,u=a&v.W,c=l?n:n[e]||(n[e]={}),y=c.prototype,h=l?r:x?r[e]:(r[e]||{}).prototype;for(m in l&&(t=e),t)(i=!b&&h&&void 0!==h[m])&&m in c||(p=i?h[m]:t[m],c[m]=l&&\"function\"!=typeof h[m]?t[m]:d&&i?_(p,r):u&&h[m]==p?function(a){var e=function(e,t,r){if(this instanceof a){switch(arguments.length){case 0:return new a;case 1:return new a(e);case 2:return new a(e,t)}return new a(e,t,r)}return a.apply(this,arguments)};return e.prototype=a.prototype,e}(p):o&&\"function\"==typeof p?_(Function.call,p):p,o&&((c.virtual||(c.virtual={}))[m]=p,a&v.R&&y&&!y[m]&&s(y,m,p)))};v.F=1,v.G=2,v.S=4,v.P=8,v.B=16,v.W=32,v.U=64,v.R=128,a.exports=v},function(a,e,t){var r=t(13);a.exports=function(a,e,t){if(r(a),void 0===e)return a;switch(t){case 1:return function(t){return a.call(e,t)};case 2:return function(t,r){return a.call(e,t,r)};case 3:return function(t,r,n){return a.call(e,t,r,n)}}return function(){return a.apply(e,arguments)}}},function(a,e){a.exports=function(a){if(\"function\"!=typeof a)throw TypeError(a+\" is not a function!\");return a}},function(a,e,t){var r=t(4),n=t(19);a.exports=t(0)?function(a,e,t){return r.f(a,e,n(1,t))}:function(a,e,t){return a[e]=t,a}},function(a,e,t){var r=t(1);a.exports=function(a){if(!r(a))throw TypeError(a+\" is not an object!\");return a}},function(a,e,t){a.exports=!t(0)&&!t(5)(function(){return 7!=Object.defineProperty(t(17)(\"div\"),\"a\",{get:function(){return 7}}).a})},function(a,e,t){var r=t(1),n=t(2).document,_=r(n)&&r(n.createElement);a.exports=function(a){return _?n.createElement(a):{}}},function(a,e,t){var r=t(1);a.exports=function(a,e){if(!r(a))return a;var t,n;if(e&&\"function\"==typeof(t=a.toString)&&!r(n=t.call(a)))return n;if(\"function\"==typeof(t=a.valueOf)&&!r(n=t.call(a)))return n;if(!e&&\"function\"==typeof(t=a.toString)&&!r(n=t.call(a)))return n;throw TypeError(\"Can't convert object to primitive value\")}},function(a,e){a.exports=function(a,e){return{enumerable:!(1&a),configurable:!(2&a),writable:!(4&a),value:e}}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.42,decay:1,echo_zoom:.999823,echo_alpha:.5,echo_orient:1,wave_mode:5,wave_thick:1,wave_brighten:0,wrap:0,darken:1,wave_a:.001185,wave_scale:.325446,wave_smoothing:.9,modwavealphastart:.5,modwavealphaend:1,warpanimspeed:2.630064,warpscale:3.209168,zoomexp:1.000158,dx:1e-5,dy:1e-5,warp:.01,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.005,ob_a:.5,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:.1,mv_x:6.4,mv_y:4.8,mv_l:5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.thresh=0;a.dx_r=0;a.dy_r=0;a.tg1=0;a.tg2=0;a.tg3=0;a.six=0;\",frame_eqs_str:\"a.wave_r=.5+.5*Math.sin(1.6*a.time);a.wave_g=.5+.5*Math.sin(4.1*a.time);a.wave_b=-1+(1-a.wave_r+1-a.wave_g);a.warp=2;a.ob_r+=a.wave_b*above(Math.sin(.1*a.time),0);a.ob_b+=a.wave_g*above(Math.sin(.1*a.time),0);a.ob_g+=a.wave_r*above(Math.sin(.1*a.time),0);a.ob_r+=a.wave_g*below(Math.sin(.1*a.time),0);a.ob_b+=a.wave_r*below(Math.sin(.1*a.time),0);a.ob_g+=a.wave_b*below(Math.sin(.1*a.time),0);\",pixel_eqs_str:\"a.thresh=2*above(a.bass_att,a.thresh)+(1-above(a.bass_att,a.thresh))*(.96*(a.thresh-1.3)+1.3);a.dx_r=.05*equal(a.thresh,2)*Math.sin(5*a.time)+(1-equal(a.thresh,2))*a.dx_r;a.dy_r=.056*equal(a.thresh,2)*Math.sin(6*a.time)+(1-equal(a.thresh,2))*a.dy_r;a.tg1=Math.abs(Math.sin(a.time));a.tg2=22*above(a.tg1,.75)+12*below(a.tg1,.25)+18*above(a.tg1,.25)*below(a.tg1,.5)+12*above(a.tg1,.5)*below(a.tg1,.75);a.tg3=.00001<Math.abs(equal(a.thresh,2))?a.tg2:a.tg3;a.six=Math.sin(a.x);a.dx+=\\na.dx_r*Math.sin(Math.abs(a.tg3*a.y))*Math.sin(a.time);a.dy+=a.dy_r*Math.sin(Math.abs(a.tg3*a.x))*Math.cos(a.time);a.dx+=a.dx_r*pow(a.rad,2*a.y)*Math.sin(a.time);a.dy+=a.dy_r*pow(a.rad,2*a.x)*Math.sin(a.time);a.zoom-=.0825*pow(a.rad,6*a.x)*Math.cos(6*a.ang);a.rot-=.039375*Math.sin(1.25*a.time)*pow(a.rad,a.x)*Math.sin(1.45*a.time)*Math.sin(a.time);\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:1,echo_orient:1,wave_mode:5,wave_brighten:0,wave_a:.001,wave_scale:1.447722,wave_smoothing:.5,modwavealphastart:.5,modwavealphaend:1,fshader:1,dx:1e-5,dy:1e-5,warp:.01,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.015,ob_a:1,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:0,mv_y:0,mv_l:1,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.pfdx_r=0;a.pfthresh=0;a.thresh=0;a.ladder=0;a.q1=0;a.leafset=0;a.dy_r=0;a.pfdy_r=0;a.leaf=0;a.dx_r=0;a.q2=0;a.q3=0;a.leafset=3;\",frame_eqs_str:\"a.wave_r=.5+.5*Math.sin(1.6*a.time);a.wave_g=.5+.5*Math.sin(4.1*a.time);a.wave_b=-1+(1-a.wave_r+1-a.wave_g);a.warp=0;a.pfthresh=3*above(a.bass_att,a.pfthresh)+(1-above(a.bass_att,a.pfthresh))*(.96*(a.pfthresh-1.3)+1.3);a.pfdx_r=.015*equal(a.pfthresh,3)*Math.sin(5*a.time)+(1-equal(a.pfthresh,3))*a.pfdx_r;a.pfdy_r=.015*equal(a.pfthresh,3)*Math.sin(6*a.time)+(1-equal(a.pfthresh,3))*a.pfdy_r;a.q1=a.wave_r;a.q2=a.wave_g;a.q3=a.wave_b;a.ob_r=1-.75*Math.abs(a.q1);a.ob_g=1-.75*Math.abs(a.q2);\\na.ob_b=1-.75*Math.abs(a.q3);a.echo_zoom+=Math.min(Math.max(.75,50*a.pfdx_r),1);a.echo_orient+=16*a.pfdy_r;a.dx+=15.1*a.pfdx_r;a.dy+=15.1*a.pfdy_r;a.ob_size+=.005*a.bass_att;a.ib_a-=Math.min(.5,.5-Math.abs(a.dx+a.dy));\",pixel_eqs_str:\"a.thresh=2*above(a.bass_att,a.thresh)+(1-above(a.bass_att,a.thresh))*(.96*(a.thresh-1.3)+1.3);a.dx_r=.015*equal(a.thresh,2)*Math.sin(5*a.time)+(1-equal(a.thresh,2))*a.dx_r;a.dy_r=.015*equal(a.thresh,2)*Math.sin(6*a.time)+(1-equal(a.thresh,2))*a.dy_r;a.ladder=Math.abs(Math.sin(1*a.time));a.leaf=5*below(a.ladder,.2)+8*above(a.ladder,.2)*below(a.ladder,.4)+12*above(a.ladder,.4)*below(a.ladder,.6)+18*above(a.ladder,.6)*below(a.ladder,.8)+24*above(a.ladder,.8);a.leafset=.00001<Math.abs(equal(a.thresh,\\n2))?a.leaf:a.leafset;a.zoom+=.05*(.75-Math.cos(a.leafset*a.rad))*(1-a.rad);a.zoom-=Math.abs(.05*(.75-Math.cos(4*a.rad)));\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:.96,echo_zoom:.99663,echo_orient:1,wave_mode:2,wave_dots:1,wave_brighten:0,wrap:0,darken:1,wave_a:.001,wave_scale:.011726,wave_smoothing:.9,warpanimspeed:.010284,warpscale:.01,warp:.01,wave_r:.5,wave_g:.4,wave_b:.3,ob_size:0,ob_r:.11,ob_b:.1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:64,mv_y:48,mv_l:5,mv_r:0,mv_g:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:32,additive:1,rad:.194774,r:0,b:1,a:1e-6,r2:.63,g2:.7,b2:1,a2:.07,border_a:0},init_eqs_str:\"a.lens_scale=0;a.cang=0;a.n=0;a.yq=0;a.xp=0;a.fix=0;a.yp=0;a.t1=0;a.q1=0;a.pos_scale=0;a.cubesize=0;a.xq=0;a.sang=0;a.flip=0;a.zq=0;a.tm=0;a.zp=0;a.q2=0;a.sample=0;a.q8=0;a.flip=1;\",frame_eqs_str:\"a.flip=-a.flip;a.lens_scale=.5*a.flip+.5;a.lens_scale=1+2.4*a.lens_scale;a.pos_scale=.00001<Math.abs(equal(a.flip,-1))?.5:a.lens_scale;a.t1=.25*a.q1;a.sample=1;a.n=6.283*a.sample;a.cubesize=a.q2;a.fix=.5*div(1,a.cubesize);a.tm=4*a.q1+4*a.sample;a.xp=Math.sin(a.tm)*Math.cos(3*a.tm)*.5+.5;a.yp=Math.sin(1.1*a.tm)*Math.sin(4.1*a.tm)*.5+.5;a.zp=Math.sin(2.9*a.tm)*Math.cos(1.77*a.tm)*.5+.5;a.xp=div(Math.floor(a.xp*a.cubesize),a.cubesize)-.5+a.fix;a.yp=div(Math.floor(a.yp*a.cubesize),\\na.cubesize)-.5+a.fix;a.zp=div(Math.floor(a.zp*a.cubesize),a.cubesize)-.5+a.fix;a.ang=a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp*a.sang+a.zp*a.cang;a.yq=a.yp;a.zq=a.xp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.ang=.75*a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sang+a.zp*a.cang;a.zq=a.yp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.zp+=2;a.x=div(-a.xp,a.zp)*a.pos_scale+.5;a.y=div(-a.yp,a.zp)*a.pos_scale*1.333+.5;a.rad=a.rad*(1+div(a.q8,\\n3))*a.lens_scale;\"},{baseVals:{enabled:1,sides:6,rad:.043785,r:.3,g:.6,b:1,g2:0,b2:1,border_a:0},init_eqs_str:\"a.cang=0;a.n=0;a.yq=0;a.xp=0;a.fix=0;a.yp=0;a.t1=0;a.q1=0;a.cubesize=0;a.xq=0;a.sang=0;a.zq=0;a.tm=0;a.zp=0;a.q2=0;a.sample=0;a.q8=0;\",frame_eqs_str:\"a.t1=.25*a.q1;a.sample=1;a.n=6.283*a.sample;a.cubesize=a.q2;a.fix=.5*div(1,a.cubesize);a.tm=4*a.q1+4*a.sample;a.xp=Math.sin(a.tm)*Math.cos(3*a.tm)*.5+.5;a.yp=Math.sin(1.1*a.tm)*Math.sin(4.1*a.tm)*.5+.5;a.zp=Math.sin(2.9*a.tm)*Math.cos(1.77*a.tm)*.5+.5;a.xp=div(Math.floor(a.xp*a.cubesize),a.cubesize)-.5+a.fix;a.yp=div(Math.floor(a.yp*a.cubesize),a.cubesize)-.5+a.fix;a.zp=div(Math.floor(a.zp*a.cubesize),a.cubesize)-.5+a.fix;a.ang=a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);\\na.xq=a.xp*a.sang+a.zp*a.cang;a.yq=a.yp;a.zq=a.xp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.ang=.75*a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sang+a.zp*a.cang;a.zq=a.yp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.zp+=2;a.x=div(a.xp,a.zp)+.5;a.y=1.333*div(a.yp,a.zp)+.5;a.a=Math.min(a.a+div(a.q8,2),1);a.r=Math.min(a.r*(1+a.q8),1);a.g=Math.min(a.g*(1+a.q8),1);a.r2=Math.min(div(a.q8,2),1);a.g2=Math.min(div(a.q8,4),1);a.rad*=1+div(a.q8,7);\"},{baseVals:{enabled:1,sides:36,rad:.284278,r:0,a:0,r2:.23,g2:.54,b2:1,a2:.05,border_g:.8,border_b:.4,border_a:.45},init_eqs_str:\"a.cang=0;a.n=0;a.yq=0;a.xp=0;a.fix=0;a.yp=0;a.t1=0;a.q1=0;a.cubesize=0;a.xq=0;a.sang=0;a.zq=0;a.tm=0;a.zp=0;a.q2=0;a.sample=0;a.q8=0;\",frame_eqs_str:\"a.t1=.25*a.q1;a.sample=1;a.n=6.283*a.sample;a.cubesize=a.q2;a.fix=.5*div(1,a.cubesize);a.tm=4*a.q1+4*a.sample;a.xp=Math.sin(a.tm)*Math.cos(3*a.tm)*.5+.5;a.yp=Math.sin(1.1*a.tm)*Math.sin(4.1*a.tm)*.5+.5;a.zp=Math.sin(2.9*a.tm)*Math.cos(1.77*a.tm)*.5+.5;a.xp=div(Math.floor(a.xp*a.cubesize),a.cubesize)-.5+a.fix;a.yp=div(Math.floor(a.yp*a.cubesize),a.cubesize)-.5+a.fix;a.zp=div(Math.floor(a.zp*a.cubesize),a.cubesize)-.5+a.fix;a.ang=a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);\\na.xq=a.xp*a.sang+a.zp*a.cang;a.yq=a.yp;a.zq=a.xp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.ang=.75*a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sang+a.zp*a.cang;a.zq=a.yp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.zp+=2;a.x=div(a.xp,a.zp)+.5;a.y=1.333*div(a.yp,a.zp)+.5;a.a2=Math.min(a.a2*(1+div(a.q8,2)),1);a.r2=Math.min(a.r2*(1+div(a.q8,4)),1);a.g2=Math.min(a.g2*(1+div(a.q8,3)),1);a.border_a=Math.min(a.border_a*(1+a.q8),1);\"},{baseVals:{enabled:1,sides:6,additive:1,rad:.158045,r:.3,g:.6,b:1,a:.140001,r2:.4,g2:.5,b2:1,border_a:0},init_eqs_str:\"a.cang=0;a.n=0;a.yq=0;a.xp=0;a.fix=0;a.yp=0;a.t1=0;a.q1=0;a.cubesize=0;a.xq=0;a.sang=0;a.zq=0;a.tm=0;a.zp=0;a.q2=0;a.sample=0;a.q8=0;\",frame_eqs_str:\"a.t1=.25*a.q1;a.sample=1;a.n=6.283*a.sample;a.cubesize=a.q2;a.fix=.5*div(1,a.cubesize);a.tm=4*a.q1+4*a.sample;a.xp=Math.sin(a.tm)*Math.cos(3*a.tm)*.5+.5;a.yp=Math.sin(1.1*a.tm)*Math.sin(4.1*a.tm)*.5+.5;a.zp=Math.sin(2.9*a.tm)*Math.cos(1.77*a.tm)*.5+.5;a.xp=div(Math.floor(a.xp*a.cubesize),a.cubesize)-.5+a.fix;a.yp=div(Math.floor(a.yp*a.cubesize),a.cubesize)-.5+a.fix;a.zp=div(Math.floor(a.zp*a.cubesize),a.cubesize)-.5+a.fix;a.ang=a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);\\na.xq=a.xp*a.sang+a.zp*a.cang;a.yq=a.yp;a.zq=a.xp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.ang=.75*a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sang+a.zp*a.cang;a.zq=a.yp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.zp+=2;a.x=div(a.xp,a.zp)+.5;a.y=1.333*div(a.yp,a.zp)+.5;a.a=Math.min(a.a*a.q8,1);a.rad*=1+a.q8;\"}],waves:[{baseVals:{enabled:1,thick:1,additive:1,r:.05,g:.09},init_eqs_str:\"a.cang=0;a.n=0;a.yq=0;a.xp=0;a.fix=0;a.yp=0;a.t1=0;a.q1=0;a.cubesize=0;a.xq=0;a.sang=0;a.zq=0;a.ang=0;a.tm=0;a.zp=0;a.q2=0;\",frame_eqs_str:\"a.t1=.25*a.q1;\",point_eqs_str:\"a.n=6.283*a.sample;a.cubesize=a.q2;a.fix=.5*div(1,a.cubesize);a.tm=4*a.q1+4*a.sample;a.xp=Math.sin(a.tm)*Math.cos(3*a.tm)*.5+.5;a.yp=Math.sin(1.1*a.tm)*Math.sin(4.1*a.tm)*.5+.5;a.zp=Math.sin(2.9*a.tm)*Math.cos(1.77*a.tm)*.5+.5;a.xp=div(Math.floor(a.xp*a.cubesize),a.cubesize)-.5+a.fix;a.yp=div(Math.floor(a.yp*a.cubesize),a.cubesize)-.5+a.fix;a.zp=div(Math.floor(a.zp*a.cubesize),a.cubesize)-.5+a.fix;a.ang=a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp*a.sang+a.zp*\\na.cang;a.yq=a.yp;a.zq=a.xp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.ang=.75*a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sang+a.zp*a.cang;a.zq=a.yp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.zp+=2;a.x=div(a.xp,a.zp)+.5;a.y=1.333*div(a.yp,a.zp)+.5;\"},{baseVals:{enabled:0}},{baseVals:{enabled:1,usedots:1,thick:1},init_eqs_str:\"a.cang=0;a.n=0;a.yq=0;a.xp=0;a.fix=0;a.yp=0;a.t1=0;a.q1=0;a.cubesize=0;a.xq=0;a.sang=0;a.zq=0;a.ang=0;a.zp=0;a.q2=0;\",frame_eqs_str:\"a.t1=.25*a.q1;\",point_eqs_str:\"a.n=6.283*a.sample;a.cubesize=a.q2;a.fix=.5*div(1,a.cubesize);a.xp=div(randint(a.cubesize),a.cubesize)-.5+a.fix;a.yp=div(randint(a.cubesize),a.cubesize)-.5+a.fix;a.zp=div(randint(a.cubesize),a.cubesize)-.5+a.fix;a.ang=a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp*a.sang+a.zp*a.cang;a.yq=a.yp;a.zq=a.xp*a.cang-a.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.ang=.75*a.t1;a.sang=Math.sin(a.ang);a.cang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sang+a.zp*a.cang;a.zq=a.yp*a.cang-\\na.zp*a.sang;a.xp=a.xq;a.yp=a.yq;a.zp=a.zq;a.zp+=2;a.x=div(a.xp,a.zp)+.5;a.y=1.333*div(a.yp,a.zp)+.5;\"},{baseVals:{enabled:0}}],init_eqs_str:\"a.q1=0;a.beat=0;a.vol=0;a.bc=0;a.size=0;a.q2=0;a.trigger=0;a.q7=0;a.mtime=0;a.q8=0;a.mv_x=64;a.mv_y=48;a.nut=0;a.stp=0;a.stq=0;a.rtp=0;a.rtq=0;a.wvr=0;a.decay=0;a.dcsp=0;a.size=4;a.bc=0;\",frame_eqs_str:\"a.decay=.95;a.zoom=1.005;a.vol=.25*(a.bass+a.mid+a.treb);a.vol*=a.vol;a.q8=a.vol;a.mtime+=.01*a.vol*div(75,a.fps);a.q7=a.mtime;a.monitor=div(512,8);a.warp=0;a.q1=.9*a.mtime;a.beat=above(a.vol,1);a.bc=Math.max(a.bc,0);a.bc=.00001<Math.abs(equal(a.bc,0))?a.bc+a.beat:a.bc-div(div(1,a.fps),4);a.trigger=equal(a.bc,1);a.monitor=a.size;a.size+=a.trigger;a.size=.00001<Math.abs(above(a.size,10))?4:a.size;a.q2=Math.floor(a.size);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:5,decay:.95,echo_zoom:1.006596,echo_orient:1,wave_mode:2,wave_dots:1,wave_brighten:0,wave_a:.019788,wave_scale:.011726,wave_smoothing:.9,warpanimspeed:.010284,warpscale:.01,fshader:1,warp:.01,wave_r:.5,wave_g:.4,wave_b:.3,ob_size:0,ob_r:.11,ob_b:.1,ib_size:.005,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:31.999994,mv_y:24.000004,mv_dx:.02,mv_dy:-.02,mv_l:1,mv_r:.49,mv_g:.48,mv_b:.300001,mv_a:0},shapes:[{baseVals:{enabled:1,textured:1,rad:1.670888,tex_ang:.942478,tex_zoom:.534261,g:1,b:1,r2:1,b2:1,a2:1,border_a:.17},init_eqs_str:\"a.flux=0;a.q5=0;a.fluxs=0;a.advflux=0;a.q3=0;a.adv=0;a.advs=0;\",frame_eqs_str:\"a.flux=9*a.q5;a.fluxs=Math.max(a.flux,0);a.fluxs=Math.min(a.fluxs,1);a.advflux=a.q3*a.fluxs+-a.q3*(1-a.fluxs);a.adv+=a.advflux;a.advs=div(a.adv,256);a.ang=a.advs;a.rad=1.671+div(a.q3,25);\"},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:3,x:.59,rad:.444842,r:0,r2:.1,g2:.05,border_a:0},init_eqs_str:\"a.rotator=0;a.dir=0;a.mover=0;a.dir=3;a.mover=0;a.rotator=.255;\",frame_eqs_str:\"a.ang=a.rotator;a.x=.00001<Math.abs(equal(a.dir,1))?1-a.mover:.00001<Math.abs(equal(a.dir,1.5))?.15:.00001<Math.abs(equal(a.dir,2))?0:.00001<Math.abs(equal(a.dir,2.5))?0:.00001<Math.abs(equal(a.dir,3))?0+a.mover:.00001<Math.abs(equal(a.dir,3.5))?1:(equal(a.dir,4),1);a.y=.00001<Math.abs(equal(a.dir,1))?1:.00001<Math.abs(equal(a.dir,1.5))?1:.00001<Math.abs(equal(a.dir,2))?1-a.mover:.00001<Math.abs(equal(a.dir,2.5))?0:.00001<Math.abs(equal(a.dir,3))?0:.00001<Math.abs(equal(a.dir,\\n3.5))?0:.00001<Math.abs(equal(a.dir,4))?0+a.mover:1;a.mover=.00001<Math.abs(equal(a.dir,1))?a.mover+.005:.00001<Math.abs(equal(a.dir,1.5))?0:.00001<Math.abs(equal(a.dir,2))?a.mover+.005:.00001<Math.abs(equal(a.dir,2.5))?0:.00001<Math.abs(equal(a.dir,3))?a.mover+.005:.00001<Math.abs(equal(a.dir,3.5))?0:.00001<Math.abs(equal(a.dir,4))?a.mover+.005:0;a.dir=.00001<Math.abs(equal(a.dir,1))?.00001<Math.abs(above(a.mover,.995))?1.5:a.dir:.00001<Math.abs(equal(a.dir,1.5))?.00001<Math.abs(below(a.rotator,\\n-1.29))?2:a.dir:.00001<Math.abs(equal(a.dir,2))?.00001<Math.abs(above(a.mover,.995))?2.5:a.dir:.00001<Math.abs(equal(a.dir,2.5))?.00001<Math.abs(below(a.rotator,-2.85))?3:a.dir:.00001<Math.abs(equal(a.dir,3))?.00001<Math.abs(above(a.mover,.995))?3.5:a.dir:.00001<Math.abs(equal(a.dir,3.5))?.00001<Math.abs(below(a.rotator,-4.44))?4:a.dir:.00001<Math.abs(equal(a.dir,4))?.00001<Math.abs(above(a.mover,.995))?4.5:a.dir:.00001<Math.abs(equal(a.dir,4.5))?.00001<Math.abs(below(a.rotator,-5.94))?1:a.dir:a.dir;\\na.rotator=.00001<Math.abs(equal(a.dir,1.5))?.00001<Math.abs(above(a.rotator,-1.31))?a.rotator-.05:a.rotator:.00001<Math.abs(equal(a.dir,2))?-1.3:.00001<Math.abs(equal(a.dir,2.5))?.00001<Math.abs(above(a.rotator,-2.87))?a.rotator-.05:a.rotator:.00001<Math.abs(equal(a.dir,3))?-2.86:.00001<Math.abs(equal(a.dir,3.5))?.00001<Math.abs(above(a.rotator,-4.46))?a.rotator-.05:a.rotator:.00001<Math.abs(equal(a.dir,4))?-4.45:.00001<Math.abs(equal(a.dir,4.5))?.00001<Math.abs(above(a.rotator,-5.97))?a.rotator-\\n.05:a.rotator:.00001<Math.abs(equal(a.dir,4))?-5.96:.26;a.b=above(a.mid,1.5);a.r2=above(a.mid,1.5);a.g2=above(a.mid,1.5);a.b2=above(a.mid,1.5);\"},{baseVals:{enabled:1,sides:3,additive:1,x:.84,r:.98,g:1,b:.98,a:.3,g2:.09,border_a:0},init_eqs_str:\"a.q1=0;\",frame_eqs_str:\"a.x=.4*Math.sin(div(a.time,2))+.5;a.y=.4*Math.sin(a.time)+.5;a.rad=div(a.q1*a.q1,2);a.ang=4*a.q1;a.r=.7+.5*Math.sin(div(a.time,2));a.g=.7+.5*Math.sin(div(a.time,2)+2);a.b=.7+.5*Math.sin(div(a.time,2)+4);\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.speedinv=0;a.q1=0;a.q5=0;a.flux=0;a.q4=0;a.q2=0;a.qb=0;a.speed=0;a.qc=0;a.q3=0;a.qa=0;a.mv_x=64;a.mv_y=48;a.nut=0;a.stp=0;a.stq=0;a.rtp=0;a.rtq=0;a.wvr=0;a.decay=0;a.dcsp=0;a.q1=0;a.q2=0;a.q3=0;\",frame_eqs_str:\"a.decay=1;a.zoom=1;a.speed=.8;a.speedinv=1-a.speed;a.q1=a.qa*a.speed+a.bass*a.speedinv;a.q2=a.qb*a.speed+a.mid*a.speedinv;a.q3=a.qc*a.speed+a.treb*a.speedinv;a.qa=a.q1;a.qb=a.q2;a.qc=a.q3;a.flux=Math.sin(div(a.time,2));a.q4=.5*a.flux+.5;a.q5=a.flux;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.21,decay:.96,echo_zoom:.99663,echo_orient:1,wave_mode:2,wave_dots:1,wave_brighten:0,brighten:1,invert:1,wave_a:.001,wave_scale:.011726,wave_smoothing:.9,warpanimspeed:.037492,warpscale:.014889,warp:.033004,wave_r:.5,wave_g:.4,wave_b:.3,ob_size:.055,ob_r:1,ob_g:1,ob_b:1,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:0,mv_y:43.199997,mv_l:1,mv_g:.91,mv_b:.71,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,r:.1,b:.7},init_eqs_str:\"a.n=0;a.yq=0;a.xp=0;a.t5=0;a.xs=0;a.yp=0;a.t1=0;a.q1=0;a.cosang=0;a.r1=0;a.g2=0;a.xq=0;a.t3=0;a.flip=0;a.t6=0;a.ys=0;a.zq=0;a.phs=0;a.r2=0;a.ang=0;a.sinang=0;a.tm=0;a.b2=0;a.t2=0;a.zp=0;a.g1=0;a.t4=0;a.b1=0;a.q8=0;\",frame_eqs_str:\"a.t1=.5*Math.sin(a.time)+.5;a.t2=.5*Math.sin(a.time+2.1)+.5;a.t3=.5*Math.sin(a.time+4.2)+.5;a.t4=.5*Math.sin(a.time+1.1)+.5;a.t5=.5*Math.sin(a.time+3.1)+.5;a.t6=.5*Math.sin(a.time+5.2)+.5;\",point_eqs_str:\"a.n=6.283*a.sample;a.phs=.2*-a.sample;a.tm=a.q1+a.phs;a.flip+=1;a.flip*=below(a.flip,2);a.xp=0;a.yp=.1*a.flip+.2*(.5*Math.sin(a.tm)+.5);a.zp=0;a.ang=.5*Math.sin(2*a.tm)+.5;a.xq=a.xp;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.yq=a.yp;a.zq=a.zp;a.ang=8*a.tm;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.3;a.ang=3.14+1.5*\\nMath.sin(2*a.tm-.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.ang=-1+Math.cos(3.1*a.tm+.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.35;a.ang=1.75*Math.cos(2.3*a.tm)-1.05;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp*a.sinang+a.zp*a.cosang;a.yq=a.yp;a.zq=a.xp*a.cosang-a.zp*a.sinang;a.ang=.5*Math.cos(a.tm)-.5;\\na.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq;a.yp=a.yq*a.cosang-a.zq*a.sinang;a.zp=a.yq*a.sinang+a.zq*a.cosang;a.zp+=2;a.xs=div(a.xp,a.zp);a.ys=div(a.yp,a.zp);a.x=a.xs+.5;a.y=1.3*a.ys+.5;a.a=.00001<Math.abs(equal(a.q8,1))?1-a.sample:a.sample;a.a*=a.a;a.b+=.3*pow(1-a.sample,2);a.r1=a.t1;a.g1=a.t2;a.b1=a.t3;a.r2=a.t4;a.g2=a.t5;a.b2=a.t6;a.r=a.r1*a.flip+a.r2*(1-a.flip);a.g=a.g1*a.flip+a.g2*(1-a.flip);a.b=a.b1*a.flip+a.b2*(1-a.flip);\"},{baseVals:{enabled:1,r:.2,b:.6},init_eqs_str:\"a.n=0;a.yq=0;a.xp=0;a.t5=0;a.xs=0;a.yp=0;a.t1=0;a.q1=0;a.cosang=0;a.r1=0;a.g2=0;a.xq=0;a.t3=0;a.flip=0;a.t6=0;a.ys=0;a.zq=0;a.phs=0;a.r2=0;a.ang=0;a.sinang=0;a.tm=0;a.b2=0;a.t2=0;a.zp=0;a.g1=0;a.t4=0;a.b1=0;a.q8=0;\",frame_eqs_str:\"a.t1=.5*Math.sin(a.time)+.5;a.t2=.5*Math.sin(a.time+2.1)+.5;a.t3=.5*Math.sin(a.time+4.2)+.5;a.t4=.5*Math.sin(a.time+1.1)+.5;a.t5=.5*Math.sin(a.time+3.1)+.5;a.t6=.5*Math.sin(a.time+5.2)+.5;\",point_eqs_str:\"a.n=6.283*a.sample;a.phs=.2*-a.sample;a.tm=a.q1+a.phs;a.flip+=1;a.flip*=below(a.flip,2);a.xp=0;a.yp=.1*a.flip+.2*(.5*Math.sin(a.tm)+.5)+.1;a.yp=-a.yp;a.zp=0;a.ang=.5*Math.sin(2*a.tm)+.5;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.yq=a.yp;a.zq=a.zp;a.ang=8*a.tm;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.3;\\na.ang=3.14+1.5*Math.sin(2*a.tm-.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.ang=-1+Math.cos(3.1*a.tm+.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.35;a.ang=1.75*Math.cos(2.3*a.tm)-1.05;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp*a.sinang+a.zp*a.cosang;a.yq=a.yp;a.zq=a.xp*a.cosang-a.zp*a.sinang;a.ang=.5*Math.cos(a.tm)-\\n.5;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq;a.yp=a.yq*a.cosang-a.zq*a.sinang;a.zp=a.yq*a.sinang+a.zq*a.cosang;a.zp+=2;a.xs=div(a.xp,a.zp);a.ys=div(a.yp,a.zp);a.x=a.xs+.5;a.y=1.3*a.ys+.5;a.a=.00001<Math.abs(equal(a.q8,1))?1-a.sample:a.sample;a.a*=a.a;a.b+=.3*pow(1-a.sample,2);a.r1=a.t1;a.g1=a.t2;a.b1=a.t3;a.r2=a.t4;a.g2=a.t5;a.b2=a.t6;a.r=a.r1*a.flip+a.r2*(1-a.flip);a.g=a.g1*a.flip+a.g2*(1-a.flip);a.b=a.b1*a.flip+a.b2*(1-a.flip);\"},{baseVals:{enabled:1,usedots:1,thick:1,additive:1,g:.6,b:.1},init_eqs_str:\"a.n=0;a.yq=0;a.xp=0;a.t5=0;a.xs=0;a.yp=0;a.t1=0;a.q1=0;a.cosang=0;a.t8=0;a.xq=0;a.t3=0;a.flip=0;a.t6=0;a.ys=0;a.zq=0;a.phs=0;a.ang=0;a.sinang=0;a.tm=0;a.t2=0;a.zp=0;a.t4=0;a.q8=0;\",frame_eqs_str:\"a.t1=.5*Math.sin(a.time)+.5;a.t2=.5*Math.sin(a.time+2.1)+.5;a.t3=.5*Math.sin(a.time+4.2)+.5;a.t4=.5*Math.sin(a.time+1.1)+.5;a.t5=.5*Math.sin(a.time+3.1)+.5;a.t6=.5*Math.sin(a.time+5.2)+.5;a.t8=Math.floor(2*Math.sin(2*a.time)+3);\",point_eqs_str:\"a.n=6.283*a.sample;a.phs=.2*-a.sample;a.tm=a.q1+a.phs;a.flip+=1;a.flip*=below(a.flip,2);a.xp=0;a.yp=.1*a.flip+.2*(.5*Math.sin(a.tm)+.5);a.zp=0;a.ang=.5*Math.sin(2*a.tm)+.5;a.xq=a.xp;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.yq=a.yp;a.zq=a.zp;a.ang=8*a.tm+1;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.3;a.ang=3.14+\\n1.5*Math.sin(2*a.tm-.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.ang=-1+Math.cos(3.1*a.tm+.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.35;a.ang=1.75*Math.cos(2.3*a.tm)-1.05;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp*a.sinang+a.zp*a.cosang;a.yq=a.yp;a.zq=a.xp*a.cosang-a.zp*a.sinang;a.ang=.5*Math.cos(a.tm)-\\n.5;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq;a.yp=a.yq*a.cosang-a.zq*a.sinang;a.zp=a.yq*a.sinang+a.zq*a.cosang;a.zp+=2;a.xs=div(a.xp,a.zp);a.ys=div(a.yp,a.zp);a.x=a.xs+.5;a.y=1.3*a.ys+.5;a.a=.00001<Math.abs(equal(a.q8,1))?1-a.sample:a.sample;a.a*=above(Math.sin(128*a.tm*a.t8),0);a.r=a.t4;a.g=a.t5;a.b=a.t6;\"},{baseVals:{enabled:1,usedots:1,thick:1,additive:1,g:.3,b:.1},init_eqs_str:\"a.n=0;a.yq=0;a.xp=0;a.t5=0;a.xs=0;a.yp=0;a.t1=0;a.q1=0;a.cosang=0;a.t8=0;a.xq=0;a.t3=0;a.flip=0;a.t6=0;a.ys=0;a.zq=0;a.phs=0;a.ang=0;a.sinang=0;a.tm=0;a.t2=0;a.zp=0;a.t4=0;a.q8=0;\",frame_eqs_str:\"a.t1=.5*Math.sin(a.time)+.5;a.t2=.5*Math.sin(a.time+2.1)+.5;a.t3=.5*Math.sin(a.time+4.2)+.5;a.t4=.5*Math.sin(a.time+1.1)+.5;a.t5=.5*Math.sin(a.time+3.1)+.5;a.t6=.5*Math.sin(a.time+5.2)+.5;a.t8=Math.floor(2*Math.sin(2*a.time)+3);\",point_eqs_str:\"a.n=6.283*a.sample;a.phs=.2*-a.sample;a.tm=a.q1+a.phs;a.flip+=1;a.flip*=below(a.flip,2);a.xp=0;a.yp=.1*a.flip+.2*(.5*Math.sin(a.tm)+.5)+.1;a.yp=-a.yp;a.zp=0;a.ang=.5*Math.sin(2*a.tm)+.5;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.yq=a.yp;a.zq=a.zp;a.ang=8*a.tm+1;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=\\n.3;a.ang=3.14+1.5*Math.sin(2*a.tm-.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.ang=-1+Math.cos(3.1*a.tm+.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.35;a.ang=1.75*Math.cos(2.3*a.tm)-1.05;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp*a.sinang+a.zp*a.cosang;a.yq=a.yp;a.zq=a.xp*a.cosang-a.zp*a.sinang;a.ang=.5*\\nMath.cos(a.tm)-.5;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq;a.yp=a.yq*a.cosang-a.zq*a.sinang;a.zp=a.yq*a.sinang+a.zq*a.cosang;a.zp+=2;a.xs=div(a.xp,a.zp);a.ys=div(a.yp,a.zp);a.x=a.xs+.5;a.y=1.3*a.ys+.5;a.a=.00001<Math.abs(equal(a.q8,1))?1-a.sample:a.sample;a.a*=a.a;a.a*=above(Math.sin(128*a.tm*a.t8),0);a.r=a.t4;a.g=a.t5;a.b=a.t6;\"}],init_eqs_str:'a.meanbass_att=0;a.q1=0;a[\"var\"]=0;a.flip=0;a.lastbeat=0;a.beatrate=0;a.mode=0;a.peakbass_att=0;a.beatcounter=0;a.att=0;a.volume=0;a.beat=0;a.vol=0;a.mtime=0;a.q8=0;a.mv_x=64;a.mv_y=48;a.nut=0;a.stp=0;a.stq=0;a.rtp=0;a.rtq=0;a.wvr=0;a.decay=0;a.dcsp=0;a.warp=0;',frame_eqs_str:\"a.volume=.3*(a.bass+a.mid+a.att);a.beatrate=equal(a.beatrate,0)+(1-equal(a.beatrate,0))*(below(a.volume,.01)+(1-below(a.volume,.01))*a.beatrate);a.lastbeat+=equal(a.lastbeat,0)*a.time;a.meanbass_att=.1*(9*a.meanbass_att+a.bass_att);a.peakbass_att=Math.max(a.bass_att,a.peakbass_att);a.beatrate=Math.max(.00001<Math.abs(a.beat)?.00001<Math.abs(below(a.time-a.lastbeat,2*a.beatrate))?.1*(9*a.beatrate+a.time-a.lastbeat):a.beatrate:a.beatrate,.1);a.peakbass_att=a.beat*a.bass_att+(1-\\na.beat)*a.peakbass_att*(.95*above(a.time-a.lastbeat,2*a.beatrate)+.995*(1-above(a.time-a.lastbeat,2*a.beatrate)));a.lastbeat=a.beat*a.time+(1-a.beat)*a.lastbeat;a.peakbass_att=Math.max(a.peakbass_att,1.1*a.meanbass_att);a.beat=above(a.volume,.8)*below(a.peakbass_att-a.bass_att,.05*a.peakbass_att)*above(a.time-a.lastbeat,.1+.5*(a.beatrate-.1));a.beatcounter+=a.beat;a.mode=.00001<Math.abs(a.beat*equal(mod(a.beatcounter,2),0))?1-a.mode:a.mode;a.flip=2*a.mode-1;a.monitor=a.flip;a.q8=a.flip;a.decay=1;\\na.zoom=1.002;a.vol=.25*(a.bass_att+a.mid_att+a.treb_att);a.vol*=a.vol;a.mtime+=.1*a.vol*a.flip*div(55,a.fps);a.q1=.4*a.mtime;a.warp=0;\",pixel_eqs_str:'a[\"var\"]=Math.tan(a.time)*a.treb*a.treb;a.zoom=1+div(a.rad,40)+div(a[\"var\"],40);',warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.999,echo_zoom:1.006596,echo_alpha:.5,echo_orient:3,wave_mode:2,additivewave:1,wave_dots:1,wave_thick:1,wave_a:4.099998,wave_scale:1.18647,wave_smoothing:.63,wave_mystery:-.2,modwavealphastart:.71,modwavealphaend:1.28,warpscale:1.331,zoom:.999514,warp:.01,wave_r:.3,wave_g:.6,ob_size:.005,ob_r:.4999,ob_b:1,ob_a:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:.2,mv_r:0,mv_g:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"}],init_eqs_str:\"a.new_mid=0;a.q6=0;a.q1=0;a.q5=0;a.treb_c=0;a.vol_att=0;a.zoome=0;a.mid_c=0;a.new_treb=0;a.q4=0;a.rad_cycle=0;a.vol_c=0;a.bass_c=0;a.rote=0;a.vol=0;a.new_bass=0;a.q2=0;a.q3=0;a.q7=0;a.q8=0;\",frame_eqs_str:\"a.vol_att=.25*a.treb_att+.25*a.mid_att+div(.25*a.bass_att+.5*Math.sin(a.vol),a.vol);a.vol=a.bass+a.treb+a.mid;a.new_bass=.25*a.bass+.5*Math.sin(.25*a.bass_att);a.new_treb=.25*a.treb+.5*Math.sin(.25*a.treb_att);a.new_mid=.25*a.mid+.4*Math.sin(.25*a.mid_att);a.bass_c=a.q1-Math.sin(bitand(a.bass_att,.54*a.time));a.treb_c=a.q2-Math.sin(bitand(a.treb_att,.44*a.time));a.mid_c=a.q3-Math.sin(bitand(a.mid_att,.24*a.time));a.vol_c=a.q4-Math.sin(bitand(a.vol_att,.64*a.time));a.q1=Math.sin(bitand(a.bass-\\na.new_bass,.63*a.time));a.q2=Math.sin(bitand(a.treb-a.new_treb,.43*a.time));a.q3=Math.sin(bitand(a.mid-a.new_mid,.23*a.time));a.q4=Math.sin(bitand(a.vol,.65*a.time));a.q5=a.bass_c;a.q6=a.treb_c;a.q7=a.mid_c;a.q8=a.vol_c;a.wave_mystery=a.bass_att-1;a.wave_r+=.2*Math.sin(.43*a.time);a.wave_b-=.2*Math.sin(.54*a.time);a.wave_g-=.4*Math.sin(.34*a.time);a.ob_a=0;\",pixel_eqs_str:\"a.rad_cycle=a.rad*a.rad*a.x*60*a.rad*Math.sin(a.q6);a.rote=a.rot+.1*Math.sin(a.rad_cycle*Math.sin(3.14*a.rad))+.01*Math.sin(a.q1)*Math.tan(a.rad);a.zoome=a.zoom+.1*Math.sin(3.14*a.rad*Math.sin(3.14*a.ang)*Math.sin(a.q2)-a.rote);a.zoom=a.zoome+.05*Math.sin(3.14*a.rad*a.q2)*Math.sin(a.q4);a.rot=a.rote*a.rad+div(div(a.ang,2)*Math.sin(a.q3)*Math.sin(3.14*a.ang*Math.sin(a.q3)*Math.sin(a.q4)),2)+.1*Math.sin(3.14*a.ang)*Math.sin(a.q1);\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:0,decay:1,echo_zoom:1,wave_mode:1,wave_brighten:0,wave_a:1,wave_scale:.504218,wave_mystery:.24,warpanimspeed:9.8608,warpscale:16.2174,zoomexp:1.503744,zoom:1.0201,warp:.819544,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.005,ob_a:.2,ib_size:.005,ib_r:0,ib_g:0,ib_b:0,ib_a:.06,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"}],init_eqs_str:\"a.xpos=0;a.yamptarg=0;a.ydir=0;a.zoom_exp=0;a.yaccel=0;a.xamptarg=0;a.xamp=0;a.xspeed=0;a.ypos=0;a.xaccel=0;a.att=0;a.vol=0;a.yamp=0;a.xdir=0;a.yspeed=0;\",frame_eqs_str:\"a.dx=-.0005;a.dy=-.0005;a.vol=div(a.bass+a.mid+a.att,6);a.xamptarg=.00001<Math.abs(equal(mod(a.frame,15),0))?Math.min(.5*a.vol*a.bass_att,.5):a.xamptarg;a.xamp+=.5*(a.xamptarg-a.xamp);a.xdir=.00001<Math.abs(above(Math.abs(a.xpos),a.xamp))?-sign(a.xpos):.00001<Math.abs(below(Math.abs(a.xspeed),.1))?2*above(a.xpos,0)-1:a.xdir;a.xaccel=a.xdir*a.xamp-a.xpos-.055*a.xspeed*below(Math.abs(a.xpos),a.xamp);a.xspeed=a.xspeed+a.xdir*a.xamp-a.xpos-.055*a.xspeed*below(Math.abs(a.xpos),a.xamp);\\na.xpos+=.001*a.xspeed;a.wave_x=a.xpos+.5;a.yamptarg=.00001<Math.abs(equal(mod(a.frame,15),0))?Math.min(.3*a.vol*a.treb_att,.5):a.yamptarg;a.yamp+=.5*(a.yamptarg-a.yamp);a.ydir=.00001<Math.abs(above(Math.abs(a.ypos),a.yamp))?-sign(a.ypos):.00001<Math.abs(below(Math.abs(a.yspeed),.1))?2*above(a.ypos,0)-1:a.ydir;a.yaccel=a.ydir*a.yamp-a.ypos-.055*a.yspeed*below(Math.abs(a.ypos),a.yamp);a.yspeed=a.yspeed+a.ydir*a.yamp-a.ypos-.055*a.yspeed*below(Math.abs(a.ypos),a.yamp);a.ypos+=.001*a.yspeed;a.wave_y=\\na.ypos+.5;a.wave_r+=.35*(.6*Math.sin(.98*a.time)+.4*Math.sin(1.047*a.time));a.wave_g+=.35*(.6*Math.sin(.835*a.time)+.4*Math.sin(1.081*a.time));a.wave_b+=.35*(.6*Math.sin(.814*a.time)+.4*Math.sin(1.011*a.time));a.rot+=.03*(.6*Math.sin(.381*a.time)+.4*Math.sin(.479*a.time));a.cx+=.41*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.cy+=.41*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.wave_mystery+=.15*(.6*Math.sin(.629*a.time)+.4*Math.sin(1.826*a.time));a.warp*=a.vol;a.zoom-=.02*a.zoom*\\na.bass_att;a.zoom_exp=1.5*(.6*Math.sin(.381*a.time)+.4*Math.sin(.479*a.time));a.ob_a=1-2*a.vol;a.monitor=a.zoom_exp;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:3,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_brighten:0,darken:1,wave_a:.002,wave_scale:.14,wave_smoothing:0,wave_mystery:-.84,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_g:0,wave_b:.6,ob_size:.015,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:0,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:23,textured:1,rad:.72143,tex_ang:.62832,tex_zoom:.0402,g:1,b:1,a:.9,r2:.9,b2:1,a2:.3,border_a:0},init_eqs_str:\"a.vis=0;a.q27=0;a.q22=0;\",frame_eqs_str:\"a.vis=div(bnot(mod(a.q27,8))*a.q22,2);a.vis=Math.min(a.vis,1);a.a=div(a.vis,2);a.a2=div(a.vis,2);a.tex_zoom=1;a.rad=.3*a.vis;\"},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:5,additive:1,num_inst:4,x:.9,rad:.24732,tex_zoom:.40839,g:.6,a:.4,g2:0,b2:.6,border_a:0},init_eqs_str:\"a.blue=0;a.ampl=0;a.steps=0;a.k1=0;a.q24=0;a.green=0;a.red=0;a.trig=0;a.q27=0;a.q28=0;\",frame_eqs_str:\"a.steps=a.q28+1;a.steps=4;a.ampl=.2;a.x=.5+a.ampl*Math.cos(6.28*(div(a.q27,a.steps)+div(a.instance,4)));a.y=.5+a.ampl*Math.sin(6.28*(div(a.q27,a.steps)+div(a.instance,4)));a.a=.4;a.a2=0;a.trig=a.q24*bnot(mod(a.q27,4));a.red=bnot(a.trig)*a.red+div(randint(100),100)*a.trig;a.green=bnot(a.trig)*a.green+div(randint(100),100)*a.trig;a.blue=bnot(a.trig)*a.blue+div(randint(100),100)*a.trig;a.k1=div(a.instance,a.num_inst);a.r=a.red*a.k1;a.g=a.green*(1-a.k1);a.b=4*a.blue*a.k1*(1-a.k1);\\na.r=a.red;a.g=a.green;a.b=a.blue;a.r2=a.r;a.b2=a.b;a.g2=a.g;\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.px=0;a.index2=0;a.speed_=0;a.index=0;a.q12=0;a.q22=0;a.q21=0;a.q13=0;a.q15=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.py=0;a.movz=0;a.trel=0;a.q9=0;a.rott=0;a.vol__=0;a.is_beat=0;a.k1=0;a.q24=0;a.vx=0;a.dec_slow=0;a.q11=0;a.q10=0;a.vy=0;a.vz=0;a.q4=0;a.dir=0;a.q16=0;a.p2=0;a.avg=0;a.trig=0;a.beat=0;a.q17=0;a.vol=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.speed=0;a.q3=0;a.t0=0;a.vol_=0;a.q7=0;a.q28=0;a.q20=0;a.q8=0;a.ang0=0;a.speed_=1;a.vx=0;a.vy=0;a.vz=0;a.trel=0;a.p1=0;a.dir=0;a.ang0=\\n0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.96,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.5);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,16);a.index2=mod(a.index2+a.is_beat*bnot(a.index),8);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q24=a.is_beat;a.vol=a.bass_att+a.mid_att+\\na.treb_att;a.vol_=a.dec_med*a.vol_+(1-a.dec_med)*a.vol;a.vol__=a.dec_med*a.vol__+(1-a.dec_med)*a.vol_;a.q27=a.index+1;a.q28=a.index2+1;a.k1=a.is_beat*equal(mod(a.index,4),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,4);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.trig=a.q24*bnot(mod(a.index,8));a.vx=a.vx*bnot(a.trig)+a.trig*(div(randint(100),100)-.5);a.vy=a.vy*bnot(a.trig)+a.trig*(div(randint(100),100)-.5);a.vz=a.vz*bnot(a.trig)+\\na.trig*(div(randint(100),100)-.5);a.q10=.2+a.vy*a.vy*4;a.q11=.5*Math.cos(div(a.time,9))+.3;a.speed=Math.min(a.vol_-a.vol__+.5,1);a.speed=Math.max(a.speed,-.5);a.speed_=bnot(a.trig)*a.speed_+a.trig*a.speed;a.movz+=div(1,a.fps)*a.speed_;a.q9=a.movz;a.q12=2*Math.min(a.q22,6);a.trig=bnot(mod(a.index,4))*a.q24;a.dir=bnot(a.trig)*a.dir+a.trig*(randint(10)-5);a.trel+=div(.2,a.fps)*a.dir;a.q5=Math.cos(a.trel);a.q6=Math.sin(a.trel+0*a.q27*mod(a.q28,2));a.q7=-a.q6;a.q8=a.q5;a.px=a.px*a.dec_med+(1-a.dec_med)*\\na.vx;a.py=a.py*a.dec_med+(1-a.dec_med)*a.vy;a.q15=div(a.px,3);a.q16=div(a.py,3);a.q13=Math.min(2,1+Math.abs(8*a.px*a.py));a.ang0=a.ang0*a.dec_med+a.vz*(1-a.dec_med);a.q17=2*a.ang0;a.zoom=1.1;a.rot=.2*Math.sin(bnot(mod(a.q28,2))*a.q28);a.dx=0;a.monitor=a.q11;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 uv6_1;\\n  vec2 uv1_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (uv - 0.5);\\n  float x_4;\\n  x_4 = (abs(tmpvar_3.x) - abs(tmpvar_3.y));\\n  float tmpvar_5;\\n  tmpvar_5 = (18.0 * sqrt((x_4 * x_4)));\\n  uv1_2 = (tmpvar_3 - (clamp (\\n    ((sin(tmpvar_5) / cos(tmpvar_5)) * normalize(tmpvar_3))\\n  , vec2(-3.0, -3.0), vec2(3.0, 3.0)) / 60.0));\\n  uv6_1 = (0.4 * cos((\\n    (uv1_2 * 4.0)\\n   * q28)));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = (((texture (sampler_main, \\n    ((uv1_2 * (q11 + (q10 * tmpvar_5))) + 0.5)\\n  ).xyz + \\n    (vec3((0.006 / sqrt(dot (uv6_1, uv6_1)))) * (1.0 + roam_cos).xyz)\\n  ) * 0.99) - 0.025);\\n  ret = tmpvar_6.xyz;\\n }\",comp:\"float xlat_mutableang2;\\nvec2 xlat_mutablers0;\\nvec2 xlat_mutableuv2;\\n shader_body { \\n  vec2 uv_1;\\n  vec3 ret1_3;\\n  uv_1 = ((uv - 0.5) * aspect.xy);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q15;\\n  tmpvar_4.y = q16;\\n  uv_1 = (uv_1 + tmpvar_4);\\n  mat2 tmpvar_5;\\n  tmpvar_5[uint(0)] = _qb.xy;\\n  tmpvar_5[1u] = _qb.zw;\\n  uv_1 = (uv_1 * tmpvar_5);\\n  float tmpvar_6;\\n  float tmpvar_7;\\n  tmpvar_7 = (min (abs(\\n    (uv_1.y / uv_1.x)\\n  ), 1.0) / max (abs(\\n    (uv_1.y / uv_1.x)\\n  ), 1.0));\\n  float tmpvar_8;\\n  tmpvar_8 = (tmpvar_7 * tmpvar_7);\\n  tmpvar_8 = (((\\n    ((((\\n      ((((-0.01213232 * tmpvar_8) + 0.05368138) * tmpvar_8) - 0.1173503)\\n     * tmpvar_8) + 0.1938925) * tmpvar_8) - 0.3326756)\\n   * tmpvar_8) + 0.9999793) * tmpvar_7);\\n  tmpvar_8 = (tmpvar_8 + (float(\\n    (abs((uv_1.y / uv_1.x)) > 1.0)\\n  ) * (\\n    (tmpvar_8 * -2.0)\\n   + 1.570796)));\\n  tmpvar_6 = (tmpvar_8 * sign((uv_1.y / uv_1.x)));\\n  if ((abs(uv_1.x) > (1e-08 * abs(uv_1.y)))) {\\n    if ((uv_1.x < 0.0)) {\\n      if ((uv_1.y >= 0.0)) {\\n        tmpvar_6 += 3.141593;\\n      } else {\\n        tmpvar_6 = (tmpvar_6 - 3.141593);\\n      };\\n    };\\n  } else {\\n    tmpvar_6 = (sign(uv_1.y) * 1.570796);\\n  };\\n  xlat_mutablers0.x = ((tmpvar_6 / 3.1416) * 2.0);\\n  xlat_mutablers0.y = (0.03 / sqrt(dot (uv_1, uv_1)));\\n  ret1_3 = vec3(0.0, 0.0, 0.0);\\n  for (int n_2 = 0; n_2 <= 10; n_2++) {\\n    float tmpvar_9;\\n    tmpvar_9 = fract((-(q9) + (\\n      float(n_2)\\n     / 10.0)));\\n    xlat_mutableang2 = (((q1 * 3.14) * float(n_2)) / 10.0);\\n    float tmpvar_10;\\n    tmpvar_10 = cos(xlat_mutableang2);\\n    float tmpvar_11;\\n    tmpvar_11 = sin(xlat_mutableang2);\\n    mat2 tmpvar_12;\\n    tmpvar_12[uint(0)].x = tmpvar_10;\\n    tmpvar_12[uint(0)].y = -(tmpvar_11);\\n    tmpvar_12[1u].x = tmpvar_11;\\n    tmpvar_12[1u].y = tmpvar_10;\\n    xlat_mutableuv2 = (uv_1 * ((q13 * tmpvar_9) * tmpvar_12));\\n    ret1_3 = max (ret1_3, (texture (sampler_main, (xlat_mutableuv2 + 0.5)).xyz * (1.0 - tmpvar_9)));\\n  };\\n  vec4 tmpvar_13;\\n  tmpvar_13.w = 1.0;\\n  tmpvar_13.xyz = ((ret1_3 * 2.0) + ((\\n    (bass_att * xlat_mutablers0.y)\\n   * texture (sampler_main, \\n    ((uv_1 * q12) + vec2(0.5, 0.0))\\n  ).yzx) * clamp (\\n    (1.0 - (ret1_3 * 32.0))\\n  , 0.0, 1.0)));\\n  ret = tmpvar_13.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.965,echo_zoom:1.483827,echo_alpha:.5,echo_orient:3,wave_mode:7,additivewave:1,wave_brighten:0,wrap:0,darken_center:1,darken:1,wave_a:.001,wave_scale:1.285751,wave_smoothing:.63,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:.01,warpscale:1.470245,zoomexp:4.778023,zoom:.998162,warp:.01,sx:1.001828,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:.005,ob_r:1,ob_g:.5,ob_b:.5,ob_a:1,ib_size:.5,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:4.800001,mv_dx:.4,mv_l:1,mv_r:0,mv_g:.5,mv_a:.1},shapes:[{baseVals:{enabled:1,sides:3,additive:1,thickoutline:1,textured:1,x:1,y:.59,rad:.559231,ang:3.39292,tex_zoom:100,r:0,g:1,b:1,g2:0,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"\",frame_eqs_str:\"a.x=.1*Math.sin(div(a.time,10))+.5+.1*a.treb_att;\"},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:6,textured:1,x:.3,y:.7,rad:1.089252,ang:.816814,tex_ang:3.141592,tex_zoom:.504215,g:1,b:1,r2:1,b2:1,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"\"},{baseVals:{enabled:1,sides:3,textured:1,rad:.284278,ang:3.141593,tex_ang:4.900885,tex_zoom:2.987755,g:1,b:1,r2:.95,b2:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:'a[\"var\"]=0;',frame_eqs_str:'a.ang=div(a.time,10);a.tex_zoom=3.4+.03*a.bass;a[\"var\"]=above(a.bass_att,.7);a.a=a[\"var\"];a.a2=a[\"var\"];a.border_a=a[\"var\"];'}],waves:[{baseVals:{enabled:1,usedots:1,thick:1,additive:1,r:0,a:.06},init_eqs_str:\"a.px=0;a.xoffset2=0;a.py=0;a.xoffset1=0;a.pheight=0;a.pphase=0;a.yspout=0;a.pphase2=0;a.xspout=0;a.lrorient=0;a.yheight=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.xspout=.5;a.yspout=-.01;a.pphase=9999*a.sample*a.sample*.0001;a.pphase2=.1+.01*mod(3349*a.sample*a.sample,100);a.pheight=.002*mod(9893*a.sample,100);a.yheight=.01*mod(1231*a.sample*a.sample,100);a.r=.01*mod(5454*a.sample,100)*Math.abs(Math.sin(.25*a.time));a.g=.01*mod(9954*a.sample,100);a.xoffset1=Math.cos(a.time*a.pphase2+a.pphase)*a.pheight;a.xoffset2=-1*Math.cos(a.time*a.pphase2+a.pphase)*a.pheight;a.lrorient=.00001<Math.abs(below(Math.cos(a.time*a.pphase2+a.pphase),Math.cos((a.time-\\n.1)*a.pphase2+a.pphase)))?0:1;a.px=.00001<Math.abs(equal(a.lrorient,0))?a.xspout-a.pheight+a.xoffset1:a.xspout+a.pheight-a.xoffset2;a.py=a.yspout+Math.abs(Math.sin(a.time*a.pphase2+a.pphase))*a.yheight;a.x=a.px;a.y=a.py;\"},{baseVals:{enabled:1,usedots:1,thick:1,additive:1,r:0},init_eqs_str:\"a.pphase=0;a.pheight=0;a.xspout=0;a.yspout=0;a.px=0;a.py=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.pphase=5671*a.sample*Math.cos(.0001*a.time);a.pheight=.005*mod(7654*a.sample,100)*Math.sin(.2*a.time);a.xspout=.00001<Math.abs(below(Math.abs(Math.sin(.2*a.time)),.005))?.3+.01*randint(40):a.xspout;a.yspout=.00001<Math.abs(below(Math.abs(Math.sin(.2*a.time)),.005))?.3+.01*randint(40):a.yspout;a.px=a.xspout+Math.cos(a.time+a.pphase)*a.pheight;a.py=a.yspout+Math.sin(a.time+a.pphase)*a.pheight;a.x=a.px;a.y=a.py;a.a=Math.abs(.3*Math.sin(.2*a.time)+.1*a.treb_att);a.r=2*a.treb;\\n\"},{baseVals:{enabled:1,thick:1,additive:1,b:0},init_eqs_str:\"a.n=0;a.yq=0;a.xp=0;a.yr=0;a.xs=0;a.yp=0;a.xr=0;a.q1=0;a.xq=0;a.flip=0;a.ca=0;a.ys=0;a.sa=0;a.zq=0;a.phs=0;a.ang=0;a.tm=0;a.zp=0;a.zr=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.n=6.283*a.sample;a.phs=.2*-a.sample;a.tm=a.q1+4*a.phs;a.flip+=1;a.flip*=below(a.flip,2);a.xp=0;a.yp=(.1*a.flip-.05)*a.sample;a.zp=0;a.ang=20*a.tm+.4*Math.sin(76*a.tm+4*a.time);a.sa=Math.sin(a.ang);a.ca=Math.cos(a.ang);a.xr=a.xp*a.sa+a.yp*a.ca;a.yr=a.xp*a.ca-a.yp*a.sa;a.zr=a.zp;a.xp=a.xr;a.yp=a.yr+.05+.2*(.5*Math.sin(a.tm)+.5)+.05;a.zp=a.zr;a.ang=Math.sin(2*a.tm);a.xq=a.xp;a.sa=Math.sin(a.ang);a.ca=Math.cos(a.ang);a.yq=a.yp*a.sa+a.zp*a.ca;a.zq=a.yp*a.ca-a.zp*a.sa;a.ang=8*a.tm;\\na.sa=Math.sin(a.ang);a.ca=Math.cos(a.ang);a.xp=a.xq*a.sa+a.yq*a.ca;a.yp=a.xq*a.ca-a.yq*a.sa;a.zp=a.zq;a.zp-=.3;a.ang=3.14+2.5*Math.sin(2*a.tm-.5);a.xq=a.xp;a.sa=Math.sin(a.ang);a.ca=Math.cos(a.ang);a.yq=a.yp*a.sa+a.zp*a.ca;a.zq=a.yp*a.ca-a.zp*a.sa;a.ang=-1+Math.cos(3*a.tm+.5);a.xp=a.xq*a.sa+a.yq*a.ca;a.yp=a.xq*a.ca-a.yq*a.sa;a.zp=a.zq;a.zp-=.35;a.ang=1.75*Math.cos(1*a.tm)-1.05;a.sa=Math.sin(a.ang);a.ca=Math.cos(a.ang);a.xq=a.xp*a.sa+a.zp*a.ca;a.yq=a.yp;a.zq=a.xp*a.ca-a.zp*a.sa;a.ang=Math.cos(a.tm);\\na.xp=a.xq;a.sa=Math.sin(a.ang);a.ca=Math.cos(a.ang);a.yp=a.yq*a.ca-a.zq*a.sa;a.zp=a.yq*a.sa+a.zq*a.ca;a.zp+=1.5;a.xs=div(a.xp,a.zp);a.ys=div(a.yp,a.zp);a.x=a.xs+.5;a.y=1.3*a.ys+.5;a.a=1-a.sample;\"},{baseVals:{enabled:0}}],init_eqs_str:\"a.vol=0;a.mtime=0;a.q1=0;\",frame_eqs_str:\"a.decay=.999;a.wrap=Math.sin(10*a.time);a.mv_dx=a.bass;a.ib_a=.005;a.vol=.25*(a.bass+a.mid+a.treb);a.vol*=a.vol;a.mtime+=.01*a.vol*div(55,a.fps);a.q1=.5*a.time;\",pixel_eqs_str:\"a.zoom=1.005-div(a.rad,100);a.rot=div(a.rad,600);a.sy=-1;\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,echo_zoom:1.006596,echo_alpha:.5,additivewave:1,wave_thick:1,wave_brighten:0,wrap:0,wave_a:4.099998,wave_scale:.01,wave_smoothing:.63,wave_mystery:-.4,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoom:.999513,warp:.01,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:.005,ob_r:.01,ob_a:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:.5,mv_r:.35,mv_g:.35,mv_b:.35,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"}],init_eqs_str:\"a.q8=0;a.oldq8=0;\",frame_eqs_str:\"a.ob_r=.5+.5*Math.sin(2*a.time);a.ob_g=.5+.5*Math.sin(1.23*a.time);a.ob_b=.5+.5*Math.sin(1.321*a.time);a.wave_a=0;a.q8=a.oldq8+.003*div(pow(1.2*a.bass+.4*a.bass_att+.1*a.treb+.1*a.treb_att+.1*a.mid+.1*a.mid_att,6),a.fps);a.oldq8=a.q8;a.warp=0;\",pixel_eqs_str:\"a.rot=.1*(a.rad+Math.cos(5+5*Math.sin(1.211*a.q8)*a.x-.5)-Math.sin((5+5*Math.sin(.973*a.q8))*a.y-.5));a.dx=.005*(Math.cos(5+5*Math.sin(1.311*a.q8)*a.x-.5)-Math.sin((5+5*Math.sin(.9431*a.q8))*a.y-.5));a.dy=.005*(Math.cos(5+5*Math.sin(1.021*a.q8)*a.x-.5)-Math.sin((5+5*Math.sin(.987*a.q8))*a.y-.5));a.zoom=1-.005*(a.rad+Math.cos(5+5*Math.sin(.943*a.q8)*a.x-.5)-Math.sin((5+5*Math.sin(1.0961*a.q8))*a.y-.5));\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:1,echo_zoom:1,wave_mode:7,additivewave:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:100,wave_scale:.438649,wave_smoothing:.5,modwavealphastart:.5,modwavealphaend:1,zoomexp:.999996,fshader:1,dx:1e-5,dy:1e-5,warp:.01,wave_y:.976,ob_size:.005,ob_r:.4,ob_g:.3,ob_a:1,ib_r:1,ib_g:.6,ib_b:0,ib_a:1,mv_x:24.959999,mv_y:19.199999,mv_l:.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"}],init_eqs_str:\"a.q1=0;a.thresh=0;a.dx_r=0;a.dy_r=0;\",frame_eqs_str:\"a.warp=0;a.wave_r=.5+.5*Math.sin(.894*a.time);a.wave_g=.5+.5*Math.sin(1.14*a.time);a.wave_b=.5+.5*Math.sin(3-a.bass_att);a.thresh=2*above(a.bass_att,a.thresh)+(1-above(a.bass_att,a.thresh))*((a.thresh-1.3)*(.9+.1*Math.sin(2.8*a.time))+1.3);a.dx_r=.004*equal(a.thresh,2)*Math.sin(5*a.time)+(1-equal(a.thresh,2))*a.dx_r;a.dy_r=.004*equal(a.thresh,2)*Math.sin(6*a.time)+(1-equal(a.thresh,2))*a.dy_r;a.q1=a.thresh;a.dx=1.1*a.dx_r;a.dy=1.1*a.dy_r;a.dx+=.00001<Math.abs(above(a.bass,1.35))?\\n31*a.dx_r:0;a.dy=.00001<Math.abs(above(a.bass,1.3))?0:a.dy;a.decay=.995+.004*Math.sin(.369*a.time)+.001*Math.sin(1.54*a.time);\",pixel_eqs_str:\"a.zoom-=.01*a.q1*a.rad;a.zoomexp=1+.2*(a.rad-.2*a.q1);a.sx-=Math.cos(a.y*(6.28+3.14*Math.sin(a.time)))*(.009+.003*Math.sin(2.18*a.time))*Math.sin(.3*a.time);a.rot=.001*Math.sin(3.14*a.x)*Math.sin(.67*a.time);\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.94,echo_zoom:.9998,echo_alpha:.4999,echo_orient:3,wave_mode:1,additivewave:1,wave_dots:1,wave_brighten:0,wave_a:1.254574,wave_scale:.45029,wave_smoothing:0,zoomexp:1.008151,zoom:.659411,warp:.01,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.005,ob_r:1,ob_a:1,ib_size:.005,ib_r:0,ib_g:0,ib_b:0,ib_a:.9,mv_x:64,mv_y:48,mv_l:0,mv_r:0,mv_g:.7,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.bblock=0;a.grid=0;a.q6=0;a.q1=0;a.q5=0;a.tth=0;a.tblock=0;a.bpulse=0;a.pulse=0;a.mblock=0;a.q4=0;a.mpulse=0;a.mod_state=0;a.bth=0;a.mres=0;a.tpulse=0;a.tres=0;a.le=0;a.ccl=0;a.q2=0;a.bres=0;a.q3=0;a.mth=0;a.q7=0;a.q8=0;\",frame_eqs_str:\"a.warp=0;a.le=1.5+2*Math.sin(a.bass_att);a.bpulse=band(above(a.le,a.bth),above(a.le-a.bth,a.bblock));a.bblock=a.le-a.bth;a.bth=.00001<Math.abs(above(a.le,a.bth))?a.le+div(114,a.le+10)-7.407:a.bth+div(.07*a.bth,a.bth-12)+.1*below(a.bth,2.7)*(2.7-a.bth);a.bth=.00001<Math.abs(above(a.bth,6))?6:a.bth;a.bres=a.bpulse*Math.sin(a.pulse+.5*a.le)+bnot(a.bpulse)*a.bres;a.le=1.5+2*Math.sin(a.treb_att);a.tpulse=band(above(a.le,a.tth),above(a.le-a.tth,a.tblock));a.tblock=a.le-a.tth;a.tth=\\n.00001<Math.abs(above(a.le,a.tth))?a.le+div(114,a.le+10)-7.407:a.tth+div(.07*a.tth,a.tth-12)+.1*below(a.tth,2.7)*(2.7-a.tth);a.tth=.00001<Math.abs(above(a.tth,6))?6:a.tth;a.tres=a.tpulse*Math.sin(a.pulse+.5*a.le)+bnot(a.tpulse)*a.tres;a.le=1.5+2*Math.sin(a.mid_att);a.mpulse=band(above(a.le,a.mth),above(a.le-a.mth,a.mblock));a.mblock=a.le-a.mth;a.mth=.00001<Math.abs(above(a.le,a.mth))?a.le+div(114,a.le+10)-7.407:a.mth+div(.07*a.mth,a.mth-12)+.1*below(a.mth,2.7)*(2.7-a.mth);a.mth=.00001<Math.abs(above(a.mth,\\n6))?6:a.mth;a.mres=a.mpulse*Math.sin(a.pulse+.5*a.le)+bnot(a.mpulse)*a.mres;a.pulse=.00001<Math.abs(above(Math.abs(a.pulse),3.14))?-3.14:a.pulse+.003*(a.bth+a.mth+a.tth);a.q1=a.bres;a.q2=a.tres;a.q3=a.mres;a.q4=Math.sin(a.pulse);a.mod_state=(above(a.q1,0)+above(a.q2,0)+above(a.q3,0))*(1+above(a.q4,0));a.ccl=a.ccl+a.tpulse+a.mpulse-a.bpulse;a.q5=Math.cos(a.pulse*(.5+.1*a.mod_state));a.q6=Math.sin(a.pulse*(.5+pow(.25,a.mod_state)));a.q7=a.mod_state;a.q8=a.ccl;a.ob_r=.5+.5*Math.cos(a.q1+a.q7);a.ob_g=\\n.5+.5*Math.cos(3.14*a.q2+a.q7);a.ob_b=.5+.5*Math.cos(2*a.q3+Math.sin(.0816*a.time));a.ib_size=.025+.02*a.q2;a.ob_size=.03+.02*a.q3-.002*a.q7;a.wave_r=.5+.5*Math.sin(a.q1*a.q7+2.183*a.time);a.wave_g=.5+.5*Math.sin(3*a.q2+1.211*a.time);a.wave_b=.5+.5*Math.sin(a.q3+1.541*a.time);a.ob_a=.8+.2*a.q2;a.zoom+=.01*a.q4;\",pixel_eqs_str:\"a.grid=mod(pow(2*Math.sin(a.rad*a.q6*a.q2+a.x*a.y*a.q6*a.q3),1+mod(a.q7,5)),2);a.rot=bnot(a.grid)+a.grid*a.q4;a.sx+=.003*Math.sin((a.q2+.5)*a.x);a.sy+=.003*Math.sin((a.q1+3.4)*a.y);a.zoom+=.11*Math.cos(3.14*a.rad)*a.q4;\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:.96,echo_zoom:2.216266,echo_alpha:.78,wave_mode:5,additivewave:1,wave_dots:1,wave_brighten:0,brighten:1,wave_a:1.254574,wave_scale:.931011,wave_smoothing:0,zoomexp:1.0081,fshader:.4,zoom:.820774,cx:.4999,warp:.01,sx:.999998,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.005,ob_r:1,ob_a:1,ib_size:.005,ib_r:0,ib_g:0,ib_b:0,ib_a:.9,mv_x:0,mv_y:0,mv_l:.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"}],init_eqs_str:\"a.bblock=0;a.grid=0;a.q6=0;a.snee=0;a.q1=0;a.q5=0;a.tth=0;a.tblock=0;a.bpulse=0;a.pulse=0;a.mblock=0;a.q4=0;a.snur=0;a.mpulse=0;a.mod_state=0;a.bth=0;a.mres=0;a.tpulse=0;a.tres=0;a.le=0;a.ccl=0;a.q2=0;a.bres=0;a.q3=0;a.mth=0;a.q7=0;a.q8=0;\",frame_eqs_str:\"a.warp=0;a.le=1.5+2*Math.sin(a.bass_att);a.bpulse=band(above(a.le,a.bth),above(a.le-a.bth,a.bblock));a.bblock=a.le-a.bth;a.bth=.00001<Math.abs(above(a.le,a.bth))?a.le+div(114,a.le+10)-7.407:a.bth+div(.07*a.bth,a.bth-12)+.1*below(a.bth,2.7)*(2.7-a.bth);a.bth=.00001<Math.abs(above(a.bth,6))?6:a.bth;a.bres=a.bpulse*Math.sin(a.pulse+.5*a.le)+bnot(a.bpulse)*a.bres;a.le=1.5+2*Math.sin(a.treb_att);a.tpulse=band(above(a.le,a.tth),above(a.le-a.tth,a.tblock));a.tblock=a.le-a.tth;a.tth=\\n.00001<Math.abs(above(a.le,a.tth))?a.le+div(114,a.le+10)-7.407:a.tth+div(.07*a.tth,a.tth-12)+.1*below(a.tth,2.7)*(2.7-a.tth);a.tth=.00001<Math.abs(above(a.tth,6))?6:a.tth;a.tres=a.tpulse*Math.sin(a.pulse+.5*a.le)+bnot(a.tpulse)*a.tres;a.le=1.5+2*Math.sin(a.mid_att);a.mpulse=band(above(a.le,a.mth),above(a.le-a.mth,a.mblock));a.mblock=a.le-a.mth;a.mth=.00001<Math.abs(above(a.le,a.mth))?a.le+div(114,a.le+10)-7.407:a.mth+div(.07*a.mth,a.mth-12)+.1*below(a.mth,2.7)*(2.7-a.mth);a.mth=.00001<Math.abs(above(a.mth,\\n6))?6:a.mth;a.mres=a.mpulse*Math.sin(a.pulse+.5*a.le)+bnot(a.mpulse)*a.mres;a.pulse=.00001<Math.abs(above(Math.abs(a.pulse),3.14))?-3.14:a.pulse+.003*(a.bth+a.mth+a.tth);a.q1=a.bres;a.q2=a.tres;a.q3=a.mres;a.q4=Math.sin(a.pulse);a.mod_state=(above(a.q1,0)+above(a.q2,0)+above(a.q3,0))*(1+above(a.q4,0));a.ccl=a.ccl+a.tpulse+a.mpulse-a.bpulse;a.q5=Math.cos(a.pulse*(.5+.1*a.mod_state));a.q6=Math.sin(a.pulse*(.5+pow(.25,a.mod_state)));a.q7=a.mod_state;a.q8=a.ccl;a.ob_r=.5+.5*Math.cos(a.q1+a.q7);a.ob_g=\\n.5+.5*Math.cos(3.14*a.q2+a.q7);a.ob_b=.5+.5*Math.cos(2*a.q3+Math.sin(.0816*a.time));a.ib_size=.025+.02*a.q2;a.ob_size=.03+.02*a.q3-.002*a.q7;a.wave_r=.5+.5*Math.sin(a.q1*a.q7+2.183*a.time);a.wave_g=.5+.5*Math.sin(3*a.q2+1.211*a.time);a.wave_b=.5+.5*Math.sin(a.q3+1.541*a.time);a.ob_a=.8+.2*a.q2;a.rot=1;a.cx+=.05*a.q4;a.cy+=.05*a.q5;a.zoom=.95+.05*a.q6;\",pixel_eqs_str:\"a.snee=bnot(above(Math.sin(a.ang)-a.x,.5)*above(a.q2,0)+above(a.y-Math.cos(a.ang),.5)*above(a.q1,0));a.snur=bnot(below(a.x,.5)*above(a.q3,0)+below(a.y,.5)*below(a.q7,4));a.grid=Math.sin(sigmoid(Math.sin(6.28*a.y*a.q2),Math.sin(6.28*a.x*a.q6))*(10+a.q7));a.zoom=a.zoom+.02*Math.cos(2*a.rad+a.rad*a.q2)*sign(a.snee)-.04*Math.sin(3.14*a.rad*a.q3-3.14*Math.cos(3.14*a.rad*a.snur-3.14*a.q6));a.sx=.00001<Math.abs(below(a.x,.5)*below(a.y,.5))?a.sx+.2*a.q4*a.snur:1+.1*a.q2*a.grid;a.sy=\\n.00001<Math.abs(below(a.x,.5)*below(a.y,.5))?a.sy+.2*a.q5*a.snee:1+.1*a.q2*a.grid;\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:4.990001,decay:1,echo_zoom:10.784553,wave_mode:7,additivewave:1,wave_dots:1,wave_brighten:0,wrap:0,wave_a:.997938,wave_scale:1.990516,wave_smoothing:0,wave_mystery:-1,modwavealphastart:.5,modwavealphaend:1,warpscale:.999998,zoomexp:.999985,fshader:1,zoom:.9999,dy:1e-5,warp:.01,wave_r:.400001,wave_g:.4,wave_y:1,ob_size:0,ob_r:.300001,ob_g:1,ob_b:.3,ob_a:.100001,ib_size:.005,ib_r:0,ib_g:0,ib_b:0,ib_a:.5,mv_x:8.960042,mv_y:12.960033,mv_dx:-.26,mv_dy:.44,mv_l:5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"},{baseVals:{},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"\"}],init_eqs_str:\"a.maxdbass=0;a.f=0;a.ttan1=0;a.avgbass=0;a.dbass=0;a.q1=0;a.prevavgbass=0;a.amt=0;a.cheat=0;a.totx=0;a.flip=0;a.lastbeat=0;a.ttan2=0;a.bpm=0;a.pctg=0;a.prevrot=0;a.interval=0;a.q4=0;a.pbass=0;a.toty=0;a.beat=0;a.vol=0;a.q2=0;a.dist=0;a.lastflip=0;a.prevvol=0;a.q3=0;a.isleftytonosy=0;a.sure=0;a.flip=-1;\",frame_eqs_str:\"a.warp=0;a.decay=1;a.vol=div(.75*(a.bass_att+a.mid_att+a.treb_att),3)+.25*a.prevvol;a.prevavgbass=a.avgbass;a.avgbass+=.01*(a.bass-a.avgbass);a.q4=Math.max(1.001*a.avgbass-.999*a.prevavgbass,0);a.q4=Math.min(a.q4,.006);a.sure=.00001<Math.abs(equal(a.sure,0))?.6:a.sure;a.interval=.00001<Math.abs(equal(a.interval,0))?40:a.interval;a.lastbeat=.00001<Math.abs(equal(a.lastbeat,0))?a.frame-a.fps:a.lastbeat;a.dbass=div(a.bass-a.pbass,a.fps);a.beat=above(a.dbass,.6*a.maxdbass)*above(a.frame-\\na.lastbeat,div(a.fps,3));a.sure=.00001<Math.abs(a.beat*below(Math.abs(a.frame-(a.interval+a.lastbeat)),div(a.fps,5)))?Math.min(.095+a.sure,1):a.beat*(a.sure-.095)+(1-a.beat)*a.sure*.9996;a.sure=Math.max(.5,a.sure);a.cheat=.00001<Math.abs(above(a.frame,a.lastbeat+a.interval+Math.floor(div(a.fps,10)))*above(a.sure,.91))?1:a.cheat;a.beat=.00001<Math.abs(a.cheat)?1:a.beat;a.sure=.00001<Math.abs(a.cheat)?.95*a.sure:a.sure;a.maxdbass=Math.max(.999*a.maxdbass,a.dbass);a.maxdbass=Math.max(.012,a.maxdbass);\\na.maxdbass=Math.min(.02,a.maxdbass);a.interval=.00001<Math.abs(a.beat)?a.frame-a.lastbeat:a.interval;a.lastbeat=.00001<Math.abs(a.beat)?a.frame-a.cheat*Math.floor(div(a.fps,10)):a.lastbeat;a.cheat=0;a.pbass=a.bass;a.lastflip=.00001<Math.abs(above(div(a.bass,a.avgbass),2)*above(a.frame-a.lastflip,100)*a.beat)?a.frame:a.lastflip;a.flip=.00001<Math.abs(equal(a.frame,a.lastflip))?Math.abs(a.flip)-1:a.flip;a.wave_mystery=a.flip;a.ob_size=div(.08*below(a.frame-a.lastbeat,div(a.fps,8))*(a.frame-a.lastbeat),\\na.fps);a.f=Math.abs(Math.cos(div(a.time,8)+.54+Math.sin(div(a.time,3)+1.075)));a.ob_r=1*a.f+(1-a.f);a.ob_g=.3*a.f+(1-a.f);a.ob_b=.3*a.f+.3*(1-a.f);a.f=div(a.frame-a.lastbeat,a.interval);a.f*=above(a.f,.8)*below(a.f,1);a.f=Math.max(0,a.f);a.f=Math.min(a.f,1);a.wave_g=.4+.6*a.f;a.wave_b=.4+.6*(1-a.f);a.q1=div(3.1416*(a.wave_mystery+1),2);a.q2=.25*Math.cos(a.time+Math.abs(2*Math.sin(2*a.time+2.311)*(a.vol-a.amt))*Math.sin(7.45*a.time+.876));a.q3=-a.q2;a.amt+=.05*(a.vol-a.amt);a.prevvol=a.vol;a.bpm+=\\n.01*(div(60*a.fps,a.interval)-a.bpm);a.monitor=0*a.pctg+1*a.bpm;\",pixel_eqs_str:\"a.x-=.5;a.y=-(a.y-.5);a.ttan1=Math.tan(a.q1+1.5708)*(a.x-a.q3)-a.y+a.q2;a.ttan2=Math.tan(a.q1+1.5708);a.isleftytonosy=above(a.ttan1*sign(3.1416-a.q1),0);a.dist=div(Math.abs(a.ttan1),sqrt(a.ttan2*a.ttan2+1));a.totx=div(.5*Math.cos(a.q1)*sign(a.isleftytonosy-.5)*sqr(a.dist),.5-a.q2);a.toty=div(-.5*Math.sin(a.q1)*sign(a.isleftytonosy-.5)*sqr(a.dist),.5-a.q2);a.dx+=a.totx;a.dy+=a.toty;a.prevrot=a.q1;a.zoom=1-div(25*a.q4*sqrt(pow(.5-a.dist,3)),Math.abs(.5-a.q2));\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:.997,echo_zoom:.996629,echo_orient:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.001185,wave_scale:.01,wave_smoothing:.27,wave_mystery:-.38,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoom:.999514,warp:.01,ob_size:0,ob_r:.01,ob_a:1,ib_size:0,ib_r:1,ib_g:1,ib_b:1,ib_a:1,mv_x:64,mv_y:48,mv_l:.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0},shapes:[{baseVals:{enabled:1,sides:3,rad:.34,ang:.53,r:.56,g:.36,r2:.9,a2:.5,border_a:0},init_eqs_str:\"a.angle=0;a.bassspin=0;a.q1=0;a.q2=0;a.bassspin=0;a.angle=0;\",frame_eqs_str:\"a.ang=a.angle;a.bassspin=.00001<Math.abs(above(.05*a.bass,a.bassspin))?a.bassspin+.001:a.bassspin-.001;a.bassspin*=above(a.bassspin,0);a.angle+=a.bassspin;a.r=.3*a.bass;a.g=.3*a.treb;a.b=.3*a.mid;a.r2=.8+.2*Math.sin(1.2*a.time);a.g2=.8+.2*Math.sin(.9777*a.time);a.b2=.8+.2*Math.sin(.7005*a.time);a.border_a=1*above(a.bass+a.treb+a.mid,5);a.x=.5+a.q1;a.y=.5+a.q2;\"},{baseVals:{enabled:1,sides:100,additive:1,textured:1,rad:.108073,g:1,b:1,r2:1,b2:1,a2:1,border_a:0},init_eqs_str:\"a.bassspin=0;a.xpos=0;a.ypos=0;a.q1=0;a.q2=0;a.bassspin=0;a.xpos=.25;a.ypos=.25;\",frame_eqs_str:\"a.bassspin=.00001<Math.abs(above(.05*a.bass,a.bassspin))?a.bassspin+.001:a.bassspin-.001;a.bassspin*=above(a.bassspin,0);a.xpos+=a.bassspin;a.ypos+=a.bassspin;a.x=.5+a.q1+.13*Math.sin(a.xpos);a.y=.5+a.q2+.18*Math.cos(a.ypos);\"},{baseVals:{enabled:1,sides:29,additive:1,textured:1,rad:.105693,g:1,b:1,r2:1,b2:1,a2:1,border_a:0},init_eqs_str:\"a.bassspin=0;a.xpos=0;a.ypos=0;a.q1=0;a.q2=0;a.bassspin=0;a.xpos=2.3;a.ypos=2.3;\",frame_eqs_str:\"a.bassspin=.00001<Math.abs(above(.05*a.bass,a.bassspin))?a.bassspin+.001:a.bassspin-.001;a.bassspin*=above(a.bassspin,0);a.xpos+=a.bassspin;a.ypos+=a.bassspin;a.x=.5+a.q1+.13*Math.sin(a.xpos);a.y=.5+a.q2+.18*Math.cos(a.ypos);\"},{baseVals:{enabled:1,sides:100,additive:1,textured:1,rad:.091434,g:1,b:1,r2:1,b2:1,a2:1,border_a:0},init_eqs_str:\"a.bassspin=0;a.xpos=0;a.ypos=0;a.q1=0;a.q2=0;a.bassspin=0;a.xpos=4.5;a.ypos=4.5;\",frame_eqs_str:\"a.bassspin=.00001<Math.abs(above(.05*a.bass,a.bassspin))?a.bassspin+.001:a.bassspin-.001;a.bassspin*=above(a.bassspin,0);a.xpos+=a.bassspin;a.ypos+=a.bassspin;a.x=.5+a.q1+.13*Math.sin(a.xpos);a.y=.5+a.q2+.18*Math.cos(a.ypos);\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.xpos=0;a.yamptarg=0;a.ydir=0;a.q1=0;a.yaccel=0;a.xamptarg=0;a.xamp=0;a.xspeed=0;a.ypos=0;a.xaccel=0;a.att=0;a.vol=0;a.q2=0;a.yamp=0;a.xdir=0;a.yspeed=0;\",frame_eqs_str:\"a.warp=0;a.decay=.92;a.vol=div(a.bass+a.mid+a.att,6);a.xamptarg=.00001<Math.abs(equal(mod(a.frame,15),0))?Math.min(.5*a.vol*a.bass_att,.5):a.xamptarg;a.xamp+=.5*(a.xamptarg-a.xamp);a.xdir=.00001<Math.abs(above(Math.abs(a.xpos),a.xamp))?-sign(a.xpos):.00001<Math.abs(below(Math.abs(a.xspeed),.1))?2*above(a.xpos,0)-1:a.xdir;a.xaccel=a.xdir*a.xamp-a.xpos-.055*a.xspeed*below(Math.abs(a.xpos),a.xamp);a.xspeed=a.xspeed+a.xdir*a.xamp-a.xpos-.055*a.xspeed*below(Math.abs(a.xpos),a.xamp);\\na.xpos+=.001*a.xspeed;a.yamptarg=.00001<Math.abs(equal(mod(a.frame,15),0))?Math.min(.3*a.vol*a.treb_att,.5):a.yamptarg;a.yamp+=.5*(a.yamptarg-a.yamp);a.ydir=.00001<Math.abs(above(Math.abs(a.ypos),a.yamp))?-sign(a.ypos):.00001<Math.abs(below(Math.abs(a.yspeed),.1))?2*above(a.ypos,0)-1:a.ydir;a.yaccel=a.ydir*a.yamp-a.ypos-.055*a.yspeed*below(Math.abs(a.ypos),a.yamp);a.yspeed=a.yspeed+a.ydir*a.yamp-a.ypos-.055*a.yspeed*below(Math.abs(a.ypos),a.yamp);a.ypos+=.001*a.yspeed;a.q1=a.ypos;a.q2=a.xpos;\",pixel_eqs_str:\"a.zoom+=a.q1*a.q2*2;a.rot=10+a.rad*a.treb*.1;\",warp:\"\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:3,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wrap:0,darken_center:1,solarize:1,wave_a:.001,zoom:.97,rot:-6.27999,warp:52e-5,wave_r:0,wave_g:0,wave_b:0,ob_r:1,ob_g:1,ob_b:1,mv_r:.8,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,textured:1,x:.25,y:.75,rad:4.44708,tex_zoom:.22746,r:0,a:.1,g2:0,a2:.2,border_r:0,border_g:0,border_a:0},init_eqs_str:\"a.q1=0;a.tex_capture=0;a.q3=0;a.tex_saw=.4;\",frame_eqs_str:\"a.ang=.2*a.q1;a.tex_capture=above(a.q3,1);a.tex_zoom=.6;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1,smoothing:0},init_eqs_str:\"a.q1=0;a.speed=0;a.v=0;a.xs=0;a.ys=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.q1=0;a.speed=.8*a.bass_att;a.v=1E6*a.sample+a.value2*a.bass*.1;a.xs+=Math.sin(a.v)*a.speed*Math.atan(1.51*a.v);a.ys+=Math.sin(a.v)*a.speed*Math.atan(10*a.v);a.x=.5+.5*Math.sin(.1*a.xs)*Math.cos(.2*a.time+a.xs);a.y=.5+.5*Math.sin(.12*a.ys)*Math.cos(.1*a.time+a.xs);a.x=.8*a.x+.1;a.y=.8*a.y+.1;a.r=.5*Math.sin(1.22*a.time)+.6;a.g=.4+.4*Math.sin(1.307*a.time+2*a.y);a.b=.4+.4*Math.sin(1.959*a.time+2*a.x);a.xs=.00001<Math.abs(above(a.xs,1E3))?0:a.xs;a.ys=.00001<Math.abs(above(a.ys,\\n1E3))?0:a.ys;\"},{baseVals:{enabled:1,thick:1,smoothing:0},init_eqs_str:\"a.q1=0;a.speed=0;a.v=0;a.xs=0;a.ys=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.q1=0;a.speed=.8*a.bass_att;a.v=1E6*a.sample+a.value2*a.bass*.1;a.xs+=Math.sin(a.v)*a.speed*Math.atan(1.51*a.v);a.ys+=Math.sin(a.v)*a.speed*Math.atan(10*a.v);a.x=.5+.5*Math.sin(.1*a.xs)*Math.cos(.2*a.time+a.xs);a.y=.5+.5*Math.sin(.14*a.ys)*Math.cos(.1*a.time+a.xs);a.x=.8*a.x+.1;a.y=.8*a.y+.1;a.x=.6*a.x+.2;a.y=.6*a.y+.2;a.r=.5*Math.sin(1.322*a.time)+.6;a.g=.4+.4*Math.sin(1.5407*a.time+2*a.y);a.b=.4+.4*Math.sin(1.759*a.time+2*a.x);a.xs=.00001<Math.abs(above(a.xs,1E3))?0:a.xs;\\na.ys=.00001<Math.abs(above(a.ys,1E3))?0:a.ys;\"},{baseVals:{enabled:1,thick:1,smoothing:0},init_eqs_str:\"a.q1=0;a.speed=0;a.v=0;a.xs=0;a.ys=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.q1=0;a.speed=.8*a.bass_att;a.v=1E6*a.sample+a.value2*a.bass*.1;a.xs+=Math.sin(a.v)*a.speed*Math.atan(1.51*a.v);a.ys+=Math.sin(a.v)*a.speed*Math.atan(10*a.v);a.x=.5+.5*Math.sin(.1*a.xs)*Math.cos(.2*a.time+a.xs);a.y=.5+.5*Math.sin(.14*a.ys)*Math.cos(.1*a.time+a.xs);a.x=.8*a.x+.1;a.y=.8*a.y+.1;a.x=.25*a.x+.375;a.y=.25*a.y+.375;a.r=.5*Math.sin(1.622*a.time)+.6;a.g=.4+.4*Math.sin(1.2407*a.time+2*a.y);a.b=.4+.4*Math.sin(1.359*a.time+2*a.x);a.xs=.00001<Math.abs(above(a.xs,1E3))?\\n0:a.xs;a.ys=.00001<Math.abs(above(a.ys,1E3))?0:a.ys;\"},{baseVals:{enabled:0}}],init_eqs_str:\"a.basstime=0;a.stickybit=0;a.volavg2=0;a.q1=0;a.decay_r=0;a.sample1=0;a.difftime=0;a.diff=0;a.decay_b=0;a.edge=0;a.volavg=0;a.bit2=0;a.vol=0;a.q2=0;a.q3=0;a.basssum=0;a.decay_g=0;a.sample2=0;\",frame_eqs_str:\"a.basstime+=.03*a.bass;a.q1=4*a.basstime;a.basstime=.00001<Math.abs(below(a.basstime,1E3))?1E3:a.basstime;a.basstime+=.03*a.bass_att;a.vol=pow(a.bass+a.mid+a.treb,2);a.basssum=a.vol;a.stickybit=mod(a.time,2);a.volavg+=a.vol*equal(a.stickybit,1);a.sample1+=equal(a.stickybit,1);a.volavg2+=a.vol*equal(a.stickybit,0);a.sample2+=equal(a.stickybit,0);a.edge=bnot(equal(a.bit2,a.stickybit));a.volavg-=a.volavg*a.edge*a.stickybit;a.volavg2-=a.volavg2*a.edge*equal(a.stickybit,0);a.sample1-=\\na.sample1*a.edge*a.stickybit;a.sample2-=a.sample2*a.edge*equal(a.stickybit,0);a.diff=.00001<Math.abs(equal(a.stickybit,1))?div(a.basssum,div(a.volavg2,a.sample2)):0;a.diff=.00001<Math.abs(equal(a.stickybit,0))?div(a.basssum,div(a.volavg,a.sample1)):a.diff;a.q3=a.diff;a.bit2=mod(a.time,2);a.difftime+=.03*a.diff;a.q2=a.difftime;a.difftime=.00001<Math.abs(above(a.difftime,2E3))?0:a.difftime;a.monitor=3.14*Math.abs(Math.cos(a.time));a.mv_a=above(a.diff,10);\",pixel_eqs_str:\"a.zoom=1+.05*a.q3*a.rad;a.decay_r=.2*a.rad*Math.sin(.35*a.q2)+.85+.1*Math.sin(a.q2);a.decay_g=.2*a.rad*Math.sin(.5*a.q2)+.85+.1*Math.sin(.7*a.q2);a.decay_b=.2*a.rad*Math.sin(.4*a.q2)+.85+.1*Math.sin(.8*a.q2);a.rot=0;\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (vec2(1.0, 0.0) * texsize.z);\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (vec2(0.0, 1.0) * texsize.z);\\n  ret_1 = (((\\n    (texture (sampler_main, (uv + tmpvar_2)).xyz + texture (sampler_main, (uv + tmpvar_2)).xyz)\\n   * 0.5) + (\\n    (texture (sampler_main, (uv + tmpvar_3)).xyz + texture (sampler_main, (uv + tmpvar_3)).xyz)\\n   * 0.5)) - texture (sampler_main, ((\\n    (uv - 0.5)\\n   * 0.9) + 0.5)).xyz);\\n  ret_1 = (ret_1 - 0.4);\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = ret_1;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = ((0.5 - uv) + 0.5);\\n  ret_1 = (mix (texture (sampler_main, uv).xyz, texture (sampler_main, tmpvar_2).xyz, vec3(0.5, 0.5, 0.5)) * 2.0);\\n  ret_1 = (((\\n    ((texture (sampler_blur3, uv).xyz * scale3) + bias3)\\n   * 2.0) + (\\n    ((texture (sampler_blur3, tmpvar_2).xyz * scale3) + bias3)\\n   * 2.0)) + ret_1);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ret_1;\\n  ret = tmpvar_3.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,gammaadj:1.07,decay:.95,echo_zoom:1,echo_alpha:.5,echo_orient:1,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,brighten:1,darken:1,invert:1,wave_a:4.1,wave_scale:1.286,wave_smoothing:.63,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoom:.99951,warp:.01,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:.5,ob_r:.01,ib_size:.26,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,spectrum:1,thick:1},init_eqs_str:\"a.xang=0;a.fov=0;a.yang=0;a.my=0;a.oz=0;a.ayang=0;a.mz=0;a.oy=0;a.mod=0;a.azang=0;a.mx=0;a.vol=0;a.sp=0;a.zang=0;a.axang=0;a.ox=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.sp=1607.68*a.sample;a.vol=.33*(a.bass_att+a.mid_att+a.treb_att);a.vol=.2+.5*(a.value1+a.value2);a.vol=.2;a.mod=.00001<Math.abs(below(a.mid_att,1.8))?a.mid_att+.2:2;a.ox=.5*Math.sin(a.sp)*Math.sin(3.14*a.sample)*a.vol;a.oy=(a.sample-0)*a.mod;a.oz=.5*Math.cos(a.sp)*Math.sin(3.14*a.sample)*a.vol;a.xang=.672*a.time;a.axang=0;a.yang=-1.351*a.time;a.ayang=0;a.zang=-.401*a.time;a.azang=0;a.fov=.6+.2*Math.sin(a.time);a.fov=.5;a.mx=a.ox*Math.cos(a.zang)-a.oy*Math.sin(a.zang);a.my=\\na.ox*Math.sin(a.zang)+a.oy*Math.cos(a.zang);a.ox=a.mx;a.oy=a.my;a.mx=a.ox*Math.cos(a.yang)+a.oz*Math.sin(a.yang);a.mz=-a.ox*Math.sin(a.yang)+a.oz*Math.cos(a.yang);a.ox=a.mx;a.oz=a.mz;a.my=a.oy*Math.cos(a.xang)-a.oz*Math.sin(a.xang);a.mz=a.oy*Math.sin(a.xang)+a.oz*Math.cos(a.xang);a.oy=a.my;a.oz=a.mz;a.oz=Math.abs(a.oz)-2;a.x=div(a.ox*a.fov,a.oz)+.5;a.x=.75*(a.x-.5)+.5;a.y=div(a.oy*a.fov,a.oz)+.5;a.r=1+Math.sin(a.sp);a.b=.5+.5*Math.sin(1.57*a.sample);a.g=.5+.5*Math.cos(1.57*a.sample);a.a=.5+.25*(a.oz+\\n2);\"},{baseVals:{enabled:1,spectrum:1,thick:1},init_eqs_str:\"a.xang=0;a.fov=0;a.yang=0;a.my=0;a.oz=0;a.ayang=0;a.mz=0;a.oy=0;a.mod=0;a.azang=0;a.mx=0;a.vol=0;a.sp=0;a.zang=0;a.axang=0;a.ox=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.sp=1607.68*a.sample;a.vol=.33*(a.bass_att+a.mid_att+a.treb_att);a.vol=.2+.5*(a.value1+a.value2);a.vol=.2;a.mod=.00001<Math.abs(below(a.bass_att,1.8))?a.bass_att+.2:2;a.ox=.5*Math.sin(a.sp)*Math.sin(3.14*a.sample)*a.vol;a.oy=(a.sample-0)*a.mod;a.oz=.5*Math.cos(a.sp)*Math.sin(3.14*a.sample)*a.vol;a.xang=-.321*a.time;a.axang=0;a.yang=1.531*a.time;a.ayang=0;a.zang=-.101*a.time;a.azang=0;a.fov=.6+.2*Math.sin(a.time);a.fov=.5;a.mx=a.ox*Math.cos(a.zang)-a.oy*Math.sin(a.zang);a.my=\\na.ox*Math.sin(a.zang)+a.oy*Math.cos(a.zang);a.ox=a.mx;a.oy=a.my;a.mx=a.ox*Math.cos(a.yang)+a.oz*Math.sin(a.yang);a.mz=-a.ox*Math.sin(a.yang)+a.oz*Math.cos(a.yang);a.ox=a.mx;a.oz=a.mz;a.my=a.oy*Math.cos(a.xang)-a.oz*Math.sin(a.xang);a.mz=a.oy*Math.sin(a.xang)+a.oz*Math.cos(a.xang);a.oy=a.my;a.oz=a.mz;a.oz=Math.abs(a.oz)-2;a.x=div(a.ox*a.fov,a.oz)+.5;a.x=.75*(a.x-.5)+.5;a.y=div(a.oy*a.fov,a.oz)+.5;a.g=1+Math.sin(a.sp);a.r=.5+.5*Math.sin(1.57*a.sample);a.b=.5+.5*Math.cos(1.57*a.sample);a.a=.5+.25*(a.oz+\\n2);\"},{baseVals:{enabled:1,spectrum:1,thick:1},init_eqs_str:\"a.xang=0;a.fov=0;a.yang=0;a.my=0;a.oz=0;a.ayang=0;a.mz=0;a.oy=0;a.mod=0;a.azang=0;a.mx=0;a.vol=0;a.sp=0;a.zang=0;a.axang=0;a.ox=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.sp=1607.68*a.sample;a.vol=.33*(a.bass_att+a.mid_att+a.treb_att);a.vol=.2+.5*(a.value1+a.value2);a.vol=.2;a.mod=.00001<Math.abs(below(a.treb_att,1.8))?a.treb_att+.2:2;a.ox=.5*Math.sin(a.sp)*Math.sin(3.14*a.sample)*a.vol;a.oy=(a.sample-0)*a.mod;a.oz=.5*Math.cos(a.sp)*Math.sin(3.14*a.sample)*a.vol;a.xang=.221*a.time;a.axang=0;a.yang=-.411*a.time;a.ayang=0;a.zang=1.201*a.time;a.azang=0;a.fov=.6+.2*Math.sin(a.time);a.fov=.5;a.mx=a.ox*Math.cos(a.zang)-a.oy*Math.sin(a.zang);a.my=\\na.ox*Math.sin(a.zang)+a.oy*Math.cos(a.zang);a.ox=a.mx;a.oy=a.my;a.mx=a.ox*Math.cos(a.yang)+a.oz*Math.sin(a.yang);a.mz=-a.ox*Math.sin(a.yang)+a.oz*Math.cos(a.yang);a.ox=a.mx;a.oz=a.mz;a.my=a.oy*Math.cos(a.xang)-a.oz*Math.sin(a.xang);a.mz=a.oy*Math.sin(a.xang)+a.oz*Math.cos(a.xang);a.oy=a.my;a.oz=a.mz;a.oz=Math.abs(a.oz)-2;a.x=div(a.ox*a.fov,a.oz)+.5;a.x=.75*(a.x-.5)+.5;a.y=div(a.oy*a.fov,a.oz)+.5;a.b=1+Math.sin(a.sp);a.g=.5+.5*Math.sin(1.57*a.sample);a.r=.5+.5*Math.cos(1.57*a.sample);a.a=.5+.25*(a.oz+\\n2);\"},{baseVals:{enabled:0}}],init_eqs_str:\"a.it=0;a.radm=0;a.mod=0;\",frame_eqs_str:\"a.wave_a=0;\",pixel_eqs_str:\"a.it=.3*Math.sin(.2*a.time);a.radm=.5*a.rad;a.rot=.02*Math.sin(20*(a.radm+a.it));a.mod=Math.sin(5*a.ang);a.mod*=a.mod*a.mod*a.mod*a.mod;a.zoom=1+Math.abs(.01*a.mod);a.zoom*=Math.min(1.05,Math.max(1,Math.max(a.bass,a.treb)));\",warp:\" shader_body { \\n  vec3 xfer_1;\\n  vec3 ret_2;\\n  vec4 tmpvar_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (uv - 0.5);\\n  tmpvar_3 = texture (sampler_main, (tmpvar_4 + 0.5));\\n  ret_2 = (tmpvar_3.xyz / ((tmpvar_3.x + tmpvar_3.y) + tmpvar_3.z));\\n  ret_2 = texture (sampler_main, ((tmpvar_4 * dot (ret_2, vec3(1.0, 0.975, 0.95))) + 0.5)).xyz;\\n  vec3 tmpvar_5;\\n  tmpvar_5 = clamp (((ret_2 - 0.05) * 99.0), 0.0, 1.0);\\n  xfer_1.x = tmpvar_5.x;\\n  xfer_1.yz = (tmpvar_5.yz * clamp ((\\n    (0.1 - ret_2.xy)\\n   * 99.0), 0.0, 1.0));\\n  ret_2 = (ret_2 + (vec3(-0.014, 0.014, 0.0) * tmpvar_5.xxx));\\n  ret_2 = (ret_2 + (vec3(0.0, -0.08, 0.08) * xfer_1.yyy));\\n  ret_2 = (ret_2 + (vec3(0.0, 0.0, -0.02) * xfer_1.zzz));\\n  ret_2 = (ret_2 + (vec3(5.0, 15.0, 40.0) * (\\n    (texture (sampler_noise_lq, (((uv_orig * texsize.xy) * texsize_noise_lq.zw) + rand_frame.xy)).xyz - 0.5)\\n   / 256.0)));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ret_2;\\n  ret = tmpvar_6.xyz;\\n }\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:2,gammaadj:1,wave_mode:7,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wave_a:.001,wave_scale:.958,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:30.965,warpscale:2.572,zoom:1.00901,warp:54e-5,wave_r:0,wave_g:0,wave_b:0,mv_x:25.6,mv_y:9.6,mv_l:0,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.dx_residual=0;a.dy_residual=0;a.bass_thresh=0;a.rg=0;a.q9=0;\",frame_eqs_str:\"a.wave_r=.85+.25*Math.sin(.437*a.time+1);a.wave_g=.85+.25*Math.sin(.544*a.time+2);a.wave_b=.85+.25*Math.sin(.751*a.time+3);a.rot+=.01*(.6*Math.sin(.381*a.time)+.4*Math.sin(.579*a.time));a.cx+=.21*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.cy+=.21*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.dx+=.003*(.6*Math.sin(.234*a.time)+.4*Math.sin(.277*a.time));a.dy+=.003*(.6*Math.sin(.284*a.time)+.4*Math.sin(.247*a.time));a.decay-=.01*equal(mod(a.frame,6),0);a.dx+=\\na.dx_residual;a.dy+=a.dy_residual;a.bass_thresh=2*above(a.bass_att,a.bass_thresh)+(1-above(a.bass_att,a.bass_thresh))*(.96*(a.bass_thresh-1.3)+1.3);a.dx_residual=.016*equal(a.bass_thresh,2.13)*Math.sin(7*a.time)+(1-equal(a.bass_thresh,2.13))*a.dx_residual;a.dy_residual=.012*equal(a.bass_thresh,2.13)*Math.sin(9*a.time)+(1-equal(a.bass_thresh,2.13))*a.dy_residual;a.wave_x-=7*a.dx_residual;a.wave_y-=7*a.dy_residual;a.wave_mystery=.03*a.time;a.rg=Math.max(.77*a.rg,.02+.5*Math.min(2,1.3*Math.max(0,a.mid_att-\\n1)));a.q9=a.rg;a.zoom+=.1*a.q9;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = texture (sampler_main, uv).xyz;\\n  ret_1 = (ret_1 + ((ret_1 - \\n    ((((\\n      (texture (sampler_blur1, uv).xyz * scale1)\\n     + bias1) * 0.3) + ((\\n      (texture (sampler_blur2, uv).xyz * scale2)\\n     + bias2) * 0.4)) + (((texture (sampler_blur3, uv).xyz * scale3) + bias3) * 0.3))\\n  ) * 0.3));\\n  ret_1 = (ret_1 * 0.9);\\n  ret_1 = (ret_1 + ((\\n    ((texture (sampler_noise_lq, ((\\n      (uv_orig * texsize.xy)\\n     * \\n      (texsize_noise_lq.zw * 0.4)\\n    ) + rand_frame.xy)).xyz - 0.5) / 256.0)\\n   * 122.0) * (\\n    (clamp ((treb_att - 1.0), 0.0, 1.0) * 0.4)\\n   + 0.3)));\\n  ret_1 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.2, 0.2, 0.2));\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ret_1;\\n  ret = tmpvar_2.xyz;\\n }\",comp:\"vec2 xlat_mutabledz;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutableuv3;\\n shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1.y = 0.0;\\n  tmpvar_1.x = texsize.z;\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = 0.0;\\n  tmpvar_2.y = texsize.w;\\n  vec2 uv_3;\\n  float inten_4;\\n  float dist_5;\\n  vec2 uv1_6;\\n  vec3 ret_7;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_9;\\n  tmpvar_9 = (time / 18.0);\\n  dist_5 = (1.0 - fract((0.25 + tmpvar_9)));\\n  inten_4 = ((sqrt(dist_5) * (1.0 - dist_5)) * 4.0);\\n  uv_3 = (tmpvar_8 * aspect.yx);\\n  xlat_mutableuv3 = (vec2(0.51, 0.55) + (uv_3 * dist_5));\\n  xlat_mutabledz.x = (inten_4 * ((2.0 * \\n    dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29))\\n  ) - (2.0 * \\n    dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29))\\n  )));\\n  xlat_mutabledz.y = (inten_4 * ((2.0 * \\n    dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29))\\n  ) - (2.0 * \\n    dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29))\\n  )));\\n  xlat_mutableret1 = max (vec3(0.0, 0.0, 0.0), (texture (sampler_main, xlat_mutableuv3).xyz * inten_4));\\n  dist_5 = (1.0 - fract((0.5 + tmpvar_9)));\\n  inten_4 = ((sqrt(dist_5) * (1.0 - dist_5)) * 4.0);\\n  uv_3 = (tmpvar_8 * aspect.yx);\\n  xlat_mutableuv3 = (vec2(0.49, 0.55) + (uv_3 * dist_5));\\n  xlat_mutabledz.x = (xlat_mutabledz.x + (inten_4 * (\\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29)))\\n   - \\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29)))\\n  )));\\n  xlat_mutabledz.y = (xlat_mutabledz.y + (inten_4 * (\\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29)))\\n   - \\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29)))\\n  )));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, xlat_mutableuv3).xyz * inten_4));\\n  dist_5 = (1.0 - fract((0.75 + tmpvar_9)));\\n  inten_4 = ((sqrt(dist_5) * (1.0 - dist_5)) * 4.0);\\n  uv_3 = (tmpvar_8 * aspect.yx);\\n  xlat_mutableuv3 = (vec2(0.51, 0.55) + (uv_3 * dist_5));\\n  xlat_mutabledz.x = (xlat_mutabledz.x + (inten_4 * (\\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29)))\\n   - \\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29)))\\n  )));\\n  xlat_mutabledz.y = (xlat_mutabledz.y + (inten_4 * (\\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29)))\\n   - \\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29)))\\n  )));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, xlat_mutableuv3).xyz * inten_4));\\n  dist_5 = (1.0 - fract((1.0 + tmpvar_9)));\\n  inten_4 = ((sqrt(dist_5) * (1.0 - dist_5)) * 4.0);\\n  uv_3 = (tmpvar_8 * aspect.yx);\\n  xlat_mutableuv3 = (vec2(0.49, 0.55) + (uv_3 * dist_5));\\n  xlat_mutabledz.x = (xlat_mutabledz.x + (inten_4 * (\\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29)))\\n   - \\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_1)).xyz, vec3(0.32, 0.49, 0.29)))\\n  )));\\n  xlat_mutabledz.y = (xlat_mutabledz.y + (inten_4 * (\\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 + tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29)))\\n   - \\n    (2.0 * dot (texture (sampler_main, (xlat_mutableuv3 - tmpvar_2)).xyz, vec3(0.32, 0.49, 0.29)))\\n  )));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, xlat_mutableuv3).xyz * inten_4));\\n  xlat_mutabledz = (xlat_mutabledz * (0.5 + rand_preset.z));\\n  vec2 tmpvar_10;\\n  tmpvar_10 = (2.0 * (rand_preset.xy - 0.5));\\n  uv1_6 = (4.0 * tmpvar_8);\\n  vec2 tmpvar_11;\\n  tmpvar_11 = sin(((uv1_6 + xlat_mutabledz) + tmpvar_10));\\n  vec2 tmpvar_12;\\n  tmpvar_12 = sin(((uv1_6 + \\n    (xlat_mutabledz * 1.4)\\n  ) + tmpvar_10));\\n  vec2 tmpvar_13;\\n  tmpvar_13 = sin(((uv1_6 + \\n    (xlat_mutabledz * 1.8)\\n  ) + tmpvar_10));\\n  vec3 tmpvar_14;\\n  tmpvar_14.x = inversesqrt(dot (tmpvar_11, tmpvar_11));\\n  tmpvar_14.y = inversesqrt(dot (tmpvar_12, tmpvar_12));\\n  tmpvar_14.z = inversesqrt(dot (tmpvar_13, tmpvar_13));\\n  ret_7 = (((\\n    (tmpvar_14 * ((vec3(0.01, 0.01, 0.01) * (1.0 + \\n      (rand_preset.xyz / 2.0)\\n    )) * (0.5 + rand_preset.y)))\\n   * \\n    ((((rand_preset.x - 0.5) * 4.0) * xlat_mutableret1) + (8.0 * (1.0 + rand_preset)).xyz)\\n  ) - (xlat_mutableret1.x * 0.5)) + ((xlat_mutableret1.y + xlat_mutableret1.z) / 3.0));\\n  ret_7 = (ret_7 - ((slow_roam_sin.wzy * roam_cos.zxy) * 0.4));\\n  ret_7 = (ret_7 * (1.0 + ret_7));\\n  vec4 tmpvar_15;\\n  tmpvar_15.w = 1.0;\\n  tmpvar_15.xyz = ret_7;\\n  ret = tmpvar_15.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.995,echo_zoom:1,echo_orient:1,wave_mode:5,wave_brighten:0,wrap:0,wave_a:100,wave_scale:.721,wave_smoothing:.5,modwavealphastart:.5,modwavealphaend:1,fshader:1,dx:1e-5,dy:1e-5,warp:.01,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:0,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:0,mv_y:0,mv_l:1,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.thresh=0;a.dx_r=0;a.dy_r=0;a.xs=0;\",frame_eqs_str:\"a.wave_r=.5+.5*Math.sin(6*a.time);a.wave_g=.5+.5*Math.sin(4.1*a.time);a.wave_b=-1+(1-a.wave_r+1-a.wave_g);a.warp=0;\",pixel_eqs_str:\"a.thresh=2*above(a.bass_att,a.thresh)+(1-above(a.bass_att,a.thresh))*(.96*(a.thresh-1.3)+1.3);a.dx_r=.015*equal(a.thresh,2)*Math.sin(5*a.time)+(1-equal(a.thresh,2))*a.dx_r;a.dy_r=.015*equal(a.thresh,2)*Math.sin(6*a.time)+(1-equal(a.thresh,2))*a.dy_r;a.xs=above(Math.sin(12*a.dx_r*a.bass),0)*a.dy_r*Math.sin(2*a.rad)+below(Math.sin(12*a.dx_r*a.bass),0)*Math.cos(a.time)*a.dx_r*Math.sin(.6*a.rad);a.zoom+=Math.abs(12*a.xs);a.rot+=5*a.xs*Math.cos(1-a.xs*a.rad*12*a.dx_r);a.dx+=a.dx_r;\\na.dy+=a.dy_r;\",warp:\" shader_body { \\n  vec2 my_uv_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (vec2(1280.0, 1024.0) * texsize.zw);\\n  float tmpvar_4;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (uv + vec2(0.005, 0.0));\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv - vec2(0.005, 0.0));\\n  tmpvar_4 = (((\\n    (texture (sampler_blur2, tmpvar_5).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_6).xyz * scale2)\\n   + bias2)).x * tmpvar_3.x);\\n  float tmpvar_7;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (uv + vec2(0.0, 0.005));\\n  vec2 tmpvar_9;\\n  tmpvar_9 = (uv - vec2(0.0, 0.005));\\n  tmpvar_7 = (((\\n    (texture (sampler_blur2, tmpvar_8).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_9).xyz * scale2)\\n   + bias2)).x * tmpvar_3.y);\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_4;\\n  tmpvar_10.y = tmpvar_7;\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = (((\\n    (texture (sampler_blur2, tmpvar_5).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_6).xyz * scale2)\\n   + bias2)).x * tmpvar_3.x);\\n  tmpvar_11.y = (((\\n    (texture (sampler_blur2, tmpvar_8).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_9).xyz * scale2)\\n   + bias2)).x * tmpvar_3.y);\\n  ret_2.x = texture (sampler_fw_main, ((uv - (tmpvar_10 * 0.01)) + (tmpvar_11 * 0.003))).x;\\n  vec4 tmpvar_12;\\n  tmpvar_12 = texture (sampler_blur3, uv);\\n  ret_2.x = (ret_2.x + ((ret_2.x - \\n    ((tmpvar_12.xyz * scale3) + bias3)\\n  .x) * 0.1));\\n  ret_2.x = (ret_2.x + 0.004);\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = tmpvar_7;\\n  tmpvar_13.y = -(tmpvar_4);\\n  my_uv_1 = (uv + ((tmpvar_13 * 0.05) * (1.2 - \\n    ((tmpvar_12.xyz * scale3) + bias3)\\n  .y)));\\n  ret_2.z = texture (sampler_fw_main, my_uv_1).z;\\n  vec2 x_14;\\n  x_14 = (my_uv_1 - uv);\\n  ret_2.z = (ret_2.z + ((\\n    ((ret_2.z - ((texture (sampler_blur1, uv).xyz * scale1) + bias1).z) * sqrt(dot (x_14, x_14)))\\n   * 180.0) / sqrt(\\n    dot (tmpvar_3, tmpvar_3)\\n  )));\\n  ret_2.z = (ret_2.z * 0.8);\\n  ret_2.z = (ret_2.z + 0.004);\\n  vec2 tmpvar_15;\\n  tmpvar_15.x = -(tmpvar_7);\\n  tmpvar_15.y = tmpvar_4;\\n  my_uv_1 = (tmpvar_15 * 0.045);\\n  vec2 tmpvar_16;\\n  tmpvar_16.x = (((\\n    (texture (sampler_blur2, (uv + vec2(0.01, 0.0))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (uv - vec2(0.01, 0.0))).xyz * scale2)\\n   + bias2)).y * tmpvar_3.x);\\n  tmpvar_16.y = (((\\n    (texture (sampler_blur2, (uv + vec2(0.0, 0.01))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (uv - vec2(0.0, 0.01))).xyz * scale2)\\n   + bias2)).y * tmpvar_3.y);\\n  my_uv_1 = (my_uv_1 + (uv - (tmpvar_16 * 0.03)));\\n  ret_2.y = texture (sampler_fw_main, my_uv_1).y;\\n  ret_2.y = (ret_2.y + ((\\n    (ret_2.y - ((texture (sampler_blur3, my_uv_1).xyz * scale3) + bias3).y)\\n   * 0.1) + 0.01));\\n  vec4 tmpvar_17;\\n  tmpvar_17.w = 1.0;\\n  tmpvar_17.xyz = ret_2;\\n  ret = tmpvar_17.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = texture (sampler_main, uv).xyz;\\n  ret_1 = (ret_1 * hue_shader);\\n  vec3 tmpvar_2;\\n  tmpvar_2 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.5, 1.0, 0.1));\\n  ret_1 = tmpvar_2;\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = tmpvar_2;\\n  ret = tmpvar_3.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.998,echo_zoom:1.421,wave_mode:7,additivewave:1,modwavealphabyvolume:1,darken_center:1,wave_a:1.193,wave_scale:1.489,wave_smoothing:0,modwavealphastart:.87,modwavealphaend:1.09,warpscale:3.138,zoom:1.003,warp:.09218,wave_r:.5,wave_g:.5,wave_b:.5,wave_x:.6,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.t2=0;\",frame_eqs_str:\"a.wave_r+=.365*(.6*Math.sin(4.437*a.time)+.4*Math.sin(3.97*a.time));a.wave_g+=.365*(.6*Math.sin(4.344*a.time)+.4*Math.sin(3.841*a.time));a.wave_b+=.365*(.6*Math.sin(4.251*a.time)+.4*Math.sin(3.055*a.time));a.rot+=.02*(.6*Math.sin(.181*a.time)+.09*Math.sin(-.279*a.time));a.zoom+=.025*(.6*Math.sin(.3131*a.time+2)+.4*Math.sin(-.479*a.time+4));a.decay-=.01*equal(mod(a.frame,6),0);a.t2=6*a.time;a.wave_x=.5+.2*(.6*Math.sin(.374*a.t2)+.4*Math.sin(.294*a.t2));a.wave_y=.5+.2*(.6*Math.sin(.393*\\na.t2)+.4*Math.sin(.223*a.t2));\",pixel_eqs_str:\"a.dx=0;a.dy=0;a.dx+=2*div(Math.cos(29.37*a.y-1.9*a.time),a.pixelsx);a.dy+=2*div(Math.cos(33.21*a.x-1.7*a.time),a.pixelsy);a.dx+=1.5*div(Math.cos(77.55*a.y-2.1*a.time),a.pixelsx);a.dy+=1.5*div(Math.cos(78.32*a.x-2.4*a.time),a.pixelsy);\",warp:\" shader_body { \\n  vec2 dxy_1;\\n  dxy_1.x = cos(((154.56 * uv_orig.y) - time));\\n  dxy_1.y = cos(((154.56 * uv_orig.x) - time));\\n  float tmpvar_2;\\n  tmpvar_2 = (time * 5.0);\\n  dxy_1.x = (dxy_1.x + cos((\\n    (412.16 * uv_orig.y)\\n   - tmpvar_2)));\\n  dxy_1.y = (dxy_1.y + cos((\\n    (412.16 * uv_orig.x)\\n   - tmpvar_2)));\\n  dxy_1.y = (dxy_1.y + 0.15);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = (max (texture (sampler_fw_main, (uv + \\n    (dxy_1 * texsize.zw)\\n  )).xyz, (texture (sampler_main, uv_orig).xyz * 0.8)) - 0.004);\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = ((texture (sampler_main, uv).xyz * 0.8) + ((\\n    (texture (sampler_blur1, uv).xyz * scale1)\\n   + bias1) * 0.7));\\n  ret = tmpvar_1.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.9,echo_zoom:1.169,wave_mode:2,additivewave:1,wave_dots:1,wave_thick:1,wave_a:.274,wave_scale:2.827,wave_smoothing:.09,modwavealphastart:.83,modwavealphaend:1.31,warpscale:3.138,zoom:.993,warp:54e-5,wave_r:.5,wave_g:.5,wave_b:.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.dx_residual=0;a.dy_residual=0;a.bass_thresh=0;\",frame_eqs_str:\"a.wave_r=.85+.25*Math.sin(.437*a.time+1);a.wave_g=.85+.25*Math.sin(.544*a.time+2);a.wave_b=.85+.25*Math.sin(.751*a.time+3);a.rot+=.01*(.6*Math.sin(.381*a.time)+.4*Math.sin(.579*a.time));a.cx+=.21*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.cy+=.21*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.dx+=.003*(.6*Math.sin(.234*a.time)+.4*Math.sin(.277*a.time));a.dy+=.003*(.6*Math.sin(.284*a.time)+.4*Math.sin(.247*a.time));a.decay-=.01*equal(mod(a.frame,6),0);a.dx+=\\na.dx_residual;a.dy+=a.dy_residual;a.bass_thresh=2*above(a.bass_att,a.bass_thresh)+(1-above(a.bass_att,a.bass_thresh))*(.96*(a.bass_thresh-1.3)+1.3);a.dx_residual=.016*equal(a.bass_thresh,2.13)*Math.sin(7*a.time)+(1-equal(a.bass_thresh,2.13))*a.dx_residual;a.dy_residual=.012*equal(a.bass_thresh,2.13)*Math.sin(9*a.time)+(1-equal(a.bass_thresh,2.13))*a.dy_residual;a.wave_x-=7*a.dx_residual;a.wave_y-=7*a.dy_residual;a.wave_mystery=.03*a.time;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  ret_1 = (tmpvar_2.xyz + ((tmpvar_2.xyz - \\n    ((texture (sampler_blur1, uv).xyz * scale1) + bias1)\\n  ) * 0.2));\\n  ret_1 = (ret_1 - 0.02);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ret_1;\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_main, uv).xyz * 1.15);\\n  ret = tmpvar_1.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,additivewave:1,wave_brighten:0,wave_a:.001,wave_scale:.01,wave_smoothing:.63,wave_mystery:-1,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:30.965,warpscale:2.572,zoom:1.00901,warp:54e-5,wave_r:.65,wave_g:.65,wave_b:.65,mv_x:12.8,mv_y:9.6,mv_l:1,mv_g:.91,mv_b:.71,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,additive:1,rad:.49138,r:0,g:1,b:1,border_a:0},init_eqs_str:\"a.q4=0;a.q5=0;\",frame_eqs_str:\"a.x=.5+a.q4;a.y=.5+a.q5;a.a=a.bass_att+a.mid_att+a.treb_att;a.a*=.25;a.a=a.a*a.a*1.5;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.dx_residual=0;a.dy_residual=0;a.bass_thresh=0;\",frame_eqs_str:\"a.wave_r=.85+.25*Math.sin(.437*a.time+1);a.wave_g=.85+.25*Math.sin(.544*a.time+2);a.wave_b=.85+.25*Math.sin(.751*a.time+3);a.rot+=.01*(.6*Math.sin(.381*a.time)+.4*Math.sin(.579*a.time));a.cx+=.21*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.cy+=.21*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.dx+=.003*(.6*Math.sin(.234*a.time)+.4*Math.sin(.277*a.time));a.dy+=.003*(.6*Math.sin(.284*a.time)+.4*Math.sin(.247*a.time));a.decay-=.01*equal(mod(a.frame,6),0);a.dx+=\\na.dx_residual;a.dy+=a.dy_residual;a.bass_thresh=2*above(a.bass_att,a.bass_thresh)+(1-above(a.bass_att,a.bass_thresh))*(.96*(a.bass_thresh-1.3)+1.3);a.dx_residual=.016*equal(a.bass_thresh,2.13)*Math.sin(7*a.time)+(1-equal(a.bass_thresh,2.13))*a.dx_residual;a.dy_residual=.012*equal(a.bass_thresh,2.13)*Math.sin(9*a.time)+(1-equal(a.bass_thresh,2.13))*a.dy_residual;a.wave_x-=7*a.dx_residual;a.wave_y-=7*a.dy_residual;a.wave_mystery=.03*a.time;a.zoom+=.005*(.6*Math.sin(.1934*a.time+3)+.4*Math.sin(.307*\\na.time+9));a.zoom+=.2*Math.max(0,a.bass_att-1.1);a.warp+=.5*Math.max(0,a.treb-1.1);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  ret_1 = (tmpvar_2.xyz + ((tmpvar_2.xyz - \\n    ((texture (sampler_blur2, uv).xyz * scale2) + bias2)\\n  ) * 0.6));\\n  ret_1 = (ret_1 * 0.9);\\n  ret_1 = (ret_1 + ((\\n    ((texture (sampler_noise_lq, ((\\n      (uv_orig * texsize.xy)\\n     * \\n      (texsize_noise_lq.zw * 0.4)\\n    ) + rand_frame.xy)).xyz - 0.5) / 256.0)\\n   * 12.0) * clamp (\\n    (treb_att - 1.0)\\n  , 0.0, 1.0)));\\n  vec3 tmpvar_3;\\n  tmpvar_3 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.04, 0.04, 0.04));\\n  ret_1 = tmpvar_3;\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = tmpvar_3;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec3 N_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (vec2(1.0, 0.0) * texsize.zw);\\n  N_1.x = ((texture (sampler_main, (uv_orig + tmpvar_3)).xyz - texture (sampler_main, (uv_orig - tmpvar_3)).xyz).x * 0.8);\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (vec2(0.0, 1.0) * texsize.zw);\\n  N_1.y = ((texture (sampler_main, (uv_orig + tmpvar_4)).xyz - texture (sampler_main, (uv_orig - tmpvar_4)).xyz).x * 0.8);\\n  N_1.x = (N_1.x + ((\\n    ((texture (sampler_blur1, (uv_orig + tmpvar_3)).xyz * scale1) + bias1)\\n   - \\n    ((texture (sampler_blur1, (uv_orig - tmpvar_3)).xyz * scale1) + bias1)\\n  ).x * 0.2));\\n  N_1.y = (N_1.y + ((\\n    ((texture (sampler_blur1, (uv_orig + tmpvar_4)).xyz * scale1) + bias1)\\n   - \\n    ((texture (sampler_blur1, (uv_orig - tmpvar_4)).xyz * scale1) + bias1)\\n  ).x * 0.2));\\n  N_1.z = -0.077;\\n  vec3 tmpvar_5;\\n  tmpvar_5 = normalize(N_1);\\n  N_1 = tmpvar_5;\\n  vec3 tmpvar_6;\\n  tmpvar_6.z = -0.8;\\n  tmpvar_6.x = q9;\\n  tmpvar_6.y = q10;\\n  vec3 tmpvar_7;\\n  tmpvar_7.z = 0.0;\\n  tmpvar_7.xy = ((uv_orig * 2.0) - 1.0);\\n  vec3 tmpvar_8;\\n  tmpvar_8 = normalize((tmpvar_6 - tmpvar_7));\\n  vec3 tmpvar_9;\\n  tmpvar_9 = normalize((tmpvar_7 - vec3(0.0, 0.0, 1.0)));\\n  ret_2 = (vec3(clamp (dot (tmpvar_5, tmpvar_8), 0.0, 1.0)) * vec3(1.2, 0.9, 0.7));\\n  ret_2 = (ret_2 * normalize((\\n    (texture (sampler_blur3, uv_orig).xyz * scale3)\\n   + bias3).yzx));\\n  ret_2 = (ret_2 + (pow (\\n    clamp (dot (normalize((tmpvar_9 + \\n      ((2.0 * tmpvar_5) * dot (tmpvar_9, tmpvar_5))\\n    )), tmpvar_8), 0.0, 1.0)\\n  , 32.0) * 0.5));\\n  vec4 tmpvar_10;\\n  tmpvar_10.w = 1.0;\\n  tmpvar_10.xyz = ret_2;\\n  ret = tmpvar_10.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:1,echo_zoom:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.535239,wave_smoothing:0,wave_mystery:-.48,modwavealphastart:1,modwavealphaend:1.1,warpscale:3.138,fshader:1,zoom:1.023,warp:.122616,wave_g:.65,wave_b:0,mv_x:6.4,mv_y:48,mv_dx:.5,mv_dy:.5,mv_l:5,mv_r:.013716,mv_g:.872347,mv_b:.522466,mv_a:0},shapes:[{baseVals:{enabled:1,thickoutline:1,textured:1,rad:.746302,tex_zoom:.942039,g:1,b:1,r2:1,b2:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.val=0;\",frame_eqs_str:\"a.ang=.5*Math.sin(a.time)+.5;a.val=3;a.a2=.33*a.val;a.a=.33*a.val;a.rad=.4*Math.cos(.3*a.time)+.65;a.x=.25*Math.sin(.25*a.time)+.5;a.y=.25*Math.cos(.45*a.time)+.5;\"},{baseVals:{enabled:1,thickoutline:1,textured:1,rad:.746302,tex_zoom:.942039,g:1,b:1,r2:1,b2:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.val=0;\",frame_eqs_str:\"a.ang=.5*Math.cos(.3*a.time)+.5;a.val=3;a.a2=.33*a.val;a.a=.33*a.val;a.rad=.4*Math.sin(.3*a.time)+.65;a.x=.25*Math.cos(.25*a.time)+.5;a.y=.25*Math.sin(.45*a.time)+.5;\"},{baseVals:{enabled:1,thickoutline:1,rad:.364564,r:0,g2:0,a2:1,border_r:0,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.h2=0;a.vr=0;a.vg=0;a.vb=0;a.dist=0;a.maat=0;\",frame_eqs_str:\"a.h2+=.8*above(a.treb,1.32)*.9;a.vr=.5*Math.sin(.8*a.h2)+.5;a.vg=.5*Math.sin(.5*a.h2)+.5;a.vb=.5*Math.sin(.1*a.h2)+.5;a.g=a.vg;a.r=a.vr;a.b=a.vb;a.g2=a.g;a.r2=a.r;a.b2=a.b;a.dist=.01*mod(a.frame,100);a.maat+=above(a.bass_att,1.5);a.maat*=below(a.maat,16);a.x=.00001<Math.abs(below(a.maat,8))?.00001<Math.abs(below(a.maat,4))?a.dist:1-a.dist:a.x;a.y=.00001<Math.abs(above(a.maat,8))?.00001<Math.abs(above(a.maat,4))?a.dist:1-a.dist:a.y;\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.dx_residual=0;a.dy_residual=0;a.bass_thresh=0;\",frame_eqs_str:\"a.wave_r=1;a.wave_g=0;a.wave_b=0;a.wave_r=sqrt(a.wave_r);a.wave_g=sqrt(a.wave_g);a.wave_b=sqrt(a.wave_b);a.rot+=.01*(.6*Math.sin(.381*a.time)+.4*Math.sin(.579*a.time));a.cx+=.21*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.cy+=.21*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.dx+=.003*(.6*Math.sin(.234*a.time)+.4*Math.sin(.277*a.time));a.dy+=.003*(.6*Math.sin(.284*a.time)+.4*Math.sin(.247*a.time));a.decay-=.01*equal(mod(a.frame,6),0);a.dx+=a.dx_residual;a.dy+=\\na.dy_residual;a.bass_thresh=2*above(a.bass_att,a.bass_thresh)+(1-above(a.bass_att,a.bass_thresh))*(.96*(a.bass_thresh-1.3)+1.3);a.dx_residual=.016*equal(a.bass_thresh,2.13)*Math.sin(7*a.time)+(1-equal(a.bass_thresh,2.13))*a.dx_residual;a.dy_residual=.012*equal(a.bass_thresh,2.13)*Math.sin(9*a.time)+(1-equal(a.bass_thresh,2.13))*a.dy_residual;a.wave_x-=7*a.dx_residual;a.wave_y-=7*a.dy_residual;a.wave_mystery=.03*a.time;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_main, (uv + (\\n    (texture (sampler_main, (uv + texsize.zw)).xy - 0.37)\\n   * 0.03))).xyz - 0.004);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret_2;\\n  uv_1 = (0.05 + (0.9 * uv));\\n  ret_2 = (abs((\\n    ((texture (sampler_blur1, uv_1).xyz * scale1) + bias1)\\n   - texture (sampler_main, uv_1).xyz)) * 6.0);\\n  ret_2 = (ret_2 * 1.333);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ret_2;\\n  ret = tmpvar_3.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.7,echo_zoom:1.16936,wave_mode:2,wave_dots:1,wave_brighten:0,wave_a:.001,wave_scale:.011726,wave_smoothing:.9,zoom:.999902,warp:.01,wave_r:.5,wave_g:.4,wave_b:.3,ob_size:.0065,ib_size:.26,mv_x:0,mv_y:43.199997,mv_l:1,mv_g:.91,mv_b:.71,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,r:.1,b:.7},init_eqs_str:\"a.n=0;a.yq=0;a.xp=0;a.t5=0;a.xs=0;a.yp=0;a.t1=0;a.q1=0;a.cosang=0;a.r1=0;a.g2=0;a.xq=0;a.t3=0;a.flip=0;a.t6=0;a.ys=0;a.zq=0;a.phs=0;a.r2=0;a.ang=0;a.sinang=0;a.tm=0;a.b2=0;a.t2=0;a.zp=0;a.g1=0;a.t4=0;a.b1=0;a.q8=0;\",frame_eqs_str:\"a.t1=.5*Math.sin(a.time)+.5;a.t2=.5*Math.sin(a.time+2.1)+.5;a.t3=.5*Math.sin(a.time+4.2)+.5;a.t4=.5*Math.sin(a.time+1.1)+.5;a.t5=.5*Math.sin(a.time+3.1)+.5;a.t6=.5*Math.sin(a.time+5.2)+.5;\",point_eqs_str:\"a.n=6.283*a.sample;a.phs=.2*-a.sample;a.tm=a.q1+a.phs;a.flip+=1;a.flip*=below(a.flip,2);a.xp=0;a.yp=.1*a.flip+.2*(.5*Math.sin(a.tm)+.5);a.zp=0;a.ang=.5*Math.sin(2*a.tm)+.5;a.xq=a.xp;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.yq=a.yp;a.zq=a.zp;a.ang=8*a.tm;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.3;a.ang=3.14+1.5*\\nMath.sin(2*a.tm-.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.ang=-1+Math.cos(3.1*a.tm+.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.35;a.ang=1.75*Math.cos(2.3*a.tm)-1.05;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp*a.sinang+a.zp*a.cosang;a.yq=a.yp;a.zq=a.xp*a.cosang-a.zp*a.sinang;a.ang=.5*Math.cos(a.tm)-.5;\\na.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq;a.yp=a.yq*a.cosang-a.zq*a.sinang;a.zp=a.yq*a.sinang+a.zq*a.cosang;a.zp+=2;a.xs=div(a.xp,a.zp);a.ys=div(a.yp,a.zp);a.x=a.xs+.5;a.y=1.3*a.ys+.5;a.a=.00001<Math.abs(equal(a.q8,1))?1-a.sample:a.sample;a.a*=a.a;a.b+=.3*pow(1-a.sample,2);a.r1=a.t1;a.g1=a.t2;a.b1=a.t3;a.r2=a.t4;a.g2=a.t5;a.b2=a.t6;a.r=a.r1*a.flip+a.r2*(1-a.flip);a.g=a.g1*a.flip+a.g2*(1-a.flip);a.b=a.b1*a.flip+a.b2*(1-a.flip);\"},{baseVals:{enabled:1,r:.2,b:.6},init_eqs_str:\"a.n=0;a.yq=0;a.xp=0;a.t5=0;a.xs=0;a.yp=0;a.t1=0;a.q1=0;a.cosang=0;a.r1=0;a.g2=0;a.xq=0;a.t3=0;a.flip=0;a.t6=0;a.ys=0;a.zq=0;a.phs=0;a.r2=0;a.ang=0;a.sinang=0;a.tm=0;a.b2=0;a.t2=0;a.zp=0;a.g1=0;a.t4=0;a.b1=0;a.q8=0;\",frame_eqs_str:\"a.t1=.5*Math.sin(a.time)+.5;a.t2=.5*Math.sin(a.time+2.1)+.5;a.t3=.5*Math.sin(a.time+4.2)+.5;a.t4=.5*Math.sin(a.time+1.1)+.5;a.t5=.5*Math.sin(a.time+3.1)+.5;a.t6=.5*Math.sin(a.time+5.2)+.5;\",point_eqs_str:\"a.n=6.283*a.sample;a.phs=.2*-a.sample;a.tm=a.q1+a.phs;a.flip+=1;a.flip*=below(a.flip,2);a.xp=0;a.yp=.1*a.flip+.2*(.5*Math.sin(a.tm)+.5)+.1;a.yp=-a.yp;a.zp=0;a.ang=.5*Math.sin(2*a.tm)+.5;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.yq=a.yp;a.zq=a.zp;a.ang=8*a.tm;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.3;\\na.ang=3.14+1.5*Math.sin(2*a.tm-.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp;a.yq=a.yp*a.sinang+a.zp*a.cosang;a.zq=a.yp*a.cosang-a.zp*a.sinang;a.ang=-1+Math.cos(3.1*a.tm+.5);a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq*a.sinang+a.yq*a.cosang;a.yp=a.xq*a.cosang-a.yq*a.sinang;a.zp=a.zq;a.zp-=.35;a.ang=1.75*Math.cos(2.3*a.tm)-1.05;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xq=a.xp*a.sinang+a.zp*a.cosang;a.yq=a.yp;a.zq=a.xp*a.cosang-a.zp*a.sinang;a.ang=.5*Math.cos(a.tm)-\\n.5;a.sinang=Math.sin(a.ang);a.cosang=Math.cos(a.ang);a.xp=a.xq;a.yp=a.yq*a.cosang-a.zq*a.sinang;a.zp=a.yq*a.sinang+a.zq*a.cosang;a.zp+=2;a.xs=div(a.xp,a.zp);a.ys=div(a.yp,a.zp);a.x=a.xs+.5;a.y=1.3*a.ys+.5;a.a=.00001<Math.abs(equal(a.q8,1))?1-a.sample:a.sample;a.a*=a.a;a.b+=.3*pow(1-a.sample,2);a.r1=a.t1;a.g1=a.t2;a.b1=a.t3;a.r2=a.t4;a.g2=a.t5;a.b2=a.t6;a.r=a.r1*a.flip+a.r2*(1-a.flip);a.g=a.g1*a.flip+a.g2*(1-a.flip);a.b=a.b1*a.flip+a.b2*(1-a.flip);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.movement=0;a.q1=0;\",frame_eqs_str:\"a.movement=a.movement+.01*(a.bass+a.bass_att)+.001*pow(a.bass+1,3);a.q1=a.movement;a.monitor=a.q1;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = texture (sampler_main, uv).xyz;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (normalize((uv - uv_orig)) * texsize.zw);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 0.0;\\n  tmpvar_3.xyz = ret_1;\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 0.0;\\n  tmpvar_4.xyz = max (tmpvar_3, (texture (sampler_main, (uv - tmpvar_2)) * 0.9)).xyz;\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 0.0;\\n  tmpvar_5.xyz = max (tmpvar_4, (texture (sampler_main, (uv + tmpvar_2)) * 0.97)).xyz;\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 0.0;\\n  tmpvar_6.xyz = max (tmpvar_5, (texture (sampler_main, (uv + \\n    (tmpvar_2 * 2.0)\\n  )) * 0.97)).xyz;\\n  ret_1 = (max (tmpvar_6, (texture (sampler_main, \\n    (uv + (tmpvar_2 * 3.0))\\n  ) * 0.9)).xyz * 0.92);\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = ret_1;\\n  ret = tmpvar_7.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret_2;\\n  uv_1 = (0.05 + (0.9 * uv));\\n  ret_2 = (abs((\\n    ((texture (sampler_blur1, uv_1).xyz * scale1) + bias1)\\n   - texture (sampler_main, uv_1).xyz)) * 6.0);\\n  ret_2 = (ret_2 * 1.333);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ret_2;\\n  ret = tmpvar_3.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,echo_zoom:1,echo_orient:3,wave_mode:1,wave_thick:1,wrap:0,darken_center:1,wave_a:.3,wave_scale:.881,wave_smoothing:.5,wave_mystery:-1,warpscale:2.853,zoomexp:3.6,zoom:1.02109,rot:-.16,warp:.309,wave_r:.6,wave_g:.6,wave_b:.6,wave_y:.47,mv_l:1.75},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.q8=0;a.oldq8=0;\",frame_eqs_str:\"a.wave_r+=.4*(.6*Math.sin(.933*a.time)+.4*Math.sin(1.045*a.time));a.wave_g+=.4*(.6*Math.sin(.9*a.time)+.4*Math.sin(.956*a.time));a.wave_b+=.4*(.6*Math.sin(.91*a.time)+.4*Math.sin(.92*a.time));a.q8=a.oldq8+(.00001<Math.abs(above(a.bass+a.bass_att,1.8))?a.q8+.0005*pow(a.bass+a.bass_att-1,9):0);a.oldq8=a.q8;a.monitor=a.q8;a.zoom+=.023*(.6*Math.sin(.339*a.q8)+.4*Math.sin(.276*a.q8));a.rot+=.03*(.6*Math.sin(.381*a.q8)+.4*Math.sin(.579*a.q8));a.mv_r=a.wave_r;a.mv_b=a.wave_b;a.mv_g=\\na.wave_g;a.mv_x=1.25;a.mv_y=1.25;a.mv_dx=.1*Math.sin(1.1*a.time);a.mv_dy=.1*Math.cos(1.112*a.time);\",pixel_eqs_str:\"a.rot+=div(1,10*(a.rad+.2+.1*Math.sin(a.q8)));\",warp:\"\",comp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1 = texture (sampler_main, uv);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = (tmpvar_1.xyz * (1.0 + (\\n    (abs((fract(\\n      (tmpvar_1.xyz * 8.0)\\n    ) - 0.5)) - 0.25)\\n   * 0.4)));\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:2.001,decay:.95,echo_zoom:.9996,wave_mode:1,wrap:0,wave_a:3.072644,wave_scale:1.285746,wave_smoothing:0,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoom:.999513,warp:.0101,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:.005,ob_a:.8,ib_size:0,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"\",frame_eqs_str:\"a.wave_r+=.5*Math.sin(1.13*a.time);a.wave_g+=.5*Math.sin(1.23*a.time);a.wave_b+=.5*Math.sin(1.33*a.time);\",pixel_eqs_str:\"a.zoom+=.05*(Math.sin(6*a.ang)+.3*Math.sin(Math.sin(2*a.time*Math.sin(a.time)*a.rad))-.1*Math.cos(a.rad));a.rot+=.5*Math.sin(.5-a.rad)*Math.cos(.02*(.5-a.rad)+a.time);a.sx+=.01*(.99-a.rad)*Math.sin(.733*a.time)*below(Math.sin(a.time),0);a.sy+=.01*(.99-a.rad)*Math.cos(.953*a.time)*above(Math.sin(a.time),0);a.zoom-=.05*(1-a.rad)*below(a.rad,.5);\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_main, (uv + (\\n    (texture (sampler_main, (uv + texsize.zw)).xy - 0.37)\\n   * 0.03))).xyz - 0.004);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret_2;\\n  uv_1 = (0.03 + (0.94 * uv));\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (texsize.zw * 0.7);\\n  ret_2 = (texture (sampler_main, (uv_1 + (tmpvar_3 * vec2(3.5, 0.0)))).xyz * 3.0);\\n  ret_2 = (ret_2 + (texture (sampler_main, (uv_1 + \\n    (tmpvar_3 * vec2(0.0, 3.5))\\n  )).xyz * 3.0));\\n  ret_2 = (ret_2 + (texture (sampler_main, (uv_1 + \\n    (tmpvar_3 * vec2(0.0, -3.5))\\n  )).xyz * -2.0));\\n  ret_2 = (ret_2 + (texture (sampler_main, (uv_1 + \\n    (tmpvar_3 * vec2(-3.5, 0.0))\\n  )).xyz * -2.0));\\n  ret_2 = (ret_2 / 2.0);\\n  ret_2 = (ret_2 * (1.0 + (0.15 * \\n    ((texture (sampler_noise_lq, (rand_frame.xy + (\\n      (uv_1 * texsize.xy)\\n     * texsize_noise_lq.zw))).xxx * 2.0) - 1.0)\\n  )));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = pow (ret_2, vec3(0.5, 0.8, 1.0));\\n  ret_2 = tmpvar_4;\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = tmpvar_4;\\n  ret = tmpvar_5.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:.97,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:2,wave_brighten:0,wrap:0,wave_a:100,wave_scale:.797,wave_smoothing:.5,modwavealphastart:.5,modwavealphaend:1,dx:1e-5,dy:1e-5,warp:.01,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.005,ob_a:1,ib_r:0,ib_g:0,ib_b:0,ib_a:.1,mv_x:0,mv_y:0,mv_l:1,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.thresh=0;a.dx_r=0;a.dy_r=0;\",frame_eqs_str:\"a.warp=0;a.ob_r=a.ob_r+.8*Math.sin(1.1*a.time)+1.1*Math.cos(2*a.time);a.ob_b=a.ob_b+.9*Math.sin(1.2*a.time)+Math.cos(1.5*a.time);a.ob_g=a.ob_g+.7*Math.sin(a.time)+Math.sin(.4*a.time);a.wave_r=Math.abs(a.ob_r+.2);a.wave_g=Math.abs(a.ob_g+.2);a.wave_b=Math.abs(a.ob_b+.2);a.ib_b=a.ib_b+.44*Math.cos(1.5*a.time)+.7*Math.tan(a.time);a.ib_g+=2*Math.sin(a.time*a.bass_att);a.ib_r=a.ib_r+.8*Math.sin(1.2*a.time)+1.3*Math.cos(1.8*a.time);\",pixel_eqs_str:\"a.thresh=2*above(a.bass_att,a.thresh)+(1-above(a.bass_att,a.thresh))*(.96*(a.thresh-1.3)+1.3);a.dx_r=.015*equal(a.thresh,2)*Math.sin(5*a.time)+(1-equal(a.thresh,2))*a.dx_r;a.dy_r=.015*equal(a.thresh,2)*Math.sin(6*a.time)+(1-equal(a.thresh,2))*a.dy_r;a.zoom+=.07*a.treb*Math.abs(Math.sin(a.time*a.rad))*(.3-a.rad);a.dy+=a.dy_r*below(a.rad,.5-.2*a.time);a.dx+=a.dx_r*below(a.rad,.5-.2*a.time);a.rot+=.7*a.bass_att*Math.sin(Math.abs(a.dx_r*(1-a.rad)*2*a.time+Math.cos(12*a.rad)))*.2;\\n\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  ret_1 = (tmpvar_2.xyz + ((tmpvar_2.xyz - \\n    ((texture (sampler_blur1, uv).xyz * scale1) + bias1)\\n  ) * 0.3));\\n  ret_1 = (ret_1 * 0.9);\\n  ret_1 = (ret_1 + ((\\n    (texture (sampler_noise_lq, ((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 0.1))).xyz - 0.5)\\n   / 256.0) * 28.0));\\n  vec3 tmpvar_3;\\n  tmpvar_3 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.04, 0.04, 0.04));\\n  ret_1 = tmpvar_3;\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = tmpvar_3;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\"\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:.5,additivewave:1,modwavealphabyvolume:1,wave_a:.009,wave_scale:2.713,wave_smoothing:0,modwavealphastart:1.2,modwavealphaend:1.2,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:.44,wave_g:.4,ob_size:.015,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:3,additive:1,num_inst:175,rad:.20065,ang:.75398,tex_ang:3.14159,tex_zoom:.99979,r:0,g2:0,border_r:.01,border_g:0,border_a:1},init_eqs_str:\"a.my_z=0;a.d=0;a.y3=0;a.z2=0;a.y1=0;a.w=0;a.q12=0;a.w2=0;a.x1=0;a.q13=0;a.q15=0;a.dy1=0;a.zoom=0;a.p=0;a.q5=0;a.dz1=0;a.z3=0;a.w3=0;a.my_x=0;a.x3=0;a.my_y=0;a.q11=0;a.dd=0;a.q4=0;a.yy1=0;a.q16=0;a.w1=0;a.x2=0;a.q17=0;a.l=0;a.y2=0;a.dx1=0;a.zz1=0;a.q14=0;a.z1=0;a.q3=0;a.q32=0;a.xx1=0;\",frame_eqs_str:\"a.xx1=.00001<Math.abs(equal(a.instance,0))?a.q11:a.xx1;a.yy1=.00001<Math.abs(equal(a.instance,0))?a.q12:a.yy1;a.zz1=.00001<Math.abs(equal(a.instance,0))?a.q13:a.zz1;a.dx1=a.q14*(a.yy1-a.xx1);a.dy1=a.xx1*(a.q15-a.zz1)-a.yy1;a.dz1=a.xx1*a.yy1-a.q16*a.zz1;a.dd=sqrt(a.dx1*a.dx1+a.dy1*a.dy1+a.dz1*a.dz1);a.xx1+=div(a.q17*a.dx1,a.dd);a.yy1+=div(a.q17*a.dy1,a.dd);a.zz1+=div(a.q17*a.dz1,a.dd);a.my_x=.1*a.xx1;a.my_y=.1*a.yy1;a.my_z=.1*a.zz1-3;a.d=4.75;a.zoom=.55+.25*Math.sin(.5*a.q32);\\na.w1=a.q3;a.w2=a.q4;a.w3=a.q5;a.x1=Math.cos(a.w1)*a.my_x+Math.sin(a.w1)*a.my_y;a.y1=-Math.sin(a.w1)*a.my_x+Math.cos(a.w1)*a.my_y;a.z1=a.my_z;a.x2=Math.cos(a.w2)*a.x1+Math.sin(a.w2)*a.z1;a.z2=-Math.sin(a.w2)*a.x1+Math.cos(a.w2)*a.z1;a.y2=a.y1;a.y3=Math.cos(a.w3)*a.y2+Math.sin(a.w3)*a.z2;a.z3=-Math.sin(a.w3)*a.y2+Math.cos(a.w3)*a.z2;a.x3=a.x2;a.l=sqrt(a.x3*a.x3+a.y3*a.y3);a.w=Math.atan2(a.x3,a.y3);a.p=Math.tan(Math.asin(1)+Math.atan2(a.d+a.z3,a.l));a.d=sqrt(a.x3*a.x3+a.y3*a.y3+(a.z3+a.d)*(a.z3+a.d));\\na.my_x=a.zoom*Math.sin(a.w)*a.p;a.my_y=a.zoom*Math.cos(a.w)*a.p;a.x=.5+a.my_x;a.y=.5+a.my_y;a.rad=div(a.rad,a.d);a.ang-=div(a.instance,a.num_inst)*Math.asin(1)*8;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.index=0;a.q12=0;a.q22=0;a.q21=0;a.q13=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.movz=0;a.trel=0;a.q9=0;a.rott=0;a.vol__=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.trel_=0;a.vx=0;a.dec_slow=0;a.q11=0;a.q10=0;a.vy=0;a.q4=0;a.dir=0;a.dir_=0;a.p2=0;a.avg=0;a.trig=0;a.beat=0;a.vol=0;a.p1=0;a.peak=0;a.dec_fast=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.vol_=0;a.q7=0;a.q28=0;a.q20=0;a.q8=0;a.step=0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.96,div(30,a.fps));a.dec_fast=pow(.6,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,0+a.avg+a.peak)*above(a.time,a.t0+.1);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,16);a.index2=mod(a.index2+a.is_beat*bnot(a.index),8);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q24=a.is_beat;\\na.vol=a.bass_att+a.mid_att+a.treb_att;a.vol_=a.dec_med*a.vol_+(1-a.dec_med)*a.vol;a.vol__=a.dec_med*a.vol__+(1-a.dec_med)*a.vol_;a.q27=a.index+1;a.q28=a.index2+1;a.q23=a.q22-div(.1,a.q22);a.q23=Math.max(a.q23,1);a.k1=a.is_beat*equal(mod(a.index,8),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_fast*a.p2+(1-a.dec_fast)*a.p1;a.rott=div(3.1416*a.p2,4);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.trig=a.q24*bnot(mod(a.index,2));a.vx=a.vx*bnot(a.trig)+a.trig*(div(Math.floor(randint(100)),\\n100)-.5);a.vy=a.vy*bnot(a.trig)+a.trig*(div(Math.floor(randint(100)),100)-.5);a.q10=.2+a.vy*a.vy*2;a.q11=div(Math.sin(div(a.time,9)),2)+.4;a.movz-=div(1,a.fps)*(.3+a.vx);a.q9=a.movz;a.q12=2*Math.min(a.q22,6);a.q13=Math.min(2,1+Math.abs(8*a.vy*a.vx));a.dir_=a.bass-1;a.trig=bnot(mod(a.index,4))*a.q24;a.dir=bnot(a.trig)*a.dir+a.trig*(Math.floor(randint(10))-5);a.trel+=div(.1,a.fps)*a.dir;a.trel_=a.dec_med*a.trel_+(1-a.dec_med)*a.trel;a.q5=Math.cos(a.trel_);a.q6=Math.sin(a.trel_+0*a.q27*mod(a.q28,2));\\na.q7=-a.q6;a.q8=a.q5;a.zoom=1.02;a.rot=.5*Math.sin(bnot(mod(a.q28,2))*a.q28);a.rot=0*Math.sin(div(a.time,3));a.dx=0;a.monitor=a.q11;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = ((uv * texsize.xy) * 0.08);\\n  vec3 tmpvar_2;\\n  tmpvar_2 = (texture (sampler_main, (uv - (\\n    ((sin(tmpvar_1) / cos(tmpvar_1)) * texsize.zw)\\n   * 3.0))).xyz + (vec3(dot (texture (sampler_noise_lq, \\n    ((((texsize.xy * texsize_noise_lq.zw).x * uv) * 0.02) + (0.1 * rand_frame).xy)\\n  ), vec4(0.32, 0.49, 0.29, 0.0))) / 30.0));\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ((mix (tmpvar_2, \\n    (1.0 - tmpvar_2.zyx)\\n  , vec3(0.01, 0.01, 0.01)) - 0.03) - (0.2 * pow (\\n    (1.0 - rad)\\n  , 18.0)));\\n  ret = tmpvar_3.xyz;\\n }\",comp:\"vec3 xlat_mutableneu;\\nvec2 xlat_mutablers0;\\nvec2 xlat_mutablerss;\\nvec2 xlat_mutableuv2;\\n shader_body { \\n  vec2 uv_1;\\n  vec2 ofs_2;\\n  vec3 ret1_3;\\n  uv_1 = ((uv - 0.5) * aspect.xy);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q5;\\n  tmpvar_4.y = q6;\\n  uv_1 = (uv_1 + (tmpvar_4 / 4.0));\\n  mat2 tmpvar_5;\\n  tmpvar_5[uint(0)] = _qb.xy;\\n  tmpvar_5[1u] = _qb.zw;\\n  uv_1 = (uv_1 * tmpvar_5);\\n  float tmpvar_6;\\n  float tmpvar_7;\\n  tmpvar_7 = (min (abs(\\n    (uv_1.y / uv_1.x)\\n  ), 1.0) / max (abs(\\n    (uv_1.y / uv_1.x)\\n  ), 1.0));\\n  float tmpvar_8;\\n  tmpvar_8 = (tmpvar_7 * tmpvar_7);\\n  tmpvar_8 = (((\\n    ((((\\n      ((((-0.01213232 * tmpvar_8) + 0.05368138) * tmpvar_8) - 0.1173503)\\n     * tmpvar_8) + 0.1938925) * tmpvar_8) - 0.3326756)\\n   * tmpvar_8) + 0.9999793) * tmpvar_7);\\n  tmpvar_8 = (tmpvar_8 + (float(\\n    (abs((uv_1.y / uv_1.x)) > 1.0)\\n  ) * (\\n    (tmpvar_8 * -2.0)\\n   + 1.570796)));\\n  tmpvar_6 = (tmpvar_8 * sign((uv_1.y / uv_1.x)));\\n  if ((abs(uv_1.x) > (1e-08 * abs(uv_1.y)))) {\\n    if ((uv_1.x < 0.0)) {\\n      if ((uv_1.y >= 0.0)) {\\n        tmpvar_6 += 3.141593;\\n      } else {\\n        tmpvar_6 = (tmpvar_6 - 3.141593);\\n      };\\n    };\\n  } else {\\n    tmpvar_6 = (sign(uv_1.y) * 1.570796);\\n  };\\n  xlat_mutablers0.x = (((tmpvar_6 / 3.1416) * 6.0) * q28);\\n  xlat_mutablers0.y = inversesqrt(dot (uv_1, uv_1));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = (xlat_mutablers0.x + (q9 * 8.0));\\n  tmpvar_9.y = (xlat_mutablers0.y + ((q9 * q28) * 4.0));\\n  xlat_mutablerss = (tmpvar_9 / 12.0);\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = q5;\\n  tmpvar_10.y = q6;\\n  ofs_2 = (0.1 * tmpvar_10.yx);\\n  float tmpvar_11;\\n  float tmpvar_12;\\n  tmpvar_12 = -(q9);\\n  tmpvar_11 = fract(tmpvar_12);\\n  mat2 tmpvar_13;\\n  tmpvar_13[uint(0)].x = 1.0;\\n  tmpvar_13[uint(0)].y = -0.0;\\n  tmpvar_13[1u].x = 0.0;\\n  tmpvar_13[1u].y = 1.0;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_11)\\n   * tmpvar_13)) * aspect.yx);\\n  vec2 tmpvar_14;\\n  tmpvar_14 = fract(((xlat_mutableuv2 + 0.5) + ofs_2));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_14).xyz + ((texture (sampler_blur1, tmpvar_14).xyz * scale1) + bias1));\\n  ret1_3 = max (vec3(0.0, 0.0, 0.0), ((xlat_mutableneu * \\n    (1.0 - (tmpvar_11 * tmpvar_11))\\n  ) * 2.0));\\n  float tmpvar_15;\\n  tmpvar_15 = fract((tmpvar_12 + 0.3333333));\\n  mat2 tmpvar_16;\\n  tmpvar_16[uint(0)].x = -0.4990803;\\n  tmpvar_16[uint(0)].y = -0.8665558;\\n  tmpvar_16[1u].x = 0.8665558;\\n  tmpvar_16[1u].y = -0.4990803;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_15)\\n   * tmpvar_16)) * aspect.yx);\\n  vec2 tmpvar_17;\\n  tmpvar_17 = fract(((xlat_mutableuv2 + 0.5) + ofs_2));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_17).xyz + ((texture (sampler_blur1, tmpvar_17).xyz * scale1) + bias1));\\n  ret1_3 = max (ret1_3, ((xlat_mutableneu * \\n    (1.0 - (tmpvar_15 * tmpvar_15))\\n  ) * 2.0));\\n  float tmpvar_18;\\n  tmpvar_18 = fract((tmpvar_12 + 0.6666667));\\n  mat2 tmpvar_19;\\n  tmpvar_19[uint(0)].x = -0.5018377;\\n  tmpvar_19[uint(0)].y = 0.8649619;\\n  tmpvar_19[1u].x = -0.8649619;\\n  tmpvar_19[1u].y = -0.5018377;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_18)\\n   * tmpvar_19)) * aspect.yx);\\n  vec2 tmpvar_20;\\n  tmpvar_20 = fract(((xlat_mutableuv2 + 0.5) + ofs_2));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_20).xyz + ((texture (sampler_blur1, tmpvar_20).xyz * scale1) + bias1));\\n  ret1_3 = max (ret1_3, ((xlat_mutableneu * \\n    (1.0 - (tmpvar_18 * tmpvar_18))\\n  ) * 2.0));\\n  float tmpvar_21;\\n  tmpvar_21 = fract((tmpvar_12 + 1.0));\\n  mat2 tmpvar_22;\\n  tmpvar_22[uint(0)].x = 0.9999949;\\n  tmpvar_22[uint(0)].y = 0.003185092;\\n  tmpvar_22[1u].x = -0.003185092;\\n  tmpvar_22[1u].y = 0.9999949;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_21)\\n   * tmpvar_22)) * aspect.yx);\\n  vec2 tmpvar_23;\\n  tmpvar_23 = fract(((xlat_mutableuv2 + 0.5) + ofs_2));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_23).xyz + ((texture (sampler_blur1, tmpvar_23).xyz * scale1) + bias1));\\n  ret1_3 = max (ret1_3, ((xlat_mutableneu * \\n    (1.0 - (tmpvar_21 * tmpvar_21))\\n  ) * 2.0));\\n  vec2 tmpvar_24;\\n  tmpvar_24.x = (ret1_3.x + ret1_3.z);\\n  tmpvar_24.y = (ret1_3.x - ret1_3.y);\\n  vec4 tmpvar_25;\\n  tmpvar_25.w = 1.0;\\n  tmpvar_25.xyz = ((ret1_3 + (\\n    ((bass_att * 0.004) / sqrt(dot (uv_1, uv_1)))\\n   * roam_sin).xyz) + ((2.0 * \\n    (bass_att * ((texture (sampler_blur1, fract(\\n      (xlat_mutablerss + (tmpvar_24 / 2.0))\\n    )).xyz * scale1) + bias1).zxy)\\n  ) * clamp (\\n    (1.0 - (ret1_3 * 4.0))\\n  , 0.0, 1.0)));\\n  ret = tmpvar_25.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.14,decay:1,echo_zoom:1,wave_mode:6,wave_thick:1,wave_brighten:0,wrap:0,darken:1,wave_a:1.17,wave_scale:.797,wave_smoothing:0,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoomexp:.9995,zoom:.9998,rot:.02,dy:-.008,warp:.01,sx:1.0098,wave_r:.5,wave_g:.5,wave_b:.5,wave_x:.9,ob_size:.005,ob_a:.8,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:44.8,mv_y:38.4,mv_l:5,mv_g:.91,mv_b:.71,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.q12=0;a.q18=0;a.q6=0;a.bass_thresh=0;a.wg=0;a.q11=0;a.q10=0;a.wb=0;a.q17=0;a.vol=0;a.q2=0;a.q3=0;a.wr=0;a.q7=0;a.q8=0;\",frame_eqs_str:\"a.wave_r+=.3*Math.sin(50*a.vol);a.wave_b+=.3*Math.sin(20*a.vol);a.wave_g+=.5*Math.sin(35*a.vol);a.q8=a.wave_r;a.q7=a.wave_b;a.q6=a.wave_g;a.wr=.5+.4*(.6*Math.sin(1.1*a.time)+.4*Math.sin(.8*a.time));a.wb=.5+.4*(.6*Math.sin(1.6*a.time)+.4*Math.sin(.5*a.time));a.wg=.5+.4*(.6*Math.sin(1.34*a.time)+.4*Math.sin(.4*a.time));a.monitor=a.wg;a.q10=a.wr;a.q11=a.wb;a.q12=a.wg;a.q18=.007*Math.sin(.1*a.time);a.q17=-.007*Math.sin(.254*a.time);a.q2=a.bass_thresh;a.vol=.25*(a.bass+a.mid+a.treb);\\na.vol*=a.vol;a.q3=a.vol;a.warp=0;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 noise3_1;\\n  vec3 tmpvar_2;\\n  tmpvar_2 = (texture (sampler_main, uv).xyz + ((texture (sampler_blur1, uv).xyz * scale1) + bias1));\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (0.5 + ((\\n    (uv - vec2(0.0, 1.0))\\n   - 0.5) * (1.0 + \\n    (tmpvar_2.y * 0.03)\\n  )));\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (tmpvar_3.x + pow (tmpvar_2.x, 0.0));\\n  tmpvar_4.y = (tmpvar_3.y + pow (tmpvar_2.x, 0.005));\\n  noise3_1 = (texture (sampler_noise_lq, ((\\n    (uv_orig * texsize.xy)\\n   * texsize_noise_lq.zw) + rand_frame.xy)).xyz * fract(q15));\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (noise3_1 * (vec3(1.0, 1.0, 1.0) - vec3(fract(\\n    (q3 * 0.5)\\n  ))));\\n  noise3_1 = tmpvar_5;\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_main, fract(tmpvar_4));\\n  vec3 tmpvar_7;\\n  tmpvar_7.x = q10;\\n  tmpvar_7.y = q11;\\n  tmpvar_7.z = q12;\\n  vec3 tmpvar_8;\\n  tmpvar_8 = mix (tmpvar_5, tmpvar_7, tmpvar_6.xxx);\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = (tmpvar_6.xyz + clamp ((\\n    (tmpvar_6.yzx * tmpvar_8.zxy)\\n   - \\n    (tmpvar_6.zxy * tmpvar_8.yzx)\\n  ), 0.0, 1.0));\\n  ret = tmpvar_9.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv1_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.y = 0.0;\\n  tmpvar_2.x = texsize.z;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = 0.0;\\n  tmpvar_3.y = texsize.w;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (texture (sampler_main, (uv - tmpvar_2)).xyz - texture (sampler_main, (uv + tmpvar_2)).xyz).x;\\n  tmpvar_4.y = (texture (sampler_main, (uv - tmpvar_3)).xyz - texture (sampler_main, (uv + tmpvar_3)).xyz).x;\\n  uv1_1 = ((0.3 * cos(\\n    ((uv - 0.5) * 2.0)\\n  )) - tmpvar_4);\\n  float tmpvar_5;\\n  tmpvar_5 = clamp ((0.04 / sqrt(\\n    dot (uv1_1, uv1_1)\\n  )), 0.0, 1.0);\\n  uv1_1 = ((0.3 * cos(\\n    (uv1_1 * 12.0)\\n  )) - (9.0 * tmpvar_4));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = (tmpvar_5 + ((texture (sampler_main, uv).xyz * 12.0) * vec3(clamp (\\n    (0.04 / sqrt(dot (uv1_1, uv1_1)))\\n  , 0.0, 1.0))));\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.14,decay:1,echo_zoom:1,wave_mode:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,darken:1,wave_a:.001,wave_scale:.179,wave_smoothing:0,wave_mystery:.3,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoomexp:.8195,zoom:1.0697,dy:.006,warp:.01,sx:.9996,wave_g:0,wave_b:0,ob_a:.8,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:0,mv_y:0,mv_l:1,mv_g:.91,mv_b:.71,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.q12=0;a.q18=0;a.q6=0;a.q5=0;a.bass_thresh=0;a.wg=0;a.q11=0;a.q10=0;a.wb=0;a.q17=0;a.vol=0;a.q2=0;a.q3=0;a.wr=0;a.q7=0;a.mtime=0;a.q8=0;\",frame_eqs_str:\"a.bass_thresh=2*above(a.bass_att,a.bass_thresh)+(1-above(a.bass_att,a.bass_thresh))*(.91*(a.bass_thresh-1.3)+1.3);a.wave_r=.5+.5*(.6*Math.sin(1.3*a.time)+.4*Math.sin(.98*a.time));a.wave_b=.5+.5*(.6*Math.sin(1.1*a.time)+.4*Math.sin(.78*a.time));a.wave_g=.5+.5*(.6*Math.sin(1.2*a.time)+.4*Math.sin(.6*a.time));a.q8=a.wave_r;a.q7=a.wave_b;a.q6=a.wave_g;a.wr=.5+.4*(.6*Math.sin(.2*a.time)+.4*Math.sin(.8*a.time));a.wb=.5+.4*(.6*Math.sin(.377*a.time)+.4*Math.sin(.5*a.time));a.wg=.5+\\n.4*(.6*Math.sin(.7*a.time)+.4*Math.sin(.4*a.time));a.q10=a.wr;a.q11=a.wb;a.q12=a.wg;a.q10=.8;a.q11=.2;a.q12=.1;a.q18=.01*Math.sin(.1*a.mtime);a.q17=-.01*Math.sin(.254*a.mtime);a.q2=a.bass_thresh;a.vol=.25*(a.bass+a.mid+a.treb);a.vol*=a.vol;a.q3=a.vol;a.q5=.5*a.vol;a.mtime+=.01*a.vol;a.q2=.25*a.mtime;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 noise2_1;\\n  vec3 ret_2;\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, uv).xyz * scale1) + bias1) + texture (sampler_main, uv).xyz);\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (0.5 + ((uv - 0.5) * (1.0 + \\n    (tmpvar_3.y * 0.05)\\n  )));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (tmpvar_4.x + pow (tmpvar_3.x, q17));\\n  tmpvar_5.y = (tmpvar_4.y + pow (tmpvar_3.x, q18));\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_fc_main, fract(tmpvar_5));\\n  vec3 tmpvar_7;\\n  tmpvar_7.x = q10;\\n  tmpvar_7.y = q11;\\n  tmpvar_7.z = q12;\\n  noise2_1 = (texture (sampler_noise_lq, ((\\n    (uv_orig * texsize.xy)\\n   * texsize_noise_lq.zw) + rand_frame.xy)).xyz + ((tmpvar_7 * vec3(rad)) * vol));\\n  vec3 a_8;\\n  a_8 = (1.0 - tmpvar_6.xyz);\\n  ret_2 = (tmpvar_6.xyz + (0.3 * clamp (\\n    ((a_8.yzx * noise2_1.zxy) - (a_8.zxy * noise2_1.yzx))\\n  , 0.0, 1.0)));\\n  ret_2 = (ret_2 * 0.97);\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = ret_2;\\n  ret = tmpvar_9.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = (texture (sampler_main, uv).xyz * vec3(0.9, 0.3, 0.5));\\n  ret_1 = (ret_1 * 1.34);\\n  ret_1 = (ret_1 * ret_1);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ret_1;\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.28,decay:.8,echo_zoom:1,echo_orient:3,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,brighten:1,wave_a:.001,wave_scale:1.286,wave_smoothing:.63,modwavealphastart:.71,modwavealphaend:1.3,zoomexp:3.04777,zoom:1.0173,warp:.01605,wave_g:.65,wave_b:.65,ob_size:0,ob_a:1,mv_x:64,mv_y:48,mv_l:0,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1,additive:1,g:0,b:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.01*a.bass;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0002*Math.cos(a.ma);a.my+=.0002*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.8);\"},{baseVals:{enabled:1,thick:1,additive:1,r:0,g:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.05*a.bass;a.ma-=3.1415*above(a.mid,1)*.05*a.mid;a.mx+=.0001*Math.cos(a.ma);a.my+=.0001*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.1);\"},{baseVals:{enabled:1,thick:1,additive:1,r:0,b:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.mid,1)*.01*a.mid;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0004*Math.cos(a.ma);a.my+=.0004*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.3);\"},{baseVals:{enabled:1,thick:1,additive:1,g:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.bass,.5)*.02*a.bass;a.ma-=3.1415*above(a.treb,.5)*.02*a.treb;a.mx+=.0008*Math.cos(a.ma);a.my+=.0008*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.2);\"}],init_eqs_str:\"a.z=0;a.w=0;a.d_x=0;a.q25=0;a.index=0;a.q12=0;a.q18=0;a.q13=0;a.q15=0;a.q29=0;a.dt=0;a.q1=0;a.dec_med=0;a.dm=0;a.mm=0;a.tt=0;a.is_beat=0;a.q31=0;a.q23=0;a.q24=0;a.dec_slow=0;a.q11=0;a.q16=0;a.q26=0;a.avg=0;a.r=0;a.db=0;a.beat=0;a.q17=0;a.d_y=0;a.peak=0;a.bb=0;a.q27=0;a.q14=0;a.t0=0;a.q32=0;a.q28=0;a.q30=0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.5+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,2);a.d_x=.00001<Math.abs(a.is_beat)?.001*(randint(2E3)-1E3):a.d_x;a.d_y=.00001<Math.abs(a.is_beat)?.001*(randint(2E3)-1E3):a.d_y;a.r=\\n.00001<Math.abs(a.is_beat)?.001*(randint(2E3)-1E3):a.r;a.z=.00001<Math.abs(a.is_beat)?.001*randint(1E3):a.z;a.zoom=1.03+.06*a.z;a.rot=.06*a.r;a.dx=.01*a.d_x;a.dy=.01*a.d_y;a.q1=1;a.q23=div(randint(1E3),1E3);a.q24=div(randint(1E3),1E3);a.q25=6.28*div(randint(1E3),1E3);a.q26=a.q25-3.14;a.q27=div(randint(1E3),12E3)+.04;a.q28=div(randint(1E3),1E3);a.q29=div(randint(1E3),1E3);a.q30=6.28*div(randint(1E3),1E3);a.q31=a.q30-3.14;a.q32=div(randint(1E3),14E3)+.04;a.db=.98*a.db+.2*a.bass;a.bb+=.1*a.db;a.dt=.98*\\na.dt+.2*a.treb;a.tt+=.1*a.dt;a.dm=.98*a.dm+.2*a.mid;a.mm+=.1*a.dm;a.w=.1*(a.bb-a.tt);a.q11=Math.sin(a.w);a.q12=Math.cos(a.w);a.q13=.5+.25*Math.sin(.1*(a.bb-a.mm));a.q14=.5+.25*Math.sin(.1*(a.tt-a.mm));a.q15=4;a.q16=.06;a.q17=Math.sin(-a.w);a.q18=Math.cos(-a.w);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 8.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.x;\\n  tmpvar_5.y = tmpvar_4.x;\\n  vec2 tmpvar_6;\\n  vec2 tmpvar_7;\\n  tmpvar_7 = mix (uv_orig, uv, vec2(0.1, 0.1));\\n  tmpvar_6 = (tmpvar_7 + ((tmpvar_5 * texsize.zw) * 2.0));\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_3.y;\\n  tmpvar_8.y = tmpvar_4.y;\\n  vec2 tmpvar_9;\\n  tmpvar_9 = (mix (uv_orig, uv, vec2(0.3, 0.3)) + ((tmpvar_8 * texsize.zw) * 2.0));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_3.z;\\n  tmpvar_10.y = tmpvar_4.z;\\n  vec2 tmpvar_11;\\n  tmpvar_11 = (tmpvar_7 + ((tmpvar_10 * texsize.zw) * 2.0));\\n  ret_1.x = (texture (sampler_main, tmpvar_6).x - ((texture (sampler_main, tmpvar_6).xyz - \\n    ((texture (sampler_blur3, tmpvar_6).xyz * scale3) + bias3)\\n  ).x * 0.01));\\n  ret_1.y = (texture (sampler_main, tmpvar_9).y - ((texture (sampler_main, tmpvar_9).xyz - \\n    ((texture (sampler_blur3, tmpvar_9).xyz * scale3) + bias3)\\n  ).y * 0.01));\\n  ret_1.z = (texture (sampler_main, tmpvar_11).z - ((texture (sampler_main, tmpvar_11).xyz - \\n    ((texture (sampler_blur3, tmpvar_11).xyz * scale3) + bias3)\\n  ).z * 0.01));\\n  ret_1 = (ret_1 + (-0.004 + (\\n    (texture (sampler_noise_lq, (((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 1.2)) + rand_frame.xy)).xyz - 0.5)\\n   * 0.1)));\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = ret_1;\\n  ret = tmpvar_12.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 8.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.z;\\n  tmpvar_5.y = tmpvar_4.z;\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = tmpvar_3.y;\\n  tmpvar_6.y = tmpvar_4.y;\\n  ret_1 = (mix (vec3(0.2, 0.0, 0.1), vec3(0.8, 0.6, 0.0), texture (sampler_main, (uv - \\n    (tmpvar_5 * 0.2)\\n  )).yyy) * ((\\n    (-(tmpvar_3.y) + tmpvar_4.y)\\n   + 1.0) + (\\n    (-(tmpvar_3.z) + tmpvar_4.z)\\n   * 2.0)));\\n  vec3 tmpvar_7;\\n  tmpvar_7 = mix (mix (ret_1, vec3(0.3, 0.0, 0.8), vec3((\\n    ((texture (sampler_blur1, (uv - (tmpvar_6 * 0.04))).xyz * scale1) + bias1)\\n  .x * 1.4))), vec3(1.0, 0.9, 0.4), texture (sampler_main, uv).zzz);\\n  ret_1 = tmpvar_7;\\n  vec4 tmpvar_8;\\n  tmpvar_8.w = 1.0;\\n  tmpvar_8.xyz = tmpvar_7;\\n  ret = tmpvar_8.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:1,gammaadj:1,decay:1,echo_zoom:1,wrap:0,darken_center:1,brighten:1,darken:1,wave_a:.001,warpanimspeed:.141,warpscale:14.497,zoom:.99951,warp:.75055,wave_r:0,wave_g:0,wave_b:0,ob_size:.5,ob_r:.01,ib_size:.26,mv_a:0},shapes:[{baseVals:{enabled:1,sides:6,rad:.17809,ang:.26,tex_zoom:.39711,g:.7,b:.6,r2:.4,g2:0,a2:1,border_a:0},init_eqs_str:\"a.q3=0;\",frame_eqs_str:\"a.x=.11+.22*randint(5);a.y=.1+.16*mod(2*a.time,6);a.b=.6+.3*a.q3;a.g=.7+.2*a.q3;a.r=.7;a.g2=.3*a.g;a.r2=.3*a.r;a.b2=.3*a.b;\"},{baseVals:{enabled:1,sides:6,additive:1,rad:.17809,ang:.26,tex_zoom:.99999,g:1,b:.4,a:.5,r2:.2,g2:0,b2:.3,a2:.6,border_r:0,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.q3=0;\",frame_eqs_str:\"a.x=.11+.22*randint(5);a.y=.1+.16*mod(2*a.time,6);a.b=.6+.3*a.q3;a.g=.7+.2*a.q3;a.r=.7;a.g2=.3*a.g;a.r2=.3*a.r;a.b2=.3*a.b;\"},{baseVals:{enabled:1,sides:6,textured:1,rad:.17633,ang:.26,tex_zoom:1.19615,r2:1,b2:1,a2:.2,border_r:0,border_g:0,border_b:0,border_a:.2},init_eqs_str:\"a.q3=0;a.q4=0;a.q5=0;a.q1=0;\",frame_eqs_str:\"a.x=.22*randint(6);a.y=.18+.16*mod(2*a.time,5);a.g=1.5*a.q3;a.r=1.3*a.q4;a.b=1.7*a.q5;a.tex_ang=-a.q1;a.tex_zoom=2+Math.sin(a.q1);\"},{baseVals:{enabled:1,sides:6,textured:1,rad:.16284,ang:.26,r2:.8,g2:.8,b2:.8,a2:.2,border_r:0,border_g:0,border_b:0,border_a:.2},init_eqs_str:\"a.q3=0;a.q2=0;a.q1=0;\",frame_eqs_str:\"a.x=.11+.22*randint(5);a.y=.1+.16*mod(2*a.time,6);a.r=.3*a.q3;a.b=.2*a.q2;a.g=.1*a.q1;a.tex_ang=a.q1;a.tex_zoom=2+1.2*Math.sin(1.5*a.q1);\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.q12=0;a.w2=0;a.ref_ang=0;a.x1=0;a.vx3=0;a.q13=0;a.q6=0;a.q1=0;a.q5=0;a.q9=0;a.vx1=0;a.vx4=0;a.x3=0;a.q11=0;a.q10=0;a.q4=0;a.vy4=0;a.bounce=0;a.x4=0;a.w1=0;a.r=0;a.x2=0;a.vy2=0;a.y2=0;a.vy1=0;a.q2=0;a.q14=0;a.v1=0;a.vx2=0;a.q3=0;a.y4=0;a.q7=0;a.vy3=0;a.v2=0;a.q8=0;a.x1=.5;a.x2=.51;a.y2=1;a.y1=.7;a.x3=.8;a.y3=.5;a.x4=.2;a.y4=.5;a.ax1=0;a.ay1=0;a.ax2=0;a.ay2=0;a.ax3=0;a.ay3=0;a.vx1=0;a.vx2=0;\",frame_eqs_str:\"a.sx=1+.01*mod(8*a.bass,8)*equal(mod(a.time,Math.floor(24-2*a.bass)),0);a.sy=1+.01*mod(8*a.mid,8)*equal(mod(a.time,12+Math.floor(24-2*a.bass)),0);a.zoom=.99;a.wave_a=0;a.r=.12+.004*Math.max(a.bass_att,a.treb_att);a.bounce=below(a.y1,a.r);a.y1+=a.vy1;a.vy1=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vy1)+.1*(a.r-a.y1):a.vy1-div(.0036,a.fps);a.bounce=below(a.x1,a.r);a.x1+=a.vx1;a.vx1=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx1)+.1*(a.r-a.x1):a.vx1;a.bounce=above(a.x1,1-a.r);a.vx1=\\n.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx1)+.04*(1-a.r-a.x1):a.vx1;a.bounce=below(a.y2,a.r);a.y2+=a.vy2;a.vy2=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vy2)+.1*(a.r-a.y2):a.vy2-div(.0036,a.fps);a.bounce=below(a.x2,a.r);a.x2+=a.vx2;a.vx2=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx2)+.1*(a.r-a.x2):a.vx2;a.bounce=above(a.x2,1-a.r);a.vx2=.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx2)+.1*(1-a.r-a.x2):a.vx2;a.bounce=below(a.y3,a.r);a.y3+=a.vy3;a.vy3=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vy3)+.1*(a.r-\\na.y3):a.vy3-div(.0036,a.fps);a.bounce=below(a.x3,a.r);a.x3+=a.vx3;a.vx3=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx3)+.1*(a.r-a.x3):a.vx3;a.bounce=above(a.x3,1-a.r);a.vx3=.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx3)+.1*(1-a.r-a.x3):a.vx3;a.bounce=below(a.y4,a.r);a.y4+=a.vy4;a.vy4=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vy4)+.1*(a.r-a.y4):a.vy4-div(.0036,a.fps);a.bounce=below(a.x4,a.r);a.x4+=a.vx4;a.vx4=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx4)+.1*(a.r-a.x4):a.vx4;a.bounce=above(a.x4,1-a.r);\\na.vx4=.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx4)+.1*(1-a.r-a.x4):a.vx4;a.bounce=below(sqrt(sqr(a.x1+a.vx1-a.x2-a.vx2)+sqr(a.y1+a.vy1-a.y2-a.vy2)),2*a.r);a.ref_ang=Math.atan2(a.x2-a.x1,a.y2-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*a.vx1+a.vy1*a.vy1);a.v2=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx2,a.vy2);a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;\\na.vy1=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy1;a.vx2=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy2;a.bounce=\\nbelow(sqrt(sqr(a.x1+a.vx1-a.x3-a.vx3)+sqr(a.y1+a.vy1-a.y3-a.vy3)),2*a.r);a.ref_ang=Math.atan2(a.x3-a.x1,a.y3-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*a.vx1+a.vy1*a.vy1);a.v2=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx3,a.vy3);a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+\\nMath.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy1;a.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy3;a.bounce=below(sqrt(sqr(a.x2+a.vx2-a.x3-a.vx3)+sqr(a.y2+a.vy2-a.y3-a.vy3)),2*a.r);a.ref_ang=\\nMath.atan2(a.x3-a.x2,a.y3-a.y2)+Math.asin(1);a.v1=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.v2=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.w1=Math.atan2(a.vx2,a.vy2);a.w2=Math.atan2(a.vx3,a.vy3);a.vx2=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy2;\\na.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy3;a.bounce=below(sqrt(sqr(a.x1+a.vx1-a.x4-a.vx4)+sqr(a.y1+a.vy1-a.y4-a.vy4)),2*a.r);a.ref_ang=Math.atan2(a.x4-a.x1,a.y4-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*a.vx1+a.vy1*a.vy1);a.v2=\\nsqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx4,a.vy4);a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy1;a.vx4=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+\\nMath.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx4;a.vy4=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy4;a.bounce=below(sqrt(sqr(a.x2+a.vx2-a.x4-a.vx4)+sqr(a.y2+a.vy2-a.y4-a.vy4)),2*a.r);a.ref_ang=Math.atan2(a.x4-a.x2,a.y4-a.y2)+Math.asin(1);a.v1=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.v2=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.w1=Math.atan2(a.vx2,a.vy2);a.w2=Math.atan2(a.vx4,a.vy4);a.vx2=.00001<\\nMath.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy2;a.vx4=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx4;a.vy4=.00001<Math.abs(a.bounce)?\\nMath.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy4;a.bounce=below(sqrt(sqr(a.x3+a.vx3-a.x4-a.vx4)+sqr(a.y3+a.vy3-a.y4-a.vy4)),2*a.r);a.ref_ang=Math.atan2(a.x4-a.x3,a.y4-a.y3)+Math.asin(1);a.v1=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.v2=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.w1=Math.atan2(a.vx3,a.vy3);a.w2=Math.atan2(a.vx4,a.vy4);a.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*\\na.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy3;a.vx4=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx4;a.vy4=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-\\na.ref_ang-Math.asin(1)):a.vy4;a.q1=a.aspectx;a.q2=a.aspecty;a.q3=a.x1;a.q4=a.y1;a.q5=a.r;a.q6=a.x2;a.q7=a.y2;a.q8=a.r;a.q9=a.x3;a.q10=a.y3;a.q11=a.r;a.q12=a.x4;a.q13=a.y4;a.q14=a.r;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1.z = (texture (sampler_main, uv).z * 0.5);\\n  vec2 tmpvar_2;\\n  tmpvar_2 = ((uv_orig * texsize.xy) * texsize_noise_lq.zw);\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (texsize.zw * 4.0);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).y * 0.5);\\n  tmpvar_4.y = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).y * 0.5);\\n  ret_1.y = texture (sampler_fw_main, clamp ((uv_orig + (\\n    (tmpvar_4 * texsize.zw)\\n   * 4.0)), 0.0, 1.0)).y;\\n  ret_1.y = (ret_1.y + ((\\n    (ret_1 - ((texture (sampler_blur1, uv_orig).xyz * scale1) + bias1))\\n  .y * 0.025) + -0.014));\\n  ret_1.y = (ret_1.y + ((texture (sampler_noise_lq, tmpvar_2).y - 0.5) * 0.02));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).x * 0.5);\\n  tmpvar_5.y = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).x * 0.5);\\n  ret_1.x = ((texture (sampler_main, (uv - \\n    ((tmpvar_5 * texsize.zw) * 4.0)\\n  )).x - (ret_1.y * 0.01)) + 0.004);\\n  ret_1.x = (ret_1.x + ((\\n    (texture (sampler_noise_lq, tmpvar_2).x - 0.5)\\n   * 0.01) + (ret_1.z * 0.14)));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ret_1;\\n  ret = tmpvar_6.xyz;\\n }\",comp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1.x = q3;\\n  tmpvar_1.y = q4;\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = q6;\\n  tmpvar_2.y = q7;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = q9;\\n  tmpvar_3.y = q10;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q12;\\n  tmpvar_4.y = q13;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (texsize.zw * 1.2);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = (texture (sampler_main, (uv + (vec2(1.0, 0.0) * tmpvar_5))).xyz - texture (sampler_main, (uv - (vec2(1.0, 0.0) * tmpvar_5))).xyz);\\n  vec3 tmpvar_7;\\n  tmpvar_7 = (texture (sampler_main, (uv + (vec2(0.0, 1.0) * tmpvar_5))).xyz - texture (sampler_main, (uv - (vec2(0.0, 1.0) * tmpvar_5))).xyz);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_8.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_9;\\n  x_9 = ((uv - (tmpvar_8 * 8.0)) - (1.0 - tmpvar_1));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_10.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_11;\\n  x_11 = ((uv - (tmpvar_10 * 8.0)) - (1.0 - tmpvar_2));\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_12.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_13;\\n  x_13 = ((uv - (tmpvar_12 * 8.0)) - (1.0 - tmpvar_3));\\n  vec2 tmpvar_14;\\n  tmpvar_14.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_14.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_15;\\n  x_15 = ((uv - (tmpvar_14 * 8.0)) - (1.0 - tmpvar_4));\\n  vec4 tmpvar_16;\\n  tmpvar_16.w = 1.0;\\n  tmpvar_16.xyz = (mix (texture (sampler_main, uv).xyz, max (\\n    max ((vec3((1.0 - pow (\\n      sqrt(dot (x_9, x_9))\\n    , 0.2))) * vec3(2.0, 1.0, -1.0)), (vec3((1.0 - pow (\\n      sqrt(dot (x_11, x_11))\\n    , 0.2))) * vec3(2.0, -1.0, 1.0)))\\n  , \\n    max ((vec3((1.0 - pow (\\n      sqrt(dot (x_13, x_13))\\n    , 0.2))) * vec3(-1.0, 1.0, 2.0)), (vec3((1.0 - pow (\\n      sqrt(dot (x_15, x_15))\\n    , 0.2))) * vec3(1.0, -1.0, 2.0)))\\n  ), vec3(0.5, 0.5, 0.5)) * 1.25);\\n  ret = tmpvar_16.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.995,echo_zoom:1.007,echo_orient:3,wave_mode:7,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,wave_a:.001,wave_scale:.958,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:0,wave_b:0,ob_size:.05,ob_g:.1,ob_b:1,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:25.6,mv_y:9.6,mv_l:0,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.look=0;a.n=0;a.reg26=0;a.w=0;a.uvx0=0;a.reg34=0;a.reg28=0;a.reg23=0;a.q25=0;a.angchg=0;a.reg20=0;a.reg15=0;a.reg10=0;a.h3=0;a.q12=0;a.v3=0;a.q18=0;a.q22=0;a.q21=0;a.diry=0;a.q13=0;a.q6=0;a.posx=0;a.fps_=0;a.reg25=0;a.bt=0;a.uvx=0;a.q1=0;a.travel=0;a.posz=0;a.q5=0;a.q9=0;a.dirz=0;a.dec_s=0;a.reg16=0;a.v=0;a.slow=0;a.reg36=0;a.mm=0;a.h2=0;a.reg22=0;a.tt=0;a.uvy=0;a.rotz=0;a.bm=0;a.ly=0;a.dist_=0;a.q23=0;a.q24=0;a.reg24=0;a.cran0=0;a.ran2=0;a.q11=0;a.q10=0;a.reg14=0;a.posy=0;\\na.reg31=0;a.dirx=0;a.q4=0;a.start=0;a.reg12=0;a.reg13=0;a.c2=0;a.reg37=0;a.s3=0;a.yslope=0;a.lampy=0;a.q16=0;a.xslope=0;a.q26=0;a.reg38=0;a.reg35=0;a.reg11=0;a.mt=0;a.tx=0;a.avg=0;a.uvz=0;a.c3=0;a.uvy0=0;a.mx=0;a.reg27=0;a.mn=0;a.q19=0;a.beat=0;a.q17=0;a.reg32=0;a.lx=0;a.reg21=0;a.uvz0=0;a.len=0;a.reg18=0;a.reg30=0;a.bb=0;a.q2=0;a.q27=0;a.slen=0;a.q14=0;a.dist=0;a.h1=0;a.reg17=0;a.v1=0;a.speed=0;a.q3=0;a.s1=0;a.t0=0;a.s2=0;a.ran1=0;a.reg33=0;a.q7=0;a.ds=0;a.q28=0;a.lampx=0;a.ty=0;a.c1=0;a.v2=0;a.q20=\\n0;a.q8=0;a.avg=.01;a.q7=.25;a.q8=randint(2)-1;a.q16=1+randint(2);a.q18=randint(.8)+.1;a.q30=1;a.q31=128;a.start=1;a.travel=0;a.rotz=0;a.look=0;a.slow=0;a.t0=a.time+3;a.lampx=.5;a.lampy=.5;a.cran0=randint(1);for(var b=a.n=0;1E4>b;b++)a.gmegabuf[Math.floor(a.n)]=0,a.n+=1;for(b=a.n=0;1E4>b;b++)a.megabuf[Math.floor(a.n)]=0,a.n+=1;a.trelx=0;a.trely=0;a.trelz=0;a.reg20=1;a.reg21=0;a.reg22=0;a.reg23=0;a.reg24=1;a.reg25=0;a.reg26=0;a.reg27=0;a.reg28=1;b=0;do{b+=1;var c;a.ran1=div(randint(800),100);a.ran2=\\ndiv(randint(800),100);a.ran3=div(randint(800),100);a.posx=randint(5)-2;a.posy=randint(5)-2;a.posz=randint(5)-2;a.c1=Math.cos(a.ran1);a.c2=Math.cos(a.ran2);a.c3=Math.cos(a.ran3);a.s1=Math.sin(a.ran1);a.s2=Math.sin(a.ran2);a.s3=Math.sin(a.ran3);a.reg20=a.c2*a.c1;a.reg21=a.c2*a.s1;a.reg22=-a.s2;a.reg23=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg24=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg25=a.s3*a.c2;a.reg26=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg27=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg28=a.c3*a.c2;a.dist=.001;var d=0;do{d+=1;a.uvx=div(a.reg26*\\na.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;a.uvx=8*(div(a.uvx,8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:\\n.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):\\na.uvz)+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.05;c=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<Math.abs(c)&&1048576>d);d=.06>a.dist?1:0}while(.00001<Math.abs(d)&&1048576>b);\",frame_eqs_str:\"a.fps_=0*a.fps_+1*(.00001<Math.abs(25>=a.fps?1:0)?a.fps:25+.5*(a.fps-25));a.dec_s=1-div(.06*30,a.fps_);a.beat=a.time>a.t0+3?1:0;a.t0=.00001<Math.abs(a.beat)?a.time:a.t0;a.speed=div(Math.min(.2,a.dist_-.02)*(1+2*a.avg)*(1-0*a.slow)*.7,a.q7);a.ds=a.ds*a.dec_s+div((1-a.dec_s)*a.speed*.25,a.fps_);a.rotz=.00001<Math.abs(.00001>Math.abs(a.rotz-0)?1:0)?a.beat*(randint(100)<20*a.travel?1:0)*(div(randint(10),10)-.3):bnot(a.beat*(30>randint(100)?1:0))*a.rotz;a.slow=.00001<Math.abs(bnot(a.slow))?\\na.beat*(6>randint(1E3*a.avg)?1:0):bnot(a.beat*(50>randint(100)?1:0));a.look=.00001<Math.abs(bnot(a.look))?a.beat*(12>randint(1E3*a.speed)?1:0):bnot(a.beat*(50>randint(100)?1:0));a.lx=.00001<Math.abs(a.beat)?div(randint(150),200)+.15:a.lx;a.ly=.00001<Math.abs(a.beat)?div(randint(150),200)+.15:a.ly;a.lampx=a.lampx*a.dec_s+(1-a.dec_s)*(.00001<Math.abs(a.look)?a.lx:.5);a.lampy=a.lampy*a.dec_s+(1-a.dec_s)*(.00001<Math.abs(a.look)?a.ly:.5);a.q1=a.lampx;a.q2=a.lampy;a.dirx=a.reg26;a.diry=a.reg27;a.dirz=\\na.reg28;a.posx+=a.ds*a.dirx;a.posy+=a.ds*a.diry;a.posz+=a.ds*a.dirz;a.q4=a.posx;a.q5=a.posy;a.q6=a.posz;a.angchg=(.2-a.dist_)*(.2>a.dist_?1:0)*2;a.travel=.00001<Math.abs(0<a.angchg?1:0)?0:a.travel+a.ds;a.v1=a.v1*a.dec_s+(1-a.dec_s)*a.rotz*a.ds;a.v2=a.v2*a.dec_s+div((1-a.dec_s)*a.angchg*a.xslope,a.fps_);a.v3=a.v3*a.dec_s+(1-a.dec_s)*(div(a.angchg*a.yslope,a.fps_)+2*a.v1*Math.sin(.1*a.time));a.reg30=a.reg20;a.reg31=a.reg21;a.reg32=a.reg22;a.reg33=a.reg23;a.reg34=a.reg24;a.reg35=a.reg25;a.reg36=a.reg26;\\na.reg37=a.reg27;a.reg38=a.reg28;a.n=0;for(var b=a.avg=0;5>b;b++){a.n+=1;a.ran1=div(randint(100),100);a.ran2=div(randint(100),200)-.25;a.tx=Math.cos(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.ty=Math.sin(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.c1=Math.cos(a.v1);a.c2=Math.cos(a.v2+a.ty);a.c3=Math.cos(a.v3+a.tx);a.s1=Math.sin(a.v1);a.s2=Math.sin(a.v2+a.ty);a.s3=Math.sin(a.v3+a.tx);a.reg10=a.c2*a.c1;a.reg11=a.c2*a.s1;a.reg12=-a.s2;a.reg13=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg14=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg15=a.s3*\\na.c2;a.reg16=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg17=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg18=a.c3*a.c2;a.reg20=a.reg30;a.reg21=a.reg31;a.reg22=a.reg32;a.reg23=a.reg33;a.reg24=a.reg34;a.reg25=a.reg35;a.reg26=a.reg36;a.reg27=a.reg37;a.reg28=a.reg38;a.q20=a.reg10*a.reg20+a.reg11*a.reg23+a.reg12*a.reg26;a.q21=a.reg10*a.reg21+a.reg11*a.reg24+a.reg12*a.reg27;a.q22=a.reg10*a.reg22+a.reg11*a.reg25+a.reg12*a.reg28;a.q23=a.reg13*a.reg20+a.reg14*a.reg23+a.reg15*a.reg26;a.q24=a.reg13*a.reg21+a.reg14*a.reg24+a.reg15*a.reg27;\\na.q25=a.reg13*a.reg22+a.reg14*a.reg25+a.reg15*a.reg28;a.q26=a.reg16*a.reg20+a.reg17*a.reg23+a.reg18*a.reg26;a.q27=a.reg16*a.reg21+a.reg17*a.reg24+a.reg18*a.reg27;a.q28=a.reg16*a.reg22+a.reg17*a.reg25+a.reg18*a.reg28;a.reg20=a.q20;a.reg21=a.q21;a.reg22=a.q22;a.reg23=a.q23;a.reg24=a.q24;a.reg25=a.q25;a.reg26=a.q26;a.reg27=a.q27;a.reg28=a.q28;a.dist=.002;var c,d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;\\na.uvx=8*(div(a.uvx,8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?\\n-2-a.uvz:a.uvz,a.slen=a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.1;c=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<\\nMath.abs(c)&&1048576>d);a.megabuf[Math.floor(a.n)]=a.megabuf[Math.floor(a.n)]*a.dec_s+(1-a.dec_s)*a.dist;a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5))}a.n=0;for(b=a.avg=0;5>b;b++)a.n+=1,a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5));a.xslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[1]-a.megabuf[3]),-3),3);a.yslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[4]-a.megabuf[2]),-3),3);a.monitor=a.avg;a.dist_=a.dist_*a.dec_s+(1-a.dec_s)*a.dist;a.q10=a.ds*a.q7;a.q14=Math.abs(a.ds)+2*(Math.abs(a.v1)+\\nMath.abs(a.v2)+Math.abs(a.v3))+div(1,255)+.05*a.start;a.q19=.6+.4*Math.sin(.02*a.time+6*a.cran0);a.start*=.9;a.q11=a.v1;a.q12=a.v2;a.q13=a.v3;a.monitor=a.q16;a.bb=.99*a.bb+.02*a.bass;a.mm=.99*a.mm+.02*a.mid;a.tt=.99*a.tt+.02*a.treb;a.mx=Math.max(Math.max(a.bb,a.mm),a.tt);a.mn=Math.min(Math.min(a.bb,a.mm),a.tt);a.h1=div(a.bb-a.mn,a.mx-a.mn);a.h2=div(a.mm-a.mn,a.mx-a.mn);a.h3=div(a.tt-a.mn,a.mx-a.mn);a.v=div(.1333,a.fps);a.bm+=(a.h1-a.h2)*a.v;a.mt+=(a.h2-a.h3)*a.v;a.bt+=(a.h1-a.h3)*a.v;a.w=2*a.bm;a.q3=\\nMath.sin(a.w);a.q9=Math.cos(a.w);a.q17=a.bm;a.q18=a.mt;a.q19=a.bt;\",pixel_eqs_str:\"a.warp=0;a.zoom=1;a.dx=div(-a.q12,a.q16)*(1+0*pow(a.x-.5,2));a.dy=div(a.q13,a.q16)*(1+0*pow(a.y-.5,2));a.rot=a.q11;\",warp:\"float sustain;\\nfloat xlat_mutabledist;\\nfloat xlat_mutablestruc;\\nvec2 xlat_mutableuv1;\\nvec3 xlat_mutableuv2;\\n shader_body { \\n  mat3 tmpvar_1;\\n  tmpvar_1[uint(0)].x = q20;\\n  tmpvar_1[uint(0)].y = q23;\\n  tmpvar_1[uint(0)].z = q26;\\n  tmpvar_1[1u].x = q21;\\n  tmpvar_1[1u].y = q24;\\n  tmpvar_1[1u].z = q27;\\n  tmpvar_1[2u].x = q22;\\n  tmpvar_1[2u].y = q25;\\n  tmpvar_1[2u].z = q28;\\n  vec3 tmpvar_2;\\n  tmpvar_2.x = q4;\\n  tmpvar_2.y = q5;\\n  tmpvar_2.z = q6;\\n  sustain = (1.0123 - q14);\\n  vec2 uv_3;\\n  vec3 ret_4;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (uv - 0.5);\\n  xlat_mutableuv1 = ((tmpvar_5 * aspect.xy) * q16);\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_pc_main, uv);\\n  uv_3 = ((tmpvar_5 * (1.0 - \\n    (q10 / (1.0 - ((tmpvar_6.z + \\n      (0.003921569 * tmpvar_6.y)\\n    ) + (q10 * 0.7))))\\n  )) + 0.5);\\n  vec4 tmpvar_7;\\n  tmpvar_7 = fract((8.0 * texture (sampler_noise_lq, (uv_3 + rand_frame.yz))));\\n  xlat_mutabledist = tmpvar_7.x;\\n  if ((tmpvar_7.y > 0.2)) {\\n    vec3 tmpvar_8;\\n    tmpvar_8 = (tmpvar_7.xyz - vec3(0.4, 0.5, 0.5));\\n    vec2 uvi_9;\\n    uvi_9 = ((tmpvar_8.zy * 0.003) + uv_3);\\n    vec2 pix_10;\\n    vec4 nb2_11;\\n    vec4 nb_12;\\n    vec2 x_13;\\n    x_13 = (uvi_9 - 0.5);\\n    pix_10 = (texsize.zw * (1.0 + (\\n      sqrt(dot (x_13, x_13))\\n     * 8.0)));\\n    float tmpvar_14;\\n    tmpvar_14 = (q10 * 0.7);\\n    vec4 tmpvar_15;\\n    tmpvar_15 = texture (sampler_pc_main, (uvi_9 - pix_10));\\n    nb_12.x = (1.0 - ((tmpvar_15.z + \\n      (0.003921569 * tmpvar_15.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_16;\\n    tmpvar_16 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(1.0, -1.0))));\\n    nb_12.y = (1.0 - ((tmpvar_16.z + \\n      (0.003921569 * tmpvar_16.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_17;\\n    tmpvar_17 = texture (sampler_pc_main, (uvi_9 + pix_10));\\n    nb_12.z = (1.0 - ((tmpvar_17.z + \\n      (0.003921569 * tmpvar_17.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_18;\\n    tmpvar_18 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(-1.0, 1.0))));\\n    nb_12.w = (1.0 - ((tmpvar_18.z + \\n      (0.003921569 * tmpvar_18.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_19;\\n    tmpvar_19 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(0.0, -1.0))));\\n    nb2_11.x = (1.0 - ((tmpvar_19.z + \\n      (0.003921569 * tmpvar_19.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_20;\\n    tmpvar_20 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(1.0, 0.0))));\\n    nb2_11.y = (1.0 - ((tmpvar_20.z + \\n      (0.003921569 * tmpvar_20.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_21;\\n    tmpvar_21 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(0.0, 1.0))));\\n    nb2_11.z = (1.0 - ((tmpvar_21.z + \\n      (0.003921569 * tmpvar_21.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_22;\\n    tmpvar_22 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(-1.0, 0.0))));\\n    nb2_11.w = (1.0 - ((tmpvar_22.z + \\n      (0.003921569 * tmpvar_22.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_23;\\n    tmpvar_23 = min (nb_12, nb2_11);\\n    nb_12.zw = tmpvar_23.zw;\\n    nb_12.xy = min (tmpvar_23.xy, tmpvar_23.zw);\\n    xlat_mutabledist = (min (nb_12.x, nb_12.y) + ((0.008 * tmpvar_8.x) * abs(tmpvar_8.y)));\\n  };\\n  vec4 tmpvar_24;\\n  tmpvar_24 = texture (sampler_pc_main, uv_3);\\n  float tmpvar_25;\\n  tmpvar_25 = min (xlat_mutabledist, (1.0 - (\\n    (tmpvar_24.z + (0.003921569 * tmpvar_24.y))\\n   + \\n    (q10 * 0.7)\\n  )));\\n  xlat_mutabledist = tmpvar_25;\\n  float tmpvar_26;\\n  tmpvar_26 = (tmpvar_25 + pow (tmpvar_25, 3.0));\\n  vec3 tmpvar_27;\\n  tmpvar_27.xy = (xlat_mutableuv1 * tmpvar_26);\\n  tmpvar_27.z = tmpvar_26;\\n  xlat_mutableuv2 = (((tmpvar_27 / q7) * tmpvar_1) + tmpvar_2);\\n  xlat_mutableuv2 = ((fract(\\n    ((xlat_mutableuv2 / 8.0) + 0.5)\\n  ) - 0.5) * 8.0);\\n  float li_28;\\n  vec3 zz0_29;\\n  vec3 zz_30;\\n  zz0_29 = (xlat_mutableuv2 + q8);\\n  li_28 = 0.0;\\n  zz_30 = ((2.0 * clamp (xlat_mutableuv2, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - xlat_mutableuv2);\\n  float tmpvar_31;\\n  tmpvar_31 = dot (zz_30, zz_30);\\n  if ((tmpvar_31 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_31 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_31);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_32;\\n  tmpvar_32 = dot (zz_30, zz_30);\\n  if ((tmpvar_32 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_32 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_32);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_33;\\n  tmpvar_33 = dot (zz_30, zz_30);\\n  if ((tmpvar_33 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_33 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_33);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_34;\\n  tmpvar_34 = dot (zz_30, zz_30);\\n  if ((tmpvar_34 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_34 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_34);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_35;\\n  tmpvar_35 = dot (zz_30, zz_30);\\n  if ((tmpvar_35 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_35 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_35);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_36;\\n  tmpvar_36 = dot (zz_30, zz_30);\\n  if ((tmpvar_36 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_36 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_36);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_37;\\n  tmpvar_37 = dot (zz_30, zz_30);\\n  if ((tmpvar_37 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_37 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_37);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_38;\\n  tmpvar_38 = dot (zz_30, zz_30);\\n  if ((tmpvar_38 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_38 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_38);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  vec4 tmpvar_39;\\n  tmpvar_39.xyz = zz_30;\\n  tmpvar_39.w = li_28;\\n  float tmpvar_40;\\n  tmpvar_40 = sqrt(dot (zz_30, zz_30));\\n  xlat_mutablestruc = (sqrt(dot (tmpvar_39.xyw, tmpvar_39.xyw)) / 24.0);\\n  vec4 tmpvar_41;\\n  tmpvar_41 = texture (sampler_pc_main, uv_3);\\n  float tmpvar_42;\\n  float tmpvar_43;\\n  tmpvar_43 = (q10 * 0.7);\\n  tmpvar_42 = ((log(\\n    (1.0 + (tmpvar_40 / 24.0))\\n  ) * 0.02) * (1.0 - (1.0 - \\n    ((tmpvar_41.z + (0.003921569 * tmpvar_41.y)) + tmpvar_43)\\n  )));\\n  float tmpvar_44;\\n  vec4 tmpvar_45;\\n  tmpvar_45 = texture (sampler_pc_main, uv_3);\\n  tmpvar_44 = (1.0 - ((tmpvar_45.z + \\n    (0.003921569 * tmpvar_45.y)\\n  ) + tmpvar_43));\\n  if ((((tmpvar_25 <= tmpvar_44) && (tmpvar_40 < 24.0)) && (tmpvar_25 > 0.005))) {\\n    ret_4.x = (((1.0 - sustain) * xlat_mutablestruc) + (sustain * mix (texture (sampler_main, uv_3).xyz, \\n      ((texture (sampler_blur1, uv_3).xyz * scale1) + bias1)\\n    , vec3(\\n      (q14 * 4.0)\\n    )).x));\\n    float x_46;\\n    x_46 = ((1.0 - tmpvar_25) * 255.0);\\n    float ip_47;\\n    ip_47 = float(int(x_46));\\n    vec2 tmpvar_48;\\n    tmpvar_48.x = (x_46 - ip_47);\\n    tmpvar_48.y = (ip_47 / 255.0);\\n    ret_4.yz = tmpvar_48;\\n  } else {\\n    vec3 tmpvar_49;\\n    tmpvar_49.y = 0.0;\\n    tmpvar_49.x = sustain;\\n    tmpvar_49.z = (1.0 - tmpvar_42);\\n    vec3 tmpvar_50;\\n    tmpvar_50.xy = vec2(0.003921569, 0.0);\\n    tmpvar_50.z = (q14 / 6.0);\\n    ret_4 = ((texture (sampler_fc_main, uv_3).xyz * tmpvar_49) - tmpvar_50);\\n  };\\n  vec4 tmpvar_51;\\n  tmpvar_51.w = 1.0;\\n  tmpvar_51.xyz = ret_4;\\n  ret = tmpvar_51.xyz;\\n }\",comp:\"vec2 xlat_mutabled;\\nvec3 xlat_mutabledx;\\nvec3 xlat_mutabledy;\\n shader_body { \\n  vec3 ret_1;\\n  xlat_mutabled = (texsize.zw * 1.5);\\n  xlat_mutabledx = (texture (sampler_main, (uv_orig + (vec2(1.0, 0.0) * xlat_mutabled))).xyz - texture (sampler_main, (uv_orig - (vec2(1.0, 0.0) * xlat_mutabled))).xyz);\\n  xlat_mutabledy = (texture (sampler_main, (uv_orig + (vec2(0.0, 1.0) * xlat_mutabled))).xyz - texture (sampler_main, (uv_orig - (vec2(0.0, 1.0) * xlat_mutabled))).xyz);\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = xlat_mutabledx.y;\\n  tmpvar_2.y = xlat_mutabledy.y;\\n  vec2 x_3;\\n  x_3 = (tmpvar_2 * 8.0);\\n  ret_1 = (((texture (sampler_main, uv).x * \\n    (1.0 - sqrt(dot (x_3, x_3)))\\n  ) * pow (hue_shader, vec3(6.0, 6.0, 6.0))) * 1.4);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = xlat_mutabledx.z;\\n  tmpvar_4.y = xlat_mutabledy.z;\\n  vec2 x_5;\\n  x_5 = (tmpvar_4 * 4.0);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = mix (ret_1, vec3(1.0, 1.0, 1.0), vec3(sqrt(dot (x_5, x_5))));\\n  ret_1 = tmpvar_6;\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = tmpvar_6;\\n  ret = tmpvar_7.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.9,echo_zoom:1.169,echo_orient:1,wave_mode:5,additivewave:1,wave_a:0,wave_scale:.9,wave_smoothing:.63,wave_mystery:1,modwavealphastart:2,modwavealphaend:2,warpscale:2.853,rot:.006,warp:0,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:.005,mv_x:0,mv_y:48,mv_dx:-.941,mv_dy:.426,mv_l:5,mv_r:.316,mv_g:.078,mv_b:.942,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:100,textured:1,rad:.78903,ang:.62832,tex_zoom:1.02009,r:0,g:1,b:1,r2:.7,b2:1,border_a:0},init_eqs_str:\"a.vx=0;a.vy=0;\",frame_eqs_str:\"\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.y3=0;a.y1=0;a.xx=0;a.res=0;a.q12=0;a.x1=0;a.vx3=0;a.q13=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.c_x=0;a.c_y=0;a.q9=0;a.d1=0;a.v=0;a.si1=0;a.vx4=0;a.diff=0;a.x3=0;a.q23=0;a.q24=0;a.d2=0;a.q11=0;a.q10=0;a.xx2=0;a.q4=0;a.yy1=0;a.vy4=0;a.dir=0;a.x4=0;a.r=0;a.x2=0;a.beat=0;a.vol=0;a.vy2=0;a.y2=0;a.size=0;a.q2=0;a.q14=0;a.si2=0;a.vx2=0;a.q3=0;a.yy=0;a.y4=0;a.q7=0;a.vy3=0;a.strength=0;a.xx1=0;a.velocity=0;a.q8=0;a.c_x=.5;a.c_y=.5;\",frame_eqs_str:\"a.sx=1+.01*mod(8*a.bass,8)*equal(mod(a.time,Math.floor(24-2*a.bass)),0);a.sy=1+.01*mod(8*a.mid,8)*equal(mod(a.time,12+Math.floor(24-2*a.bass)),0);a.q1=a.aspectx;a.q2=a.aspecty;a.rot=0;a.zoom=1;a.warp=0;a.vol=8*a.bass+4*a.mid+2*a.treb;a.vol*=above(a.vol,17);a.monitor=a.vol;a.beat=above(a.vol,a.res);a.diff=(1-a.beat)*a.diff+a.beat*(a.vol-a.res);a.res=a.beat*(a.vol+2*a.diff)+(1-a.beat)*(a.res-div(60*(.04*a.diff+.12),a.fps));a.res=Math.max(0,a.res);a.monitor=a.res;a.r=.00001<Math.abs(a.beat)?\\n.0001*(randint(200)-100):a.r;a.rot=a.r;a.c_x=.00001<Math.abs(a.beat)?.5+.005*(randint(200)-100):a.c_x;a.c_y=.00001<Math.abs(a.beat)?.5+.005*(randint(200)-100):a.c_y;a.q23=a.c_x;a.q24=a.c_y;a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+2*(a.xx1-a.xx2);a.y1=.4+1.5*a.yy1;a.dt=div(.03,a.fps);a.vx2=a.vx2*(1-2*a.dt)+10*a.dt*(a.x1+a.x3-2*a.x2);a.vy2=a.vy2*(1-2*a.dt)+a.dt*(10*(a.y1+a.y3-2*a.y2)-.5);a.vx3=a.vx3*(1-2*a.dt)+10*a.dt*(a.x2+a.x4-2*a.x3);a.vy3=\\na.vy3*(1-2*a.dt)+a.dt*(10*(a.y2+a.y4-2*a.y3)-.5);a.vx4=a.vx4*(1-2*a.dt)+10*a.dt*(a.x3-a.x4);a.vy4=a.vy4*(1-2*a.dt)+a.dt*(10*(a.y3-a.y4)-.5);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:.5*Math.abs(a.vx2);a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:.5*-Math.abs(a.vx2);a.vx3=.00001<Math.abs(above(a.x3,0))?a.vx3:.5*Math.abs(a.vx3);a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:.5*-Math.abs(a.vx3);a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:\\n.5*Math.abs(a.vx4);a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:.5*-Math.abs(a.vx4);a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:.5*Math.abs(a.vy2);a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:.5*-Math.abs(a.vy2);a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:.5*Math.abs(a.vy3);a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:.5*-Math.abs(a.vy3);a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:.5*Math.abs(a.vy4);a.vy4=.00001<Math.abs(below(a.y4,1))?a.vy4:.5*-Math.abs(a.vy4);a.q1=a.x1;a.q2=a.x2;a.q3=a.x3;a.q4=a.x4;a.q5=\\na.y1;a.q6=a.y2;a.q7=a.y3;a.q8=a.y4;a.q9=div(1,a.aspectx);a.q10=div(1,a.aspecty);a.q11=a.aspectx;a.q12=a.aspecty;a.q13=.8*sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.q14=Math.atan2(a.vx4,a.vy4);\",pixel_eqs_str:\"a.d=pow(sqrt(sqr(a.x-a.q3)+sqr(a.y-a.q4)),2)-0;a.v=.03;a.dx=a.v*(a.x-a.q23)*a.d;a.dy=a.v*(a.y-a.q24)*a.d;a.x=.5+(a.x-.5)*a.q11;a.y=.5+(a.y-.5)*a.q12;a.dir=-a.q14+Math.asin(1);a.velocity=a.q13;a.strength=100;a.size=.07;a.xx=a.q4;a.yy=1-a.q8;a.x1=a.xx+Math.cos(a.dir+1.5708)*a.size;a.y1=a.yy-Math.sin(a.dir+1.5708)*a.size;a.x2=a.xx-Math.cos(a.dir+1.5708)*a.size;a.y2=a.yy+Math.sin(a.dir+1.5708)*a.size;a.d1=sqrt((a.x1-a.x)*(a.x1-a.x)+(a.y1-a.y)*(a.y1-a.y))-2*a.size;a.si1=1-div(1,\\n1+pow(2,100*-a.d1));a.d2=sqrt((a.x2-a.x)*(a.x2-a.x)+(a.y2-a.y)*(a.y2-a.y))-2*a.size;a.si2=1-div(1,1+pow(2,100*-a.d2));a.dx+=(a.si1*Math.sin(a.y1-a.y)*a.d1-a.si2*Math.sin(a.y2-a.y)*a.d2)*a.strength*a.velocity;a.dy+=(-a.si1*Math.sin(a.x1-a.x)*a.d1+a.si2*Math.sin(a.x2-a.x)*a.d2)*a.strength*a.velocity;\",warp:\"vec2 xlat_mutabled;\\nvec3 xlat_mutabledx;\\nvec3 xlat_mutabledy;\\n shader_body { \\n  vec3 ret_1;\\n  vec3 tmpvar_2;\\n  tmpvar_2 = (texture (sampler_noise_lq, ((\\n    (uv_orig * texsize.xy)\\n   * texsize_noise_lq.zw) + rand_frame.xy)).xyz - 0.5);\\n  xlat_mutabled = (texsize.zw * 4.0);\\n  xlat_mutabledx = (((texture (sampler_blur1, \\n    (uv_orig + (vec2(1.0, 0.0) * xlat_mutabled))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_orig - (vec2(1.0, 0.0) * xlat_mutabled))\\n  ).xyz * scale1) + bias1));\\n  xlat_mutabledy = (((texture (sampler_blur1, \\n    (uv_orig + (vec2(0.0, 1.0) * xlat_mutabled))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_orig - (vec2(0.0, 1.0) * xlat_mutabled))\\n  ).xyz * scale1) + bias1));\\n  xlat_mutabled = uv;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = xlat_mutabledx.y;\\n  tmpvar_3.y = xlat_mutabledy.y;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = xlat_mutabledx.z;\\n  tmpvar_4.y = xlat_mutabledy.z;\\n  vec4 tmpvar_5;\\n  tmpvar_5 = texture (sampler_main, uv_orig);\\n  ret_1.y = ((texture (sampler_main, (uv - \\n    ((tmpvar_3 * texsize.zw) * 6.0)\\n  )).y - 0.008) + ((1.0 - tmpvar_5.x) * 0.018));\\n  ret_1.z = ((texture (sampler_main, (uv - \\n    ((tmpvar_4 * texsize.zw) * 6.0)\\n  )).z - 0.008) + (tmpvar_5.x * 0.018));\\n  ret_1.x = texture (sampler_fc_main, (uv + ((tmpvar_2.xy * texsize.zw) * 0.5))).x;\\n  ret_1.x = (ret_1.x + ((\\n    (ret_1.x - ((texture (sampler_blur3, uv).xyz * scale3) + bias3).x)\\n   * 0.15) + (tmpvar_2 * 0.0042)).x);\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ret_1;\\n  ret = tmpvar_6.xyz;\\n }\",comp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1.x = q3;\\n  tmpvar_1.y = q4;\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = q6;\\n  tmpvar_2.y = q7;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = q9;\\n  tmpvar_3.y = q10;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q12;\\n  tmpvar_4.y = q13;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (texsize.zw * 1.25);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = (texture (sampler_main, (uv + (vec2(1.0, 0.0) * tmpvar_5))).xyz - texture (sampler_main, (uv - (vec2(1.0, 0.0) * tmpvar_5))).xyz);\\n  vec3 tmpvar_7;\\n  tmpvar_7 = (texture (sampler_main, (uv + (vec2(0.0, 1.0) * tmpvar_5))).xyz - texture (sampler_main, (uv - (vec2(0.0, 1.0) * tmpvar_5))).xyz);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_8.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_9;\\n  x_9 = ((uv - (tmpvar_8 * 8.0)) - tmpvar_1);\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_10.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_11;\\n  x_11 = ((uv - (tmpvar_10 * 8.0)) - tmpvar_2);\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_12.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_13;\\n  x_13 = ((uv - (tmpvar_12 * 8.0)) - tmpvar_3);\\n  vec2 tmpvar_14;\\n  tmpvar_14.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_14.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec2 x_15;\\n  x_15 = ((uv - (tmpvar_14 * 8.0)) - tmpvar_4);\\n  vec4 tmpvar_16;\\n  tmpvar_16.w = 1.0;\\n  tmpvar_16.xyz = mix (texture (sampler_main, uv).xyz, max (max (\\n    (vec3((1.0 - pow (sqrt(\\n      dot (x_9, x_9)\\n    ), 0.2))) * vec3(2.0, 1.0, -1.0))\\n  , \\n    (vec3((1.0 - pow (sqrt(\\n      dot (x_11, x_11)\\n    ), 0.2))) * vec3(2.0, -1.0, 1.0))\\n  ), max (\\n    (vec3((1.0 - pow (sqrt(\\n      dot (x_13, x_13)\\n    ), 0.2))) * vec3(-1.0, 1.0, 2.0))\\n  , \\n    (vec3((1.0 - pow (sqrt(\\n      dot (x_15, x_15)\\n    ), 0.2))) * vec3(1.0, -1.0, 2.0))\\n  )), vec3(0.5, 0.5, 0.5));\\n  ret = tmpvar_16.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.955,echo_zoom:.997,echo_alpha:.5,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,wave_a:.001,wave_scale:.49,wave_smoothing:0,modwavealphastart:.71,modwavealphaend:1.3,warpscale:16.016,zoomexp:11.56276,fshader:1,zoom:1.05971,warp:.13126,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:0,ob_a:1,ib_size:0,mv_x:64,mv_y:48,mv_l:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:14,additive:1,num_inst:126,rad:.0303,tex_ang:.62832,r:0,b:1,g2:0,b2:1,a2:1,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.01*a.bass;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0002*Math.cos(a.ma);a.my+=.0002*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.8);\"},{baseVals:{enabled:1,sides:14,additive:1,num_inst:128,rad:.03,tex_ang:.62832,r:0,b:1,g2:0,b2:1,a2:1,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.05*a.bass;a.ma-=3.1415*above(a.mid,1)*.05*a.mid;a.mx+=.0001*Math.cos(a.ma);a.my+=.0001*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.1);\"},{baseVals:{enabled:1,sides:14,additive:1,num_inst:32,rad:.0297,tex_ang:.62832,r:0,b:1,g2:0,b2:1,a2:1,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.mid,1)*.01*a.mid;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0004*Math.cos(a.ma);a.my+=.0004*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.3);\"},{baseVals:{enabled:1,sides:14,additive:1,num_inst:16,rad:.0303,tex_ang:.62832,r:0,b:1,g2:0,b2:1,a2:1,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.bass,.5)*.02*a.bass;a.ma-=3.1415*above(a.treb,.5)*.02*a.treb;a.mx+=.0008*Math.cos(a.ma);a.my+=.0008*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.2);\"}],waves:[{baseVals:{enabled:1,thick:1,additive:1,scaling:2.0231,smoothing:0,r:0,b:0},init_eqs_str:\"a.d=0;a.tt2=0;a.res=0;a.tt1=0;a.diff=0;a.tt3=0;a.beat=0;a.vol=0;a.m=0;a.monitor=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.vol=8*a.bass+5*a.mid+3*a.treb;a.m=.97*a.m+.08*a.vol;a.monitor=a.vol;a.beat=above(a.vol,a.res)*above(a.vol,a.m)*above(a.vol,16);a.diff=(1-a.beat)*a.diff+a.beat*(a.vol-a.res);a.res=a.beat*(a.vol+.04*a.m)+(1-a.beat)*(a.res-div(60*(.1+.02*a.diff),a.fps));a.res=Math.max(0,a.res);a.a=a.beat;\",point_eqs_str:\"a.tt3=.6*a.tt3+1*a.value1;a.tt2=.7*a.tt2+.2*a.tt3;a.tt1=.8*a.tt1+.1*a.tt2;a.d=.9*a.d+.2*a.tt1;a.y=.5+a.d*a.sample*(1-a.sample)*4;a.x=-.05+1.1*a.sample;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.xx=0;a.si3=0;a.q12=0;a.t1=0;a.x1=0;a.vx3=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.q9=0;a.d1=0;a.si1=0;a.vx4=0;a.grav=0;a.x3=0;a.d2=0;a.q11=0;a.q10=0;a.xx2=0;a.q4=0;a.yy1=0;a.vy4=0;a.dir=0;a.bounce=0;a.x4=0;a.r=0;a.x2=0;a.vy2=0;a.y2=0;a.q2=0;a.m1=0;a.spring=0;a.si2=0;a.vx2=0;a.q3=0;a.resist=0;a.yy=0;a.y4=0;a.q7=0;a.vy3=0;a.xx1=0;a.b1=0;a.q8=0;\",frame_eqs_str:\"a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+2*(a.xx1-a.xx2);a.y1=.4+a.yy1;a.x1=Math.max(0,Math.min(1,a.x1));a.y1=Math.max(0,Math.min(1,a.y1));a.spring=10;a.grav=.5;a.resist=1;a.bounce=.75;a.dt=.0005*div(60,a.fps);a.vx2=a.vx2*(1-a.resist*a.dt)+a.dt*(a.x1+a.x3-2*a.x2)*a.spring;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*((a.y1+a.y3-2*a.y2)*a.spring-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*(a.x2+a.x4-2*a.x3)*a.spring;a.vy3=a.vy3*(1-\\na.resist*a.dt)+a.dt*((a.y2+a.y4-2*a.y3)*a.spring-a.grav);a.vx4=a.vx4*(1-a.resist*a.dt)+a.dt*(a.x3-a.x4)*a.spring;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*((a.y3-a.y4)*a.spring-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<Math.abs(above(a.x3,0))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:-Math.abs(a.vx3)*\\na.bounce;a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:Math.abs(a.vx4)*a.bounce;a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:-Math.abs(a.vy3)*a.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<\\nMath.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q1=a.x1;a.q2=a.x2;a.q3=a.x3;a.q4=a.x4;a.q5=a.y1;a.q6=a.y2;a.q7=a.y3;a.q8=a.y4;a.q9=div(1,a.aspectx);a.q10=div(1,a.aspecty);a.zoom=1;a.r=.96*a.r+(a.x1-.5);a.rot=.1*a.r;a.q12=Math.atan2(a.vx4,a.vy4);a.q11=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.zoom=1.001;a.rot=0;a.warp=.2;a.wave_a=0;\",pixel_eqs_str:\"a.dir=-a.q12+Math.asin(1);a.b1=.1;a.m1=25*a.q11;a.t1=.05;a.xx=a.q4;a.yy=1-a.q8;a.x1=a.xx+Math.cos(a.dir+1.5708)*a.b1;a.y1=a.yy-Math.sin(a.dir+1.5708)*a.b1;a.x2=a.xx-Math.cos(a.dir+1.5708)*a.b1;a.y2=a.yy+Math.sin(a.dir+1.5708)*a.b1;a.d1=sqrt((a.x1-a.x)*(a.x1-a.x)+(a.y1-a.y)*(a.y1-a.y))-2*a.b1;a.si1=1-div(1,1+pow(2,1E3*-a.d1));a.d2=sqrt((a.x2-a.x)*(a.x2-a.x)+(a.y2-a.y)*(a.y2-a.y))-2*a.b1;a.si2=1-div(1,1+pow(2,1E3*-a.d2));a.si3=0*-pow(a.q5,3);a.dx=2*(a.si1*Math.sin(a.y1-a.y)*a.m1*\\na.d1-a.si2*Math.sin(a.y2-a.y)*a.m1*a.d2+a.si3*Math.cos(a.dir)*a.t1);a.dy=2*(-a.si1*Math.sin(a.x1-a.x)*a.m1*a.d1+a.si2*Math.sin(a.x2-a.x)*a.m1*a.d2-a.si3*Math.sin(a.dir)*a.t1);\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 8.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.z;\\n  tmpvar_5.y = tmpvar_4.z;\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv + ((tmpvar_5 * texsize.zw) * 4.0));\\n  ret_1.z = (((texture (sampler_main, tmpvar_6).z - \\n    ((texture (sampler_main, tmpvar_6).z - ((texture (sampler_blur3, tmpvar_6).xyz * scale3) + bias3).z) * 0.02)\\n  ) - 0.008) + ((texture (sampler_noise_lq, \\n    (((uv_orig * texsize.xy) * texsize_noise_lq.zw) + rand_frame.xy)\\n  ).xyz - 0.5) * 0.1)).x;\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_3.x;\\n  tmpvar_7.y = tmpvar_4.x;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = ((0.5 + (uv - 0.5)) - (tmpvar_7 * texsize.zw));\\n  ret_1.x = texture (sampler_main, tmpvar_8).x;\\n  ret_1.x = (ret_1.x + ((\\n    (ret_1.x - ((texture (sampler_blur3, tmpvar_8).xyz * scale3) + bias3))\\n  .x * 0.4) + 0.006));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_3.x;\\n  tmpvar_9.y = tmpvar_4.x;\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_3.y;\\n  tmpvar_10.y = tmpvar_4.y;\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = tmpvar_3.z;\\n  tmpvar_11.y = tmpvar_4.z;\\n  ret_1.y = texture (sampler_fc_main, (((uv - \\n    ((tmpvar_9 * texsize.zw) * 8.0)\\n  ) + (\\n    (tmpvar_10 * texsize.zw)\\n   * 4.0)) + ((tmpvar_11 * texsize.zw) * 8.0))).y;\\n  ret_1.y = (ret_1.y * (1.0 + (ret_1.x * 0.1)));\\n  ret_1.y = (ret_1.y - (0.004 + (\\n    clamp (ret_1.z, 0.0, 1.0)\\n   * 0.012)));\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = ret_1;\\n  ret = tmpvar_12.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 4.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.z;\\n  tmpvar_5.y = tmpvar_4.z;\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = tmpvar_3.y;\\n  tmpvar_6.y = tmpvar_4.y;\\n  vec2 tmpvar_7;\\n  tmpvar_7 = ((uv - (tmpvar_5 * 0.1)) + (tmpvar_6 * 0.06));\\n  vec4 tmpvar_8;\\n  tmpvar_8 = texture (sampler_main, uv);\\n  ret_1 = (((\\n    ((texture (sampler_blur2, tmpvar_7).xyz * scale2) + bias2)\\n  .x * \\n    clamp ((1.0 - tmpvar_8.z), 0.0, 1.0)\\n  ) * pow (hue_shader.yxz, vec3(8.0, 8.0, 8.0))) * 3.0);\\n  ret_1 = (mix (ret_1, (\\n    pow (hue_shader.yzx, vec3(8.0, 8.0, 8.0))\\n   * 1.4), vec3((\\n    (texture (sampler_main, tmpvar_7).x * 0.8)\\n   + \\n    ((texture (sampler_blur1, tmpvar_7).xyz * scale1) + bias1)\\n  .x))) * clamp ((1.0 - \\n    (((texture (sampler_blur1, uv).xyz * scale1) + bias1).y * 4.0)\\n  ), 0.0, 1.0));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_3.y;\\n  tmpvar_9.y = tmpvar_4.y;\\n  vec3 tmpvar_10;\\n  vec3 tmpvar_11;\\n  tmpvar_11 = pow (hue_shader, vec3(8.0, 8.0, 8.0));\\n  tmpvar_10 = mix (mix (ret_1, vec3(1.0, 1.0, 1.0), (\\n    (tmpvar_11 * texture (sampler_main, clamp ((uv - (tmpvar_9 * 2.0)), 0.0, 1.0)).z)\\n   * 1.2)), (tmpvar_11.zxy * 1.8), tmpvar_8.yyy);\\n  ret_1 = tmpvar_10;\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = tmpvar_10;\\n  ret = tmpvar_12.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.9,echo_zoom:1.169,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,wave_a:1.413,wave_scale:.418,wave_smoothing:0,wave_mystery:-.66,modwavealphastart:2,modwavealphaend:2,warpanimspeed:.626,warpscale:1.331,zoomexp:1.00001,zoom:.99951,warp:.08925,wave_r:0,wave_g:0,wave_x:.24,wave_y:.44,ob_size:.5,ob_r:.01,ib_size:.26,mv_x:64,mv_y:48,mv_l:0,mv_a:0},shapes:[{baseVals:{enabled:1,additive:1,rad:.0277,ang:6.03186,tex_ang:6.03186,tex_zoom:.6839,g:1,r2:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.an=0;a.q6=0;a.q4=0;a.q5=0;a.q3=0;a.q2=0;a.q1=0;\",frame_eqs_str:\"a.an+=a.q6;a.ang=.5*a.an;a.x=a.q4;a.y=a.q5;a.rad=a.q3*sqrt(2);a.x=.5+div(a.x-.5,a.q2);a.y=.5+div(a.y-.5,a.q1);\"},{baseVals:{enabled:1,additive:1,rad:.0277,ang:6.03186,tex_ang:6.03186,tex_zoom:.6839,g:1,r2:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.an=0;a.q9=0;a.q7=0;a.q8=0;a.q3=0;a.q2=0;a.q1=0;\",frame_eqs_str:\"a.an+=a.q9;a.ang=.5*a.an;a.x=a.q7;a.y=a.q8;a.rad=a.q3*sqrt(2);a.x=.5+div(a.x-.5,a.q2);a.y=.5+div(a.y-.5,a.q1);\"},{baseVals:{enabled:1,additive:1,rad:.0277,ang:6.03186,tex_ang:6.03186,tex_zoom:.6839,b:1,r2:1,g2:0,b2:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.an=0;a.q12=0;a.q10=0;a.q11=0;a.q3=0;a.q2=0;a.q1=0;\",frame_eqs_str:\"a.an+=a.q12;a.ang=.5*a.an;a.x=a.q10;a.y=a.q11;a.rad=a.q3*sqrt(2);a.x=.5+div(a.x-.5,a.q2);a.y=.5+div(a.y-.5,a.q1);\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1,additive:1,scaling:2.0231,smoothing:0,r:0},init_eqs_str:\"a.d=0;a.tt2=0;a.res=0;a.tt1=0;a.diff=0;a.tt3=0;a.beat=0;a.vol=0;a.m=0;a.monitor=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.vol=8*a.bass+5*a.mid+3*a.treb;a.m=.97*a.m+.08*a.vol;a.monitor=a.vol;a.beat=above(a.vol,a.res)*above(a.vol,a.m)*above(a.vol,16);a.diff=(1-a.beat)*a.diff+a.beat*(a.vol-a.res);a.res=a.beat*(a.vol+.04*a.m)+(1-a.beat)*(a.res-div(60*(.1+.02*a.diff),a.fps));a.res=Math.max(0,a.res);a.a=a.beat;\",point_eqs_str:\"a.tt3=.6*a.tt3+1*a.value1;a.tt2=.7*a.tt2+.2*a.tt3;a.tt1=.8*a.tt1+.1*a.tt2;a.d=.9*a.d+.2*a.tt1;a.y=.5+a.d*a.sample*(1-a.sample)*2;a.x=-.05+1.1*a.sample;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.q12=0;a.w2=0;a.ref_ang=0;a.du=0;a.x1=0;a.vx3=0;a.q13=0;a.q6=0;a.q1=0;a.q5=0;a.q9=0;a.vx1=0;a.mult=0;a.x3=0;a.q11=0;a.q10=0;a.ang2=0;a.dv=0;a.vr3=0;a.vr2=0;a.q4=0;a.bounce=0;a.vr=0;a.v2r=0;a.w1=0;a.r=0;a.x2=0;a.vy2=0;a.y2=0;a.vy1=0;a.q2=0;a.q14=0;a.dist=0;a.vr1=0;a.v1=0;a.vx2=0;a.q3=0;a.q7=0;a.vy3=0;a.v2=0;a.q8=0;a.x1=.5;a.y1=.6;a.x2=.5;a.y2=.4;a.x3=.5;a.y3=.2;a.vr1=.0001;a.vr2=0;a.vr3=0;a.vx1=0;a.vx2=0;a.vx3=0;\",frame_eqs_str:\"a.zoom=1;a.warp=0;a.wave_a=0;a.r=.03+.004*(a.bass_att+a.treb_att);a.monitor=a.aspecty;a.vr=Math.sin(a.vr1)*a.r;a.bounce=below(a.y1,a.r-.5*(a.aspectx-1));a.y1+=a.vy1;a.vy1=.00001<Math.abs(a.bounce)?.96*Math.abs(a.vy1)+.1*(a.r-a.y1-.5*(a.aspectx-1)):a.vy1-div(.018,a.fps);a.vx1=.00001<Math.abs(a.bounce)?a.vx1+.15*(a.vr-a.vx1):a.vx1;a.vr=.00001<Math.abs(a.bounce)?a.vr+.85*(a.vx1-a.vr):a.vr;a.vr1=Math.asin(div(a.vr,a.r));a.bounce=above(a.x1,1-a.r+.5*(a.aspecty-1));a.vx1=.00001<Math.abs(a.bounce)?\\n.96*-Math.abs(a.vx1)+.1*(1-a.r-a.x1+.5*(a.aspecty-1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?a.vy1+.15*(a.vr-a.vy1):a.vy1;a.vr=.00001<Math.abs(a.bounce)?a.vr+.85*(a.vy1-a.vr):a.vr;a.vr1=Math.asin(div(a.vr,a.r));a.bounce=below(a.x1,a.r-.5*(a.aspecty-1));a.x1+=a.vx1;a.vx1=.00001<Math.abs(a.bounce)?.96*Math.abs(a.vx1)+.1*(a.r-a.x1-.5*(a.aspecty-1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?a.vy1+.15*(-a.vr-a.vy1):a.vy1;a.vr=.00001<Math.abs(a.bounce)?a.vr-.85*(a.vy1+a.vr):a.vr;a.vr1=Math.asin(div(a.vr,a.r));\\na.vr=Math.sin(a.vr2)*a.r;a.bounce=below(a.y2,a.r-.5*(a.aspectx-1));a.y2+=a.vy2;a.vy2=.00001<Math.abs(a.bounce)?.96*Math.abs(a.vy2)+.1*(a.r-a.y2-.5*(a.aspectx-1)):a.vy2-div(.018,a.fps);a.vx2=.00001<Math.abs(a.bounce)?a.vx2+.15*(a.vr-a.vx2):a.vx2;a.vr=.00001<Math.abs(a.bounce)?a.vr+.85*(a.vx2-a.vr):a.vr;a.vr2=Math.asin(div(a.vr,a.r));a.bounce=above(a.x2,1-a.r+.5*(a.aspecty-1));a.vx2=.00001<Math.abs(a.bounce)?.96*-Math.abs(a.vx2)+.1*(1-a.r-a.x2+.5*(a.aspecty-1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?\\na.vy2+.15*(a.vr-a.vy2):a.vy2;a.vr=.00001<Math.abs(a.bounce)?a.vr+.85*(a.vy2-a.vr):a.vr;a.vr2=Math.asin(div(a.vr,a.r));a.bounce=below(a.x2,a.r-.5*(a.aspecty-1));a.x2+=a.vx2;a.vx2=.00001<Math.abs(a.bounce)?.96*Math.abs(a.vx2)+.1*(a.r-a.x2-.5*(a.aspecty-1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?a.vy2+.15*(-a.vr-a.vy2):a.vy2;a.vr=.00001<Math.abs(a.bounce)?a.vr-.85*(a.vy2+a.vr):a.vr;a.vr2=Math.asin(div(a.vr,a.r));a.vr=Math.sin(a.vr3)*a.r;a.bounce=below(a.y3,a.r-.5*(a.aspectx-1));a.y3+=a.vy3;a.vy3=.00001<\\nMath.abs(a.bounce)?.96*Math.abs(a.vy3)+.1*(a.r-a.y3-.5*(a.aspectx-1)):a.vy3-div(.018,a.fps);a.vx3=.00001<Math.abs(a.bounce)?a.vx3+.15*(a.vr-a.vx3):a.vx3;a.vr=.00001<Math.abs(a.bounce)?a.vr+.85*(a.vx3-a.vr):a.vr;a.vr3=Math.asin(div(a.vr,a.r));a.bounce=above(a.x3,1-a.r+.5*(a.aspecty-1));a.vx3=.00001<Math.abs(a.bounce)?.96*-Math.abs(a.vx3)+.1*(1-a.r-a.x3+.5*(a.aspecty-1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?a.vy3+.15*(a.vr-a.vy3):a.vy3;a.vr=.00001<Math.abs(a.bounce)?a.vr+.85*(a.vy3-a.vr):a.vr;a.vr3=\\nMath.asin(div(a.vr,a.r));a.bounce=below(a.x3,a.r-.5*(a.aspecty-1));a.x3+=a.vx3;a.vx3=.00001<Math.abs(a.bounce)?.96*Math.abs(a.vx3)+.1*(a.r-a.x3-.5*(a.aspecty-1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?a.vy3+.15*(-a.vr-a.vy3):a.vy3;a.vr=.00001<Math.abs(a.bounce)?a.vr-.85*(a.vy3+a.vr):a.vr;a.vr3=Math.asin(div(a.vr,a.r));a.bounce=below(sqrt(sqr(a.x1+a.vx1-a.x2-a.vx2)+sqr(a.y1+a.vy1-a.y2-a.vy2)),2*a.r);a.bounce*=below(sqrt(sqr(a.x1+a.vx1-a.x2-a.vx2)+sqr(a.y1+a.vy1-a.y2-a.vy2)),sqrt(sqr(a.x1-a.x2)+sqr(a.y1-\\na.y2)));a.ref_ang=Math.atan2(a.x2-a.x1,a.y2-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*a.vx1+a.vy1*a.vy1);a.v2=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx2,a.vy2);a.vr=Math.sin(a.vr1)*a.r;a.v2r=Math.sin(a.vr2)*a.r;a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.v2r-Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang))+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?\\nMath.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.v2r-Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang))+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy1;a.vx2=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+.1*(a.v2r-a.vr-Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+\\n.1*(a.v2r-a.vr-Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy2;a.vr=.00001<Math.abs(a.bounce)?a.vr+.9*(Math.cos(a.w1-a.ref_ang)*(a.v1-a.v2)-a.vr):a.vr;a.vr1=Math.asin(div(a.vr,a.r));a.v2r=.00001<Math.abs(a.bounce)?a.v2r+.9*(Math.cos(a.w2-a.ref_ang)*(a.v2-a.v1)-a.v2r):a.v2r;a.vr2=Math.asin(div(a.v2r,a.r));a.bounce=below(sqrt(sqr(a.x1+a.vx1-a.x3-a.vx3)+sqr(a.y1+a.vy1-a.y3-a.vy3)),2*a.r);a.bounce*=below(sqrt(sqr(a.x1+\\na.vx1-a.x3-a.vx3)+sqr(a.y1+a.vy1-a.y3-a.vy3)),sqrt(sqr(a.x1-a.x3)+sqr(a.y1-a.y3)));a.ref_ang=Math.atan2(a.x3-a.x1,a.y3-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*a.vx1+a.vy1*a.vy1);a.v2=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx3,a.vy3);a.vr=Math.sin(a.vr1)*a.r;a.v2r=Math.sin(a.vr3)*a.r;a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.v2r-Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang))+Math.sin(a.ref_ang+Math.asin(1))*a.v2*\\nMath.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.v2r-Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang))+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy1;a.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+.1*(a.v2r-a.vr-Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx3;\\na.vy3=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+.1*(a.v2r-a.vr-Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy3;a.vr=.00001<Math.abs(a.bounce)?a.vr+.9*(Math.cos(a.w1-a.ref_ang)*(a.v1-a.v2)-a.vr):a.vr;a.vr1=Math.asin(div(a.vr,a.r));a.v2r=.00001<Math.abs(a.bounce)?a.v2r+.9*(Math.cos(a.w2-a.ref_ang)*(a.v2-a.v1)-a.v2r):a.v2r;a.vr3=Math.asin(div(a.v2r,a.r));a.bounce=below(sqrt(sqr(a.x3+\\na.vx3-a.x2-a.vx2)+sqr(a.y3+a.vy3-a.y2-a.vy2)),2*a.r);a.bounce*=below(sqrt(sqr(a.x2+a.vx2-a.x3-a.vx3)+sqr(a.y2+a.vy2-a.y3-a.vy3)),sqrt(sqr(a.x2-a.x3)+sqr(a.y2-a.y3)));a.ref_ang=Math.atan2(a.x2-a.x3,a.y2-a.y3)+Math.asin(1);a.v1=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.v2=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.w1=Math.atan2(a.vx3,a.vy3);a.w2=Math.atan2(a.vx2,a.vy2);a.vr=Math.sin(a.vr3)*a.r;a.v2r=Math.sin(a.vr2)*a.r;a.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.v2r-Math.sin(a.ref_ang)*\\na.v1*Math.cos(a.w1-a.ref_ang))+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.v2r-Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang))+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy3;a.vx2=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+.1*(a.v2r-a.vr-Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))+Math.sin(a.ref_ang+\\nMath.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+.1*(a.v2r-a.vr-Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy2;a.vr=.00001<Math.abs(a.bounce)?a.vr+.9*(Math.cos(a.w1-a.ref_ang)*(a.v1-a.v2)-a.vr):a.vr;a.vr3=Math.asin(div(a.vr,a.r));a.v2r=.00001<Math.abs(a.bounce)?a.v2r+.9*(Math.cos(a.w2-a.ref_ang)*(a.v2-a.v1)-a.v2r):a.v2r;\\na.vr2=Math.asin(div(a.v2r,a.r));a.q1=a.aspectx;a.q2=a.aspecty;a.q3=2*a.r;a.q4=a.x1;a.q5=a.y1;a.q6=a.vr1;a.q7=a.x2;a.q8=a.y2;a.q9=a.vr2;a.q10=a.x3;a.q11=a.y3;a.q12=a.vr3;a.q13=Math.atan2(div(a.x1+a.x2+a.x3,3)-.5,div(a.y1+a.y2+a.y3,3)-.5);a.q14=.2*sigmoid(sqrt(sqr(div(a.x1+a.x2+a.x3,3)-.5)+sqr(div(a.y1+a.y2+a.y3,3)-.5)),2);\",pixel_eqs_str:\"a.du=2*a.x-1-div(2*(a.q4+a.q7+a.q10-1.5),3);a.dv=2*a.y-1+div(2*(a.q5+a.q8+a.q11-1.5),3);a.dist=sqrt(a.du*a.du+a.dv*a.dv);a.ang2=Math.atan2(a.du,a.dv);a.mult=.4*Math.sin(.05*a.dist)*a.q14;a.dx=a.mult*Math.sin(2*a.ang2+a.q13)*a.aspectx;a.dy=a.mult*Math.cos(2*a.ang2+a.q13)*a.aspecty;\",warp:\" shader_body { \\n  float n_1;\\n  vec3 ret_2;\\n  vec4 tmpvar_3;\\n  tmpvar_3 = texture (sampler_pw_main, uv);\\n  ret_2 = tmpvar_3.xyz;\\n  n_1 = (clamp ((texture (sampler_pw_main, \\n    (uv + texsize.zw)\\n  ).x * 999.0), 0.0, 1.0) + clamp ((texture (sampler_pw_main, \\n    (uv + (texsize.zw * vec2(1.0, 0.0)))\\n  ).x * 999.0), 0.0, 1.0));\\n  n_1 = (n_1 + clamp ((texture (sampler_pw_main, \\n    (uv + (texsize.zw * vec2(1.0, -1.0)))\\n  ).x * 999.0), 0.0, 1.0));\\n  n_1 = (n_1 + clamp ((texture (sampler_pw_main, \\n    (uv + (texsize.zw * vec2(0.0, 1.0)))\\n  ).x * 999.0), 0.0, 1.0));\\n  n_1 = (n_1 + clamp ((texture (sampler_pw_main, \\n    (uv + (texsize.zw * vec2(0.0, -1.0)))\\n  ).x * 999.0), 0.0, 1.0));\\n  n_1 = (n_1 + clamp ((texture (sampler_pw_main, \\n    (uv + (texsize.zw * vec2(-1.0, 1.0)))\\n  ).x * 999.0), 0.0, 1.0));\\n  n_1 = (n_1 + clamp ((texture (sampler_pw_main, \\n    (uv + (texsize.zw * vec2(-1.0, 0.0)))\\n  ).x * 999.0), 0.0, 1.0));\\n  n_1 = (n_1 + clamp ((texture (sampler_pw_main, \\n    (uv - texsize.zw)\\n  ).x * 999.0), 0.0, 1.0));\\n  if ((n_1 < 1.9)) {\\n    ret_2 = (tmpvar_3.xyz - 0.4);\\n  };\\n  if ((n_1 > 3.1)) {\\n    ret_2 = (ret_2 - 0.4);\\n  };\\n  bool tmpvar_4;\\n  if ((ret_2.x < 0.1)) {\\n    tmpvar_4 = (abs((n_1 - 3.0)) < 0.5);\\n  } else {\\n    tmpvar_4 = bool(0);\\n  };\\n  if (tmpvar_4) {\\n    ret_2 = (ret_2 + 0.4);\\n  };\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = ret_2;\\n  ret = tmpvar_5.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret2_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (texsize.zw * 8.0);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1)).y;\\n  tmpvar_4.y = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1)).y;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (uv + (tmpvar_4 * 0.55));\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_blur3, uv);\\n  ret_2 = (vec3((0.25 * dot (\\n    clamp ((2.0 * ((tmpvar_6.xyz * scale3) + bias3)), 0.0, 1.0)\\n  , vec3(0.32, 0.49, 0.29)))) - (0.8 * dot (\\n    clamp (((20.0 * (\\n      (0.6 * ((texture (sampler_blur2, uv).xyz * scale2) + bias2))\\n     - 0.01)) - 2.0), 0.0, 1.0)\\n  , vec3(0.32, 0.49, 0.29))));\\n  vec4 tmpvar_7;\\n  tmpvar_7 = texture (sampler_blur1, uv);\\n  ret_2 = (ret_2 + dot (clamp (\\n    ((30.0 * ((texture (sampler_main, uv).xyz + \\n      (((tmpvar_7.xyz * scale1) + bias1) * 0.15)\\n    ) - 0.01)) - 2.0)\\n  , 0.0, 1.0), vec3(0.32, 0.49, 0.29)));\\n  ret_2 = (ret_2 + 1.0);\\n  vec3 tmpvar_8;\\n  tmpvar_8 = mix (ret_2, (ret_2 * (\\n    ((texture (sampler_blur3, tmpvar_5).xyz * scale3) + bias3)\\n   - \\n    ((texture (sampler_blur1, tmpvar_5).xyz * scale1) + bias1)\\n  )), pow (hue_shader, ret_2));\\n  ret2_1 = (vec3((-0.5 * dot (\\n    ((texture (sampler_blur3, tmpvar_5).xyz * scale3) + bias3)\\n  , vec3(0.32, 0.49, 0.29)))) + (0.8 * (\\n    (texture (sampler_blur1, tmpvar_5).xyz * scale1)\\n   + bias1)));\\n  ret2_1 = (ret2_1 - (0.9 * texture (sampler_main, tmpvar_5).xyz));\\n  ret2_1 = (ret2_1 - 1.5);\\n  vec3 tmpvar_9;\\n  tmpvar_9 = mix (ret2_1, (ret2_1 * (\\n    ((tmpvar_6.xyz * scale3) + bias3)\\n   - \\n    ((tmpvar_7.xyz * scale1) + bias1)\\n  )), pow (hue_shader.zxy, tmpvar_8));\\n  ret2_1 = tmpvar_9;\\n  vec3 tmpvar_10;\\n  tmpvar_10 = abs((tmpvar_8 - tmpvar_9));\\n  ret_2 = (tmpvar_10 * tmpvar_10);\\n  ret_2 = (ret_2 * 1.15);\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = ret_2;\\n  ret = tmpvar_11.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1,decay:.9,echo_zoom:1,wave_brighten:0,wrap:0,wave_a:.001,wave_scale:5.715,wave_smoothing:.9,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.162,warpscale:5.582,zoomexp:.32104,zoom:.9901,warp:.11563,wave_r:0,wave_g:0,wave_b:0,ob_size:0,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,thickoutline:1,textured:1,rad:.05343,tex_zoom:12.77228,g:1,b:1,a:0,r2:1,b2:1,a2:1,border_g:0,border_a:0},init_eqs_str:\"a.vx=0;a.vy=0;\",frame_eqs_str:\"\"},{baseVals:{enabled:1,sides:100,textured:1,y:.75,rad:.46753,g:1,b:1,r2:1,b2:1,border_a:0},init_eqs_str:\"a.w=0;a.q1=0;\",frame_eqs_str:\"a.w=4*-Math.atan2(.5,a.q1)+4*Math.asin(1);a.ang=a.w;a.x=.5+.19*Math.sin(a.w);a.y=.5+.26*Math.cos(a.w);\"},{baseVals:{enabled:1,sides:100,textured:1,y:.75,rad:.46753,g:1,b:1,r2:1,b2:1,border_a:0},init_eqs_str:\"a.w=0;a.q1=0;\",frame_eqs_str:\"a.w=4*-Math.atan2(.5,a.q1)+4*Math.asin(1)+div(2*Math.asin(1),3);a.ang=a.w;a.x=.5+.19*Math.sin(a.w);a.y=.5+.26*Math.cos(a.w);\"},{baseVals:{enabled:1,sides:100,textured:1,y:.75,rad:.46753,g:1,b:1,r2:1,b2:1,border_a:0},init_eqs_str:\"a.w=0;a.q1=0;\",frame_eqs_str:\"a.w=4*-Math.atan2(.5,a.q1)+4*Math.asin(1)-div(2*Math.asin(1),3);a.ang=a.w;a.x=.5+.19*Math.sin(a.w);a.y=.5+.26*Math.cos(a.w);\"}],waves:[{baseVals:{enabled:1,usedots:1,thick:1,additive:1,scaling:2.44415,smoothing:0},init_eqs_str:\"a.d=0;a.n=0;a.y1=0;a.xx=0;a.z=0;a.w=0;a.t5=0;a.t1=0;a.x1=0;a.cl3=0;a.j3=0;a.cl2=0;a.zoom=0;a.j=0;a.cl1=0;a.t8=0;a.v=0;a.t3=0;a.t6=0;a.pi3=0;a.t7=0;a.c2=0;a.j2=0;a.s3=0;a.t=0;a.k=0;a.zz=0;a.c3=0;a.t2=0;a.bb=0;a.s1=0;a.s2=0;a.t4=0;a.yy=0;a.c=0;a.c1=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.t1=0;a.v=.01;a.j+=.01*a.bass;a.j2+=.01*a.mid_att;a.j3+=.01*a.treb_att;a.t2=a.j;a.t3=a.j2;a.t4=a.j3;a.k=.99*a.k+div(10*a.mid,a.fps);a.t5=-a.k;a.cl1=a.cl1-.0005-.003*a.bass;a.cl1=.00001<Math.abs(above(a.cl1,1))?0:a.cl1;a.cl1=.00001<Math.abs(below(a.cl1,0))?1:a.cl1;a.t8=a.cl1;a.cl2=a.cl2+.0001+.001*a.mid-.0005*a.bass-.0005*a.treb;a.cl2=.00001<Math.abs(above(a.cl2,1))?0:a.cl2;a.cl2=.00001<Math.abs(below(a.cl2,0))?1:a.cl2;a.t7=a.cl2;a.cl3=a.cl3+.0001+.001*a.treb-.0005*a.bass-.0005*\\na.mid;a.cl3=.00001<Math.abs(above(a.cl3,1))?0:a.cl3;a.cl3=.00001<Math.abs(below(a.cl3,0))?1:a.cl3;a.t6=a.cl3;\",point_eqs_str:\"a.xx=div(mod(983624912364*a.sample,1E7)+100,1E7);a.yy=div(mod(1896575575*a.xx,1E7)+100,1E7);a.zz=div(mod(58652340875*a.yy,1E7)+100,1E7);a.d=sqrt(sqr(a.xx)+sqr(a.yy)+sqr(a.zz));a.zz=a.zz+a.t8-(.00001<Math.abs(above(a.zz+a.t8,1))?1:0)-.5;a.xx=a.xx+a.t7-(.00001<Math.abs(above(a.xx+a.t7,1))?1:0)-.5;a.yy=a.yy+a.t6-(.00001<Math.abs(above(a.yy+a.t6,1))?1:0)-.5;a.v=.001;a.w=1;a.bb=a.d*a.d*.5;a.n=.3;a.s1=Math.sin(Math.sin(a.t2*a.w+a.bb)*a.n);a.s2=Math.sin(Math.sin(a.t3*a.w+a.bb)*a.n);\\na.s3=Math.sin(Math.sin(a.t4*a.w+a.bb)*a.n);a.c1=Math.cos(Math.sin(a.t2*a.w+a.bb)*a.n);a.c2=Math.cos(Math.sin(a.t3*a.w+a.bb)*a.n);a.c3=Math.cos(Math.sin(a.t4*a.w+a.bb)*a.n);a.z=(a.c3*a.s1*a.c2+a.s3*a.s2)*a.xx-(a.c3*a.s1*a.s2-a.s3*a.c2)*a.yy+a.c3*a.c1*a.zz;a.x1=a.c1*a.c2*a.xx+a.c1*a.s2*a.yy-a.s1*a.zz;a.y1=(a.s3*a.s1*a.c2-a.c3*a.s2)*a.xx+(a.s3*a.s1*a.s2+a.c3*a.c2)*a.yy+a.s3*a.c1*a.zz;a.zoom=.5*div(1,a.z+.5);a.x=.5+a.zoom*a.x1+0*Math.sin(.1*a.time);a.y=.5+a.zoom*a.y1+0*Math.cos(.16801*a.time);a.pi3=2.0941239;\\na.t=2*a.z+1*a.t2;a.c=3;a.r=Math.sin(a.t)*a.c;a.g=Math.sin(a.t+a.pi3)*a.c;a.b=Math.sin(a.t-a.pi3)*a.c;a.r=.00001<Math.abs(above(a.r,1))?1:a.r;a.r=.00001<Math.abs(below(a.r,0))?0:a.r;a.g=.00001<Math.abs(above(a.g,1))?1:a.g;a.g=.00001<Math.abs(below(a.g,0))?0:a.g;a.b=.00001<Math.abs(above(a.b,1))?1:a.b;a.b=.00001<Math.abs(below(a.b,0))?0:a.b;a.a=-a.z+.7;\"},{baseVals:{enabled:1,thick:1,scaling:2.44415,smoothing:0,a:.05},init_eqs_str:\"a.t8=0;a.q1=0;a.pi3=0;a.t=0;a.q4=0;a.q6=0;a.c=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.t8=1;\",point_eqs_str:\"a.t8=-a.t8;a.y=.48*a.sample;a.x=.5+.04*a.t8-a.t8*a.sample*.02+(sqr(2*a.sample-1)-1)*a.q1*.5;a.pi3=2.0941239;a.t=10*-(a.q4-a.q6)+a.sample*Math.asin(1)*4.01;a.c=9;a.r=Math.sin(a.t)*a.c;a.g=Math.sin(a.t+a.pi3)*a.c;a.b=Math.sin(a.t-a.pi3)*a.c;a.r=.00001<Math.abs(above(a.r,1))?1:a.r;a.r=.00001<Math.abs(below(a.r,0))?0:a.r;a.g=.00001<Math.abs(above(a.g,1))?1:a.g;a.g=.00001<Math.abs(below(a.g,0))?0:a.g;a.b=.00001<Math.abs(above(a.b,1))?1:a.b;a.b=.00001<Math.abs(below(a.b,0))?0:a.b;\\n\"},{baseVals:{enabled:1,samples:49,scaling:2.44415,smoothing:0,r:0,g:0,b:0},init_eqs_str:\"a.t8=0;a.q1=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.t8=1;\",point_eqs_str:\"a.t8=-1;a.y=.48*a.sample;a.x=.5+.04*a.t8-a.t8*a.sample*.02+(sqr(2*a.sample-1)-1)*a.q1*.5;\"},{baseVals:{enabled:1,samples:49,scaling:2.44415,smoothing:0,r:0,g:0,b:0},init_eqs_str:\"a.t8=0;a.q1=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.t8=1;\",point_eqs_str:\"a.t8=1;a.y=.48*a.sample;a.x=.5+.04*a.t8-a.t8*a.sample*.02+(sqr(2*a.sample-1)-1)*a.q1*.5;\"}],init_eqs_str:\"a.d=0;a.vt=0;a.q6=0;a.q1=0;a.q5=0;a.vb=0;a.q9=0;a.v=0;a.mm=0;a.tt=0;a.q4=0;a.bb=0;a.q2=0;a.q3=0;a.vvm=0;a.vvb=0;a.vm=0;a.vvt=0;a.x1=0;a.y1=0;\",frame_eqs_str:\"a.zoom=1;a.q1=.1*(a.bass-a.treb);a.vvb=.00001<Math.abs(below(a.vvb,0))?0:a.vvb;a.vvm=.00001<Math.abs(below(a.vvm,0))?0:a.vvm;a.vvt=.00001<Math.abs(below(a.vvt,0))?0:a.vvt;a.vb=.85*a.vb+(1-a.vb)*pow(a.bass,2)*.001;a.vvb=.95*a.vvb+(1-a.vvb)*a.vb*.2;a.vm=.85*a.vm+(1-a.vm)*pow(a.mid,2)*.01;a.vvm=.95*a.vvm+(1-a.vvm)*a.vm*.2;a.vt=.85*a.vt+(1-a.vt)*pow(a.treb,2)*.001;a.vvt=.95*a.vvt+(1-a.vvt)*a.vt*.2;a.q1=(a.vvb-a.vvt)*a.vvm;a.q2=a.vvm;a.q3=a.vvt;a.v=.2;a.d=0;a.bb=a.bb+a.vvb*a.v-a.d;\\na.mm=a.mm+a.vvm*a.v-a.d;a.tt=a.tt+a.vvt*a.v-a.d;a.q4=a.bb;a.q5=a.mm;a.q6=a.tt;a.q4=.00001<Math.abs(above(Math.abs(a.q1),.02))?.99:1;a.q9=.5+.5*Math.sin(.14*a.time);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_fc_main, uv) * q4).xyz;\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1.x = 0.5;\\n  tmpvar_1.y = (1.0 - q9);\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (uv_orig - tmpvar_1);\\n  float tmpvar_3;\\n  tmpvar_3 = (3.0 / tmpvar_2.y);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = ((tmpvar_2.x * tmpvar_3) * q9);\\n  tmpvar_4.y = (tmpvar_3 * q9);\\n  vec4 tmpvar_5;\\n  tmpvar_5 = texture (sampler_main, fract(((1.0 - \\n    abs(((fract(\\n      ((tmpvar_2 + vec2(0.5, 1.0)) * 0.5)\\n    ) * 2.0) - 1.0))\\n  ) - (\\n    ((texture (sampler_noise_hq, ((tmpvar_4 * 0.05) + (vec2(0.1, -0.05) * time))) - 0.5) * float(int((tmpvar_2.y > 0.0))))\\n  .xy * 0.025))));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = (((tmpvar_5.xyz * tmpvar_5.xyz) * 1.4) - 0.04);\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.56,decay:1,echo_zoom:.362,echo_orient:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:1.599,wave_smoothing:0,wave_mystery:-.5,modwavealphastart:2,modwavealphaend:2,warpscale:.107,zoomexp:.1584,fshader:1,warp:.01,wave_r:.51,wave_g:.5,ob_size:0,ob_a:1,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:.5,mv_r:0,mv_g:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.y3=0;a.y1=0;a.xx=0;a.s=0;a.t1=0;a.x1=0;a.vx3=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.v=0;a.vx4=0;a.mm=0;a.tt=0;a.grav=0;a.x3=0;a.xx2=0;a.q4=0;a.a=0;a.yy1=0;a.vy4=0;a.dir=0;a.bounce=0;a.x4=0;a.r=0;a.x2=0;a.mx=0;a.mn=0;a.vy2=0;a.y2=0;a.bb=0;a.q2=0;a.m1=0;a.spring=0;a.vx2=0;a.q3=0;a.resist=0;a.yy=0;a.y4=0;a.vy3=0;a.xx1=0;a.b1=0;a.q8=0;\",frame_eqs_str:\"a.ib_r=.3*Math.sin(5*a.time)+.7;a.ib_g=.3*Math.sin(4*a.time)+.3;a.ib_b=.5*Math.sin(4*div(a.time,3))+.5;a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+2*(a.xx1-a.xx2);a.y1=.4+a.yy1;a.x1=Math.max(0,Math.min(1,a.x1));a.y1=Math.max(0,Math.min(1,a.y1));a.spring=10;a.grav=.5;a.resist=1;a.bounce=.75;a.dt=.0002*div(60,a.fps);a.vx2=a.vx2*(1-a.resist*a.dt)+a.dt*(a.x1+a.x3-2*a.x2)*a.spring;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*((a.y1+a.y3-\\n2*a.y2)*a.spring-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*(a.x2+a.x4-2*a.x3)*a.spring;a.vy3=a.vy3*(1-a.resist*a.dt)+a.dt*((a.y2+a.y4-2*a.y3)*a.spring-a.grav);a.vx4=a.vx4*(1-a.resist*a.dt)+a.dt*(a.x3-a.x4)*a.spring;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*((a.y3-a.y4)*a.spring-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<\\nMath.abs(above(a.x3,0))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:-Math.abs(a.vx3)*a.bounce;a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:Math.abs(a.vx4)*a.bounce;a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?\\na.vy3:-Math.abs(a.vy3)*a.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<Math.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q4=a.x4;a.q8=a.y4;a.q1=a.aspectx;a.q2=a.aspecty;a.zoom=1;a.warp=0;a.bb=.99*a.bb+.02*a.bass;a.mm=.99*a.mm+.02*a.mid;a.tt=.99*a.tt+.02*a.treb;a.mx=Math.max(Math.max(a.bb,a.mm),a.tt);a.mn=Math.min(Math.min(a.bb,a.mm),a.tt);a.ob_r=div(a.bb-a.mn,a.mx-a.mn);a.ob_b=div(a.mm-a.mn,a.mx-a.mn);a.ob_g=div(a.tt-a.mn,a.mx-a.mn);a.q6=Math.atan2(a.vx4,\\na.vy4);a.q5=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.a=.95*a.a+a.q5;a.s=.9*a.s+a.a;a.q3=.1*a.s;a.monitor=a.s;a.wave_a=0;\",pixel_eqs_str:\"a.x=.5+(a.x-.5)*a.q1;a.y=.5+(a.y-.5)*a.q2;a.dir=-a.q6+0*Math.asin(1);a.b1=.1;a.m1=25*a.q5;a.t1=.05;a.xx=a.q4;a.yy=1-a.q8;a.dx=0;a.dy=0;a.d=sqrt((a.x-a.xx)*(a.x-a.xx)+(a.y-a.yy)*(a.y-a.yy));a.r=.05;a.v=-35*a.q5;a.dx=a.v*Math.sin(a.dir)*(a.r-a.d)*(1-sigmoid(a.d-a.r,200))*a.q2;a.dy=a.v*Math.cos(a.dir)*(a.r-a.d)*(1-sigmoid(a.d-a.r,200))*a.q1;\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  tmpvar_1.xyz = ((texture (sampler_main, clamp (\\n    (uv - (((vec2(0.0, 32.0) * texsize.zw) * dot (\\n      (tmpvar_2.xyz - 0.35)\\n    , vec3(0.32, 0.49, 0.29))) * (dot (tmpvar_2.xyz, vec3(0.32, 0.49, 0.29)) - 0.4)))\\n  , 0.0, 1.0)).xyz - 0.0011) + ((texture (sampler_noise_lq, \\n    (((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 1.5)) + rand_frame.xy)\\n  ) - 0.5) * 0.0038).xyz);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv1_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.y = 0.0;\\n  tmpvar_2.x = texsize.z;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = 0.0;\\n  tmpvar_3.y = texsize.w;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (texture (sampler_main, (uv - tmpvar_2)).xyz - texture (sampler_main, (uv + tmpvar_2)).xyz).x;\\n  tmpvar_4.y = (texture (sampler_main, (uv - tmpvar_3)).xyz - texture (sampler_main, (uv + tmpvar_3)).xyz).x;\\n  uv1_1 = ((0.3 * cos(\\n    ((uv - 0.5) * 2.0)\\n  )) - tmpvar_4);\\n  float tmpvar_5;\\n  tmpvar_5 = clamp ((0.04 / sqrt(\\n    dot (uv1_1, uv1_1)\\n  )), 0.0, 1.0);\\n  uv1_1 = ((0.3 * cos(\\n    (uv1_1 * 12.0)\\n  )) - (9.0 * tmpvar_4));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = (tmpvar_5 + ((texture (sampler_main, uv).xyz * 12.0) * vec3(clamp (\\n    (0.04 / sqrt(dot (uv1_1, uv1_1)))\\n  , 0.0, 1.0))));\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,modwavealphabyvolume:1,wave_a:.207,wave_scale:.397,wave_smoothing:0,wave_mystery:.24,modwavealphaend:1.17,warpscale:16.016,zoomexp:11.56276,zoom:1.05971,warp:.13126,ob_size:.005,ob_a:1,ib_size:0,mv_x:64,mv_y:48,mv_l:0,mv_r:.35,mv_g:.35,mv_b:.35,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.cx1=0;a.y3=0;a.y1=0;a.cy1=0;a.x1=0;a.vx3=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.v=0;a.vx4=0;a.grav=0;a.x3=0;a.xx2=0;a.q4=0;a.yy1=0;a.vy4=0;a.dir=0;a.bounce=0;a.x4=0;a.r=0;a.x2=0;a.vy2=0;a.y2=0;a.q2=0;a.spring=0;a.vx2=0;a.q3=0;a.resist=0;a.y4=0;a.q7=0;a.vy3=0;a.xx1=0;a.q8=0;\",frame_eqs_str:\"a.decay=1;a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+1.5*(a.xx1-a.xx2);a.y1=.5+a.yy1;a.spring=18;a.grav=1;a.resist=5;a.bounce=.9;a.dt=.0003;a.vx2=a.vx2*(1-a.resist*a.dt)+a.dt*(a.x1+a.x3-2*a.x2)*a.spring;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*((a.y1+a.y3-2*a.y2)*a.spring-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*(a.x2+a.x4-2*a.x3)*a.spring;a.vy3=a.vy3*(1-a.resist*a.dt)+a.dt*((a.y2+a.y4-2*a.y3)*a.spring-a.grav);a.vx4=a.vx4*(1-\\na.resist*a.dt)+a.dt*(a.x3-a.x4)*a.spring;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*((a.y3-a.y4)*a.spring-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<Math.abs(above(a.x3,0))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:-Math.abs(a.vx3)*a.bounce;a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:Math.abs(a.vx4)*\\na.bounce;a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:-Math.abs(a.vy3)*a.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<Math.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q1=a.x1;a.q2=\\na.x2;a.q3=a.x3;a.q4=a.x4;a.q5=a.y1;a.q6=a.y2;a.q7=a.y3;a.q8=a.y4;a.q6=Math.atan2(a.vx4,a.vy4);a.q5=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.zoom=1.001;a.rot=0;a.warp=.2;a.wave_a=0;\",pixel_eqs_str:\"a.r=.2;a.cx1=a.q4;a.cy1=a.q5;a.d=sqrt((a.x-a.cx1)*(a.x-a.cx1)+(a.y-a.cy1)*(a.y-a.cy1));a.dir=-(a.r*a.r-a.d*a.d)*a.q3;a.x1=.00001<Math.abs(above(a.d,a.r))?0:Math.sin(a.y-a.cy1)*a.dir;a.y1=.00001<Math.abs(above(a.d,a.r))?0:-Math.sin(a.x-a.cx1)*a.dir;a.v=1;a.dx=a.x1*a.v;a.dy=a.y1*a.v;\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret_2;\\n  uv_1 = (0.5 + ((uv - 0.5) * 1.002));\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (texsize.zw * 8.0);\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv_1 + (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_1 - (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_blur1, \\n    (uv_1 + (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_1 - (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = tmpvar_4.x;\\n  tmpvar_6.y = tmpvar_5.x;\\n  vec2 tmpvar_7;\\n  tmpvar_7 = fract(((0.5 + \\n    (uv_1 - 0.5)\\n  ) - (tmpvar_6 * texsize.zw)));\\n  ret_2.x = texture (sampler_main, tmpvar_7).x;\\n  ret_2.x = (ret_2.x + ((\\n    (ret_2.x - ((texture (sampler_blur2, tmpvar_7).xyz * scale2) + bias2))\\n  .x * 0.4) + 0.006));\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_5.x;\\n  tmpvar_8.y = -(tmpvar_4.x);\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_4.z;\\n  tmpvar_9.y = tmpvar_5.z;\\n  ret_2.z = max ((clamp (\\n    (((texture (sampler_blur1, uv_1).xyz * scale1) + bias1).x - 0.3)\\n  , 0.0, 1.0) * 2.0), (texture (sampler_fc_main, (\\n    (uv_1 - ((tmpvar_8 * texsize.zw) * 8.0))\\n   + \\n    ((tmpvar_9 * texsize.zw) * 4.0)\\n  )).z - 0.008));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_4.y;\\n  tmpvar_10.y = tmpvar_5.y;\\n  ret_2.y = max (ret_2.x, (texture (sampler_fc_main, (uv_1 + \\n    (tmpvar_10 * texsize.zw)\\n  )).y - 0.016));\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = ret_2;\\n  ret = tmpvar_11.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 6.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = dot (tmpvar_3, vec3(0.32, 0.49, 0.29));\\n  tmpvar_5.y = dot (tmpvar_4, vec3(0.32, 0.49, 0.29));\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv - (0.25 * tmpvar_5));\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = dot (tmpvar_3, vec3(0.32, 0.49, 0.29));\\n  tmpvar_7.y = dot (tmpvar_4, vec3(0.32, 0.49, 0.29));\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (uv + (0.25 * tmpvar_7));\\n  ret_1 = ((0.8 * (\\n    (texture (sampler_blur3, tmpvar_6).xyz * scale3)\\n   + bias3)) - ((texture (sampler_blur1, tmpvar_6).xyz * scale1) + bias1));\\n  ret_1 = (ret_1 + (0.6 * (\\n    (texture (sampler_blur1, uv).xyz * scale1)\\n   + bias1)));\\n  ret_1 = (ret_1 - ((\\n    (texture (sampler_blur2, tmpvar_8).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur1, tmpvar_8).xyz * scale1)\\n   + bias1)));\\n  ret_1 = (ret_1 + ((1.2 * texture (sampler_main, tmpvar_8).xyz) + (0.15 * \\n    ((texture (sampler_blur1, tmpvar_8).xyz * scale1) + bias1)\\n  )));\\n  ret_1 = (ret_1 + 1.0);\\n  float tmpvar_9;\\n  tmpvar_9 = dot (ret_1, vec3(0.32, 0.49, 0.29));\\n  ret_1 = (mix (vec3(tmpvar_9), (\\n    (0.75 * vec3(tmpvar_9))\\n   * \\n    dot ((((0.6 * \\n      ((texture (sampler_blur3, tmpvar_6).xyz * scale3) + bias3)\\n    ) - (0.7 * texture (sampler_main, uv).xyz)) - (0.3 * (\\n      (texture (sampler_blur1, tmpvar_8).xyz * scale1)\\n     + bias1))), vec3(0.32, 0.49, 0.29))\\n  ), pow (hue_shader, vec3(tmpvar_9))) * 0.9);\\n  ret_1 = (ret_1 * ret_1);\\n  vec3 tmpvar_10;\\n  tmpvar_10 = sqrt(ret_1);\\n  ret_1 = tmpvar_10;\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = tmpvar_10;\\n  ret = tmpvar_11.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1,wave_thick:1,wrap:0,wave_a:.004,wave_scale:9.731,wave_smoothing:0,wave_mystery:1,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.442,warpscale:7.315,zoomexp:1.50374,warp:.08563,wave_y:.04,ob_size:0,ob_g:1,ob_a:1,ib_size:0,ib_r:1,ib_g:0,ib_b:.75,ib_a:1,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:3,additive:1,num_inst:400,rad:.16283,tex_zoom:.73458,g:1,b:1,a:.5,g2:0,border_a:0},init_eqs_str:\"a.bending=0;a.ppo=0;a.index=0;a.i3=0;a.dir=0;a.i4=0;a.size=0;a.q2=0;a.q32=0;a.sample=0;a.i3=0;a.i4=0;\",frame_eqs_str:\"a.i3=.00001<Math.abs(equal(a.instance,0))?0:a.i3;a.i4=.00001<Math.abs(equal(a.instance,0))?0:a.i4;a.ppo=8;a.index=a.i4*a.q32;a.sample=mod(a.i3,a.ppo);a.size=40*a.gmegabuf[Math.floor(a.index+4)];a.x=a.gmegabuf[Math.floor(a.index)];a.y=a.gmegabuf[Math.floor(a.index+1)];a.ang=a.gmegabuf[Math.floor(a.index+9)];a.rad=.05*a.size;a.r=a.gmegabuf[Math.floor(a.index+5)];a.g=a.gmegabuf[Math.floor(a.index+6)];a.b=a.gmegabuf[Math.floor(a.index+7)];a.sample=div(a.sample,a.ppo);a.bending=\\n5*a.gmegabuf[Math.floor(a.index+12)]+5*a.gmegabuf[Math.floor(a.index+10)];a.dir=-a.ang+(a.sample-.4)*a.bending;a.ang=1.5*Math.asin(1)-a.dir+.05*a.bending;a.x+=.06*(a.sample-.3)*Math.cos(a.dir)*a.size+Math.sin(a.dir)*a.size*a.bending*.01;a.y+=.06*(a.sample-.3)*Math.sin(a.dir)*a.size-Math.cos(a.dir)*a.size*a.bending*.01;a.x=.5+div(a.x-.5,a.q2);a.rad=1.5*a.rad-.05*a.sample*a.size;a.i3+=1;a.i4=.00001<Math.abs(equal(mod(a.i3,a.ppo),0))?a.i4+1:a.i4;\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:1,samples:65,spectrum:1,usedots:1,thick:1,additive:1,scaling:.33408,smoothing:0,a:0},init_eqs_str:\"a.d=0;a.q32=0;a.t8=0;a.t1=0;a.t2=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.t8=1;a.t1=.5;a.t2=.9;\",point_eqs_str:\"a.d=0;a.y=.2+a.value1+a.value2;a.x=.9-.8*a.sample;a.gmegabuf[Math.floor((64*a.sample-1)*a.q32+14)]=a.value1+a.value2;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.fric=0;a.d=0;a.nliststart=0;a.w=0;a.random=0;a.index2=0;a.index=0;a.w2=0;a.rotatefactor=0;a.ref_ang=0;a.smaller=0;a.dt=0;a.q1=0;a.j=0;a.v=0;a.count=0;a.shock=0;a.nn=0;a.vrr=0;a.check=0;a.gravity=0;a.vr2=0;a.direction=0;a.bouncefactor=0;a.smallestfind=0;a.distance=0;a.bounce=0;a.vr=0;a.vv1=0;a.vv2=0;a.vrr2=0;a.w1=0;a.attributes=0;a.i=0;a.m2=0;a.hit=0;a.q2=0;a.m1=0;a.h=0;a.v1=0;a.acceleration=0;a.findindex=0;a.friction=0;a.pi2=0;a.sample=0;a.v2=0;a.dampening=0;for(var b=a.i=\\n0;1048576>b;b++)a.gmegabuf[Math.floor(a.i)]=0,a.i+=1;a.count=50;a.attributes=32;a.nliststart=24;a.minradius=.004;a.maxradius=.04;a.v=0;for(b=a.index=0;b<a.count;b++)a.gmegabuf[Math.floor(a.index*a.attributes)]=div(randint(1E3),1E3),a.gmegabuf[Math.floor(a.index*a.attributes+1)]=div(randint(1E3),1E3),a.gmegabuf[Math.floor(a.index*a.attributes+2)]=a.v*(div(randint(1E3),1E3)-.5),a.gmegabuf[Math.floor(a.index*a.attributes+3)]=a.v*(div(randint(1E3),1E3)-.5),a.gmegabuf[Math.floor(a.index*a.attributes+4)]=\\na.minradius+div((a.maxradius-a.minradius)*(a.index+1),a.count),a.gmegabuf[Math.floor(a.index*a.attributes+5)]=0,a.gmegabuf[Math.floor(a.index*a.attributes+6)]=1,a.gmegabuf[Math.floor(a.index*a.attributes+7)]=1,a.gmegabuf[Math.floor(a.index*a.attributes+8)]=pow(a.gmegabuf[Math.floor(a.index*a.attributes+4)],3),a.gmegabuf[Math.floor(a.index*a.attributes+9)]=div(4*Math.asin(1)*randint(1E3),1E3),a.gmegabuf[Math.floor(a.index*a.attributes+10)]=0,a.gmegabuf[Math.floor(a.index*a.attributes+13)]=div(a.index,\\na.count-1),a.gmegabuf[Math.floor(a.index*a.attributes+14)]=0,a.index+=1;a.q30=a.nliststart;a.q31=a.count;a.q32=a.attributes;\",frame_eqs_str:\"a.dt=div(1,a.fps);a.warp=0;a.zoom=1;a.wave_a=0;a.gravity=0*a.dt;a.dampening=0;a.friction=2048*a.dt;a.shock=.002;a.pi2=Math.asin(1);a.nn=3;a.check=2;a.bouncefactor=.1;a.rotatefactor=0;a.h=.5*(a.aspecty-1);a.w=.5*(a.aspectx-1);a.index=0;for(var c=a.index2=0;c<a.count;c++){a.random=div(randint(1E3),1E3);a.sample=a.gmegabuf[Math.floor(a.index+13)];a.gmegabuf[Math.floor(a.index+11)]=.92*a.gmegabuf[Math.floor(a.index+11)]-4*a.gmegabuf[Math.floor(a.index+12)]*a.dt+2*(a.random-.5)*\\na.dt*a.gmegabuf[Math.floor(a.index+14)];a.gmegabuf[Math.floor(a.index+12)]+=60*a.gmegabuf[Math.floor(a.index+11)]*a.dt;a.v=sqrt(sqr(a.gmegabuf[Math.floor(a.index+2)])+sqr(a.gmegabuf[Math.floor(a.index+3)]));a.fric=Math.max(0,1-sqr(a.v*a.friction)-2*a.v);a.gmegabuf[Math.floor(a.index+2)]*=a.fric;a.gmegabuf[Math.floor(a.index+3)]*=a.fric;a.gmegabuf[Math.floor(a.index+10)]=a.gmegabuf[Math.floor(a.index+10)]*a.fric+a.v*a.gmegabuf[Math.floor(a.index+12)]*0;a.acceleration=0*a.random+.003*Math.abs(a.gmegabuf[Math.floor(a.index+\\n11)]);a.direction=a.gmegabuf[Math.floor(a.index+9)]-a.pi2;a.gmegabuf[Math.floor(a.index+2)]+=Math.sin(a.direction)*a.acceleration;a.gmegabuf[Math.floor(a.index+3)]+=Math.cos(a.direction)*a.acceleration;a.gmegabuf[Math.floor(a.index)]+=60*a.gmegabuf[Math.floor(a.index+2)]*a.dt;a.gmegabuf[Math.floor(a.index+1)]+=60*a.gmegabuf[Math.floor(a.index+3)]*a.dt;a.gmegabuf[Math.floor(a.index+9)]+=.5*a.gmegabuf[Math.floor(a.index+10)];a.gmegabuf[Math.floor(a.index+3)]-=a.gravity;a.vr=Math.sin(a.gmegabuf[Math.floor(a.index+\\n10)])*a.gmegabuf[Math.floor(a.index+4)];a.bounce=above(a.gmegabuf[Math.floor(a.index+1)],1-a.gmegabuf[Math.floor(a.index+4)]+a.w);a.gmegabuf[Math.floor(a.index+2)]=.00001<Math.abs(a.bounce)?a.gmegabuf[Math.floor(a.index+2)]+(a.vr+a.gmegabuf[Math.floor(a.index+2)])*a.rotatefactor:a.gmegabuf[Math.floor(a.index+2)];a.gmegabuf[Math.floor(a.index+3)]=.00001<Math.abs(a.bounce)?-Math.abs(a.gmegabuf[Math.floor(a.index+3)])*a.dampening-a.shock:a.gmegabuf[Math.floor(a.index+3)];a.vr=.00001<Math.abs(a.bounce)?\\na.vr-(a.gmegabuf[Math.floor(a.index+2)]+a.vr)*(1-a.rotatefactor):a.vr;a.bounce=below(a.gmegabuf[Math.floor(a.index+1)],a.gmegabuf[Math.floor(a.index+4)]-a.w);a.gmegabuf[Math.floor(a.index+2)]=.00001<Math.abs(a.bounce)?a.gmegabuf[Math.floor(a.index+2)]+(a.vr-a.gmegabuf[Math.floor(a.index+2)])*a.rotatefactor:a.gmegabuf[Math.floor(a.index+2)];a.gmegabuf[Math.floor(a.index+3)]=.00001<Math.abs(a.bounce)?Math.abs(a.gmegabuf[Math.floor(a.index+3)])*a.dampening+a.shock:a.gmegabuf[Math.floor(a.index+3)];a.vr=\\n.00001<Math.abs(a.bounce)?a.vr+(a.gmegabuf[Math.floor(a.index+2)]-a.vr)*(1-a.rotatefactor):a.vr;a.bounce=above(a.gmegabuf[Math.floor(a.index)],1-a.gmegabuf[Math.floor(a.index+4)]+a.h);a.gmegabuf[Math.floor(a.index+2)]=.00001<Math.abs(a.bounce)?-Math.abs(a.gmegabuf[Math.floor(a.index+2)])*a.dampening-a.shock:a.gmegabuf[Math.floor(a.index+2)];a.gmegabuf[Math.floor(a.index+3)]=.00001<Math.abs(a.bounce)?a.gmegabuf[Math.floor(a.index+3)]+(a.vr-a.gmegabuf[Math.floor(a.index+3)])*a.rotatefactor:a.gmegabuf[Math.floor(a.index+\\n3)];a.vr=.00001<Math.abs(a.bounce)?a.vr+(a.gmegabuf[Math.floor(a.index+3)]-a.vr)*(1-a.rotatefactor):a.vr;a.bounce=below(a.gmegabuf[Math.floor(a.index)],a.gmegabuf[Math.floor(a.index+4)]-a.h);a.gmegabuf[Math.floor(a.index+2)]=.00001<Math.abs(a.bounce)?Math.abs(a.gmegabuf[Math.floor(a.index+2)])*a.dampening+a.shock:a.gmegabuf[Math.floor(a.index+2)];a.gmegabuf[Math.floor(a.index+3)]=.00001<Math.abs(a.bounce)?a.gmegabuf[Math.floor(a.index+3)]-(a.vr+a.gmegabuf[Math.floor(a.index+3)])*a.rotatefactor:a.gmegabuf[Math.floor(a.index+\\n3)];a.vr=.00001<Math.abs(a.bounce)?a.vr-(a.gmegabuf[Math.floor(a.index+3)]+a.vr)*(1-a.rotatefactor):a.vr;a.gmegabuf[Math.floor(a.index+10)]=Math.asin(div(a.vr,a.gmegabuf[Math.floor(a.index+4)]));a.i=0;for(var b=a.j=0;b<a.count;b++)a.d=sqrt(sqr(a.gmegabuf[Math.floor(a.index)]-a.gmegabuf[Math.floor(a.i)])+sqr(a.gmegabuf[Math.floor(a.index+1)]-a.gmegabuf[Math.floor(a.i+1)])),a.d=.00001<Math.abs(equal(a.d,0))?10:a.d,a.d-=.5*(a.gmegabuf[Math.floor(a.index+4)]+a.gmegabuf[Math.floor(a.i+4)]),a.megabuf[Math.floor(a.j)]=\\na.i,a.megabuf[Math.floor(a.j+1)]=a.d,a.j+=2,a.i+=a.attributes;for(b=a.i=0;b<a.nn;b++){a.j=a.i;a.smallestfind=10;a.findindex=-1;for(var d=0;d<a.count-a.j;d++)a.distance=a.megabuf[Math.floor(2*a.j+1)],a.smaller=above(a.smallestfind,a.distance),a.smallestfind=.00001<Math.abs(a.smaller)?a.distance:a.smallestfind,a.findindex=.00001<Math.abs(a.smaller)?2*a.j:a.findindex,a.j+=1;a.j=a.megabuf[Math.floor(2*a.i)];a.d=a.megabuf[Math.floor(2*a.i+1)];a.megabuf[Math.floor(2*a.i)]=a.megabuf[Math.floor(a.findindex)];\\na.megabuf[Math.floor(2*a.i+1)]=a.megabuf[Math.floor(a.findindex+1)];a.megabuf[Math.floor(a.findindex)]=a.j;a.megabuf[Math.floor(a.findindex+1)]=a.d;a.i+=1}for(b=a.i=0;b<a.nn;b++)a.gmegabuf[Math.floor(a.index+a.nliststart+a.i)]=a.megabuf[Math.floor(2*a.i)],a.i+=1;for(b=a.i=0;b<a.check;b++)a.index2=a.megabuf[Math.floor(a.i)],a.hit=below(sqrt(sqr(a.gmegabuf[Math.floor(a.index)]-a.gmegabuf[Math.floor(a.index2)])+sqr(a.gmegabuf[Math.floor(a.index+1)]-a.gmegabuf[Math.floor(a.index2+1)])),a.gmegabuf[Math.floor(a.index+\\n4)]+a.gmegabuf[Math.floor(a.index2+4)])*above(sqrt(sqr(a.gmegabuf[Math.floor(a.index)]-a.gmegabuf[Math.floor(a.index2)])+sqr(a.gmegabuf[Math.floor(a.index+1)]-a.gmegabuf[Math.floor(a.index2+1)])),sqrt(sqr(a.gmegabuf[Math.floor(a.index+0)]-a.gmegabuf[Math.floor(a.index2+0)]+a.gmegabuf[Math.floor(a.index+2)]-a.gmegabuf[Math.floor(a.index2+2)])+sqr(a.gmegabuf[Math.floor(a.index+1)]-a.gmegabuf[Math.floor(a.index2+1)]+a.gmegabuf[Math.floor(a.index+3)]-a.gmegabuf[Math.floor(a.index2+3)]))),a.ref_ang=Math.atan2(a.gmegabuf[Math.floor(a.index2)]-\\na.gmegabuf[Math.floor(a.index)],a.gmegabuf[Math.floor(a.index2+1)]-a.gmegabuf[Math.floor(a.index+1)])+a.pi2,a.v1=sqrt(sqr(a.gmegabuf[Math.floor(a.index+2)])+sqr(a.gmegabuf[Math.floor(a.index+3)])),a.v2=sqrt(sqr(a.gmegabuf[Math.floor(a.index2+2)])+sqr(a.gmegabuf[Math.floor(a.index2+3)])),a.w1=Math.atan2(a.gmegabuf[Math.floor(a.index+2)],a.gmegabuf[Math.floor(a.index+3)]),a.w2=Math.atan2(a.gmegabuf[Math.floor(a.index2+2)],a.gmegabuf[Math.floor(a.index2+3)]),a.vr2=Math.sin(a.gmegabuf[Math.floor(a.index2+\\n10)])*a.gmegabuf[Math.floor(a.index2+4)],a.m1=a.gmegabuf[Math.floor(a.index+8)],a.m2=a.gmegabuf[Math.floor(a.index2+8)],a.vv1=div((a.m1-a.m2)*a.v1+2*a.m2*a.v2,a.m1+a.m2),a.vv2=div((a.m2-a.m1)*a.v2+2*a.m1*a.v1,a.m1+a.m2),a.vrr=div((a.m1-a.m2)*a.vr+2*a.m2*a.vr2,a.m1+a.m2),a.vrr2=div((a.m2-a.m1)*a.vr2+2*a.m1*a.vr,a.m1+a.m2),a.gmegabuf[Math.floor(a.index+2)]=.00001<Math.abs(a.hit)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.vr2-Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang))+Math.cos(a.ref_ang)*\\na.vv1*Math.sin(a.w2-a.ref_ang):a.gmegabuf[Math.floor(a.index+2)],a.gmegabuf[Math.floor(a.index+3)]=.00001<Math.abs(a.hit)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+.1*(a.vr-a.vr2-Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang))-Math.sin(a.ref_ang)*a.vv1*Math.sin(a.w2-a.ref_ang):a.gmegabuf[Math.floor(a.index+3)],a.gmegabuf[Math.floor(a.index2+2)]=.00001<Math.abs(a.hit)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+.1*(a.vr2-a.vr-Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))+Math.cos(a.ref_ang)*\\na.vv2*Math.sin(a.w1-a.ref_ang):a.gmegabuf[Math.floor(a.index2+2)],a.gmegabuf[Math.floor(a.index2+3)]=.00001<Math.abs(a.hit)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+.1*(a.vr2-a.vr-Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang))-Math.sin(a.ref_ang)*a.vv2*Math.sin(a.w1-a.ref_ang):a.gmegabuf[Math.floor(a.index2+3)],a.vr=.00001<Math.abs(a.hit)?a.vr+(Math.cos(a.w1-a.ref_ang)*(a.v1-a.v2)-a.vr):a.vr,a.gmegabuf[Math.floor(a.index+10)]=Math.asin(div(a.vr,a.gmegabuf[Math.floor(a.index+4)])),a.vr2=\\n.00001<Math.abs(a.hit)?a.vr2+(Math.cos(a.w2-a.ref_ang)*(a.v2-a.v1)-a.vr2):a.vr2,a.gmegabuf[Math.floor(a.index2+10)]=Math.asin(div(a.vr2,a.gmegabuf[Math.floor(a.index2+4)])),a.i+=2;a.index+=a.attributes}a.q1=a.aspectx;a.q2=a.aspecty;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1.z = (texture (sampler_main, uv).z * 0.5);\\n  vec2 tmpvar_2;\\n  tmpvar_2 = ((uv_orig * texsize.xy) * texsize_noise_lq.zw);\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (texsize.zw * 4.0);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).y * 0.5);\\n  tmpvar_4.y = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).y * 0.5);\\n  ret_1.y = texture (sampler_fw_main, clamp ((uv_orig + (\\n    (tmpvar_4 * texsize.zw)\\n   * 4.0)), 0.0, 1.0)).y;\\n  ret_1.y = (ret_1.y + ((\\n    (ret_1 - ((texture (sampler_blur1, uv_orig).xyz * scale1) + bias1))\\n  .y * 0.025) + -0.014));\\n  ret_1.y = (ret_1.y + ((texture (sampler_noise_lq, tmpvar_2).y - 0.5) * 0.02));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(1.0, 0.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).x * 0.5);\\n  tmpvar_5.y = (((2.0 * \\n    ((texture (sampler_blur1, (uv_orig + (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_orig - (vec2(0.0, 1.0) * tmpvar_3))).xyz * scale1) + bias1)\\n  )).x * 0.5);\\n  ret_1.x = ((texture (sampler_main, (uv - \\n    ((tmpvar_5 * texsize.zw) * 4.0)\\n  )).x - (ret_1.y * 0.01)) + 0.004);\\n  ret_1.x = (ret_1.x + ((\\n    (texture (sampler_noise_lq, tmpvar_2).x - 0.5)\\n   * 0.01) + (ret_1.z * 0.14)));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ret_1;\\n  ret = tmpvar_6.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 4.0);\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv - (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale1) + bias1)\\n  )) * 0.5).y;\\n  tmpvar_3.y = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (vec2(0.0, 1.0) * tmpvar_2))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv - (vec2(0.0, 1.0) * tmpvar_2))).xyz * scale1) + bias1)\\n  )) * 0.5).y;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (uv - ((tmpvar_3 * texsize.zw) * 128.0));\\n  vec4 tmpvar_5;\\n  tmpvar_5 = texture (sampler_main, uv);\\n  ret_1 = (((\\n    ((texture (sampler_blur2, tmpvar_4).xyz * scale2) + bias2)\\n  .x * \\n    clamp ((1.0 - tmpvar_5.y), 0.0, 1.0)\\n  ) * pow (hue_shader.yxz, vec3(8.0, 8.0, 8.0))) * 3.0);\\n  ret_1 = (mix (mix (ret_1, \\n    (pow (hue_shader.yzx, vec3(8.0, 8.0, 8.0)) * 1.4)\\n  , vec3(\\n    ((texture (sampler_main, tmpvar_4).x * 0.8) + ((texture (sampler_blur1, tmpvar_4).xyz * scale1) + bias1).x)\\n  )), vec3(1.0, 1.0, 1.0), (\\n    (pow (hue_shader, vec3(8.0, 8.0, 8.0)) * texture (sampler_main, clamp (uv, 0.0, 1.0)).y)\\n   * 1.2)) * clamp ((1.0 - tmpvar_5.z), 0.0, 1.0));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ret_1;\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.995,echo_zoom:1.007,echo_orient:3,wave_thick:1,modwavealphabyvolume:1,wave_a:.9,wave_scale:2.997,wave_smoothing:0,wave_mystery:-.5,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.274,warpscale:7.98,zoom:.99951,warp:.20929,wave_r:.02,wave_g:.02,wave_b:0,ob_size:.5,ob_r:1,ob_g:.12,ob_b:1,ob_a:.37,ib_size:0,ib_a:1,mv_x:0,mv_y:0,mv_l:5,mv_a:0,b1ed:.2},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.w=0;a.h3=0;a.q12=0;a.q6=0;a.bt=0;a.q1=0;a.q5=0;a.startx=0;a.v=0;a.mm=0;a.h2=0;a.tt=0;a.bm=0;a.q11=0;a.q10=0;a.q4=0;a.a=0;a.mt=0;a.b=0;a.mx=0;a.mn=0;a.bb=0;a.q2=0;a.starty=0;a.h1=0;a.q3=0;a.q7=0;a.x1=0;a.y1=.001;a.z1=0;\",frame_eqs_str:\"a.zoom=1;a.wave_a=0;a.startx=.3;a.starty=.3;a.a=.55;a.b=.05;a.d=.09;a.q1=a.aspectx;a.q2=a.aspecty;a.q5=a.a;a.q6=a.b;a.q7=a.d;a.bb=.99*a.bb+.02*a.bass;a.mm=.99*a.mm+.02*a.mid;a.tt=.99*a.tt+.02*a.treb;a.mx=Math.max(Math.max(a.bb,a.mm),a.tt);a.mn=Math.min(Math.min(a.bb,a.mm),a.tt);a.h1=div(a.bb-a.mn,a.mx-a.mn);a.h2=div(a.mm-a.mn,a.mx-a.mn);a.h3=div(a.tt-a.mn,a.mx-a.mn);a.v=div(.1333,a.fps);a.bm+=(a.h1-a.h2)*a.v;a.mt+=(a.h2-a.h3)*a.v;a.bt+=(a.h1-a.h3)*a.v;a.w=2*a.bm;a.q3=Math.sin(a.w);\\na.q4=Math.cos(a.w);a.q10=a.bm;a.q11=a.mt;a.q12=a.bt;\",pixel_eqs_str:\"a.x=.5+(a.x-.51)*a.q1;a.y=.5-(a.y-.5)*a.q2;a.dx=a.x*(1-a.x)-div(a.q5*a.x*a.y,a.x+a.q6);a.dy=-a.q7*a.y*(1-div(a.y,a.x));a.dx=div(.02*-a.dx,a.q1);a.dy=div(.02*-a.dy,a.q2);\",warp:\" shader_body { \\n  vec2 my_uv2_1;\\n  vec2 dz_2;\\n  vec3 ret_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (texsize.zw * 4.0);\\n  vec3 tmpvar_5;\\n  tmpvar_5 = ((2.0 * (\\n    (texture (sampler_blur1, (uv + (vec2(1.0, 0.0) * tmpvar_4))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (uv - (vec2(1.0, 0.0) * tmpvar_4))).xyz * scale1)\\n   + bias1)));\\n  vec3 tmpvar_6;\\n  tmpvar_6 = ((2.0 * (\\n    (texture (sampler_blur1, (uv + (vec2(0.0, 1.0) * tmpvar_4))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (uv - (vec2(0.0, 1.0) * tmpvar_4))).xyz * scale1)\\n   + bias1)));\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_5.x;\\n  tmpvar_7.y = tmpvar_6.x;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (tmpvar_7 * texsize.zw);\\n  ret_3.x = (texture (sampler_fw_main, (uv - tmpvar_8)).x - ((\\n    (texture (sampler_blur3, uv).xyz * scale3)\\n   + bias3).x - (\\n    (texture (sampler_blur1, (uv + tmpvar_8)).xyz * scale1)\\n   + bias1).x));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_5.y;\\n  tmpvar_9.y = tmpvar_6.y;\\n  dz_2 = (-(tmpvar_9) * texsize.zw);\\n  ret_3.y = ((texture (sampler_fw_main, (uv - dz_2)).y - 0.06) - ((\\n    ((texture (sampler_blur2, uv).xyz * scale2) + bias2)\\n  .y - \\n    ((texture (sampler_blur1, (uv + dz_2)).xyz * scale1) + bias1)\\n  .y) * 1.3));\\n  vec2 tmpvar_10;\\n  tmpvar_10 = ((uv_orig - 0.5) * (1.8 - (\\n    (bass_att - treb_att)\\n   * 0.015)));\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = ((tmpvar_10.x * tmpvar_10.x) - (tmpvar_10.y * tmpvar_10.y));\\n  tmpvar_11.y = ((2.0 * tmpvar_10.x) * tmpvar_10.y);\\n  my_uv2_1 = (tmpvar_11 + vec2(0.28, 0.4));\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = ((2.0 * (\\n    (texture (sampler_blur1, (my_uv2_1 + (vec2(1.0, 0.0) * tmpvar_4))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (my_uv2_1 - (vec2(1.0, 0.0) * tmpvar_4))).xyz * scale1)\\n   + bias1))).z;\\n  tmpvar_12.y = ((2.0 * (\\n    (texture (sampler_blur1, (my_uv2_1 + (vec2(0.0, 1.0) * tmpvar_4))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (my_uv2_1 - (vec2(0.0, 1.0) * tmpvar_4))).xyz * scale1)\\n   + bias1))).z;\\n  dz_2 = (tmpvar_12 * texsize.zw);\\n  ret_3.z = (texture (sampler_main, clamp ((my_uv2_1 + dz_2), 0.0, 1.0)).z - 0.014);\\n  vec4 tmpvar_13;\\n  tmpvar_13.w = 1.0;\\n  tmpvar_13.xyz = ret_3;\\n  ret = tmpvar_13.xyz;\\n }\",comp:\" shader_body { \\n  vec3 dy_1;\\n  vec3 dx_2;\\n  vec2 mirror_uv_3;\\n  vec3 ret_4;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = ((uv - 0.5) * aspect.xy);\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = ((q4 * tmpvar_5.x) - (q3 * tmpvar_5.y));\\n  tmpvar_6.y = ((q3 * tmpvar_5.x) + (q4 * tmpvar_5.y));\\n  vec2 tmpvar_7;\\n  tmpvar_7 = (0.5 - (tmpvar_6 * 2.0));\\n  vec2 numerator_8;\\n  numerator_8 = (tmpvar_7 - vec2(0.0, 0.5));\\n  vec2 denominator_9;\\n  denominator_9 = (tmpvar_7 - vec2(1.0, 0.5));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = ((numerator_8.x * denominator_9.x) + (numerator_8.y * denominator_9.y));\\n  tmpvar_10.y = ((numerator_8.y * denominator_9.x) - (numerator_8.x * denominator_9.y));\\n  vec2 tmpvar_11;\\n  tmpvar_11 = (((tmpvar_10 / \\n    ((denominator_9.x * denominator_9.x) + (denominator_9.y * denominator_9.y))\\n  ) + 0.5) - vec2(0.5, 0.5));\\n  float tmpvar_12;\\n  tmpvar_12 = sqrt(dot (tmpvar_11, tmpvar_11));\\n  float tmpvar_13;\\n  float tmpvar_14;\\n  tmpvar_14 = (min (abs(\\n    (tmpvar_11.x / tmpvar_11.y)\\n  ), 1.0) / max (abs(\\n    (tmpvar_11.x / tmpvar_11.y)\\n  ), 1.0));\\n  float tmpvar_15;\\n  tmpvar_15 = (tmpvar_14 * tmpvar_14);\\n  tmpvar_15 = (((\\n    ((((\\n      ((((-0.01213232 * tmpvar_15) + 0.05368138) * tmpvar_15) - 0.1173503)\\n     * tmpvar_15) + 0.1938925) * tmpvar_15) - 0.3326756)\\n   * tmpvar_15) + 0.9999793) * tmpvar_14);\\n  tmpvar_15 = (tmpvar_15 + (float(\\n    (abs((tmpvar_11.x / tmpvar_11.y)) > 1.0)\\n  ) * (\\n    (tmpvar_15 * -2.0)\\n   + 1.570796)));\\n  tmpvar_13 = (tmpvar_15 * sign((tmpvar_11.x / tmpvar_11.y)));\\n  if ((abs(tmpvar_11.y) > (1e-08 * abs(tmpvar_11.x)))) {\\n    if ((tmpvar_11.y < 0.0)) {\\n      if ((tmpvar_11.x >= 0.0)) {\\n        tmpvar_13 += 3.141593;\\n      } else {\\n        tmpvar_13 = (tmpvar_13 - 3.141593);\\n      };\\n    };\\n  } else {\\n    tmpvar_13 = (sign(tmpvar_11.x) * 1.570796);\\n  };\\n  vec2 tmpvar_16;\\n  tmpvar_16.x = (tmpvar_13 * 0.1591549);\\n  tmpvar_16.y = tmpvar_12;\\n  vec2 tmpvar_17;\\n  tmpvar_17.x = ((tmpvar_16.x * 2.0) + q11);\\n  tmpvar_17.y = ((0.3 * log(tmpvar_12)) + q12);\\n  vec2 tmpvar_18;\\n  tmpvar_18 = (0.5 + (0.5 - abs(\\n    ((fract((tmpvar_17 * 0.5)) * 2.0) - 1.0)\\n  )));\\n  vec2 tmpvar_19;\\n  tmpvar_19 = (texsize.zw * 3.0);\\n  vec3 tmpvar_20;\\n  tmpvar_20 = ((2.0 * (\\n    (texture (sampler_blur1, (tmpvar_18 + (vec2(1.0, 0.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (tmpvar_18 - (vec2(1.0, 0.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)));\\n  vec3 tmpvar_21;\\n  tmpvar_21 = ((2.0 * (\\n    (texture (sampler_blur1, (tmpvar_18 + (vec2(0.0, 1.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (tmpvar_18 - (vec2(0.0, 1.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)));\\n  vec2 tmpvar_22;\\n  tmpvar_22.x = tmpvar_20.x;\\n  tmpvar_22.y = tmpvar_21.x;\\n  mirror_uv_3 = (tmpvar_18 + ((tmpvar_22 * texsize.zw) * 4.0));\\n  ret_4 = ((mix (ret_4, vec3(1.0, 1.0, 1.0), \\n    ((((texture (sampler_blur1, mirror_uv_3).xyz * scale1) + bias1).x * (1.0 - (\\n      (texture (sampler_blur2, mirror_uv_3).xyz * scale2)\\n     + bias2).x)) * (pow (hue_shader, vec3(4.0, 4.0, 4.0)) * 1.4))\\n  ) * texture (sampler_main, mirror_uv_3).xxx) + ((\\n    (1.0 - texture (sampler_main, mirror_uv_3).x)\\n   * \\n    ((texture (sampler_blur1, mirror_uv_3).xyz * scale1) + bias1)\\n  .x) * vec3(3.0, 3.0, 3.0)));\\n  vec2 tmpvar_23;\\n  tmpvar_23.x = tmpvar_20.x;\\n  tmpvar_23.y = tmpvar_21.x;\\n  mirror_uv_3 = (mirror_uv_3 - ((tmpvar_23 * texsize.zw) * 24.0));\\n  dx_2 = ((2.0 * (\\n    (texture (sampler_blur1, (mirror_uv_3 + (vec2(1.0, 0.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (mirror_uv_3 - (vec2(1.0, 0.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)));\\n  dy_1 = ((2.0 * (\\n    (texture (sampler_blur1, (mirror_uv_3 + (vec2(0.0, 1.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)) - (2.0 * (\\n    (texture (sampler_blur1, (mirror_uv_3 - (vec2(0.0, 1.0) * tmpvar_19))).xyz * scale1)\\n   + bias1)));\\n  vec2 tmpvar_24;\\n  tmpvar_24.x = -(dx_2.y);\\n  tmpvar_24.y = dy_1.y;\\n  vec2 tmpvar_25;\\n  tmpvar_25 = (tmpvar_24 * 0.25);\\n  vec3 tmpvar_26;\\n  tmpvar_26 = mix (ret_4, vec3(1.0, 1.0, 1.0), (mix (vec3(1.0, 0.7, 0.2), vec3(0.15, 0.0, 0.5), vec3(\\n    ((((\\n      ((mirror_uv_3.x * 0.8) - mirror_uv_3.y)\\n     + 0.75) + tmpvar_25.x) + tmpvar_25.y) - 0.1)\\n  )) * texture (sampler_main, mirror_uv_3).y));\\n  vec2 tmpvar_27;\\n  vec2 tmpvar_28;\\n  tmpvar_28 = ((0.5 + (\\n    (uv - 0.5)\\n   * aspect.wz)) - vec2(0.5, 0.5));\\n  vec2 tmpvar_29;\\n  tmpvar_29.x = ((q4 * tmpvar_28.x) - (q3 * tmpvar_28.y));\\n  tmpvar_29.y = ((q3 * tmpvar_28.x) + (q4 * tmpvar_28.y));\\n  tmpvar_27 = (vec2(0.5, 0.5) + tmpvar_29);\\n  mirror_uv_3 = tmpvar_27.yx;\\n  vec2 tmpvar_30;\\n  tmpvar_30 = (vec2(1.0, 0.0) * texsize.zw);\\n  dx_2 = ((2.0 * texture (sampler_main, (tmpvar_27.yx + tmpvar_30)).xyz) - (2.0 * texture (sampler_main, (tmpvar_27.yx - tmpvar_30)).xyz));\\n  vec2 tmpvar_31;\\n  tmpvar_31 = (vec2(0.0, 1.0) * texsize.zw);\\n  dy_1 = ((2.0 * texture (sampler_main, (tmpvar_27.yx + tmpvar_31)).xyz) - (2.0 * texture (sampler_main, (tmpvar_27.yx - tmpvar_31)).xyz));\\n  vec2 tmpvar_32;\\n  tmpvar_32.x = dx_2.z;\\n  tmpvar_32.y = dy_1.z;\\n  vec3 tmpvar_33;\\n  tmpvar_33 = mix (tmpvar_26, vec3(0.9, 0.9, 1.0), vec3((1.0 - texture (sampler_main, (tmpvar_27.yx - tmpvar_32)).z)));\\n  ret_4 = tmpvar_33;\\n  vec4 tmpvar_34;\\n  tmpvar_34.w = 1.0;\\n  tmpvar_34.xyz = tmpvar_33;\\n  ret = tmpvar_34.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.995,echo_zoom:1.007,echo_orient:3,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,wave_a:1.413,wave_scale:.418,wave_smoothing:0,wave_mystery:-.66,modwavealphastart:2,modwavealphaend:2,warpanimspeed:.626,warpscale:8.642,zoomexp:7.10084,zoom:.99951,warp:.09014,wave_r:0,wave_g:0,wave_x:.24,wave_y:.44,ob_size:0,ob_a:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:48,additive:1,rad:.0277,ang:6.03186,tex_ang:6.03186,tex_zoom:.6839,r:0,g:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.q3=0;a.q4=0;a.q5=0;a.q2=0;a.q1=0;\",frame_eqs_str:\"a.x=a.q3;a.y=a.q4;a.rad=a.q5;a.x=.5+div(a.x-.5,a.q2);a.y=.5+div(a.y-.5,a.q1);\"},{baseVals:{enabled:1,sides:48,additive:1,rad:.0277,ang:6.03186,tex_ang:6.03186,tex_zoom:.6839,r:0,b:1,g2:0,b2:1,a2:1,border_r:0,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.q6=0;a.q7=0;a.q8=0;a.q2=0;a.q1=0;\",frame_eqs_str:\"a.x=a.q6;a.y=a.q7;a.rad=a.q8;a.x=.5+div(a.x-.5,a.q2);a.y=.5+div(a.y-.5,a.q1);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1,additive:1,scaling:2.0231,smoothing:0,g:0,b:0},init_eqs_str:\"a.d=0;a.tt2=0;a.res=0;a.tt1=0;a.diff=0;a.tt3=0;a.beat=0;a.vol=0;a.m=0;a.monitor=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.vol=8*a.bass+5*a.mid+3*a.treb;a.m=.97*a.m+.08*a.vol;a.monitor=a.vol;a.beat=above(a.vol,a.res)*above(a.vol,a.m)*above(a.vol,16);a.diff=(1-a.beat)*a.diff+a.beat*(a.vol-a.res);a.res=a.beat*(a.vol+.04*a.m)+(1-a.beat)*(a.res-div(60*(.1+.02*a.diff),a.fps));a.res=Math.max(0,a.res);a.a=a.beat;\",point_eqs_str:\"a.tt3=.6*a.tt3+1*a.value1;a.tt2=.7*a.tt2+.2*a.tt3;a.tt1=.8*a.tt1+.1*a.tt2;a.d=.9*a.d+.2*a.tt1;a.y=.5+a.d*a.sample*(1-a.sample)*2;a.x=-.05+1.1*a.sample;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.xx=0;a.q12=0;a.w2=0;a.ref_ang=0;a.q18=0;a.x1=0;a.vx3=0;a.q13=0;a.q15=0;a.q6=0;a.q1=0;a.q5=0;a.q9=0;a.d1=0;a.si1=0;a.vx1=0;a.vx4=0;a.x3=0;a.d2=0;a.q11=0;a.q10=0;a.q4=0;a.vy4=0;a.dir=0;a.bounce=0;a.q16=0;a.x4=0;a.w1=0;a.r=0;a.x2=0;a.q17=0;a.vy2=0;a.y2=0;a.vy1=0;a.q2=0;a.m1=0;a.q14=0;a.si2=0;a.v1=0;a.vx2=0;a.q3=0;a.yy=0;a.y4=0;a.q7=0;a.vy3=0;a.v2=0;a.b1=0;a.q8=0;a.x1=.5;a.x2=.51;a.y2=.9;a.y1=.7;a.x3=.8;a.y3=.5;a.x4=.2;a.y4=.5;a.ax1=0;a.ay1=0;a.ax2=0;a.ay2=0;a.ax3=\\n0;a.ay3=0;a.vx1=0;a.vx2=0;\",frame_eqs_str:\"a.zoom=1.002;a.warp=.2;a.wave_a=0;a.r=.04+.008*Math.max(a.bass_att,a.treb_att);a.bounce=below(a.y1,a.r);a.y1+=a.vy1;a.vy1=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vy1)+.1*(a.r-a.y1):a.vy1-div(.018,a.fps);a.bounce=below(a.x1,a.r);a.x1+=a.vx1;a.vx1=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx1)+.1*(a.r-a.x1):a.vx1;a.bounce=above(a.x1,1-a.r);a.vx1=.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx1)+.04*(1-a.r-a.x1):a.vx1;a.bounce=below(a.y2,a.r);a.y2+=a.vy2;a.vy2=.00001<Math.abs(a.bounce)?\\n.94*Math.abs(a.vy2)+.1*(a.r-a.y2):a.vy2-div(.018,a.fps);a.bounce=below(a.x2,a.r);a.x2+=a.vx2;a.vx2=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx2)+.1*(a.r-a.x2):a.vx2;a.bounce=above(a.x2,1-a.r);a.vx2=.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx2)+.1*(1-a.r-a.x2):a.vx2;a.bounce=below(a.y3,a.r);a.y3+=a.vy3;a.vy3=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vy3)+.1*(a.r-a.y3):a.vy3-div(.018,a.fps);a.bounce=below(a.x3,a.r);a.x3+=a.vx3;a.vx3=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx3)+.1*(a.r-a.x3):a.vx3;\\na.bounce=above(a.x3,1-a.r);a.vx3=.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx3)+.1*(1-a.r-a.x3):a.vx3;a.bounce=below(a.y4,a.r);a.y4+=a.vy4;a.vy4=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vy4)+.1*(a.r-a.y4):a.vy4-div(.018,a.fps);a.bounce=below(a.x4,a.r);a.x4+=a.vx4;a.vx4=.00001<Math.abs(a.bounce)?.94*Math.abs(a.vx4)+.1*(a.r-a.x4):a.vx4;a.bounce=above(a.x4,1-a.r);a.vx4=.00001<Math.abs(a.bounce)?.94*-Math.abs(a.vx4)+.1*(1-a.r-a.x4):a.vx4;a.bounce=below(sqrt(sqr(a.x1+a.vx1-a.x2-a.vx2)+sqr(a.y1+a.vy1-a.y2-\\na.vy2)),2*a.r);a.ref_ang=Math.atan2(a.x2-a.x1,a.y2-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*a.vx1+a.vy1*a.vy1);a.v2=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx2,a.vy2);a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-\\nMath.asin(1)):a.vy1;a.vx2=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy2;a.bounce=below(sqrt(sqr(a.x1+a.vx1-a.x3-a.vx3)+sqr(a.y1+a.vy1-a.y3-a.vy3)),2*a.r);a.ref_ang=Math.atan2(a.x3-a.x1,a.y3-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*\\na.vx1+a.vy1*a.vy1);a.v2=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx3,a.vy3);a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy1;a.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-\\na.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy3;a.bounce=below(sqrt(sqr(a.x2+a.vx2-a.x3-a.vx3)+sqr(a.y2+a.vy2-a.y3-a.vy3)),2*a.r);a.ref_ang=Math.atan2(a.x3-a.x2,a.y3-a.y2)+Math.asin(1);a.v1=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.v2=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.w1=Math.atan2(a.vx2,a.vy2);a.w2=Math.atan2(a.vx3,\\na.vy3);a.vx2=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy2;a.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx3;a.vy3=\\n.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy3;a.bounce=below(sqrt(sqr(a.x1+a.vx1-a.x4-a.vx4)+sqr(a.y1+a.vy1-a.y4-a.vy4)),2*a.r);a.ref_ang=Math.atan2(a.x4-a.x1,a.y4-a.y1)+Math.asin(1);a.v1=sqrt(a.vx1*a.vx1+a.vy1*a.vy1);a.v2=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.w1=Math.atan2(a.vx1,a.vy1);a.w2=Math.atan2(a.vx4,a.vy4);a.vx1=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+\\nMath.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx1;a.vy1=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy1;a.vx4=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx4;a.vy4=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+\\nMath.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy4;a.bounce=below(sqrt(sqr(a.x2+a.vx2-a.x4-a.vx4)+sqr(a.y2+a.vy2-a.y4-a.vy4)),2*a.r);a.ref_ang=Math.atan2(a.x4-a.x2,a.y4-a.y2)+Math.asin(1);a.v1=sqrt(a.vx2*a.vx2+a.vy2*a.vy2);a.v2=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.w1=Math.atan2(a.vx2,a.vy2);a.w2=Math.atan2(a.vx4,a.vy4);a.vx2=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx2;a.vy2=.00001<\\nMath.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy2;a.vx4=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx4;a.vy4=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy4;a.bounce=below(sqrt(sqr(a.x3+\\na.vx3-a.x4-a.vx4)+sqr(a.y3+a.vy3-a.y4-a.vy4)),2*a.r);a.ref_ang=Math.atan2(a.x4-a.x3,a.y4-a.y3)+Math.asin(1);a.v1=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);a.v2=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.w1=Math.atan2(a.vx3,a.vy3);a.w2=Math.atan2(a.vx4,a.vy4);a.vx3=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vx3;a.vy3=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v1*Math.cos(a.w1-a.ref_ang)+Math.cos(a.ref_ang+\\nMath.asin(1))*a.v2*Math.cos(a.w2-a.ref_ang-Math.asin(1)):a.vy3;a.vx4=.00001<Math.abs(a.bounce)?Math.sin(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.sin(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vx4;a.vy4=.00001<Math.abs(a.bounce)?Math.cos(a.ref_ang)*a.v2*Math.cos(a.w2-a.ref_ang)+Math.cos(a.ref_ang+Math.asin(1))*a.v1*Math.cos(a.w1-a.ref_ang-Math.asin(1)):a.vy4;a.q1=a.aspectx;a.q2=a.aspecty;a.q3=a.x1;a.q4=a.y1;a.q5=2*a.r;a.q6=a.x2;a.q7=a.y2;a.q8=2*a.r;a.q9=a.x3;a.q10=a.y3;\\na.q11=2*a.r;a.q12=a.x4;a.q13=a.y4;a.q14=2*a.r;a.q15=Math.atan2(a.vx4,a.vy4);a.q16=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.q17=Math.atan2(a.vx3,a.vy3);a.q18=sqrt(a.vx3*a.vx3+a.vy3*a.vy3);\",pixel_eqs_str:\"a.x=.5+(a.x-.5)*a.q2;a.y=.5+(a.y-.5)*a.q1;a.dir=-a.q15+Math.asin(1);a.b1=.075;a.m1=25*a.q16;a.xx=a.q12;a.yy=1-a.q13;a.x1=a.xx-Math.sin(a.dir)*a.b1;a.y1=a.yy-Math.cos(a.dir)*a.b1;a.x2=a.xx+Math.sin(a.dir)*a.b1;a.y2=a.yy+Math.cos(a.dir)*a.b1;a.d1=sqrt((a.x1-a.x)*(a.x1-a.x)+(a.y1-a.y)*(a.y1-a.y))-2*a.b1;a.d2=sqrt((a.x2-a.x)*(a.x2-a.x)+(a.y2-a.y)*(a.y2-a.y))-2*a.b1;a.si1=sigmoid(-a.d1,1E3);a.si2=sigmoid(-a.d2,1E3);a.dx=3*(a.si1*Math.sin(a.y1-a.y)*a.m1*a.d1-a.si2*Math.sin(a.y2-a.y)*\\na.m1*a.d2)*a.q1;a.dy=3*(-a.si1*Math.sin(a.x1-a.x)*a.m1*a.d1+a.si2*Math.sin(a.x2-a.x)*a.m1*a.d2)*a.q2;a.dir=-a.q17+Math.asin(1);a.m1=25*a.q18;a.xx=a.q9;a.yy=1-a.q10;a.x1=a.xx-Math.sin(a.dir)*a.b1;a.y1=a.yy-Math.cos(a.dir)*a.b1;a.x2=a.xx+Math.sin(a.dir)*a.b1;a.y2=a.yy+Math.cos(a.dir)*a.b1;a.d1=sqrt((a.x1-a.x)*(a.x1-a.x)+(a.y1-a.y)*(a.y1-a.y))-2*a.b1;a.d2=sqrt((a.x2-a.x)*(a.x2-a.x)+(a.y2-a.y)*(a.y2-a.y))-2*a.b1;a.si1=sigmoid(-a.d1,1E3);a.si2=sigmoid(-a.d2,1E3);a.dx+=3*(a.si1*Math.sin(a.y1-a.y)*a.m1*\\na.d1-a.si2*Math.sin(a.y2-a.y)*a.m1*a.d2)*a.q1;a.dy+=3*(-a.si1*Math.sin(a.x1-a.x)*a.m1*a.d1+a.si2*Math.sin(a.x2-a.x)*a.m1*a.d2)*a.q2;\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 8.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.z;\\n  tmpvar_5.y = tmpvar_4.z;\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv + ((tmpvar_5 * texsize.zw) * 4.0));\\n  ret_1.z = (((texture (sampler_main, tmpvar_6).z - \\n    ((texture (sampler_main, tmpvar_6).z - ((texture (sampler_blur3, tmpvar_6).xyz * scale3) + bias3).z) * 0.02)\\n  ) - 0.008) + ((texture (sampler_noise_lq, \\n    (((uv_orig * texsize.xy) * texsize_noise_lq.zw) + rand_frame.xy)\\n  ).xyz - 0.5) * 0.1)).x;\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_3.x;\\n  tmpvar_7.y = tmpvar_4.x;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = ((0.5 + (uv - 0.5)) - (tmpvar_7 * texsize.zw));\\n  ret_1.x = texture (sampler_main, tmpvar_8).x;\\n  ret_1.x = (ret_1.x + ((\\n    (ret_1.x - ((texture (sampler_blur3, tmpvar_8).xyz * scale3) + bias3))\\n  .x * 0.4) + 0.006));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_3.x;\\n  tmpvar_9.y = tmpvar_4.x;\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_3.y;\\n  tmpvar_10.y = tmpvar_4.y;\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = tmpvar_3.z;\\n  tmpvar_11.y = tmpvar_4.z;\\n  ret_1.y = texture (sampler_fc_main, (((uv - \\n    ((tmpvar_9 * texsize.zw) * 8.0)\\n  ) + (\\n    (tmpvar_10 * texsize.zw)\\n   * 4.0)) + ((tmpvar_11 * texsize.zw) * 8.0))).y;\\n  ret_1.y = (ret_1.y * (1.0 + (ret_1.x * 0.1)));\\n  ret_1.y = (ret_1.y - (0.004 + (\\n    clamp (ret_1.z, 0.0, 1.0)\\n   * 0.04)));\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = ret_1;\\n  ret = tmpvar_12.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 4.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.z;\\n  tmpvar_5.y = tmpvar_4.z;\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = tmpvar_3.y;\\n  tmpvar_6.y = tmpvar_4.y;\\n  vec2 tmpvar_7;\\n  tmpvar_7 = ((uv - (tmpvar_5 * 0.1)) + (tmpvar_6 * 0.06));\\n  vec4 tmpvar_8;\\n  tmpvar_8 = texture (sampler_main, uv);\\n  ret_1 = (((\\n    ((texture (sampler_blur2, tmpvar_7).xyz * scale2) + bias2)\\n  .x * \\n    clamp ((1.0 - tmpvar_8.z), 0.0, 1.0)\\n  ) * pow (hue_shader.yxz, vec3(8.0, 8.0, 8.0))) * 3.0);\\n  ret_1 = (mix (ret_1, (\\n    pow (hue_shader.yzx, vec3(8.0, 8.0, 8.0))\\n   * 1.4), vec3((\\n    (texture (sampler_main, tmpvar_7).x * 0.8)\\n   + \\n    ((texture (sampler_blur1, tmpvar_7).xyz * scale1) + bias1)\\n  .x))) * clamp ((1.0 - \\n    (((texture (sampler_blur1, uv).xyz * scale1) + bias1).y * 4.0)\\n  ), 0.0, 1.0));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_3.y;\\n  tmpvar_9.y = tmpvar_4.y;\\n  vec3 tmpvar_10;\\n  vec3 tmpvar_11;\\n  tmpvar_11 = pow (hue_shader, vec3(8.0, 8.0, 8.0));\\n  tmpvar_10 = mix (mix (ret_1, vec3(1.0, 1.0, 1.0), (\\n    (tmpvar_11 * texture (sampler_main, clamp ((uv - (tmpvar_9 * 2.0)), 0.0, 1.0)).z)\\n   * 1.2)), (tmpvar_11.zxy * 1.8), tmpvar_8.yyy);\\n  ret_1 = tmpvar_10;\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = tmpvar_10;\\n  ret = tmpvar_12.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.5,echo_zoom:1.03,wave_brighten:0,wrap:0,wave_a:.001,wave_scale:.01,wave_smoothing:0,modwavealphastart:1,modwavealphaend:1,warpscale:.107,zoomexp:4.28632,fshader:1,warp:.01743,wave_r:0,wave_g:0,wave_b:0,ob_size:0,ob_g:1,ob_a:1,ib_size:0,ib_r:1,ib_g:1,ib_b:1,ib_a:1,mv_x:64,mv_y:48,mv_l:5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:100,textured:1,rad:.789,ang:.6283,tex_zoom:1.17257,r:0,g:1,border_a:0},init_eqs_str:\"a.an=0;a.vx=0;a.vy=0;\",frame_eqs_str:\"a.rad=.65+.1*a.bass;a.an=.99*a.an+.1*(a.bass-a.treb);a.ang=.1*a.an+.6;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:495,sep:4,spectrum:1,thick:1,additive:1,scaling:100,smoothing:1,r:0,g:.04,b:0,a:.99},init_eqs_str:\"a.my_z=0;a.d=0;a.n=0;a.y3=0;a.z2=0;a.y1=0;a.w=0;a.t5=0;a.w2=0;a.t1=0;a.x1=0;a.q6=0;a.zoom=0;a.p=0;a.q1=0;a.q5=0;a.t8=0;a.z3=0;a.w3=0;a.t3=0;a.my_x=0;a.x3=0;a.t6=0;a.my_y=0;a.pi=0;a.q4=0;a.t7=0;a.rd=0;a.w1=0;a.x2=0;a.t2=0;a.l=0;a.y2=0;a.q2=0;a.z1=0;a.q3=0;a.t4=0;a.t2=0;a.t3=0;a.t4=0;a.ab=1;\",frame_eqs_str:\"a.t1=a.q1;a.t2=a.q2;a.t3=a.q3;a.t4=a.q4;a.t5=a.q5;a.t6=a.q6;a.t8=.07;a.t7=1;\",point_eqs_str:\"a.t7=-a.t7;a.pi=Math.asin(1);a.n=180;a.rd=.075;a.my_x=.5*Math.sin(a.sample*a.pi*4+(a.t7+1)*a.t8)+Math.cos(a.sample*a.pi*a.n)*a.rd*Math.sin(a.sample*a.pi*4+(a.t7+1)*a.t8);a.my_y=.5*Math.cos(a.sample*a.pi*4+(a.t7+1)*a.t8)+Math.cos(a.sample*a.pi*a.n)*a.rd*Math.cos(a.sample*a.pi*4+(a.t7+1)*a.t8);a.my_z=Math.sin(a.sample*a.pi*a.n)*a.rd;a.d=1.4;a.zoom=.65;a.w1=a.q2;a.w2=a.q3;a.w3=a.q4;a.x1=Math.cos(a.w1)*a.my_x+Math.sin(a.w1)*a.my_y;a.y1=-Math.sin(a.w1)*a.my_x+Math.cos(a.w1)*a.my_y;\\na.z1=a.my_z;a.x2=Math.cos(a.w2)*a.x1+Math.sin(a.w2)*a.z1;a.z2=-Math.sin(a.w2)*a.x1+Math.cos(a.w2)*a.z1;a.y2=a.y1;a.y3=Math.cos(a.w3)*a.y2+Math.sin(a.w3)*a.z2;a.z3=-Math.sin(a.w3)*a.y2+Math.cos(a.w3)*a.z2;a.x3=a.x2;a.l=sqrt(a.x3*a.x3+a.y3*a.y3);a.w=Math.atan2(a.x3,a.y3);a.p=Math.tan(Math.asin(1)+Math.atan2(a.d+a.z3,a.l));a.d=sqrt(a.x3*a.x3+a.y3*a.y3+(a.z3+a.d)*(a.z3+a.d));a.my_x=a.zoom*Math.sin(a.w)*a.p;a.my_y=a.zoom*Math.cos(a.w)*a.p;a.x=.5+a.my_x;a.y=.5+a.my_y;a.b=-a.z3+.5;a.b=.5*Math.min(1,Math.max(0,\\na.b));a.r=1-2*a.b;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.n=0;a.n2=0;a.j3=0;a.q1=0;a.q5=0;a.n1=0;a.q9=0;a.v=0;a.q10=0;a.q4=0;a.j2=0;a.k=0;a.j1=0;a.q2=0;a.q3=0;a.x1=0;a.y1=0;\",frame_eqs_str:\"a.q1=0;a.v=.4;a.j1=.95*a.j1+sqr(4*a.bass)*a.v;a.j2=.95*a.j2+sqr(4*a.mid)*a.v;a.j3=.95*a.j3+sqr(4*a.treb)*a.v;a.n+=.0052*a.j1;a.n1+=.0052*a.j2;a.n2+=.0052*a.j3;a.q2=.01*a.n;a.q3=.01*a.n1;a.q4=.01*a.n2;a.k=.99*a.k+sqr(2*a.mid_att);a.q5=0*a.k;a.zoom=1.0016;a.warp=0;a.rot=-0;a.q9=a.aspectx;a.q10=a.aspecty;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 4.0);\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = (((texture (sampler_blur2, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale2) + bias2) - ((texture (sampler_blur2, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale2) + bias2)).z;\\n  tmpvar_3.y = -(((\\n    (texture (sampler_blur2, (uv + (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (uv - (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale2)\\n   + bias2)).z);\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (uv + ((tmpvar_3 * texsize.zw) * 60.0));\\n  vec2 x_5;\\n  x_5 = (tmpvar_4 - uv);\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_main, uv);\\n  vec4 tmpvar_7;\\n  tmpvar_7 = texture (sampler_blur1, uv);\\n  ret_1.z = (((texture (sampler_main, tmpvar_4).z + \\n    (((tmpvar_6.z - (\\n      (tmpvar_7.xyz * scale1)\\n     + bias1).z) * 200.0) * sqrt(dot (x_5, x_5)))\\n  ) * 0.96) - 0.02);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1)).y;\\n  tmpvar_8.y = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1)).y;\\n  ret_1.y = ((texture (sampler_main, (uv_orig + \\n    ((tmpvar_8 * texsize.zw) * 6.0)\\n  )).y + (\\n    (tmpvar_6.y - ((tmpvar_7.xyz * scale1) + bias1).y)\\n   * 0.1)) - 0.016);\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = ret_1;\\n  ret = tmpvar_9.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 8.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.z;\\n  tmpvar_5.y = tmpvar_4.z;\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = tmpvar_3.y;\\n  tmpvar_6.y = tmpvar_4.y;\\n  ret_1 = (mix (vec3(0.2, 0.0, 0.1), vec3(0.8, 0.6, 0.0), texture (sampler_main, (uv - \\n    (tmpvar_5 * 0.2)\\n  )).yyy) * ((\\n    (-(tmpvar_3.y) + tmpvar_4.y)\\n   + 1.0) + (\\n    (-(tmpvar_3.z) + tmpvar_4.z)\\n   * 2.0)));\\n  vec3 tmpvar_7;\\n  tmpvar_7 = mix (mix (ret_1, vec3(0.2, 0.0, 0.4), vec3((\\n    ((texture (sampler_blur1, (uv - (tmpvar_6 * 0.04))).xyz * scale1) + bias1)\\n  .x * 1.4))), vec3(1.0, 0.9, 0.8), texture (sampler_main, uv).zzz);\\n  ret_1 = tmpvar_7;\\n  vec4 tmpvar_8;\\n  tmpvar_8.w = 1.0;\\n  tmpvar_8.xyz = tmpvar_7;\\n  ret = tmpvar_8.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:1,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:.5,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wave_a:2.789,wave_scale:.292,wave_smoothing:0,wave_mystery:.12,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.01,warpscale:100,zoomexp:.92178,zoom:.9901,warp:.01,wave_g:0,ob_size:0,ob_r:.2,ob_a:.1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:100,additive:1,thickoutline:1,x:.43,y:.42,rad:.15799,ang:.1885,tex_zoom:.87865,r:0,g:1,g2:0,border_a:0},init_eqs_str:\"a.q4=0;a.q8=0;\",frame_eqs_str:\"a.x=a.q4;a.y=a.q8;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.xx=0;a.si3=0;a.t1=0;a.x1=0;a.vx3=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.d1=0;a.si1=0;a.vx4=0;a.grav=0;a.x3=0;a.d2=0;a.xx2=0;a.q4=0;a.yy1=0;a.vy4=0;a.dir=0;a.bounce=0;a.x4=0;a.x2=0;a.vy2=0;a.y2=0;a.q2=0;a.m1=0;a.spring=0;a.si2=0;a.vx2=0;a.q3=0;a.resist=0;a.yy=0;a.y4=0;a.q7=0;a.vy3=0;a.xx1=0;a.b1=0;a.q8=0;a.x1=.9;a.y1=.5;a.x2=.5;a.y2=.5;a.x3=.5;a.y3=.5;a.x4=.5;a.y4=.5;\",frame_eqs_str:\"a.decay=1;a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+a.xx1-a.xx2;a.y1=.5+a.yy1;a.spring=18;a.grav=1;a.resist=.2;a.bounce=.9;a.dt=.0003;a.vx2=a.vx2*(1-a.resist*a.dt)+a.dt*(a.x1+a.x3-2*a.x2)*a.spring;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*((a.y1+a.y3-2*a.y2)*a.spring-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*(a.x2+a.x4-2*a.x3)*a.spring;a.vy3=a.vy3*(1-a.resist*a.dt)+a.dt*((a.y2+a.y4-2*a.y3)*a.spring-a.grav);a.vx4=a.vx4*(1-a.resist*\\na.dt)+a.dt*(a.x3-a.x4)*a.spring;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*((a.y3-a.y4)*a.spring-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<Math.abs(above(a.x3,0))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:-Math.abs(a.vx3)*a.bounce;a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:Math.abs(a.vx4)*\\na.bounce;a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:-Math.abs(a.vy3)*a.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<Math.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q1=a.x1;a.q2=\\na.x2;a.q3=a.x3;a.q4=a.x4;a.q5=a.y1;a.q6=a.y2;a.q7=a.y3;a.q8=a.y4;a.zoom=1.004;a.q6=Math.atan2(a.vx4,a.vy4);a.q5=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);\",pixel_eqs_str:\"a.dir=-a.q6+Math.asin(1);a.b1=.08;a.m1=45*a.q5;a.t1=.5;a.xx=.5+div(a.q4-.5,a.aspectx);a.yy=1-(.5+div(a.q8-.5,a.aspecty));a.x1=a.xx+Math.cos(a.dir+1.5708)*a.b1;a.y1=a.yy-Math.sin(a.dir+1.5708)*a.b1;a.x2=a.xx-Math.cos(a.dir+1.5708)*a.b1;a.y2=a.yy+Math.sin(a.dir+1.5708)*a.b1;a.d1=sqrt((a.x1-a.x)*(a.x1-a.x)+(a.y1-a.y)*(a.y1-a.y))-2*a.b1;a.si1=1-div(1,1+pow(2,100*-a.d1));a.d2=sqrt((a.x2-a.x)*(a.x2-a.x)+(a.y2-a.y)*(a.y2-a.y))-2*a.b1;a.si2=1-div(1,1+pow(2,100*-a.d2));a.si3=0*-pow(a.q5,\\n3);a.dx=div(2*(a.si1*Math.sin(a.y1-a.y)*a.m1*a.d1-a.si2*Math.sin(a.y2-a.y)*a.m1*a.d2+a.si3*Math.cos(a.dir)*a.t1),a.aspectx);a.dy=div(2*(-a.si1*Math.sin(a.x1-a.x)*a.m1*a.d1+a.si2*Math.sin(a.x2-a.x)*a.m1*a.d2-a.si3*Math.sin(a.dir)*a.t1),a.aspecty);\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 8.0);\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1)).x;\\n  tmpvar_3.y = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1)).x;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (uv - ((tmpvar_3 * texsize.zw) * 0.5));\\n  ret_1.x = texture (sampler_fw_main, tmpvar_4).x;\\n  ret_1.x = (ret_1.x + ((\\n    (ret_1.x - ((texture (sampler_blur3, tmpvar_4).xyz * scale3) + bias3).x)\\n   * 0.2) - 0.004));\\n  ret_1.y = ((texture (sampler_fw_main, uv_orig).y * 0.98) - 0.004);\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = ret_1;\\n  ret = tmpvar_5.xyz;\\n }\",comp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = (texsize.zw * 4.0);\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1)).x;\\n  tmpvar_2.y = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1)).x;\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = mix ((vec3(0.0, 0.0, 1.0) * texture (sampler_main, uv).x), vec3(1.0, 0.0, 0.0), texture (sampler_main, (uv - tmpvar_2)).yyy);\\n  ret = tmpvar_3.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:1,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:.5,wave_thick:1,wave_brighten:0,wrap:0,wave_a:.004,wave_scale:.01,wave_smoothing:0,wave_mystery:-.44,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.137,warpscale:13.125,zoom:.99951,warp:.99213,wave_y:.04,ob_size:.015,ob_r:.1,ob_g:.25,ob_a:1,ib_size:0,ib_b:1,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,thickoutline:1,rad:.02015,tex_ang:.12566,tex_zoom:1.51878,r:0,a:.1,g2:0,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.q12=0;a.x1=0;a.vx3=0;a.q13=0;a.q15=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.q9=0;a.vx4=0;a.x3=0;a.q11=0;a.q10=0;a.xx2=0;a.q4=0;a.yy1=0;a.vy4=0;a.q16=0;a.x4=0;a.x2=0;a.vy2=0;a.y2=0;a.q2=0;a.q14=0;a.vx2=0;a.q3=0;a.y4=0;a.q7=0;a.vy3=0;a.xx1=0;a.q8=0;\",frame_eqs_str:\"a.warp=0;a.wave_a=0;a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+2*(a.xx1-a.xx2);a.y1=.4+1.5*a.yy1;a.dt=div(.03,a.fps);a.vx2=a.vx2*(1-2*a.dt)+10*a.dt*(a.x1+a.x3-2*a.x2);a.vy2=a.vy2*(1-2*a.dt)+a.dt*(10*(a.y1+a.y3-2*a.y2)-.5);a.vx3=a.vx3*(1-2*a.dt)+10*a.dt*(a.x2+a.x4-2*a.x3);a.vy3=a.vy3*(1-2*a.dt)+a.dt*(10*(a.y2+a.y4-2*a.y3)-.5);a.vx4=a.vx4*(1-2*a.dt)+10*a.dt*(a.x3-a.x4);a.vy4=a.vy4*(1-2*a.dt)+a.dt*(10*(a.y3-a.y4)-.5);a.x2+=\\na.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:.5*Math.abs(a.vx2);a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:.5*-Math.abs(a.vx2);a.vx3=.00001<Math.abs(above(a.x3,0))?a.vx3:.5*Math.abs(a.vx3);a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:.5*-Math.abs(a.vx3);a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:.5*Math.abs(a.vx4);a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:.5*-Math.abs(a.vx4);a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:.5*Math.abs(a.vy2);\\na.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:.5*-Math.abs(a.vy2);a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:.5*Math.abs(a.vy3);a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:.5*-Math.abs(a.vy3);a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:.5*Math.abs(a.vy4);a.vy4=.00001<Math.abs(below(a.y4,1))?a.vy4:.5*-Math.abs(a.vy4);a.q1=a.x1;a.q2=a.x2;a.q3=a.x3;a.q4=a.x4;a.q5=a.y1;a.q6=a.y2;a.q7=a.y3;a.q8=a.y4;a.q9=div(1,a.aspectx);a.q10=div(1,a.aspecty);a.q11=a.aspectx;a.q12=a.aspecty;a.q13=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);\\na.q14=Math.atan2(a.vx4,a.vy4);a.q15=Math.sin(a.q14);a.q16=Math.cos(a.q14);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 my_uv_2;\\n  vec3 ret_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q4;\\n  tmpvar_4.y = (1.0 - q8);\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = -(q15);\\n  tmpvar_5.y = q16;\\n  vec2 domain_6;\\n  vec2 uv_rot_7;\\n  domain_6 = (uv - tmpvar_4);\\n  domain_6 = (domain_6 * aspect.xy);\\n  float tmpvar_8;\\n  tmpvar_8 = (1.0/((1.0 + exp(\\n    ((sqrt(dot (domain_6, domain_6)) - 0.07) * 50.0)\\n  ))));\\n  domain_6 = (domain_6 + ((tmpvar_5 * q13) * (aspect.wz * tmpvar_8)));\\n  float tmpvar_9;\\n  tmpvar_9 = sin(tmpvar_8);\\n  float tmpvar_10;\\n  tmpvar_10 = cos(tmpvar_8);\\n  uv_rot_7.x = ((tmpvar_10 * domain_6.x) - (tmpvar_9 * domain_6.y));\\n  uv_rot_7.y = ((tmpvar_9 * domain_6.x) + (tmpvar_10 * domain_6.y));\\n  uv_rot_7 = (uv_rot_7 * aspect.zw);\\n  uv_rot_7 = (uv_rot_7 + tmpvar_4);\\n  uv_1 = (clamp ((tmpvar_4 + \\n    ((uv_rot_7 - tmpvar_4) * mix (1.0, 4.0, tmpvar_8))\\n  ), 0.0, 1.0) + (texsize.zw * vec2(0.0, 0.15)));\\n  vec2 tmpvar_11;\\n  tmpvar_11 = mix (uv_orig, uv_1, vec2(0.2, 0.2));\\n  uv_1 = tmpvar_11;\\n  vec2 tmpvar_12;\\n  tmpvar_12 = (vec2(1280.0, 1024.0) * texsize.zw);\\n  float tmpvar_13;\\n  tmpvar_13 = (((\\n    (texture (sampler_blur2, (tmpvar_11 + vec2(0.005, 0.0))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (tmpvar_11 - vec2(0.005, 0.0))).xyz * scale2)\\n   + bias2)).x * tmpvar_12.x);\\n  float tmpvar_14;\\n  tmpvar_14 = (((\\n    (texture (sampler_blur2, (tmpvar_11 + vec2(0.0, 0.005))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (tmpvar_11 - vec2(0.0, 0.005))).xyz * scale2)\\n   + bias2)).x * tmpvar_12.y);\\n  vec2 tmpvar_15;\\n  tmpvar_15.x = tmpvar_13;\\n  tmpvar_15.y = tmpvar_14;\\n  vec2 tmpvar_16;\\n  tmpvar_16.x = (((\\n    (texture (sampler_blur2, (tmpvar_11 + vec2(0.005, 0.0))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (tmpvar_11 - vec2(0.005, 0.0))).xyz * scale2)\\n   + bias2)).x * tmpvar_12.x);\\n  tmpvar_16.y = (((\\n    (texture (sampler_blur2, (tmpvar_11 + vec2(0.0, 0.005))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (tmpvar_11 - vec2(0.0, 0.005))).xyz * scale2)\\n   + bias2)).x * tmpvar_12.y);\\n  ret_3.x = texture (sampler_fw_main, ((tmpvar_11 - (tmpvar_15 * 0.006)) + (tmpvar_16 * 0.003))).x;\\n  ret_3.x = (ret_3.x + ((ret_3.x - \\n    ((texture (sampler_blur3, tmpvar_11).xyz * scale3) + bias3)\\n  .x) * 0.1));\\n  ret_3.x = (ret_3.x + 0.004);\\n  vec2 tmpvar_17;\\n  tmpvar_17.x = tmpvar_14;\\n  tmpvar_17.y = -(tmpvar_13);\\n  my_uv_2 = (uv_orig + ((tmpvar_17 * 0.05) * (1.2 - \\n    ((texture (sampler_blur3, uv_orig).xyz * scale3) + bias3)\\n  .y)));\\n  ret_3.z = texture (sampler_fw_main, my_uv_2).z;\\n  vec2 x_18;\\n  x_18 = (my_uv_2 - uv_orig);\\n  ret_3.z = (ret_3.z + ((\\n    ((ret_3.z - ((texture (sampler_blur1, uv_orig).xyz * scale1) + bias1).z) * sqrt(dot (x_18, x_18)))\\n   * 180.0) / sqrt(\\n    dot (tmpvar_12, tmpvar_12)\\n  )));\\n  ret_3.z = (ret_3.z * 0.85);\\n  ret_3.z = (ret_3.z + 0.008);\\n  vec2 tmpvar_19;\\n  tmpvar_19.x = -(tmpvar_14);\\n  tmpvar_19.y = tmpvar_13;\\n  my_uv_2 = (tmpvar_19 * 0.045);\\n  vec2 tmpvar_20;\\n  tmpvar_20.x = (((\\n    (texture (sampler_blur2, (tmpvar_11 + vec2(0.01, 0.0))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (tmpvar_11 - vec2(0.01, 0.0))).xyz * scale2)\\n   + bias2)).y * tmpvar_12.x);\\n  tmpvar_20.y = (((\\n    (texture (sampler_blur2, (tmpvar_11 + vec2(0.0, 0.01))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (tmpvar_11 - vec2(0.0, 0.01))).xyz * scale2)\\n   + bias2)).y * tmpvar_12.y);\\n  my_uv_2 = (my_uv_2 + (tmpvar_11 - (tmpvar_20 * 0.03)));\\n  ret_3.y = texture (sampler_fw_main, my_uv_2).y;\\n  ret_3.y = (ret_3.y + ((\\n    (ret_3.y - ((texture (sampler_blur3, my_uv_2).xyz * scale3) + bias3).y)\\n   * 0.1) + 0.03));\\n  vec4 tmpvar_21;\\n  tmpvar_21.w = 1.0;\\n  tmpvar_21.xyz = ret_3;\\n  ret = tmpvar_21.xyz;\\n }\",comp:\" shader_body { \\n  vec2 dz_1;\\n  vec3 dy_2;\\n  vec3 dx_3;\\n  vec2 d_4;\\n  vec3 ret_5;\\n  vec2 tmpvar_6;\\n  vec2 tmpvar_7;\\n  tmpvar_7 = (vec2(1.0, 0.0) * texsize.zw);\\n  tmpvar_6.x = (texture (sampler_main, (uv + tmpvar_7)).xyz - texture (sampler_main, (uv - tmpvar_7)).xyz).y;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (vec2(0.0, 1.0) * texsize.zw);\\n  tmpvar_6.y = (texture (sampler_main, (uv + tmpvar_8)).xyz - texture (sampler_main, (uv - tmpvar_8)).xyz).y;\\n  d_4 = (texsize.zw * 2.0);\\n  dx_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * d_4))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * d_4))\\n  ).xyz * scale1) + bias1));\\n  dy_2 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * d_4))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * d_4))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = dx_3.y;\\n  tmpvar_9.y = dy_2.y;\\n  dz_1 = ((tmpvar_6 * 3.0) + tmpvar_9);\\n  ret_5 = (vec3(((\\n    pow ((sqrt(dot (dz_1, dz_1)) * 0.8), 0.7)\\n   + \\n    (((texture (sampler_blur2, uv).xyz * scale2) + bias2).y * 0.4)\\n  ) - 0.1)) * vec3(0.3, 0.5, 0.7));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = dx_3.x;\\n  tmpvar_10.y = dy_2.x;\\n  vec3 tmpvar_11;\\n  tmpvar_11 = mix (mix (ret_5, vec3(0.2, 0.1, 0.0), vec3((texture (sampler_main, \\n    (uv + ((tmpvar_10 * texsize.zw) * 18.0))\\n  ).x * 6.0))), vec3(1.0, 1.0, 1.0), texture (sampler_main, uv).zzz);\\n  ret_5 = tmpvar_11;\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = tmpvar_11;\\n  ret = tmpvar_12.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:.5,wave_thick:1,wave_brighten:0,wave_a:.004,wave_scale:.267,wave_smoothing:0,wave_mystery:-.44,modwavealphastart:1,modwavealphaend:1,warpscale:16.016,zoomexp:11.56276,zoom:1.05971,warp:.13126,wave_y:.04,ob_size:0,ob_a:1,ib_size:0,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:100,thickoutline:1,rad:.01,tex_ang:.12566,tex_zoom:1.51878,g:.99,b:1,a:.1,g2:0,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.v=0;a.t=0;a.q12=0;a.q13=0;a.q11=div(.5,Math.asin(1));\",frame_eqs_str:\"a.zoom=1;a.v=.9*a.v+.04*(a.bass-a.treb);a.t+=.01*a.v;a.q12=.1*a.time+a.t;a.q13=.25+.01*(a.bass_att-a.treb_att);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 my_uv_1;\\n  vec2 d_2;\\n  vec3 ret_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (texsize.zw * 4.0);\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_blur1, \\n    fract((uv + (vec2(1.0, 0.0) * tmpvar_4)))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    fract((uv - (vec2(1.0, 0.0) * tmpvar_4)))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_6;\\n  tmpvar_6 = (((texture (sampler_blur1, \\n    fract((uv + (vec2(0.0, 1.0) * tmpvar_4)))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    fract((uv - (vec2(0.0, 1.0) * tmpvar_4)))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_7;\\n  tmpvar_7 = ((texture (sampler_blur1, uv).xyz * scale1) + bias1);\\n  d_2 = -(tmpvar_4);\\n  float tmpvar_8;\\n  tmpvar_8 = (d_2 * 4.0).x;\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_5.y;\\n  tmpvar_9.y = tmpvar_6.y;\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_5.x;\\n  tmpvar_10.y = tmpvar_6.x;\\n  vec2 tmpvar_11;\\n  tmpvar_11 = ((uv - (tmpvar_9 * d_2)) - (tmpvar_10 * tmpvar_8));\\n  ret_3.y = texture (sampler_fc_main, (tmpvar_11 - floor(tmpvar_11))).y;\\n  ret_3.y = (ret_3.y + ((\\n    (ret_3.y - tmpvar_7.y)\\n   * 0.042) + -0.0075));\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = tmpvar_5.x;\\n  tmpvar_12.y = tmpvar_6.x;\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = tmpvar_5.z;\\n  tmpvar_13.y = tmpvar_6.z;\\n  my_uv_1 = ((uv - (tmpvar_12 * d_2)) - (tmpvar_13 * tmpvar_8));\\n  ret_3.x = texture (sampler_fc_main, (my_uv_1 - floor(my_uv_1))).x;\\n  ret_3.x = (ret_3.x + ((\\n    (ret_3.x - tmpvar_7.x)\\n   * 0.042) + -0.0075));\\n  vec2 tmpvar_14;\\n  tmpvar_14.x = tmpvar_5.z;\\n  tmpvar_14.y = tmpvar_6.z;\\n  vec2 tmpvar_15;\\n  tmpvar_15.x = tmpvar_5.y;\\n  tmpvar_15.y = tmpvar_6.y;\\n  my_uv_1 = ((uv - (tmpvar_14 * d_2)) - (tmpvar_15 * tmpvar_8));\\n  ret_3.z = texture (sampler_fc_main, (my_uv_1 - floor(my_uv_1))).z;\\n  ret_3.z = (ret_3.z + ((\\n    (ret_3.z - tmpvar_7.z)\\n   * 0.042) + -0.0075));\\n  vec4 tmpvar_16;\\n  tmpvar_16.w = 1.0;\\n  tmpvar_16.xyz = ret_3;\\n  ret = tmpvar_16.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  uv_1 = uv;\\n  vec3 ret_2;\\n  float tmpvar_3;\\n  tmpvar_3 = -(q12);\\n  vec2 tmpvar_4;\\n  tmpvar_4 = ((uv - 0.5) * aspect.wz);\\n  float tmpvar_5;\\n  float tmpvar_6;\\n  tmpvar_6 = (min (abs(\\n    (tmpvar_4.x / tmpvar_4.y)\\n  ), 1.0) / max (abs(\\n    (tmpvar_4.x / tmpvar_4.y)\\n  ), 1.0));\\n  float tmpvar_7;\\n  tmpvar_7 = (tmpvar_6 * tmpvar_6);\\n  tmpvar_7 = (((\\n    ((((\\n      ((((-0.01213232 * tmpvar_7) + 0.05368138) * tmpvar_7) - 0.1173503)\\n     * tmpvar_7) + 0.1938925) * tmpvar_7) - 0.3326756)\\n   * tmpvar_7) + 0.9999793) * tmpvar_6);\\n  tmpvar_7 = (tmpvar_7 + (float(\\n    (abs((tmpvar_4.x / tmpvar_4.y)) > 1.0)\\n  ) * (\\n    (tmpvar_7 * -2.0)\\n   + 1.570796)));\\n  tmpvar_5 = (tmpvar_7 * sign((tmpvar_4.x / tmpvar_4.y)));\\n  if ((abs(tmpvar_4.y) > (1e-08 * abs(tmpvar_4.x)))) {\\n    if ((tmpvar_4.y < 0.0)) {\\n      if ((tmpvar_4.x >= 0.0)) {\\n        tmpvar_5 += 3.141593;\\n      } else {\\n        tmpvar_5 = (tmpvar_5 - 3.141593);\\n      };\\n    };\\n  } else {\\n    tmpvar_5 = (sign(tmpvar_4.x) * 1.570796);\\n  };\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = ((tmpvar_5 * q11) - tmpvar_3);\\n  tmpvar_8.y = (((q13 * \\n    log(sqrt(dot (tmpvar_4, tmpvar_4)))\\n  ) + (tmpvar_5 * q11)) + tmpvar_3);\\n  uv_1 = (0.5 + (0.5 - abs(\\n    ((fract((tmpvar_8 * 0.5)) * 2.0) - 1.0)\\n  )));\\n  vec4 tmpvar_9;\\n  tmpvar_9 = texture (sampler_main, uv_1);\\n  ret_2 = (vec3(dot (tmpvar_9.xyz, vec3(0.32, 0.49, 0.29))) * mix (vec3(1.0, 1.0, 1.0), vec3(0.2, 0.5, 1.0), tmpvar_9.xxx));\\n  ret_2 = (ret_2 * 2.0);\\n  vec4 tmpvar_10;\\n  tmpvar_10.w = 1.0;\\n  tmpvar_10.xyz = ret_2;\\n  ret = tmpvar_10.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:.5,wave_thick:1,wave_brighten:0,wrap:0,wave_a:.004,wave_scale:.242,wave_smoothing:0,wave_mystery:-.44,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.88,warpscale:9.181,zoomexp:.65309,zoom:.87866,warp:.04914,wave_y:.04,ob_size:.05,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,thickoutline:1,y:.04,rad:.01,tex_ang:.12566,tex_zoom:1.51878,r:0,a:0,g2:0,b2:.01,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1,additive:1,scaling:2.0231,smoothing:0,r:0,b:0},init_eqs_str:\"a.tt3=0;a.tt2=0;a.tt1=0;a.d=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.r=1;a.g=0;a.b=1;\",point_eqs_str:\"a.tt3=.6*a.tt3+1*a.value1;a.tt2=.7*a.tt2+.2*a.tt3;a.tt1=.8*a.tt1+.1*a.tt2;a.d=.9*a.d+.2*a.tt1;a.y=.6+a.d*a.sample*(1-a.sample)*2;a.x=-.05+1.1*a.sample;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.c_inv_i=0;a.translation_x=0;a.q12=0;a.a_i=0;a.a_r=0;a.q18=0;a.q13=0;a.scale=0;a.q15=0;a.c_inv_r=0;a.angle=0;a.q11=0;a.bcad_r=0;a.b_r=0;a.q16=0;a.bcad_i=0;a.q17=0;a.q14=0;a.translation_y=0;a.translation_v=0;a.b_i=0;a.translation_u=0;a.x1=.9;a.y1=.5;a.x2=.5;a.y2=.5;a.x3=.5;a.y3=.5;a.x4=.5;a.y4=.5;\",frame_eqs_str:\"a.zoom=1;a.scale=1;a.angle=.1*a.time;a.translation_x=0;a.translation_y=.12;a.a_r=Math.cos(a.angle)*a.scale;a.a_i=Math.sin(a.angle)*a.scale;a.b_r=a.translation_x;a.b_i=a.translation_y;a.scale=1.6;a.angle=0;a.translation_u=0;a.translation_v=0;a.q15=Math.cos(a.angle)*a.scale;a.q16=Math.sin(a.angle)*a.scale;a.q17=a.translation_u;a.q18=a.translation_v;a.c_inv_r=div(a.q15,a.q15*a.q15+a.q16*a.q16);a.c_inv_i=div(a.q16,a.q15*a.q15+a.q16*a.q16);a.q11=a.a_r*a.c_inv_r-a.a_i*a.c_inv_i;a.q12=\\na.a_r*a.c_inv_i-a.a_i*a.c_inv_r;a.bcad_r=a.b_r*a.q15-a.b_i*a.q16-(a.a_r*a.q17-a.a_i*a.q18);a.bcad_i=a.b_r*a.q16-a.b_i*a.q15-(a.a_r*a.q18-a.a_i*a.q17);a.q13=a.bcad_r*a.c_inv_r-a.bcad_i*a.c_inv_i;a.q14=a.bcad_r*a.c_inv_i-a.bcad_i*a.c_inv_r;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  float conway_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = (((\\n    ((texture (sampler_blur2, (uv + vec2(0.02, 0.0))).xyz * scale2) + bias2)\\n   - \\n    ((texture (sampler_blur2, (uv - vec2(0.02, 0.0))).xyz * scale2) + bias2)\\n  ).y * 1280.0) * texsize.z);\\n  tmpvar_3.y = (((\\n    ((texture (sampler_blur2, (uv + vec2(0.0, 0.02))).xyz * scale2) + bias2)\\n   - \\n    ((texture (sampler_blur2, (uv - vec2(0.0, 0.02))).xyz * scale2) + bias2)\\n  ).y * 1024.0) * texsize.w);\\n  ret_2.y = texture (sampler_pc_main, (uv - (tmpvar_3 * 0.004))).y;\\n  ret_2.y = (ret_2.y + ((\\n    ((ret_2.y - ((texture (sampler_blur1, uv).xyz * scale1) + bias1).y) - 0.1)\\n   * 0.1) + 0.02));\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (vec2(0.0, 1.0) * texsize.zw);\\n  ret_2.z = (texture (sampler_fc_main, (uv - tmpvar_4)).z - 0.004);\\n  conway_1 = (texture (sampler_pw_main, (uv_orig - texsize.zw)).x + texture (sampler_pw_main, (uv_orig + (vec2(0.0, -1.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(1.0, -1.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(-1.0, 0.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(1.0, 0.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(-1.0, 1.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + tmpvar_4)).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + texsize.zw)).x);\\n  conway_1 = (conway_1 - fract(conway_1));\\n  float tmpvar_5;\\n  tmpvar_5 = clamp (texture (sampler_pc_main, uv_orig).x, 0.0, 1.0);\\n  ret_2.x = (clamp ((1.0 - \\n    abs((conway_1 - 3.0))\\n  ), 0.0, 1.0) * (1.0 - tmpvar_5));\\n  ret_2.x = (ret_2.x + (clamp (\\n    max ((1.0 - abs((conway_1 - 2.0))), (1.0 - abs((conway_1 - 3.0))))\\n  , 0.0, 1.0) * tmpvar_5));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ret_2;\\n  ret = tmpvar_6.xyz;\\n }\",comp:\" shader_body { \\n  vec2 moebius_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = q11;\\n  tmpvar_3.y = q12;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q17;\\n  tmpvar_4.y = q18;\\n  vec2 tmpvar_5;\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv - 0.5);\\n  tmpvar_5 = (tmpvar_6 * aspect.xy);\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = ((tmpvar_5.x * q15) - (tmpvar_5.y * q16));\\n  tmpvar_7.y = ((tmpvar_5.x * q16) - (tmpvar_5.y * q15));\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (tmpvar_7 + tmpvar_4);\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = ((q13 * tmpvar_8.x) + (q14 * tmpvar_8.y));\\n  tmpvar_9.y = ((q14 * tmpvar_8.x) - (q13 * tmpvar_8.y));\\n  moebius_1 = (((tmpvar_9 / \\n    ((tmpvar_8.x * tmpvar_8.x) + (tmpvar_8.y * tmpvar_8.y))\\n  ) + tmpvar_3) * 0.5);\\n  float tmpvar_10;\\n  tmpvar_10 = sqrt(dot (moebius_1, moebius_1));\\n  moebius_1 = (0.5 + ((\\n    (1.0 - abs(((\\n      fract((moebius_1 * 0.5))\\n     * 2.0) - 1.0)))\\n   - 0.5) * 0.95));\\n  vec2 tmpvar_11;\\n  tmpvar_11 = (0.5 + (tmpvar_6 * 0.2));\\n  ret_2 = (texture (sampler_main, tmpvar_11).z * vec3(0.4, 0.0, 0.7));\\n  ret_2 = (mix (ret_2, vec3(0.0, 1.0, 1.0), vec3(clamp (texture (sampler_fc_main, moebius_1).y, 0.0, 1.0))) * (1.4 - pow (\\n    (tmpvar_10 * 0.8)\\n  , 0.3)));\\n  vec3 tmpvar_12;\\n  tmpvar_12 = mix (mix (mix (ret_2, vec3(4.0, 1.0, 0.0), vec3(\\n    ((clamp ((texture (sampler_fc_main, tmpvar_11).y - texture (sampler_pc_main, tmpvar_11).y), 0.0, 1.0) * 4.0) * (tmpvar_10 * tmpvar_10))\\n  )), vec3(-4.0, -4.0, -4.0), texture (sampler_main, tmpvar_11).xxx), vec3(2.0, 2.0, 2.0), vec3((texture (sampler_pc_main, tmpvar_11).x * 0.75)));\\n  ret_2 = tmpvar_12;\\n  vec4 tmpvar_13;\\n  tmpvar_13.w = 1.0;\\n  tmpvar_13.xyz = tmpvar_12;\\n  ret = tmpvar_13.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:1,gammaadj:1.28,decay:.8,echo_zoom:1,echo_orient:3,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,brighten:1,wave_a:.001,wave_scale:1.286,wave_smoothing:.63,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:.01,warpscale:100,zoomexp:.92178,zoom:.9901,warp:.01,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:.005,ob_g:1,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:0,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.y3=0;a.y1=0;a.xx=0;a.s=0;a.x1=0;a.vx3=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.v=0;a.vx4=0;a.grav=0;a.x3=0;a.q11=0;a.q10=0;a.xx2=0;a.q4=0;a.a=0;a.yy1=0;a.vy4=0;a.dir=0;a.bounce=0;a.x4=0;a.r=0;a.x2=0;a.vy2=0;a.y2=0;a.q2=0;a.spring=0;a.vx2=0;a.q3=0;a.resist=0;a.yy=0;a.y4=0;a.vy3=0;a.xx1=0;a.v2=0;a.q8=0;a.x1=.9;a.y1=.5;a.x2=.5;a.y2=.5;a.x3=.5;a.y3=.5;a.x4=.5;a.y4=.5;\",frame_eqs_str:\"a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+2*(a.xx1-a.xx2);a.y1=.4+a.yy1;a.x1=Math.max(0,Math.min(1,a.x1));a.y1=Math.max(0,Math.min(1,a.y1));a.spring=10;a.grav=.5;a.resist=1;a.bounce=.75;a.dt=.0001*div(60,a.fps);a.vx2=a.vx2*(1-a.resist*a.dt)+a.dt*(a.x1+a.x3-2*a.x2)*a.spring;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*((a.y1+a.y3-2*a.y2)*a.spring-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*(a.x2+a.x4-2*a.x3)*a.spring;a.vy3=a.vy3*(1-\\na.resist*a.dt)+a.dt*((a.y2+a.y4-2*a.y3)*a.spring-a.grav);a.vx4=a.vx4*(1-a.resist*a.dt)+a.dt*(a.x3-a.x4)*a.spring;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*((a.y3-a.y4)*a.spring-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<Math.abs(above(a.x3,0))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:-Math.abs(a.vx3)*\\na.bounce;a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:Math.abs(a.vx4)*a.bounce;a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:-Math.abs(a.vy3)*a.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<\\nMath.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q4=a.x4;a.q8=a.y4;a.q1=a.aspectx;a.q2=a.aspecty;a.q10=a.x1;a.q11=a.y1;a.zoom=1;a.warp=0;a.q6=Math.atan2(a.vx4,a.vy4);a.q5=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.a=.95*a.a+a.q5;a.s=.9*a.s+a.a;a.q3=.1*a.s;a.monitor=a.s;a.wave_a=0;\",pixel_eqs_str:\"a.x=.5+(a.x-.5)*a.q1;a.y=.5+(a.y-.5)*a.q2;a.xx=a.q4;a.yy=1-a.q8;a.dx=0;a.dy=0;a.d=sqrt((a.x-a.xx)*(a.x-a.xx)+(a.y-a.yy)*(a.y-a.yy));a.r=.1;a.v=20;a.v2=a.q5;a.dx=(a.v*(Math.sin(a.y-a.yy)*(a.d-a.r)-(a.x-a.xx)*(a.d-div(a.r,2)))+Math.cos(a.dir)*a.v2)*(1-sigmoid(a.d-a.r,120));a.dy=(-a.v*(Math.sin(a.x-a.xx)*(a.d-a.r)+(a.y-a.yy)*(a.d-div(a.r,2)))-Math.sin(a.dir)*a.v2)*(1-sigmoid(a.d-a.r,120));\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = mix (uv_orig, uv, vec2(2.0, 2.0));\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (texsize.zw * 2.0);\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (tmpvar_2 + (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (tmpvar_2 - (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_blur1, \\n    (tmpvar_2 + (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (tmpvar_2 - (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = tmpvar_4.x;\\n  tmpvar_6.y = tmpvar_5.x;\\n  vec2 tmpvar_7;\\n  tmpvar_7 = (tmpvar_2 + ((tmpvar_6 * texsize.zw) * 8.0));\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_4.y;\\n  tmpvar_8.y = tmpvar_5.y;\\n  vec2 tmpvar_9;\\n  tmpvar_9 = (tmpvar_2 + ((tmpvar_8 * texsize.zw) * 8.0));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_4.z;\\n  tmpvar_10.y = tmpvar_5.z;\\n  vec2 tmpvar_11;\\n  tmpvar_11 = (tmpvar_2 + ((tmpvar_10 * texsize.zw) * 8.0));\\n  ret_1.x = (texture (sampler_main, tmpvar_7).x - ((texture (sampler_main, tmpvar_7).xyz - \\n    ((texture (sampler_blur3, tmpvar_7).xyz * scale3) + bias3)\\n  ).x * 0.02));\\n  ret_1.y = (texture (sampler_main, tmpvar_9).y - ((texture (sampler_main, tmpvar_9).xyz - \\n    ((texture (sampler_blur3, tmpvar_9).xyz * scale3) + bias3)\\n  ).y * 0.02));\\n  ret_1.z = (texture (sampler_main, tmpvar_11).z - ((texture (sampler_main, tmpvar_11).xyz - \\n    ((texture (sampler_blur3, tmpvar_11).xyz * scale3) + bias3)\\n  ).z * 0.02));\\n  ret_1 = (ret_1 + ((texture (sampler_noise_lq, \\n    (((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 1.2)) + rand_frame.xy)\\n  ).xyz - 0.5) * 0.04));\\n  ret_1 = (ret_1 - ((ret_1.yzx * 0.1) - 0.02));\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = ret_1;\\n  ret = tmpvar_12.xyz;\\n }\",comp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = (texsize.zw * 8.0);\\n  vec3 tmpvar_2;\\n  tmpvar_2 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_1))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q4;\\n  tmpvar_4.y = (1.0 - q8);\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_2.y;\\n  tmpvar_5.y = tmpvar_3.y;\\n  vec2 x_6;\\n  x_6 = ((uv - (tmpvar_5 * 2.0)) - tmpvar_4);\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_2.x;\\n  tmpvar_7.y = tmpvar_3.x;\\n  vec2 x_8;\\n  x_8 = ((uv - (tmpvar_7 * 2.0)) - tmpvar_4);\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_2.z;\\n  tmpvar_9.y = tmpvar_3.z;\\n  vec2 x_10;\\n  x_10 = ((uv - (tmpvar_9 * 2.0)) - tmpvar_4);\\n  vec3 tmpvar_11;\\n  tmpvar_11.x = (1.1 - pow (sqrt(\\n    dot (x_8, x_8)\\n  ), 0.2));\\n  tmpvar_11.y = (1.1 - pow (sqrt(\\n    dot (x_6, x_6)\\n  ), 0.2));\\n  tmpvar_11.z = (1.1 - pow (sqrt(\\n    dot (x_10, x_10)\\n  ), 0.2));\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = ((tmpvar_11 * texture (sampler_main, uv).xyz) * 2.4);\\n  ret = tmpvar_12.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:1,echo_zoom:1,echo_orient:2,wave_mode:1,wave_thick:1,wave_brighten:0,wrap:0,wave_a:.004,wave_scale:.01,wave_smoothing:0,wave_mystery:-.44,modwavealphastart:1,modwavealphaend:1,warpanimspeed:1.311,warpscale:8.311,zoomexp:5.20652,warp:.13291,wave_y:.04,ob_size:.005,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:0,mv_y:0,mv_l:1,mv_g:.91,mv_b:.71,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:100,additive:1,thickoutline:1,y:.75,rad:.07493,tex_zoom:.73458,g:1,g2:0,border_a:0},init_eqs_str:\"a.q4=0;a.q8=0;a.vx=0;\",frame_eqs_str:\"a.x=a.q4;a.y=a.q8;\"},{baseVals:{enabled:1,sides:100,additive:1,thickoutline:1,textured:1,x:.7,y:.3,rad:.6623,ang:2.45044,tex_zoom:.74934,g:.1,b:.1,r2:1,g2:.1,b2:.1,a2:1,border_a:0},init_eqs_str:\"a.d=0;a.xx=0;a.q4=0;a.yy=0;a.q8=0;a.aang=0;a.xx=.5;a.yy=.4;\",frame_eqs_str:\"a.d=sqrt(sqr(a.xx-a.q4)+sqr(a.yy-a.q8));a.xx=.00001<Math.abs(below(a.d,.15))?.4+div(randint(200),1E3):a.xx;a.yy=.00001<Math.abs(below(a.d,.15))?.3+div(randint(400),1E3):a.yy;a.aang=.00001<Math.abs(below(a.d,.12))?div(randint(1E3),1E3):a.aang;a.ang=4*a.aang*Math.asin(1);a.x=a.xx;a.y=a.yy;\"},{baseVals:{enabled:1,sides:100,additive:1,thickoutline:1,textured:1,x:.43,y:.6,rad:1.16781,ang:5.96903,tex_zoom:.67165,r2:1,g2:0,a2:1,border_a:0},init_eqs_str:\"a.d=0;a.xx=0;a.q4=0;a.yy=0;a.q8=0;a.aang=0;a.xx=.5;a.yy=.4;\",frame_eqs_str:\"a.d=sqrt(sqr(a.xx-a.q4)+sqr(a.yy-a.q8));a.xx=.00001<Math.abs(below(a.d,.15))?.4+div(randint(200),1E3):a.xx;a.yy=.00001<Math.abs(below(a.d,.15))?.3+div(randint(400),1E3):a.yy;a.aang=.00001<Math.abs(below(a.d,.12))?div(randint(1E3),1E3):a.aang;a.ang=4*a.aang*Math.asin(1);a.x=a.xx;a.y=a.yy;\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.spx3=0;a.x1=0;a.vx3=0;a.q6=0;a.spy2=0;a.dt=0;a.spy3=0;a.q1=0;a.q5=0;a.spx2=0;a.vx4=0;a.spx4=0;a.grav=0;a.x3=0;a.ry4=0;a.xx2=0;a.q4=0;a.spy4=0;a.yy1=0;a.vy4=0;a.bounce=0;a.x4=0;a.x2=0;a.vy2=0;a.y2=0;a.q2=0;a.spring=0;a.vx2=0;a.q3=0;a.resist=0;a.y4=0;a.q7=0;a.vy3=0;a.xx1=0;a.q8=0;a.x1=0;a.y1=0;\",frame_eqs_str:\"a.decay=.25;a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+2*(a.xx1-a.xx2);a.y1=.4+a.yy1;a.x1=Math.max(0,Math.min(1,a.x1));a.y1=Math.max(0,Math.min(1,a.y1));a.spring=50;a.grav=2;a.resist=5;a.bounce=.75;a.dt=div(.009,a.fps);a.spx2=(a.x1+a.x3-2*a.x2)*a.spring;a.spy2=(a.y1+a.y3-2*a.y2)*a.spring;a.spx3=(a.x2+a.x4-2*a.x3)*a.spring;a.spy3=(a.y2+a.y4-2*a.y3)*a.spring;a.spx4=(a.x3-a.x4)*a.spring;a.spy4=(a.y3-a.y4)*a.spring;a.vx2=a.vx2*\\n(1-a.resist*a.dt)+a.dt*a.spx2;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*(a.spy2-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*a.spx3;a.vy3=a.vy3*(1-a.resist*a.dt)+a.dt*(a.spy3-a.grav);a.vx4=a.vx4*(1-a.resist*a.dt)+a.dt*a.spx4;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*(a.spy4-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,.1))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,.9))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<Math.abs(above(a.x3,\\n.1))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,.9))?a.vx3:-Math.abs(a.vx3)*a.bounce;a.vx4=.00001<Math.abs(above(a.x4,.1))?a.vx4:Math.abs(a.vx4)*a.bounce;a.vx4=.00001<Math.abs(below(a.x4,.9))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:-Math.abs(a.vy3)*\\na.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<Math.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q1=a.x1;a.q2=a.x2;a.q3=a.x3;a.q4=a.x4;a.q5=a.y1;a.q6=a.y2;a.q7=a.y3;a.q8=a.y4;a.monitor=a.ry4;a.zoom=1.0004;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 my_uv_1;\\n  vec3 ret_2;\\n  float tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur2, \\n    (uv + vec2(0.005, 0.0))\\n  ).xyz * scale2) + bias2) - ((texture (sampler_blur2, \\n    (uv - vec2(0.005, 0.0))\\n  ).xyz * scale2) + bias2)).y;\\n  float tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur2, \\n    (uv + vec2(0.0, 0.005))\\n  ).xyz * scale2) + bias2) - ((texture (sampler_blur2, \\n    (uv - vec2(0.0, 0.005))\\n  ).xyz * scale2) + bias2)).y;\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3;\\n  tmpvar_5.y = tmpvar_4;\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv - (tmpvar_5 * 0.01));\\n  ret_2.y = texture (sampler_fc_main, (tmpvar_6 - floor(tmpvar_6))).y;\\n  ret_2.y = (ret_2.y + ((ret_2.y - \\n    ((texture (sampler_blur3, (tmpvar_6 - floor(tmpvar_6))).xyz * scale3) + bias3)\\n  .y) * 0.1));\\n  vec2 tmpvar_7;\\n  tmpvar_7 = floor(uv);\\n  ret_2.y = (ret_2.y + (0.006 - (\\n    ((texture (sampler_blur3, (uv - tmpvar_7)).xyz * scale3) + bias3)\\n  .x * 5.0)));\\n  ret_2.y = ret_2.y;\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = -(tmpvar_4);\\n  tmpvar_8.y = tmpvar_3;\\n  my_uv_1 = (tmpvar_8 * 0.05);\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = (((texture (sampler_blur2, \\n    (uv + vec2(0.01, 0.0))\\n  ).xyz * scale2) + bias2) - ((texture (sampler_blur2, \\n    (uv - vec2(0.01, 0.0))\\n  ).xyz * scale2) + bias2)).z;\\n  tmpvar_9.y = (((texture (sampler_blur2, \\n    (uv + vec2(0.0, 0.01))\\n  ).xyz * scale2) + bias2) - ((texture (sampler_blur2, \\n    (uv - vec2(0.0, 0.01))\\n  ).xyz * scale2) + bias2)).z;\\n  my_uv_1 = (my_uv_1 + (uv - (tmpvar_9 * 0.005)));\\n  ret_2.z = texture (sampler_fw_main, (my_uv_1 - floor(my_uv_1))).z;\\n  ret_2.z = (ret_2.z + ((ret_2.z - \\n    ((texture (sampler_blur3, (my_uv_1 - floor(my_uv_1))).xyz * scale3) + bias3)\\n  .z) * 0.13));\\n  ret_2.z = (ret_2.z * 0.95);\\n  ret_2.z = (ret_2.z + ((0.03 - \\n    ((texture (sampler_blur3, (uv - tmpvar_7)).xyz * scale3) + bias3)\\n  .x) - (texture (sampler_main, \\n    (my_uv_1 - floor(my_uv_1))\\n  ).y * 0.05)));\\n  ret_2.x = (texture (sampler_main, uv_orig).x - 0.3);\\n  vec4 tmpvar_10;\\n  tmpvar_10.w = 1.0;\\n  tmpvar_10.xyz = ret_2;\\n  ret = tmpvar_10.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 8.0);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_blur1, \\n    (uv + (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(1.0, 0.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv + (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv - (vec2(0.0, 1.0) * tmpvar_2))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.y;\\n  tmpvar_5.y = tmpvar_4.y;\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv + (tmpvar_5 * 0.1));\\n  vec4 tmpvar_7;\\n  tmpvar_7 = texture (sampler_main, uv);\\n  ret_1 = (((\\n    ((texture (sampler_blur2, tmpvar_6).xyz * scale2) + bias2)\\n  .x * \\n    clamp ((1.0 - tmpvar_7.z), 0.0, 1.0)\\n  ) * pow (hue_shader.yxz, vec3(8.0, 8.0, 8.0))) * 3.0);\\n  ret_1 = (mix (ret_1, (\\n    pow (hue_shader.yzx, vec3(8.0, 8.0, 8.0))\\n   * 1.4), vec3((\\n    (texture (sampler_main, tmpvar_6).x * 0.8)\\n   + \\n    ((texture (sampler_blur1, tmpvar_6).xyz * scale1) + bias1)\\n  .x))) * clamp ((1.0 - \\n    (((texture (sampler_blur1, uv).xyz * scale1) + bias1).y * 4.0)\\n  ), 0.0, 1.0));\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_3.y;\\n  tmpvar_8.y = tmpvar_4.y;\\n  vec3 tmpvar_9;\\n  vec3 tmpvar_10;\\n  tmpvar_10 = pow (hue_shader, vec3(8.0, 8.0, 8.0));\\n  tmpvar_9 = mix (mix (ret_1, vec3(1.0, 1.0, 1.0), (\\n    (tmpvar_10 * texture (sampler_main, clamp ((uv - (tmpvar_8 * 0.04)), 0.0, 1.0)).z)\\n   * 1.2)), (tmpvar_10.zxy * 1.8), tmpvar_7.yyy);\\n  ret_1 = tmpvar_9;\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = tmpvar_9;\\n  ret = tmpvar_11.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.56,decay:1,echo_zoom:.362,echo_orient:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:1.599,wave_smoothing:0,wave_mystery:-.5,modwavealphastart:2,modwavealphaend:2,warpscale:.107,zoomexp:.1584,fshader:1,warp:.01,wave_r:.51,wave_g:.5,ob_size:0,ob_a:1,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:.5,mv_r:0,mv_g:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.y3=0;a.y1=0;a.xx=0;a.s=0;a.q12=0;a.x1=0;a.vx3=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.v=0;a.vx4=0;a.mm=0;a.tt=0;a.grav=0;a.x3=0;a.xx2=0;a.q4=0;a.a=0;a.yy1=0;a.vy4=0;a.dir=0;a.bounce=0;a.x4=0;a.t=0;a.r=0;a.x2=0;a.mx=0;a.mn=0;a.vy2=0;a.y2=0;a.bb=0;a.q2=0;a.spring=0;a.vx2=0;a.q3=0;a.resist=0;a.yy=0;a.y4=0;a.vy3=0;a.xx1=0;a.q8=0;a.q11=div(.5,Math.asin(1));\",frame_eqs_str:\"a.ib_r=.3*Math.sin(5*a.time)+.7;a.ib_g=.3*Math.sin(4*a.time)+.3;a.ib_b=.5*Math.sin(4*div(a.time,3))+.5;a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+3*(a.xx1-a.xx2);a.y1=.4+a.yy1;a.x1=Math.max(0,Math.min(1,a.x1));a.y1=Math.max(0,Math.min(1,a.y1));a.spring=25;a.grav=1.1;a.resist=1;a.bounce=.85;a.dt=.0002*div(60,a.fps);a.vx2=a.vx2*(1-a.resist*a.dt)+a.dt*(a.x1+a.x3-2*a.x2)*a.spring;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*((a.y1+a.y3-\\n2*a.y2)*a.spring-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*(a.x2+a.x4-2*a.x3)*a.spring;a.vy3=a.vy3*(1-a.resist*a.dt)+a.dt*((a.y2+a.y4-2*a.y3)*a.spring-a.grav);a.vx4=a.vx4*(1-a.resist*a.dt)+a.dt*(a.x3-a.x4)*a.spring;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*((a.y3-a.y4)*a.spring-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<\\nMath.abs(above(a.x3,0))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:-Math.abs(a.vx3)*a.bounce;a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:Math.abs(a.vx4)*a.bounce;a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?\\na.vy3:-Math.abs(a.vy3)*a.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<Math.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q4=a.x4;a.q8=a.y4;a.q1=a.aspectx;a.q2=a.aspecty;a.zoom=1;a.warp=0;a.bb=.99*a.bb+.02*a.bass;a.mm=.99*a.mm+.02*a.mid;a.tt=.99*a.tt+.02*a.treb;a.mx=Math.max(Math.max(a.bb,a.mm),a.tt);a.mn=Math.min(Math.min(a.bb,a.mm),a.tt);a.ob_r=div(a.bb-a.mn,a.mx-a.mn);a.ob_b=div(a.mm-a.mn,a.mx-a.mn);a.ob_g=div(a.tt-a.mn,a.mx-a.mn);a.q6=Math.atan2(a.vx4,\\na.vy4);a.q5=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.a=.95*a.a+a.q5;a.s=.9*a.s+a.a;a.q3=.1*a.s;a.t+=div(.1,a.fps);a.t=.00001<Math.abs(above(a.t,2))?a.t-2:a.t;a.q12=-a.t;a.monitor=a.t;a.wave_a=0;\",pixel_eqs_str:\"a.x=.5+(a.x-.5)*a.q1;a.y=.5+(a.y-.5)*a.q2;a.dir=-a.q6+0*Math.asin(1);a.xx=a.q4;a.yy=1-a.q8;a.dx=0;a.dy=0;a.d=sqrt((a.x-a.xx)*(a.x-a.xx)+(a.y-a.yy)*(a.y-a.yy));a.r=.08;a.v=-15*a.q5;a.dx=a.v*Math.sin(a.dir)*(a.r-a.d)*(1-sigmoid(a.d-a.r,200))*a.q2;a.dy=a.v*Math.cos(a.dir)*(a.r-a.d)*(1-sigmoid(a.d-a.r,200))*a.q1;\",warp:\" shader_body { \\n  vec3 tmpvar_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  tmpvar_1 = vec3((((tmpvar_2.x + tmpvar_2.y) + tmpvar_2.z) * 0.33333));\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ((texture (sampler_main, clamp (\\n    (uv - ((vec2(0.0, 0.0168) * (tmpvar_1 - 0.35).xy) * (tmpvar_1 - 0.4).xy))\\n  , 0.0, 1.0)).xyz - 0.001) + ((texture (sampler_noise_lq, \\n    (((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 2.0)) + rand_frame.xy)\\n  ) - 0.5) * 0.04).xyz);\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = ((uv - 0.5).yx * aspect.zw);\\n  float tmpvar_2;\\n  float tmpvar_3;\\n  tmpvar_3 = (min (abs(\\n    (tmpvar_1.x / tmpvar_1.y)\\n  ), 1.0) / max (abs(\\n    (tmpvar_1.x / tmpvar_1.y)\\n  ), 1.0));\\n  float tmpvar_4;\\n  tmpvar_4 = (tmpvar_3 * tmpvar_3);\\n  tmpvar_4 = (((\\n    ((((\\n      ((((-0.01213232 * tmpvar_4) + 0.05368138) * tmpvar_4) - 0.1173503)\\n     * tmpvar_4) + 0.1938925) * tmpvar_4) - 0.3326756)\\n   * tmpvar_4) + 0.9999793) * tmpvar_3);\\n  tmpvar_4 = (tmpvar_4 + (float(\\n    (abs((tmpvar_1.x / tmpvar_1.y)) > 1.0)\\n  ) * (\\n    (tmpvar_4 * -2.0)\\n   + 1.570796)));\\n  tmpvar_2 = (tmpvar_4 * sign((tmpvar_1.x / tmpvar_1.y)));\\n  if ((abs(tmpvar_1.y) > (1e-08 * abs(tmpvar_1.x)))) {\\n    if ((tmpvar_1.y < 0.0)) {\\n      if ((tmpvar_1.x >= 0.0)) {\\n        tmpvar_2 += 3.141593;\\n      } else {\\n        tmpvar_2 = (tmpvar_2 - 3.141593);\\n      };\\n    };\\n  } else {\\n    tmpvar_2 = (sign(tmpvar_1.x) * 1.570796);\\n  };\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (tmpvar_2 * q11);\\n  tmpvar_5.y = (((0.5 * \\n    log(sqrt(dot (tmpvar_1, tmpvar_1)))\\n  ) - (tmpvar_2 * q11)) + q12);\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = pow (texture (sampler_main, (0.5 + (\\n    (0.5 - abs(((\\n      fract((tmpvar_5 * 0.5))\\n     * 2.0) - 1.0)))\\n   * vec2(0.96, 1.0)))).xyz, vec3(0.618034, 0.618034, 0.618034));\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:.5,wave_thick:1,wave_brighten:0,wave_a:.004,wave_scale:.01,wave_smoothing:0,wave_mystery:-.44,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.01,warpscale:100,zoomexp:.24298,zoom:.9901,warp:.01,wave_y:.04,ob_size:0,ob_g:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:100,thickoutline:1,rad:.01,tex_ang:.12566,tex_zoom:1.51878,r:.05,a:.1,g2:0,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.x1=.9;a.y1=.5;a.x2=.5;a.y2=.5;a.x3=.5;a.y3=.5;a.x4=.5;a.y4=.5;\",frame_eqs_str:\"a.zoom=1;a.warp=0;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 my_uv_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (0.02 * aspect.zw);\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur2, \\n    ((uv + (vec2(1.0, 0.0) * tmpvar_3)) - floor((uv + (vec2(1.0, 0.0) * tmpvar_3))))\\n  ).xyz * scale2) + bias2) - ((texture (sampler_blur2, \\n    ((uv - (vec2(1.0, 0.0) * tmpvar_3)) - floor((uv - (vec2(1.0, 0.0) * tmpvar_3))))\\n  ).xyz * scale2) + bias2));\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_blur2, \\n    ((uv + (vec2(0.0, 1.0) * tmpvar_3)) - floor((uv + (vec2(0.0, 1.0) * tmpvar_3))))\\n  ).xyz * scale2) + bias2) - ((texture (sampler_blur2, \\n    ((uv - (vec2(0.0, 1.0) * tmpvar_3)) - floor((uv - (vec2(0.0, 1.0) * tmpvar_3))))\\n  ).xyz * scale2) + bias2));\\n  vec3 tmpvar_6;\\n  tmpvar_6 = ((texture (sampler_blur1, uv).xyz * scale1) + bias1);\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_4.y;\\n  tmpvar_7.y = tmpvar_5.y;\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_5.x;\\n  tmpvar_8.y = -(tmpvar_4.x);\\n  vec2 tmpvar_9;\\n  tmpvar_9 = ((uv - (tmpvar_7 * vec2(0.01, 0.01))) - (tmpvar_8 * -0.02));\\n  ret_2.y = texture (sampler_fc_main, (tmpvar_9 - floor(tmpvar_9))).y;\\n  ret_2.y = (ret_2.y + ((\\n    (ret_2.y - tmpvar_6.y)\\n   * 0.02) + 0.005));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_4.x;\\n  tmpvar_10.y = tmpvar_5.x;\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = tmpvar_5.z;\\n  tmpvar_11.y = -(tmpvar_4.z);\\n  my_uv_1 = ((uv - (tmpvar_10 * vec2(0.01, 0.01))) - (tmpvar_11 * -0.02));\\n  ret_2.x = texture (sampler_fc_main, (my_uv_1 - floor(my_uv_1))).x;\\n  ret_2.x = (ret_2.x + ((\\n    (ret_2.x - tmpvar_6.x)\\n   * 0.02) + 0.005));\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = tmpvar_4.z;\\n  tmpvar_12.y = tmpvar_5.z;\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = tmpvar_5.y;\\n  tmpvar_13.y = -(tmpvar_4.y);\\n  my_uv_1 = ((uv - (tmpvar_12 * vec2(0.01, 0.01))) - (tmpvar_13 * -0.02));\\n  ret_2.z = texture (sampler_fc_main, (my_uv_1 - floor(my_uv_1))).z;\\n  ret_2.z = (ret_2.z + ((\\n    (ret_2.z - tmpvar_6.z)\\n   * 0.02) + 0.005));\\n  vec4 tmpvar_14;\\n  tmpvar_14.w = 1.0;\\n  tmpvar_14.xyz = ret_2;\\n  ret = tmpvar_14.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv2_1;\\n  vec3 ret_2;\\n  uv2_1 = (uv + (vec2(1.0, 0.0) * texsize.zw));\\n  float tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_main, uv2_1).xyz + \\n    (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4)\\n  ) + (\\n    ((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2)\\n   * 0.15)) + ((\\n    (texture (sampler_blur3, uv2_1).xyz * scale3)\\n   + bias3) * 0.1)).x;\\n  uv2_1 = (uv + (vec2(-1.0, 0.0) * texsize.zw));\\n  float tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_main, uv2_1).xyz + \\n    (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4)\\n  ) + (\\n    ((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2)\\n   * 0.15)) + ((\\n    (texture (sampler_blur3, uv2_1).xyz * scale3)\\n   + bias3) * 0.1)).x;\\n  uv2_1 = (uv + (vec2(0.0, 1.0) * texsize.zw));\\n  float tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_main, uv2_1).xyz + \\n    (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4)\\n  ) + (\\n    ((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2)\\n   * 0.15)) + ((\\n    (texture (sampler_blur3, uv2_1).xyz * scale3)\\n   + bias3) * 0.1)).x;\\n  uv2_1 = (uv + (vec2(0.0, -1.0) * texsize.zw));\\n  vec3 tmpvar_6;\\n  tmpvar_6.z = 0.14;\\n  tmpvar_6.x = (tmpvar_3 - tmpvar_4);\\n  tmpvar_6.y = (tmpvar_5 - ((\\n    (texture (sampler_main, uv2_1).xyz + (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4))\\n   + \\n    (((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2) * 0.15)\\n  ) + (\\n    ((texture (sampler_blur3, uv2_1).xyz * scale3) + bias3)\\n   * 0.1)).x);\\n  ret_2 = (0.5 + (0.5 * normalize(tmpvar_6)));\\n  vec2 x_7;\\n  x_7 = (ret_2.xy - 0.5);\\n  ret_2 = (ret_2 * clamp ((\\n    sqrt(dot (x_7, x_7))\\n   * 5.0), 0.0, 1.0));\\n  ret_2 = ret_2.xxy;\\n  ret_2 = (ret_2 + 1.15);\\n  ret_2 = (ret_2 * mix (ret_2, (ret_2 * \\n    (((texture (sampler_blur3, uv).xyz * scale3) + bias3) - ((texture (sampler_blur1, uv).xyz * scale1) + bias1))\\n  ), pow (hue_shader.zxy, ret_2)));\\n  ret_2 = (ret_2 * ret_2);\\n  vec4 tmpvar_8;\\n  tmpvar_8.w = 1.0;\\n  tmpvar_8.xyz = ret_2;\\n  ret = tmpvar_8.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,echo_zoom:1,echo_alpha:.5,wave_thick:1,wave_brighten:0,wrap:0,wave_a:.004,wave_scale:.242,wave_smoothing:0,wave_mystery:-.44,modwavealphastart:1,modwavealphaend:1,warpanimspeed:.397,warpscale:15.099,zoomexp:.65309,zoom:.87866,warp:.04027,wave_y:.04,ob_size:0,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,thickoutline:1,y:.04,rad:.01,tex_ang:.12566,tex_zoom:1.51878,r:0,a:0,g2:0,b2:.01,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1,additive:1,scaling:2.0231,smoothing:0,r:0,b:0},init_eqs_str:\"a.tt3=0;a.tt2=0;a.tt1=0;a.d=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.r=1;a.g=0;a.b=1;\",point_eqs_str:\"a.tt3=.6*a.tt3+1*a.value1;a.tt2=.7*a.tt2+.2*a.tt3;a.tt1=.8*a.tt1+.1*a.tt2;a.d=.9*a.d+.2*a.tt1;a.y=.6+a.d*a.sample*(1-a.sample)*2;a.x=-.05+1.1*a.sample;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.c_inv_i=0;a.translation_x=0;a.q12=0;a.a_i=0;a.a_r=0;a.q18=0;a.q13=0;a.scale=0;a.q15=0;a.c_inv_r=0;a.angle=0;a.q11=0;a.bcad_r=0;a.b_r=0;a.q16=0;a.bcad_i=0;a.q17=0;a.q14=0;a.translation_y=0;a.translation_v=0;a.b_i=0;a.translation_u=0;a.x1=.9;a.y1=.5;a.x2=.5;a.y2=.5;a.x3=.5;a.y3=.5;a.x4=.5;a.y4=.5;\",frame_eqs_str:\"a.zoom=.998;a.scale=1;a.angle=.02*a.time;a.translation_x=0;a.translation_y=.12;a.a_r=Math.cos(a.angle)*a.scale;a.a_i=Math.sin(a.angle)*a.scale;a.b_r=a.translation_x;a.b_i=a.translation_y;a.scale=1;a.angle=0*Math.sin(.1337*a.time);a.translation_u=0;a.translation_v=-.2;a.q15=Math.cos(a.angle)*a.scale;a.q16=Math.sin(a.angle)*a.scale;a.q17=a.translation_u;a.q18=a.translation_v;a.c_inv_r=div(a.q15,a.q15*a.q15+a.q16*a.q16);a.c_inv_i=div(a.q16,a.q15*a.q15+a.q16*a.q16);a.q11=a.a_r*\\na.c_inv_r-a.a_i*a.c_inv_i;a.q12=a.a_r*a.c_inv_i-a.a_i*a.c_inv_r;a.bcad_r=a.b_r*a.q15-a.b_i*a.q16-(a.a_r*a.q17-a.a_i*a.q18);a.bcad_i=a.b_r*a.q16-a.b_i*a.q15-(a.a_r*a.q18-a.a_i*a.q17);a.q13=a.bcad_r*a.c_inv_r-a.bcad_i*a.c_inv_i;a.q14=a.bcad_r*a.c_inv_i-a.bcad_i*a.c_inv_r;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  float conway_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = (((\\n    ((texture (sampler_blur2, (uv + vec2(0.02, 0.0))).xyz * scale2) + bias2)\\n   - \\n    ((texture (sampler_blur2, (uv - vec2(0.02, 0.0))).xyz * scale2) + bias2)\\n  ).y * 1280.0) * texsize.z);\\n  tmpvar_3.y = (((\\n    ((texture (sampler_blur2, (uv + vec2(0.0, 0.02))).xyz * scale2) + bias2)\\n   - \\n    ((texture (sampler_blur2, (uv - vec2(0.0, 0.02))).xyz * scale2) + bias2)\\n  ).y * 1024.0) * texsize.w);\\n  ret_2.y = texture (sampler_pc_main, (uv - (tmpvar_3 * 0.004))).y;\\n  ret_2.y = (ret_2.y + ((\\n    ((ret_2.y - ((texture (sampler_blur1, uv).xyz * scale1) + bias1).y) - 0.1)\\n   * 0.1) + 0.02));\\n  ret_2.z = (texture (sampler_fc_main, (0.5 + (\\n    (uv - 0.5)\\n   * 0.992))).z - 0.004);\\n  conway_1 = (texture (sampler_pw_main, (uv_orig - texsize.zw)).x + texture (sampler_pw_main, (uv_orig + (vec2(0.0, -1.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(1.0, -1.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(-1.0, 0.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(1.0, 0.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(-1.0, 1.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + (vec2(0.0, 1.0) * texsize.zw))).x);\\n  conway_1 = (conway_1 + texture (sampler_pw_main, (uv_orig + texsize.zw)).x);\\n  conway_1 = (conway_1 - fract(conway_1));\\n  float tmpvar_4;\\n  tmpvar_4 = clamp (texture (sampler_pc_main, uv_orig).x, 0.0, 1.0);\\n  ret_2.x = (clamp ((1.0 - \\n    abs((conway_1 - 3.0))\\n  ), 0.0, 1.0) * (1.0 - tmpvar_4));\\n  ret_2.x = (ret_2.x + (clamp (\\n    max ((1.0 - abs((conway_1 - 2.0))), (1.0 - abs((conway_1 - 3.0))))\\n  , 0.0, 1.0) * tmpvar_4));\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = ret_2;\\n  ret = tmpvar_5.xyz;\\n }\",comp:\" shader_body { \\n  vec2 moebius_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = q11;\\n  tmpvar_3.y = q12;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q17;\\n  tmpvar_4.y = q18;\\n  vec2 tmpvar_5;\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv - 0.5);\\n  tmpvar_5 = (tmpvar_6 * aspect.xy);\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = ((tmpvar_5.x * q15) - (tmpvar_5.y * q16));\\n  tmpvar_7.y = ((tmpvar_5.x * q16) - (tmpvar_5.y * q15));\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (tmpvar_7 + tmpvar_4);\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = ((q13 * tmpvar_8.x) + (q14 * tmpvar_8.y));\\n  tmpvar_9.y = ((q14 * tmpvar_8.x) - (q13 * tmpvar_8.y));\\n  moebius_1 = (((tmpvar_9 / \\n    ((tmpvar_8.x * tmpvar_8.x) + (tmpvar_8.y * tmpvar_8.y))\\n  ) + tmpvar_3) * 0.5);\\n  float tmpvar_10;\\n  tmpvar_10 = sqrt(dot (moebius_1, moebius_1));\\n  moebius_1 = (0.5 + ((\\n    (1.0 - abs(((\\n      fract((moebius_1 * 0.5))\\n     * 2.0) - 1.0)))\\n   - 0.5) * 0.99));\\n  vec3 tmpvar_11;\\n  tmpvar_11 = mix (mix (mix (\\n    mix (mix ((mix (ret_2, vec3(0.2, 0.6, 1.0), vec3(\\n      (texture (sampler_pc_main, moebius_1).y * 2.0)\\n    )) * (vec3(1.0, 1.0, 1.0) - vec3(\\n      ((((texture (sampler_blur1, \\n        (0.5 + (tmpvar_6 * 0.5))\\n      ).xyz * scale1) + bias1).y * 2.0) * tmpvar_10)\\n    ))), vec3(1.0, 1.0, 1.0), texture (sampler_pc_main, moebius_1).xxx), vec3(4.0, 1.0, 0.0), vec3(clamp (((texture (sampler_pc_main, \\n      (0.5 + (tmpvar_6 * 0.2))\\n    ).y * 2.0) * (\\n      (tmpvar_10 * tmpvar_10)\\n     * tmpvar_10)), 0.0, 1.0)))\\n  , vec3(0.1, 0.0, 0.0), vec3(\\n    clamp ((((texture (sampler_blur1, \\n      (0.5 + (tmpvar_6 * 0.2))\\n    ).xyz * scale1) + bias1).x * 12.0), 0.0, 1.0)\\n  )), (vec3(0.5, 0.8, 1.0) * texture (sampler_pc_main, uv).z), vec3((\\n    clamp ((((texture (sampler_blur1, \\n      (0.5 + (tmpvar_6 * 0.2))\\n    ).xyz * scale1) + bias1).x * 4.0), 0.0, 1.0)\\n   * 1.4))), vec3(1.0, 1.0, 1.0), texture (sampler_pc_main, (0.5 + (tmpvar_6 * 0.2))).xxx);\\n  ret_2 = tmpvar_11;\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = tmpvar_11;\\n  ret = tmpvar_12.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.56,decay:1,echo_zoom:.362,echo_orient:1,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:1.286,wave_smoothing:.63,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,fshader:1,zoom:1.004,warp:.19788,sx:.99967,sy:.9999,wave_g:.65,wave_b:.65,ob_size:0,ob_a:1,mv_x:64,mv_y:48,mv_l:0,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1,r:0,g:.3,b:.75},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.01*a.bass;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0002*Math.cos(a.ma);a.my+=.0002*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.8);\"},{baseVals:{enabled:1,thick:1,r:0,b:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.05*a.bass;a.ma-=3.1415*above(a.mid,1)*.05*a.mid;a.mx+=.0001*Math.cos(a.ma);a.my+=.0001*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.1);\"},{baseVals:{enabled:1,thick:1,g:.5,b:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.mid,1)*.01*a.mid;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0004*Math.cos(a.ma);a.my+=.0004*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.3);\"},{baseVals:{enabled:1,thick:1,r:.4,g:0,b:.6},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.ma+=3.1415*above(a.bass,.5)*.02*a.bass;a.ma-=3.1415*above(a.treb,.5)*.02*a.treb;a.mx+=.0008*Math.cos(a.ma);a.my+=.0008*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.2);\"}],init_eqs_str:\"a.du=0;a.q1=0;a.mm=0;a.tt=0;a.mult=0;a.ang2=0;a.dv=0;a.mx=0;a.mn=0;a.bb=0;a.q2=0;a.dist=0;\",frame_eqs_str:\"a.wave_r+=.2*(.6*Math.sin(.98*a.time)+.4*Math.sin(1.047*a.time));a.wave_g+=.2*(.6*Math.sin(.835*a.time)+.4*Math.sin(1.081*a.time));a.wave_b+=.2*(.6*Math.sin(.814*a.time)+.4*Math.sin(1.011*a.time));a.q1=2*a.cx-1+.6*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.q2=2*a.cy-1+.6*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.warp=0;a.zoom=1;a.bb=.99*a.bb+.02*a.bass;a.mm=.99*a.mm+.02*a.mid;a.tt=.99*a.tt+.02*a.treb;a.mx=Math.max(Math.max(a.bb,a.mm),a.tt);a.mn=Math.min(Math.min(a.bb,\\na.mm),a.tt);a.ob_r=div(a.bb-a.mn,a.mx-a.mn);a.ob_b=div(a.mm-a.mn,a.mx-a.mn);a.ob_g=div(a.tt-a.mn,a.mx-a.mn);\",pixel_eqs_str:\"a.du=2*a.x-1-a.q1;a.dv=2*a.y-1-a.q2;a.dist=sqrt(a.du*a.du+a.dv*a.dv);a.ang2=Math.atan2(a.du,a.dv)+.15*a.time;a.mult=.05*Math.sin(.05*a.dist);a.dx=a.mult*Math.sin(2*a.ang2-1.5);a.dy=a.mult*Math.cos(2*a.ang2-1.5);\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  tmpvar_1.xyz = ((texture (sampler_main, clamp (\\n    (uv - (((vec2(0.0, 64.0) * texsize.zw) * dot (\\n      (tmpvar_2.xyz - 0.35)\\n    , vec3(0.32, 0.49, 0.29))) * (dot (tmpvar_2.xyz, vec3(0.32, 0.49, 0.29)) - 0.4)))\\n  , 0.0, 1.0)).xyz - 0.0011) + ((texture (sampler_noise_lq, \\n    (((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 1.5)) + rand_frame.xy)\\n  ) - 0.5) * 0.0038).xyz);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv1_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.y = 0.0;\\n  tmpvar_2.x = texsize.z;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = 0.0;\\n  tmpvar_3.y = texsize.w;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (texture (sampler_main, (uv - tmpvar_2)).xyz - texture (sampler_main, (uv + tmpvar_2)).xyz).x;\\n  tmpvar_4.y = (texture (sampler_main, (uv - tmpvar_3)).xyz - texture (sampler_main, (uv + tmpvar_3)).xyz).x;\\n  uv1_1 = ((0.3 * cos(\\n    ((uv - 0.5) * 2.0)\\n  )) - tmpvar_4);\\n  float tmpvar_5;\\n  tmpvar_5 = clamp ((0.04 / sqrt(\\n    dot (uv1_1, uv1_1)\\n  )), 0.0, 1.0);\\n  uv1_1 = ((0.3 * cos(\\n    (uv1_1 * 12.0)\\n  )) - (9.0 * tmpvar_4));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = (tmpvar_5 + ((texture (sampler_main, uv).xyz * 12.0) * vec3(clamp (\\n    (0.04 / sqrt(dot (uv1_1, uv1_1)))\\n  , 0.0, 1.0))));\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,gammaadj:1.56,decay:1,echo_zoom:.362,echo_orient:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:1.599,wave_smoothing:0,wave_mystery:-.5,modwavealphastart:2,modwavealphaend:2,warpscale:.107,zoomexp:.1584,fshader:1,warp:.01,wave_r:.51,wave_g:.5,ob_size:0,ob_a:1,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:.5,mv_r:0,mv_g:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.cx1=0;a.y3=0;a.y1=0;a.cy1=0;a.x1=0;a.x3=0;a.dir=0;a.r=0;a.x2=0;a.y2=0;\",frame_eqs_str:\"a.ib_r=.3*Math.sin(5*a.time)+.7;a.ib_g=.3*Math.sin(4*a.time)+.3;a.ib_b=.5*Math.sin(4*div(a.time,3))+.5;a.wave_r=1-a.ib_r;a.wave_g=1-a.ib_g;a.wave_b=1-a.ib_b;a.wave_x=.5+.3*Math.sin(3*a.time);a.wave_y=.5+.3*Math.cos(2.187*a.time);\",pixel_eqs_str:\"a.r=div(a.bass,4);a.cx1=.5+.2*Math.sin(.618*a.time);a.cy1=.5+.2*Math.cos(1.618*a.time);a.d=sqrt((a.x-a.cx1)*(a.x-a.cx1)+(a.y-a.cy1)*(a.y-a.cy1));a.dir=a.bass*(a.r*a.r-a.d*a.d)*.3;a.x1=.00001<Math.abs(above(a.d,a.r))?0:Math.sin(a.y-a.cy1)*a.dir;a.y1=.00001<Math.abs(above(a.d,a.r))?0:-Math.sin(a.x-a.cx1)*a.dir;a.cx1=.5+.3*Math.sin(2.618*a.time);a.cy1=.5+.3*Math.cos(3.14*a.time);a.d=sqrt((a.x-a.cx1)*(a.x-a.cx1)+(a.y-a.cy1)*(a.y-a.cy1));a.dir=-a.mid*(a.r*a.r-a.d*a.d)*.3;a.x2=.00001<\\nMath.abs(above(a.d,a.r))?0:Math.sin(a.y-a.cy1)*a.dir;a.y2=.00001<Math.abs(above(a.d,a.r))?0:-Math.sin(a.x-a.cx1)*a.dir;a.cx1=.5+.4*Math.sin(2.618*-a.time);a.cy1=.5+.4*Math.cos(1.14*-a.time);a.d=sqrt((a.x-a.cx1)*(a.x-a.cx1)+(a.y-a.cy1)*(a.y-a.cy1));a.dir=-a.treb*(a.r*a.r-a.d*a.d)*.3;a.x3=.00001<Math.abs(above(a.d,a.r))?0:Math.sin(a.y-a.cy1)*a.dir;a.y3=.00001<Math.abs(above(a.d,a.r))?0:-Math.sin(a.x-a.cx1)*a.dir;a.dx=a.x1+a.x2+a.x3;a.dy=a.y1+a.y2+a.y3;\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 2.0)) + rand_frame.xy);\\n  uv_1 = (uv + ((texture (sampler_noise_lq, tmpvar_2).xy - 0.5) * texsize.zw));\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = bass;\\n  tmpvar_3.y = treb;\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = (texture (sampler_main, (uv_1 + (\\n    (texture (sampler_main, (mix (uv_1, uv_orig, vec2(-1.0, -1.0)) + texsize.zw)).xy - 0.4)\\n   * \\n    (-0.004 + (0.04 * clamp ((tmpvar_3 - 1.0), 0.0, 1.0)))\\n  ))).xyz - (0.0008 + (\\n    (texture (sampler_noise_lq, tmpvar_2) - 0.5)\\n   * 0.02)).xyz);\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv1_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.y = 0.0;\\n  tmpvar_2.x = texsize.z;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = 0.0;\\n  tmpvar_3.y = texsize.w;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (texture (sampler_main, (uv - tmpvar_2)).xyz - texture (sampler_main, (uv + tmpvar_2)).xyz).x;\\n  tmpvar_4.y = (texture (sampler_main, (uv - tmpvar_3)).xyz - texture (sampler_main, (uv + tmpvar_3)).xyz).x;\\n  uv1_1 = ((0.3 * cos(\\n    ((uv - 0.5) * 2.0)\\n  )) - tmpvar_4);\\n  float tmpvar_5;\\n  tmpvar_5 = clamp ((0.04 / sqrt(\\n    dot (uv1_1, uv1_1)\\n  )), 0.0, 1.0);\\n  uv1_1 = ((0.3 * cos(\\n    (uv1_1 * 12.0)\\n  )) - (9.0 * tmpvar_4));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = (tmpvar_5 + ((texture (sampler_main, uv).xyz * 12.0) * vec3(clamp (\\n    (0.04 / sqrt(dot (uv1_1, uv1_1)))\\n  , 0.0, 1.0))));\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,decay:1,echo_zoom:1,echo_alpha:.5,echo_orient:3,invert:1,wave_a:.001,warpanimspeed:100,warpscale:.01,zoomexp:1.14947,warp:0,sx:.9901,sy:.9901,wave_r:0,wave_g:0,wave_b:0,ob_size:0,ob_r:1,ob_g:1,ob_b:1,ib_r:1,ib_g:1,ib_b:1,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:100,g:1,b:1,r2:1,b2:1,border_a:0},init_eqs_str:\"a.q4=0;a.q3=0;a.xx=0;a.yy=0;a.radi=0;a.q1=0;\",frame_eqs_str:\"a.a=above(a.q4,1E3-div(9E3,a.fps))&&above(a.q3,1.5)?1:0;a.a2=above(a.q4,1E3)&&above(a.q3,1.5)?1:0;a.xx=(above(a.q4,1E3-div(3,a.fps)),.01*randint(100));a.yy=.00001<Math.abs(above(a.q4,1E3-div(3,a.fps)))?.01*randint(100):.01*randint(70)+.15;a.radi=.00001<Math.abs(above(a.q4,1E3-div(3,a.fps)))?.333*sqrt(a.q3)+.15:.4*sqrt(a.q3);a.rad=a.radi;a.x=a.xx;a.y=a.yy;a.r=.5*Math.sin(1.22*a.q1)+.6;a.g=.45+.45*Math.sin(1.307*a.q1);a.b=.45+.45*Math.sin(1.959*a.q1);a.r2=.5*Math.sin(1.622*a.q1)+\\n.6;a.g2=.45+.45*Math.sin(1.507*a.q1);a.b2=.45+.45*Math.sin(1.6559*a.q1);\"}],waves:[{baseVals:{enabled:1,spectrum:1,thick:1,a:.42},init_eqs_str:\"a.zs=0;a.speed=0;a.q3=0;a.q29=0;a.q30=0;a.q4=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.zs=.00001<Math.abs(below(a.zs,-9.42478))?0:a.zs;a.zs=.00001<Math.abs(above(a.zs,9.42478))?0:a.zs;a.speed=.0025*Math.floor(Math.tan(pow(a.q3,.667)))*(1.5708*Math.atan(a.bass)+1.5708*Math.atan(a.mid)+1.5708*Math.atan(a.treb));a.zs+=a.speed;a.x=.5+(.18+.005*pow(a.q3,1.25))*Math.cos(a.zs*Math.asin(1)*100);a.y=.5+(.18+.005*pow(a.q3,1.25))*Math.sin(a.zs*Math.asin(1)*100);.00001<Math.abs(above(a.mid+a.treb,2*a.bass))?a.r=.3-Math.abs(.33*Math.sin(1-a.q29*a.bass*a.bass)):a.r=.7+Math.abs(.33*\\nMath.sin(1-a.q29*a.bass*a.bass));.00001<Math.abs(above(a.bass+a.treb,2*a.mid))?a.g=.3-Math.abs(.33*Math.sin(1-a.q30*a.mid*a.mid)):a.g=.7+Math.abs(.33*Math.sin(1-a.q30*a.mid*a.mid));.00001<Math.abs(below(a.mid+a.bass,2*a.treb))?a.b=.3-Math.abs(.33*Math.sin(1-a.q3*a.treb*a.treb)):a.b=.7+Math.abs(.33*Math.sin(1-a.q3*a.treb*a.treb));a.a=.175+.0007*a.q4;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.foo_r=0;a.maxs=0;a.n=0;a.ampl=0;a.bd_minbpm=0;a.im=0;a.basstime=0;a.bd_mean=0;a.timediff=0;a.bd_src=0;a.bass_residual=0;a.bd_slot=0;a.bd_b=0;a.bd_oct=0;a.tcos=0;a.stickybit=0;a.bd_arg=0;a.old_treb_flop=0;a.quali=0;a.q12=0;a.foo_b=0;a.bass_flop=0;a.q22=0;a.q21=0;a.volavg2=0;a.q13=0;a.q15=0;a.q29=0;a.dt=0;a.bd_pk=0;a.maxo=0;a.bd_m=0;a.q1=0;a.bd_cos=0;a.q5=0;a.foo_g=0;a.treb_flop=0;a.sample1=0;a.bass_thresh=0;a.difftime=0;a.dec_s=0;a.old_bass_flop=0;a.bd_exc=0;a.dec_xs=0;a.kraft=\\n0;a.diff=0;a.treb_thresh=0;a.bd_ampl=0;a.bd_mid_=0;a.maxind=0;a.edge=0;a.tsin=0;a.re0=0;a.testi=0;a.ec_steps=0;a.creep=0;a.q31=0;a.bpm=0;a.q23=0;a.q24=0;a.pulse=0;a.q11=0;a.bd_bass_=0;a.bd_tab0=0;a.pv_beat=0;a.bass_changed=0;a.show=0;a.mid_thresh=0;a.dec_m=0;a.q4=0;a.im0=0;a.bd_spo=0;a.mid_changed=0;a.entropy=0;a.test0=0;a.bd_nres=0;a.bd_bass=0;a.maxa=0;a.volavg=0;a.feder=0;a.q16=0;a.bd_recsz=0;a.old_mid_flop=0;a.mid_residual=0;a.bit2=0;a.tstart=0;a.bd_omega=0;a.bd_treb_=0;a.beatsin=0;a.bd_tabptr=\\n0;a.bd_treb=0;a.treb_residual=0;a.q19=0;a.beat=0;a.vol=0;a.bd_mid=0;a.chaos=0;a.bd_dat0=0;a.prog=0;a.mid_flop=0;a.re=0;a.bd_t=0;a.beatcos=0;a.q2=0;a.time_st=0;a.q14=0;a.treb_changed=0;a.bd_maxbpm=0;a.bd_qual=0;a.vol2=0;a.q3=0;a.t0=0;a.vol_=0;a.m=0;a.oct=0;a.quad=0;a.q32=0;a.basssum=0;a.creepo=0;a.q28=0;a.bd_sin=0;a.sample2=0;a.q30=0;a.change=0;a.beatct=0;a.q20=0;a.q8=0;a.bd_finc=0;for(var b=a.index=0;2E5>b;b++)a.megabuf[Math.floor(a.index)]=0,a.gmegabuf[Math.floor(a.index)]=0,a.index+=1;a.tstart=\\na.time;a.bd_recsz=8;a.bd_oct=4;a.bd_spo=30;a.bd_finc=pow(2,div(1,a.bd_spo));a.bd_nres=a.bd_oct*a.bd_spo;a.bd_minbpm=20;a.bd_maxbpm=pow(2,a.bd_oct)*a.bd_minbpm;a.bd_dat0=1E5;a.bd_tab0=a.bd_dat0+a.bd_nres*a.bd_recsz*3;a.reg00=a.bd_minbpm;a.reg01=a.bd_maxbpm;a.reg02=a.bd_recsz;a.reg03=a.bd_nres;a.reg05=a.bd_finc;a.reg06=a.bd_dat0;a.reg07=a.bd_mp0;a.time_st=0;a.timediff=1;\",frame_eqs_str:\"a.dt=Math.min(div(1,a.fps),.1);a.dec_m=1-4*a.dt;a.dec_s=1-a.dt;a.dec_xs=1-div(a.dt,6);a.t0=a.time-a.tstart;a.bd_b=a.bass;a.bd_bass_=a.bd_bass_*a.dec_m+(1-a.dec_m)*a.bd_b;a.bd_bass=a.bd_b-a.bd_bass_;a.bd_m=a.mid;a.bd_mid_=a.bd_mid_*a.dec_m+(1-a.dec_m)*a.bd_m;a.bd_mid=a.bd_m-a.bd_mid_;a.bd_t=a.treb;a.bd_treb_=a.bd_treb_*a.dec_m+(1-a.dec_m)*a.bd_t;a.bd_treb=a.bd_t-a.bd_treb_;a.n=0;a.bpm=a.bd_minbpm;for(var b=0;b<a.bd_nres;b++)a.gmegabuf[Math.floor(5E4+a.n*a.bd_recsz)]=0,a.bd_arg=\\ndiv(a.bpm,60)*a.t0*6.283,a.gmegabuf[Math.floor(a.bd_tab0+a.n*a.bd_recsz)]=a.bpm,a.bpm*=a.bd_finc,a.n+=1;for(b=a.bd_src=0;3>b;b++){a.bd_exc=a.bd_bass*(.00001>Math.abs(a.bd_src-0)?1:0)+a.bd_mid*(.00001>Math.abs(a.bd_src-1)?1:0)+a.bd_treb*(.00001>Math.abs(a.bd_src-2)?1:0);for(var c=a.oct=0;c<a.bd_oct;c++){a.bd_slot=0;a.bd_pk=0;for(var d=a.bd_mean=0;d<a.bd_spo;d++){a.bd_tabptr=a.bd_tab0+(a.oct*a.bd_spo+a.bd_slot)*a.bd_recsz;a.n=a.bd_dat0+(a.bd_nres*a.bd_src+a.oct*a.bd_spo+a.bd_slot)*a.bd_recsz;a.bpm=\\na.gmegabuf[Math.floor(a.bd_tabptr)];a.bd_omega=6.283*div(a.bpm,60);a.feder=sqr(a.bd_omega);a.gmegabuf[Math.floor(a.n+4)]=a.gmegabuf[Math.floor(a.n+2)];a.gmegabuf[Math.floor(a.n+1)]*=1-.5*a.dt*sqrt(div(a.bpm,300));a.ec_steps=2*Math.floor(1+div(a.bpm,50));for(var e=0;e<a.ec_steps;e++)a.kraft=a.bd_exc-a.feder*a.gmegabuf[Math.floor(a.n+2)],a.gmegabuf[Math.floor(a.n+1)]+=div(a.kraft*a.dt,a.ec_steps),a.gmegabuf[Math.floor(a.n+2)]+=div(a.gmegabuf[Math.floor(a.n+1)]*a.dt,a.ec_steps);a.beatcos=a.gmegabuf[Math.floor(a.n+\\n1)];a.beatsin=a.gmegabuf[Math.floor(a.n+2)]*a.bd_omega;a.quad=sqrt(pow(a.beatsin,2)+pow(a.beatcos,2));a.gmegabuf[Math.floor(a.n)]=.8*a.gmegabuf[Math.floor(a.n)]+.2*a.quad;a.bd_ampl=a.gmegabuf[Math.floor(a.n)];a.bd_mean+=a.bd_ampl;.00001<Math.abs(a.bd_ampl>a.bd_pk?1:0)?a.bd_pk=a.bd_ampl:0;a.bd_slot+=1}a.bd_slot=0;a.bd_qual=pow(div(a.bd_pk,a.bd_mean)*a.bd_spo-1,1);a.gmegabuf[Math.floor(2*(a.bd_src*a.bd_oct+a.oct))]=a.bd_qual;for(d=0;d<a.bd_spo;d++)a.m=5E4+(a.bd_slot+0*a.oct*a.bd_spo)*a.bd_recsz,a.n=\\na.bd_dat0+(a.bd_nres*a.bd_src+a.oct*a.bd_spo+a.bd_slot)*a.bd_recsz,a.gmegabuf[Math.floor(a.m)]+=div(a.bd_qual*a.gmegabuf[Math.floor(a.n)],12),a.bd_slot+=1;a.oct+=1}a.bd_src+=1}a.bd_slot=0;a.maxind=0;a.bd_pk=0;for(b=a.bd_mean=0;b<a.bd_spo;b++)a.m=5E4+a.bd_slot*a.bd_recsz,a.gmegabuf[Math.floor(a.m)]=pow(a.gmegabuf[Math.floor(a.m)],1),a.bd_mean+=a.gmegabuf[Math.floor(a.m)],.00001<Math.abs(a.gmegabuf[Math.floor(a.m)]>a.bd_pk?1:0)?(a.bd_pk=a.gmegabuf[Math.floor(a.m)],a.maxind=a.bd_slot):0,a.bd_slot+=1;\\na.quali=div(a.bd_pk,a.bd_mean)*a.bd_spo-1;for(b=a.n=0;150>b;b++)a.gmegabuf[Math.floor(50+a.n)]*=0,a.n+=1;a.bd_src=0;a.tsin=0;for(b=a.tcos=0;3>b;b++){for(c=a.oct=0;c<a.bd_oct;c++)a.n=a.bd_dat0+(a.bd_nres*a.bd_src+a.oct*a.bd_spo+a.maxind)*a.bd_recsz,a.bd_tabptr=a.bd_tab0+(a.oct*a.bd_spo+a.maxind)*a.bd_recsz,a.bpm=a.gmegabuf[Math.floor(a.bd_tabptr)],a.im=a.gmegabuf[Math.floor(a.n+1)],a.re=6.283*div(a.gmegabuf[Math.floor(a.n+2)]*a.bpm,60),a.bd_cos=Math.cos(6.28*div(a.bpm,60)*a.time),a.bd_sin=-Math.sin(6.28*\\ndiv(a.bpm,60)*a.time),a.re0=a.re*a.bd_cos+a.im*a.bd_sin,a.im0=-a.re*a.bd_sin+a.im*a.bd_cos,a.bd_qual=a.gmegabuf[Math.floor(2*(a.bd_src*a.bd_oct+a.oct))],a.gmegabuf[Math.floor(50+4*a.oct)]+=a.bd_qual*a.im0,a.gmegabuf[Math.floor(4*a.oct+51)]+=a.bd_qual*a.re0,a.gmegabuf[Math.floor(4*a.oct+52)]+=a.bd_qual,a.gmegabuf[100]+=a.bd_qual*a.im0,a.gmegabuf[101]+=a.bd_qual*a.re0,a.re=a.bd_cos*a.re0+a.bd_sin*a.im0,a.im=-a.bd_cos*a.im0+a.bd_sin*a.re0,a.tsin+=5*a.im,a.oct+=1;a.bd_src+=1}a.q30=a.tsin;a.vol=a.bass_att+\\na.mid_att+a.treb_att;a.vol_=.95*a.vol_+.05*a.vol;a.q29=a.vol-a.vol_;a.bd_src=0;a.maxo=0;a.maxs=0;for(b=a.maxa=0;3>b;b++){a.oct=1;for(c=0;c<a.bd_oct-1;c++)a.n=a.bd_dat0+(a.bd_nres*a.bd_src+a.oct*a.bd_spo+a.maxind)*a.bd_recsz,a.bd_qual=a.gmegabuf[Math.floor(2*(a.bd_src*a.bd_oct+a.oct))],a.ampl=div(a.bd_qual,1+a.oct*div(a.maxind,a.bd_oct)*0),.00001<Math.abs(a.ampl>a.maxa?1:0)?(a.maxa=a.ampl,a.maxs=a.bd_src,a.maxo=a.oct):0,a.oct+=1;a.bd_src+=1}a.q28=pow(4*a.bd_qual,1.5);a.q31=a.q28;.00001<Math.abs(above(a.q28,\\n50))?a.q28=pow(5*Math.sin(.5*a.bd_qual),2):0;a.testi=a.bd_nres*a.maxs+a.bd_spo*a.maxo+a.maxind;.00001<Math.abs(bor(a.beat&&.00001>Math.abs(a.prog-0)?1:0,2>Math.abs(a.testi-a.test0)?1:0))?a.test0=a.testi:0;a.n=a.bd_dat0+a.test0*a.bd_recsz;a.creep=a.gmegabuf[Math.floor(a.n+1)];a.beat=(0<a.creep?1:0)*(0>a.creepo?1:0);a.beatct=.00001<Math.abs(a.change)?0:a.beatct+a.beat;a.prog=mod(a.prog+a.beat,8);a.creepo=a.creep;a.show=.00001<Math.abs(a.beat)?1:.5*a.show;a.q4=1E3*div(a.gmegabuf[Math.floor(a.n+1)],a.gmegabuf[Math.floor(a.n)]);\\na.q2=a.prog;.00001<Math.abs(a.beat)?(a.timediff=a.time-a.time_st,a.time_st=a.time):a.timediff=a.timediff;.00001<Math.abs(below(a.timediff,.0625))?a.timediff=.0625:a.timediff=a.timediff;a.q8=a.timediff;a.monitor=a.q8;a.q24=a.bd_maxbpm;a.old_bass_flop=a.bass_flop;a.old_treb_flop=a.treb_flop;a.old_mid_flop=a.mid_flop;a.chaos=.9+.1*Math.sin(a.pulse);a.entropy=.00001<Math.abs(equal(a.pulse,-20))?1+a.bass_flop+a.treb_flop+a.mid_flop+.002*a.q4:a.entropy;a.bass_thresh=2*above(a.bass_att,a.bass_thresh)+(1-\\nabove(a.bass_att,a.bass_thresh))*((a.bass_thresh-1.6)*a.chaos+1.6);a.bass_flop=Math.abs(a.bass_flop-equal(a.bass_thresh,2));a.treb_thresh=2*above(a.treb_att,a.treb_thresh)+(1-above(a.treb_att,a.treb_thresh))*((a.treb_thresh-1.6)*a.chaos+1.6);a.treb_flop=Math.abs(a.treb_flop-equal(a.treb_thresh,2));a.mid_thresh=2*above(a.mid_att,a.mid_thresh)+(1-above(a.mid_att,a.mid_thresh))*((a.mid_thresh-1.6)*a.chaos+1.6);a.mid_flop=Math.abs(a.mid_flop-equal(a.mid_thresh,2));a.bass_changed=bnot(equal(a.old_bass_flop,\\na.bass_flop));a.mid_changed=bnot(equal(a.old_mid_flop,a.mid_flop));a.treb_changed=bnot(equal(a.old_treb_flop,a.treb_flop));a.bass_residual=a.bass_changed*Math.sin(1.5*a.pulse)+bnot(a.bass_changed)*a.bass_residual;a.treb_residual=a.treb_changed*Math.sin(1.5*a.pulse)+bnot(a.treb_changed)*a.treb_residual;a.mid_residual=a.mid_changed*Math.sin(1.5*a.pulse)+bnot(a.mid_changed)*a.mid_residual;a.pulse=.00001<Math.abs(above(Math.abs(a.pulse),20))?-20:a.pulse+.018*(a.bass_thresh+a.mid_thresh+a.treb_thresh);\\na.q11=a.mid_residual;a.q12=a.bass_residual;a.q13=a.treb_residual;a.q14=Math.sin(a.pulse);a.q15=Math.cos(a.pulse*(.5+.1*a.entropy));a.q16=Math.sin(a.pulse*(.5+pow(.25,a.entropy)));a.ob_r=Math.sin(1.0785*a.time+a.q16);a.ob_b=Math.sin(.8445*a.time+a.q15);a.ob_g=Math.sin(.413*a.time+a.q14);a.ib_r=Math.cos(.6*a.time+.1*a.q11);a.ib_b=Math.cos(1.4055*a.time+.1*a.q12);a.ib_g=Math.cos(.833*a.time+.1*a.q13);a.ib_size=.05+.03*a.q12;a.ob_size=.03+.02*Math.sin(2.321*a.time+.2*a.q12);a.ob_a=.6+.4*a.q13;a.ib_a=\\n.9+.1*Math.sin(.3*a.q12+a.q14+.5*a.q11);a.rot=0;a.basstime+=div(3*a.q29,a.fps);a.q1=a.basstime;a.basstime=.00001<Math.abs(below(a.basstime,-1E4))?0:a.basstime;a.basstime=.00001<Math.abs(above(a.basstime,1E4))?0:a.basstime;a.basstime+=div(.75*a.bass_att,a.fps);a.vol2=pow(a.bass+a.mid+a.treb,2);a.basssum=a.vol2;a.stickybit=mod(a.time,2);a.volavg+=a.vol2*equal(a.stickybit,1);a.sample1+=equal(a.stickybit,1);a.volavg2+=a.vol2*equal(a.stickybit,0);a.sample2+=equal(a.stickybit,0);a.edge=bnot(equal(a.bit2,\\na.stickybit));a.volavg-=a.volavg*a.edge*a.stickybit;a.volavg2-=a.volavg2*a.edge*equal(a.stickybit,0);a.sample1-=a.sample1*a.edge*a.stickybit;a.sample2-=a.sample2*a.edge*equal(a.stickybit,0);a.diff=.00001<Math.abs(equal(a.stickybit,1))?div(a.basssum,div(a.volavg2,a.sample2)):0;a.diff=.00001<Math.abs(equal(a.stickybit,0))?div(a.basssum,div(a.volavg,a.sample1)):a.diff;a.q3=a.diff;a.pv_beat=.2*a.pv_beat*sqrt(div(a.fps,30))+div(.0001*(a.bass_att*a.bass_att+a.mid_att*a.mid_att+a.treb_att*a.treb_att)*a.q4,\\nsqrt(a.q8));a.q32=a.pv_beat;a.monitor=a.q32;a.bit2=mod(a.time,2);a.difftime+=.03*a.diff;a.q2=a.difftime;a.warp=.005*(a.bass*a.bass+a.mid*a.mid+a.treb*a.treb);a.foo_r=Math.sin(.34313*a.q1);a.foo_g=Math.sin(.3675*a.q1);a.foo_b=Math.sin(.55095*a.q1);.00001<Math.abs(above(a.foo_r,a.foo_g)&&above(a.foo_r,a.foo_b)?1:0)?a.q23=1:a.q23=0;.00001<Math.abs(above(a.foo_g,a.foo_r)&&above(a.foo_g,a.foo_b)?1:0)?a.q21=1:a.q21=0;.00001<Math.abs(above(a.foo_b,a.foo_r)&&above(a.foo_b,a.foo_g)?1:0)?a.q22=1:a.q22=0;.00001<\\nMath.abs(equal(a.q11+a.q12+a.q13,0))?a.q22=1:0;a.q5=div(30,a.fps);a.q19=50;a.q20=1;.00001<Math.abs(above(a.q31,14))?a.q19=100:a.q19=a.q19;.00001<Math.abs(above(a.q31,50))?a.q19=500:a.q19=a.q19;.00001<Math.abs(above(a.q3,2))?a.q19=.5+10*a.q8:a.q19=a.q19;\",pixel_eqs_str:\".00001<Math.abs(a.q32>1.2*sqrt(a.bass_att)?1:0)?(a.rot=.00001<Math.abs(above(a.q14,0))?.2*a.rad*a.q15:Math.tan(.001*a.rad*a.q4),a.zoom=.00001<Math.abs(above(a.q12,1.5))?a.zoom+(1-a.zoom)*a.rot*Math.cos(3.14*a.rad*a.q12):.00001<Math.abs(above(a.q13,2)*above(a.x,.5+.5*a.q15))?a.zoom+(1-a.zoom)*Math.sin(a.q11*a.rot*3.14):a.zoom+(1-a.zoom)*Math.cos(3*a.rad*a.q16),a.dx=above(a.q11,0)*Math.sin(.5*a.rad*a.q12),a.dy=above(a.q13,0)*Math.sin(.5*a.rad*a.q13)):(a.zoom=a.q19,a.zoomexp=a.q20,\\na.rot=0);\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_pw_main, uv_orig);\\n  ret_1 = ((texture (sampler_blur1, tmpvar_2.xy).xyz * scale1) + bias1);\\n  vec3 tmpvar_3;\\n  tmpvar_3 = vec3((((1.0 - ret_1.x) * (1.0 - ret_1.y)) * (1.0 - ret_1.z)));\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (((texsize.zw * q5) * -3.0) * ((\\n    pow (tmpvar_3, vec3(0.333, 0.333, 0.333))\\n   + \\n    ((((0.5 * tmpvar_3) * (\\n      (texture (sampler_blur2, ret_1.xx).xyz * scale2)\\n     + bias2)) * ((texture (sampler_blur2, ret_1.yy).xyz * scale2) + bias2)) * ((texture (sampler_blur2, ret_1.zz).xyz * scale2) + bias2))\\n  ) + (\\n    ((0.25 * ((texture (sampler_blur3, ret_1.xx).xyz * scale3) + bias3)) * ((texture (sampler_blur3, ret_1.yy).xyz * scale3) + bias3))\\n   * \\n    ((texture (sampler_blur3, ret_1.xx).xyz * scale3) + bias3)\\n  )).xy);\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_blur1, \\n    (uv_orig + (vec2(1.0, 0.0) * tmpvar_4))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_orig - (vec2(1.0, 0.0) * tmpvar_4))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_6;\\n  tmpvar_6 = (((texture (sampler_blur1, \\n    (uv_orig + (vec2(0.0, 1.0) * tmpvar_4))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_orig - (vec2(0.0, 1.0) * tmpvar_4))\\n  ).xyz * scale1) + bias1));\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_5.x;\\n  tmpvar_7.y = tmpvar_6.x;\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_5.y;\\n  tmpvar_8.y = tmpvar_6.y;\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_5.z;\\n  tmpvar_9.y = tmpvar_6.z;\\n  vec2 tmpvar_10;\\n  tmpvar_10 = (uv_orig + ((\\n    (((tmpvar_7 * q21) + (tmpvar_8 * q22)) + (tmpvar_9 * q23))\\n   * texsize.zw) * 6.0));\\n  ret_1 = ((texture (sampler_main, tmpvar_10).xyz + (\\n    (texture (sampler_main, uv).xyz - ((texture (sampler_blur1, uv).xyz * scale1) + bias1))\\n   * 0.1)) - ((0.00015 * q28) * (\\n    ((((\\n      (texture (sampler_main, tmpvar_10).x * texture (sampler_main, tmpvar_10).y)\\n     * texture (sampler_main, tmpvar_10).z) / (2.0 * q8)) + ((\\n      sqrt(treb)\\n     * texture (sampler_main, tmpvar_10).x) * texture (sampler_main, tmpvar_10).y)) + ((sqrt(mid) * texture (sampler_main, tmpvar_10).x) * texture (sampler_main, tmpvar_10).z))\\n   + \\n    ((sqrt(bass) * texture (sampler_main, tmpvar_10).y) * texture (sampler_main, tmpvar_10).z)\\n  )));\\n  ret_1.x = mix (ret_1.x, (1.01 * texture (sampler_pc_main, tmpvar_10).x), (bass_att * 0.05));\\n  ret_1.y = mix (ret_1.y, (1.01 * texture (sampler_pc_main, tmpvar_10).y), (mid_att * 0.05));\\n  ret_1.z = mix (ret_1.z, (1.01 * texture (sampler_pc_main, tmpvar_10).z), (treb_att * 0.05));\\n  ret_1 = (ret_1 + ((\\n    (pow (q3, 1.2) - 0.25)\\n   * 0.00667) * tmpvar_2).xyz);\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 0.0;\\n  tmpvar_11.xyz = ret_1;\\n  vec3 tmpvar_12;\\n  tmpvar_12 = mix (tmpvar_11, texture (sampler_pc_main, uv), vec4(float((\\n    (q32 * sqrt(((\\n      ((1.0 - ret_1.x) * (1.0 - ret_1.y))\\n     + \\n      ((1.0 - ret_1.x) * (1.0 - ret_1.z))\\n    ) + (\\n      (1.0 - ret_1.y)\\n     * \\n      (1.0 - ret_1.z)\\n    ))))\\n   > 1.333)))).xyz;\\n  ret_1 = tmpvar_12;\\n  vec4 tmpvar_13;\\n  tmpvar_13.w = 1.0;\\n  tmpvar_13.xyz = tmpvar_12;\\n  ret = tmpvar_13.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = mix (texture (sampler_main, uv).xyz, texture (sampler_main, ((0.5 - uv) + 0.5)).xyz, vec3(0.5, 0.5, 0.5));\\n  ret_1 = (1.0 - ((ret_1 * \\n    (1.0 - ret_1)\\n  ) * 4.0));\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ret_1;\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:.925,echo_zoom:1.007,echo_orient:3,wave_brighten:0,brighten:1,darken:1,solarize:1,wave_a:.001,wave_scale:.01,wave_smoothing:0,modwavealphastart:1,modwavealphaend:1,warpanimspeed:1.459,warpscale:2.007,fshader:1,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:0,wave_b:0,ob_size:.015,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:5,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,textured:1,rad:.789,ang:.6283,tex_zoom:1.17257,r:0,g:1,border_a:0},init_eqs_str:\"a.an=0;a.vx=0;a.vy=0;\",frame_eqs_str:\"a.rad=.65+.1*a.bass;a.an=.99*a.an+.1*(a.bass-a.treb);a.ang=.1*a.an+.6;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:495,sep:4,spectrum:1,thick:1,additive:1,scaling:100,smoothing:1,r:0,g:.04,b:0,a:.99},init_eqs_str:\"a.my_z=0;a.d=0;a.n=0;a.y3=0;a.z2=0;a.y1=0;a.w=0;a.t5=0;a.w2=0;a.t1=0;a.x1=0;a.q6=0;a.zoom=0;a.p=0;a.q1=0;a.q5=0;a.t8=0;a.z3=0;a.w3=0;a.t3=0;a.my_x=0;a.x3=0;a.t6=0;a.my_y=0;a.pi=0;a.q4=0;a.t7=0;a.rd=0;a.w1=0;a.x2=0;a.t2=0;a.l=0;a.y2=0;a.q2=0;a.z1=0;a.q3=0;a.t4=0;a.t2=0;a.t3=0;a.t4=0;a.ab=1;\",frame_eqs_str:\"a.t1=a.q1;a.t2=a.q2;a.t3=a.q3;a.t4=a.q4;a.t5=a.q5;a.t6=a.q6;a.t8=.07;a.t7=1;\",point_eqs_str:\"a.t7=-a.t7;a.pi=Math.asin(1);a.n=180;a.rd=.075;a.my_x=.5*Math.sin(a.sample*a.pi*4+(a.t7+1)*a.t8)+Math.cos(a.sample*a.pi*a.n)*a.rd*Math.sin(a.sample*a.pi*4+(a.t7+1)*a.t8);a.my_y=.5*Math.cos(a.sample*a.pi*4+(a.t7+1)*a.t8)+Math.cos(a.sample*a.pi*a.n)*a.rd*Math.cos(a.sample*a.pi*4+(a.t7+1)*a.t8);a.my_z=Math.sin(a.sample*a.pi*a.n)*a.rd;a.d=1.4;a.zoom=.65;a.w1=a.q2;a.w2=a.q3;a.w3=a.q4;a.x1=Math.cos(a.w1)*a.my_x+Math.sin(a.w1)*a.my_y;a.y1=-Math.sin(a.w1)*a.my_x+Math.cos(a.w1)*a.my_y;\\na.z1=a.my_z;a.x2=Math.cos(a.w2)*a.x1+Math.sin(a.w2)*a.z1;a.z2=-Math.sin(a.w2)*a.x1+Math.cos(a.w2)*a.z1;a.y2=a.y1;a.y3=Math.cos(a.w3)*a.y2+Math.sin(a.w3)*a.z2;a.z3=-Math.sin(a.w3)*a.y2+Math.cos(a.w3)*a.z2;a.x3=a.x2;a.l=sqrt(a.x3*a.x3+a.y3*a.y3);a.w=Math.atan2(a.x3,a.y3);a.p=Math.tan(Math.asin(1)+Math.atan2(a.d+a.z3,a.l));a.d=sqrt(a.x3*a.x3+a.y3*a.y3+(a.z3+a.d)*(a.z3+a.d));a.my_x=a.zoom*Math.sin(a.w)*a.p;a.my_y=a.zoom*Math.cos(a.w)*a.p;a.x=.5+a.my_x;a.y=.5+a.my_y;a.b=-a.z3+.5;a.b=.5*Math.min(1,Math.max(0,\\na.b));a.r=1-2*a.b;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.index=0;a.q12=0;a.q22=0;a.q21=0;a.q29=0;a.q1=0;a.dec_med=0;a.rott=0;a.is_beat=0;a.q31=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.p3=0;a.q3=0;a.t0=0;a.q28=0;a.q30=0;a.q20=0;a.p4=0;a.step=0;a.step=0;\",frame_eqs_str:\"a.dec_med=pow(.7,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,-2+a.avg+a.peak)*above(a.time,a.t0+.1);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,16);a.index2=mod(a.index2+a.is_beat*bnot(a.index),2);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass_att+\\na.mid_att+a.treb_att;a.q27=a.index+1;a.q28=a.index2;a.q29=2*(mod(a.index,2)-.5);a.k1=a.is_beat*equal(mod(a.index,2),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,8);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.step+=a.q24;a.p3=a.p3*a.dec_slow+(1-a.dec_slow)*a.step;a.q30=a.step;a.p4=a.dec_slow*a.p4+(1-a.dec_slow)*a.q27;a.q31=a.p4;a.q12=a.time-a.t0;a.monitor=a.q12;a.zoom=1;a.rot=-0;a.dx=0;\",pixel_eqs_str:\"a.zoom=1.3;\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 uv6_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_4;\\n  tmpvar_4 = (((q29 * 2.0) * sqrt(\\n    dot (tmpvar_3, tmpvar_3)\\n  )) + (rand_frame * 64.0)).x;\\n  uv_1 = (uv + (clamp (\\n    ((sin(tmpvar_4) / cos(tmpvar_4)) * normalize(tmpvar_3))\\n  , vec2(-2.0, -2.0), vec2(2.0, 2.0)) / 20.0));\\n  uv6_2 = (0.4 * sin((tmpvar_3 * 22.0)));\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = (((q24 * \\n    (((texture (sampler_main, uv_1).xyz - (\\n      ((texture (sampler_blur1, fract(uv_1)).xyz * scale1) + bias1)\\n     * 0.04)) + (0.15 * (vec3(\\n      (0.1 / sqrt(dot (uv6_2, uv6_2)))\\n    ) * roam_cos.xyz))) - 0.02)\\n  ) * 0.98) + ((1.0 - q24) * texture (sampler_main, uv_orig).xyz));\\n  ret = tmpvar_5.xyz;\\n }\",comp:\"uniform sampler2D sampler_rand00;\\n shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1 = texture (sampler_main, uv);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ((texture (sampler_rand00, (0.4 + \\n    (0.6 * tmpvar_1.xy)\\n  )) * tmpvar_1.z) * 3.0).xyz;\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:2,gammaadj:2.7,wave_mode:1,modwavealphabyvolume:1,wave_a:2.707,wave_scale:1.025,wave_smoothing:.1,modwavealphastart:.77,modwavealphaend:1.01,warpscale:1.331,zoom:1.014,warp:.21786,wave_r:.65,wave_g:.65,wave_b:.65,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"\",frame_eqs_str:\"a.wave_r+=.35*(.6*Math.sin(3.98*a.time)+.4*Math.sin(11.047*a.time));a.wave_g+=.35*(.6*Math.sin(.835*a.time)+.4*Math.sin(1.081*a.time));a.wave_b+=.35*(.6*Math.sin(.814*a.time)+.4*Math.sin(1.011*a.time));a.cx+=.11*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.cy+=.11*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.dx+=.005*(.6*Math.sin(.173*a.time)+.4*Math.sin(.223*a.time));a.decay-=.01*equal(mod(a.frame,20),0);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_main, (uv + (\\n    (texture (sampler_main, (mix (uv, uv_orig, vec2(-1.0, -1.0)) + texsize.zw)).xy - 0.37)\\n   * 0.01))).xyz - 0.004);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1 = texture (sampler_main, uv);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = mix (vec3(dot (tmpvar_1.xyz, vec3(0.3333, 0.3333, 0.3333))), tmpvar_1.xyz, vec3(3.0, 3.0, 3.0));\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.9,echo_zoom:1.16936,wave_mode:7,modwavealphabyvolume:1,wave_a:0,wave_scale:1.015009,wave_smoothing:.522,modwavealphastart:.83,modwavealphaend:1.31,warpscale:3.138,zoom:1.009006,warp:536e-6,wave_r:.5,wave_g:.5,wave_b:.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.dx_residual=0;a.dy_residual=0;a.bass_thresh=0;\",frame_eqs_str:\"a.wave_r=.85+.25*Math.sin(.437*a.time+1);a.wave_g=.85+.25*Math.sin(.544*a.time+2);a.wave_b=.85+.25*Math.sin(.751*a.time+3);a.rot+=.01*(.6*Math.sin(.381*a.time)+.4*Math.sin(.579*a.time));a.cx+=.21*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.cy+=.21*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.dx+=.003*(.6*Math.sin(.234*a.time)+.4*Math.sin(.277*a.time));a.dy+=.003*(.6*Math.sin(.284*a.time)+.4*Math.sin(.247*a.time));a.decay-=.01*equal(mod(a.frame,6),0);a.dx+=\\na.dx_residual;a.dy+=a.dy_residual;a.bass_thresh=2*above(a.bass_att,a.bass_thresh)+(1-above(a.bass_att,a.bass_thresh))*(.96*(a.bass_thresh-1.3)+1.3);a.dx_residual=.016*equal(a.bass_thresh,2.13)*Math.sin(7*a.time)+(1-equal(a.bass_thresh,2.13))*a.dx_residual;a.dy_residual=.012*equal(a.bass_thresh,2.13)*Math.sin(9*a.time)+(1-equal(a.bass_thresh,2.13))*a.dy_residual;a.wave_x-=7*a.dx_residual;a.wave_y-=7*a.dy_residual;a.wave_mystery=.03*a.time;a.zoom+=.005*(.6*Math.sin(.1934*a.time+3)+.4*Math.sin(.307*\\na.time+9));a.zoom+=.4*Math.max(0,a.bass_att-1.1);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = texture (sampler_main, uv).xyz;\\n  ret_1 = (ret_1 + ((ret_1 - \\n    ((texture (sampler_blur2, uv).xyz * scale2) + bias2)\\n  ) * 0.3));\\n  ret_1 = (ret_1 * 0.9);\\n  ret_1 = (ret_1 + ((\\n    ((texture (sampler_noise_lq, ((\\n      (uv_orig * texsize.xy)\\n     * \\n      (texsize_noise_lq.zw * 0.4)\\n    ) + rand_frame.xy)).xyz - 0.5) / 256.0)\\n   * 122.0) * clamp (\\n    (treb_att - 1.0)\\n  , 0.0, 1.0)));\\n  ret_1 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.2, 0.2, 0.2));\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ret_1;\\n  ret = tmpvar_2.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = (texture (sampler_main, uv).xyz + ((\\n    (texture (sampler_blur1, uv).xyz * scale1)\\n   + bias1) * 0.4));\\n  vec3 tmpvar_2;\\n  tmpvar_2 = pow (ret_1, vec3(0.5, 0.8, 1.7));\\n  ret_1 = tmpvar_2;\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = tmpvar_2;\\n  ret = tmpvar_3.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,wave_mode:6,additivewave:1,wave_dots:1,wave_thick:1,wave_brighten:0,wave_a:100,wave_scale:3.63,wave_smoothing:.9,wave_mystery:-.3,modwavealphastart:1.15,modwavealphaend:1.55,warpscale:1.331,zoom:.96971,warp:0,wave_r:.6,wave_g:.6,wave_b:.6,mv_x:64,mv_y:48,mv_l:0,mv_r:.35,mv_g:.35,mv_b:.35,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.decay_rate=0;a.q6=0;a.rot_sum=0;a.q1=0;a.q5=0;a.prev_beat=0;a.is_beat=0;a.min_att=0;a.beat=0;a.decay_to=0;a.rot_sim=0;a.q2=0;a.q3=0;a.beat_level=0;a.rot_sum=0;a.q2=.07+.00004*randint(1E3)+.00003*randint(1E3);a.q3=1.035+.06*(randint(1E3)+randint(1E3)+randint(1E3))*.000333;\",frame_eqs_str:\"a.wave_r+=.5*(.6*Math.sin(1.98*a.time)+.4*Math.sin(3.047*a.time));a.wave_g+=.5*(.6*Math.sin(2.835*a.time)+.4*Math.sin(2.081*a.time));a.wave_b+=.5*(.6*Math.sin(3.814*a.time)+.4*Math.sin(1.011*a.time));a.cx=.5;a.cy=.5;a.rot=a.q2;a.zoom=a.zoom-1+a.q3;a.rot_sum+=a.rot;a.q1=-a.rot_sum;a.q5=Math.cos(a.rot_sum);a.q6=Math.sin(a.rot_sim);a.monitor=a.q2;a.min_att=2.5;a.decay_to=.8;a.decay_rate=pow(.999,a.fps);a.beat=div(a.bass,Math.max(a.min_att,a.bass_att));a.beat=Math.max(a.beat,div(a.mid,\\nMath.max(a.min_att,a.mid_att)));a.beat=Math.max(a.beat,div(a.treb,Math.max(a.min_att,a.treb_att)));a.beat=Math.max(a.beat,(a.prev_beat-a.decay_to)*a.decay_rate+a.decay_to);a.beat_level=24*(a.beat-a.prev_beat-.02);a.is_beat=above(a.beat_level,.5);a.prev_beat=a.beat;a.wave_a=a.beat_level;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_pw_main, uv).xyz - 0.004);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 uv2_2;\\n  uv_1 = (uv - 0.5);\\n  uv_1 = (uv_1 * (min (aspect.x, aspect.y) * 0.8));\\n  uv_1 = (uv_1 * aspect.xy);\\n  float tmpvar_3;\\n  tmpvar_3 = sin(q1);\\n  float tmpvar_4;\\n  tmpvar_4 = cos(q1);\\n  uv2_2.x = ((uv_1.x * tmpvar_4) - (uv_1.y * tmpvar_3));\\n  uv2_2.y = ((uv_1.x * tmpvar_3) + (uv_1.y * tmpvar_4));\\n  uv2_2 = (uv2_2 * aspect.zw);\\n  uv2_2 = (uv2_2 + 0.5);\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = (abs((\\n    (texture (sampler_main, uv2_2).xyz * 2.65)\\n   + \\n    (((texture (sampler_blur1, uv2_2).xyz * scale1) + bias1) * -2.0)\\n  )) * 1.5);\\n  ret = tmpvar_5.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.9,echo_zoom:1.16936,wave_mode:5,additivewave:1,wave_a:0,wave_scale:.899719,wave_smoothing:.63,wave_mystery:1,modwavealphastart:2,modwavealphaend:2,warpscale:2.593743,zoom:1.00496,warp:.278033,sx:.999666,sy:.9999,wave_r:.65,wave_g:.65,wave_b:.65,mv_x:0,mv_y:48,mv_dx:-.941273,mv_dy:.426319,mv_l:5,mv_r:.315997,mv_g:.078173,mv_b:.941976,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.du=0;a.q1=0;a.rg=0;a.q9=0;a.mult=0;a.ang2=0;a.dv=0;a.q4=0;a.q2=0;a.dist=0;a.q3=0;a.rg=0;\",frame_eqs_str:\"a.wave_r+=.35*(.6*Math.sin(.98*a.time)+.4*Math.sin(1.047*a.time));a.wave_g+=.35*(.6*Math.sin(.835*a.time)+.4*Math.sin(1.081*a.time));a.wave_b+=.35*(.6*Math.sin(.814*a.time)+.4*Math.sin(1.011*a.time));a.q1=2*a.cx-1+.52*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.q2=2*a.cy-1+.52*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));a.q3=2*a.cx-1+.52*(.6*Math.sin(.174*-a.time)+.4*Math.sin(.364*a.time));a.q4=2*a.cy-1+.52*(.6*Math.sin(.234*a.time)+.4*Math.sin(.271*-a.time));\\na.decay-=.01*equal(mod(a.frame,5),0);a.rg=Math.max(.95*a.rg,.3+.5*Math.min(2,1.3*Math.max(0,a.mid_att-1)));a.q9=a.rg;\",pixel_eqs_str:\"a.du=2*a.x-1-a.q1;a.dv=2*a.y-1-a.q2;a.dist=sqrt(a.du*a.du+a.dv*a.dv);a.ang2=Math.atan2(a.du,a.dv);a.mult=div(.008,a.dist+.4);a.dx=a.mult*Math.sin(a.ang2-1.5);a.dy=a.mult*Math.cos(a.ang2-1.5);a.du=2*a.x-1-a.q3;a.dv=2*a.y-1-a.q4;a.dist=sqrt(a.du*a.du+a.dv*a.dv);a.ang2=Math.atan2(a.du,a.dv);a.mult=div(.008,a.dist+.4);a.dx+=a.mult*Math.sin(a.ang2+1.5);a.dy+=a.mult*Math.cos(a.ang2+1.5);\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = mix (uv_orig, uv, vec2(q9));\\n  ret_1 = texture (sampler_main, tmpvar_2).xyz;\\n  ret_1 = (ret_1 + ((ret_1 - \\n    ((texture (sampler_blur1, tmpvar_2).xyz * scale1) + bias1)\\n  ) * 0.3));\\n  ret_1 = (ret_1 * 0.9);\\n  ret_1 = (ret_1 + ((\\n    ((texture (sampler_noise_lq, ((\\n      (uv_orig * texsize.xy)\\n     * \\n      (texsize_noise_lq.zw * 0.4)\\n    ) + rand_frame.xy)).xyz - 0.5) / 256.0)\\n   * 122.0) * clamp (\\n    (treb_att - 1.0)\\n  , 0.0, 1.0)));\\n  ret_1 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.2, 0.2, 0.2));\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ret_1;\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (0.3 + (0.4 * vec3(dot (texture (sampler_main, uv).xyz, vec3(0.32, 0.49, 0.29)))));\\n  ret = tmpvar_1.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.9,echo_zoom:1.169,echo_orient:1,wave_mode:5,additivewave:1,wave_a:0,wave_scale:.9,wave_smoothing:.63,wave_mystery:1,modwavealphastart:2,modwavealphaend:2,warpscale:1.331,zoom:1.004,warp:.19788,sx:.99967,sy:.9999,wave_r:.65,wave_g:.65,wave_b:.65,mv_x:0,mv_y:48,mv_dx:-.941,mv_dy:.426,mv_l:5,mv_r:.316,mv_g:.078,mv_b:.942,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.du=0;a.q1=0;a.dv=0;a.q2=0;a.dist=0;a.ang2=0;a.mult=0;\",frame_eqs_str:\"a.wave_r+=.2*(.6*Math.sin(.98*a.time)+.4*Math.sin(1.047*a.time));a.wave_g+=.2*(.6*Math.sin(.835*a.time)+.4*Math.sin(1.081*a.time));a.wave_b+=.2*(.6*Math.sin(.814*a.time)+.4*Math.sin(1.011*a.time));a.q1=2*a.cx-1+.6*(.6*Math.sin(.374*a.time)+.4*Math.sin(.294*a.time));a.q2=2*a.cy-1+.6*(.6*Math.sin(.393*a.time)+.4*Math.sin(.223*a.time));\",pixel_eqs_str:\"a.du=2*a.x-1-a.q1;a.dv=2*a.y-1-a.q2;a.dist=sqrt(a.du*a.du+a.dv*a.dv);a.ang2=Math.atan2(a.du,a.dv)+.15*a.time;a.mult=.65*Math.sin(.05*a.dist);a.dx=a.mult*Math.sin(2*a.ang2-1.5);a.dy=a.mult*Math.cos(2*a.ang2-1.5);\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  ret_1 = (tmpvar_2.xyz + ((tmpvar_2.xyz - \\n    ((texture (sampler_blur2, uv).xyz * scale2) + bias2)\\n  ) * 0.3));\\n  ret_1 = (ret_1 * 0.9);\\n  ret_1 = (ret_1 + ((\\n    ((texture (sampler_noise_lq, ((\\n      (uv_orig * texsize.xy)\\n     * \\n      (texsize_noise_lq.zw * 0.4)\\n    ) + rand_frame.xy)).xyz - 0.5) / 256.0)\\n   * 122.0) * clamp (\\n    (treb_att - 1.0)\\n  , 0.0, 1.0)));\\n  vec3 tmpvar_3;\\n  tmpvar_3 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.2, 0.2, 0.2));\\n  ret_1 = tmpvar_3;\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = tmpvar_3;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv2_1;\\n  vec3 ret_2;\\n  uv2_1 = (uv + (vec2(1.0, 0.0) * texsize.zw));\\n  float tmpvar_3;\\n  tmpvar_3 = (((texture (sampler_main, uv2_1).xyz + \\n    (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4)\\n  ) + (\\n    ((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2)\\n   * 0.15)) + ((\\n    (texture (sampler_blur3, uv2_1).xyz * scale3)\\n   + bias3) * 0.1)).x;\\n  uv2_1 = (uv + (vec2(-1.0, 0.0) * texsize.zw));\\n  float tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_main, uv2_1).xyz + \\n    (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4)\\n  ) + (\\n    ((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2)\\n   * 0.15)) + ((\\n    (texture (sampler_blur3, uv2_1).xyz * scale3)\\n   + bias3) * 0.1)).x;\\n  uv2_1 = (uv + (vec2(0.0, 1.0) * texsize.zw));\\n  float tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_main, uv2_1).xyz + \\n    (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4)\\n  ) + (\\n    ((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2)\\n   * 0.15)) + ((\\n    (texture (sampler_blur3, uv2_1).xyz * scale3)\\n   + bias3) * 0.1)).x;\\n  uv2_1 = (uv + (vec2(0.0, -1.0) * texsize.zw));\\n  vec3 tmpvar_6;\\n  tmpvar_6.z = 0.14;\\n  tmpvar_6.x = (tmpvar_3 - tmpvar_4);\\n  tmpvar_6.y = (tmpvar_5 - ((\\n    (texture (sampler_main, uv2_1).xyz + (((texture (sampler_blur1, uv2_1).xyz * scale1) + bias1) * 0.4))\\n   + \\n    (((texture (sampler_blur2, uv2_1).xyz * scale2) + bias2) * 0.15)\\n  ) + (\\n    ((texture (sampler_blur3, uv2_1).xyz * scale3) + bias3)\\n   * 0.1)).x);\\n  ret_2 = (0.5 + (0.5 * normalize(tmpvar_6)));\\n  vec2 x_7;\\n  x_7 = (ret_2.xy - 0.5);\\n  ret_2 = (ret_2 * clamp ((\\n    sqrt(dot (x_7, x_7))\\n   * 5.0), 0.0, 1.0));\\n  ret_2 = ret_2.xxy;\\n  ret_2 = (ret_2 + 1.15);\\n  ret_2 = (ret_2 * mix (ret_2, (ret_2 * \\n    (((texture (sampler_blur3, uv).xyz * scale3) + bias3) - ((texture (sampler_blur1, uv).xyz * scale1) + bias1))\\n  ), pow (hue_shader.yxz, ret_2)));\\n  ret_2 = (ret_2 * ret_2);\\n  vec4 tmpvar_8;\\n  tmpvar_8.w = 1.0;\\n  tmpvar_8.xyz = ret_2;\\n  ret = tmpvar_8.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:2.4,decay:1,echo_zoom:.997,echo_alpha:.5,echo_orient:3,wave_mode:2,wave_brighten:0,wrap:0,darken:1,wave_a:.001,wave_scale:.28,wave_smoothing:.9,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:2.599,warpscale:.01,zoomexp:.99817,zoom:.86978,warp:.01,sy:1.0017,wave_r:0,wave_g:0,wave_b:0,ob_size:0,ob_r:1,ob_g:1,ob_b:1,ib_size:.04,ib_r:0,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:.5,mv_r:.35,mv_g:.35,mv_b:.35,mv_a:.2},shapes:[{baseVals:{enabled:1,sides:20,additive:1,textured:1,rad:1.99867,tex_zoom:.49486,g:1,b:1,a:.75,r2:1,b2:1,a2:1,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.ang2=0;a.redsine=0;a.greensine=0;a.bluesine=0;a.redif=0;a.greenif=0;a.blueif=0;a.decay=.1;\",frame_eqs_str:\"a.sx=1;a.sy=1;a.redsine=.5+.15*a.bass*Math.sin(3*a.time);a.greensine=.5+.15*a.mid*Math.sin(2*a.time);a.bluesine=.5+.15*a.treb*Math.sin(a.time);a.redif=.9*(.00001<Math.abs(above(a.bass,1.2))?a.redsine:.00001<Math.abs(above(a.redif,.95))?0:.98*a.redif);a.greenif=.8*(.00001<Math.abs(above(a.mid,1.2))?a.greensine:.00001<Math.abs(above(a.greenif,.95))?0:.8*a.greenif);a.blueif=.8*(.00001<Math.abs(above(a.treb,1.2))?a.bluesine:.00001<Math.abs(above(a.blueif,.95))?0:.8*a.blueif);a.ib_r=\\na.redif;a.ib_g=a.greenif;a.ib_b=a.blueif;\",pixel_eqs_str:\"a.ang2=Math.sin(3*a.ang+a.time+.05*Math.sin(a.time*above(a.mid_att,1.2)));a.rot=1.2*a.ang2;\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (((texture (sampler_blur1, uv).xyz * scale1) + bias1) - texture (sampler_main, uv).xyz);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = (mix (texture (sampler_main, uv).xyz, texture (sampler_main, (\\n    (vec2(-1.003, 1.003) * (uv - 0.5))\\n   + 0.5)).xyz, vec3(0.5, 0.5, 0.5)) * 2.4);\\n  ret_1 = (ret_1 * ret_1);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ret_1;\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1,decay:.995,echo_zoom:1,echo_alpha:.5,echo_orient:1,wave_mode:6,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,wave_a:.001,wave_scale:2.103,wave_smoothing:.54,wave_mystery:.38,modwavealphastart:.81,modwavealphaend:1.4,warpscale:1.331,warp:.01,wave_r:0,wave_g:0,wave_b:0,ob_size:.005,ob_a:1,ib_size:.005,ib_a:1,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:14,num_inst:78,x:.6,rad:.02217,tex_zoom:60.80383,g:1,b:1,a:.9,g2:0,a2:1,border_g:.59,border_a:1},init_eqs_str:\"a.fov=0;a.arg=0;a.t1=0;a.posx=0;a.trel=0;a.yl=0;a.k1=0;a.posy=0;a.xl=0;a.time2=0;a.q19=0;a.t2=0;a.yw=0;a.dist=0;a.xw=0;a.speed=0;a.t1=div(Math.floor(randint(10)),10);a.t2=.2+div(Math.floor(randint(8)),10);\",frame_eqs_str:\"a.speed=.02;a.trel=Math.floor(a.time*a.speed)-a.time*a.speed+1;a.k1=div(a.instance,a.num_inst);a.k1-=Math.floor(a.k1);a.dist=1.4-a.k1;a.fov=.1;a.arg=a.dist-.02*a.time;a.posx=div(a.fov,a.dist)*(Math.sin(13*a.arg)+.2*Math.sin(332*a.dist));a.posy=div(a.fov,a.dist)*(Math.cos(36*a.arg)+.2*Math.sin(332*a.dist));a.xl=.5+a.posx;a.yl=.5+a.posy;a.time2=div(a.time,4)+Math.cos(a.instance);a.xw=.5+.5*(Math.sin(14*a.arg)+.02*Math.cos(1131*a.arg));a.yw=a.time2-Math.floor(a.time2);a.x=.00001<\\nMath.abs(bnot(a.q19))?a.xl:a.xw;a.y=.00001<Math.abs(bnot(a.q19))?a.yl:a.yw;a.ang=a.time*Math.sin(44*a.k1)*12;a.a=a.t1;a.border_a=0;a.a2=a.t2;a.rad=div(.01,a.dist);a.r=.5+.3*Math.sin(a.instance+a.arg);a.b=.5+.3*Math.sin(a.instance-2+a.arg);a.g=.5+.3*Math.sin(2*a.instance+a.arg);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.mq29=0;a.cthr=0;a.mq1=0;a.q25=0;a.q12=0;a.q22=0;a.q21=0;a.q13=0;a.q29=0;a.mq31=0;a.mq21=0;a.mq24=0;a.oldq8=0;a.chng=0;a.mq28=0;a.mq23=0;a.q31=0;a.q23=0;a.q24=0;a.q11=0;a.atime=0;a.q26=0;a.mq27=0;a.mq25=0;a.mq22=0;a.vol=0;a.mq26=0;a.q27=0;a.q28=0;a.q8=0;a.q8=0;\",frame_eqs_str:\"a.chng=Math.sin(.5*a.time);a.cthr=.9999;a.mq21=.00001<Math.abs(above(a.chng,a.cthr))?randint(3):a.mq21;a.mq22=.00001<Math.abs(above(a.chng,a.cthr))?randint(3):a.mq22;a.mq23=.00001<Math.abs(above(a.chng,a.cthr))?randint(3):a.mq23;a.mq24=.00001<Math.abs(above(a.chng,a.cthr))?randint(2):a.mq24;a.mq25=.00001<Math.abs(above(a.chng,a.cthr))?randint(2):a.mq25;a.mq26=.00001<Math.abs(above(a.chng,a.cthr))?randint(2):a.mq26;a.mq27=.00001<Math.abs(above(a.chng,a.cthr))?randint(1):a.mq27;\\na.mq28=.00001<Math.abs(above(a.chng,a.cthr))?randint(1):a.mq28;a.mq29=.00001<Math.abs(above(a.chng,a.cthr))?.3*randint(1):a.mq29;a.mq31=.00001<Math.abs(above(a.chng,a.cthr))?.3*randint(1):a.mq31;a.monitor=a.chng;a.q21=a.mq21;a.q22=a.mq22;a.q23=a.mq23;a.q24=a.mq24;a.q25=a.mq25;a.q26=a.mq26;a.q27=a.mq27;a.q28=a.mq28;a.q29=a.mq29;a.q31=a.mq31;a.monitor=a.mq1;a.vol=a.bass+a.treb+a.mid;a.atime+=a.vol;a.q11=.4+.4*Math.sin(.006*a.atime);a.q12=.4+.4*Math.cos(.00613828348*a.atime);a.q13=.4+.4*Math.sin(.00598593455*\\na.atime);a.monitor=a.q13;a.warp=0;a.q8=a.oldq8+.0003*div(pow(1+1.2*a.bass+.4*a.bass_att+.1*a.treb+.1*a.treb_att+.1*a.mid+.1*a.mid_att,6),a.fps);a.oldq8=a.q8;a.wave_r=.5+.5*Math.sin(1.123*a.q8);a.wave_g=.5+.5*Math.sin(1.576*a.q8);a.wave_b=.5+.5*Math.cos(1.465*a.q8);a.ib_a=.2*a.bass;\",pixel_eqs_str:\"a.dx=a.dx+.008*Math.sin((2*a.y-1)*a.meshx)+.008*Math.sin((2*a.y-1)*a.meshx*1.3333);a.dy=a.dy+.008*Math.cos((2*a.x-1)*a.meshx*1.3333)+.008*Math.cos((2*a.x-1)*a.meshx);\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  ret_1 = tmpvar_2.xyz;\\n  vec4 tmpvar_3;\\n  tmpvar_3 = texture (sampler_noisevol_hq, (((vec3(0.05, 0.05, 0.0) * uv.xyy) * (\\n    (q27 * texsize.xyy)\\n   * texsize_noisevol_hq.zww)) + ((time * vec3(0.0, 0.0, 1.0)) * q29)));\\n  if (((tmpvar_2.x > (q21 * q13)) && (tmpvar_2.x <= (q24 * q11)))) {\\n    ret_1.y = (tmpvar_2.y - (tmpvar_3.x * 0.5));\\n  };\\n  if (((ret_1.y > (q22 * q11)) && (ret_1.y <= (q25 * q12)))) {\\n    ret_1.z = (tmpvar_2.z - (tmpvar_3.y * 0.5));\\n  };\\n  if (((ret_1.z > (q23 * q12)) && (ret_1.z <= (q26 * q13)))) {\\n    ret_1.x = (tmpvar_2.x - (tmpvar_3.z * 0.5));\\n  };\\n  ret_1 = (ret_1 + ((ret_1 - \\n    ((texture (sampler_blur1, uv).xyz * scale1) + bias1)\\n  ) * 0.2));\\n  ret_1 = (ret_1 - 0.02);\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = ret_1;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret_2;\\n  uv_1 = (0.05 + (0.9 * uv));\\n  vec4 tmpvar_3;\\n  tmpvar_3 = texture (sampler_main, uv_1);\\n  ret_2 = tmpvar_3.xyz;\\n  vec4 tmpvar_4;\\n  tmpvar_4 = texture (sampler_noisevol_hq, (((vec3(0.05, 0.05, 0.0) * uv_1.xyy) * (\\n    (q28 * texsize.xyy)\\n   * texsize_noisevol_hq.zww)) + ((time * vec3(0.0, 0.0, 1.0)) * q31)));\\n  if (((tmpvar_3.x > (q26 * q13)) && (tmpvar_3.x <= (q23 * q11)))) {\\n    ret_2.z = (tmpvar_3.z - (tmpvar_4.x * 0.5));\\n  };\\n  if (((tmpvar_3.y > (q25 * q11)) && (tmpvar_3.y <= (q22 * q12)))) {\\n    ret_2.x = (tmpvar_3.x - (tmpvar_4.y * 0.5));\\n  };\\n  if (((ret_2.z > (q24 * q12)) && (ret_2.z <= (q21 * q13)))) {\\n    ret_2.y = (tmpvar_3.y - (tmpvar_4.z * 0.5));\\n  };\\n  ret_2 = (abs((\\n    ((texture (sampler_blur1, uv_1).xyz * scale1) + bias1)\\n   - ret_2)) * 6.0);\\n  ret_2 = (ret_2 * 1.333);\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = ret_2;\\n  ret = tmpvar_5.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:1.157,wave_smoothing:.63,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoom:.9995,warp:.009,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:.5,ob_r:.01,ib_size:.26,mv_x:64,mv_y:48,mv_l:0,mv_a:0,b1x:.7,b1ed:0},shapes:[{baseVals:{enabled:1,sides:14,num_inst:512,rad:.1026,tex_ang:.62832,r2:1,g2:0,a2:1,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;a.r_border=0;a.g_border=0;a.b_border=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.01*a.bass;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0002*Math.cos(a.ma);a.my+=.0002*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.rad=div(a.bass+a.treb,100);a.a=above(a.bass+a.mid+a.treb,.8);a.r=div(Math.floor(randint(100)),100);a.g=div(Math.floor(randint(100)),\\n100);a.b=div(Math.floor(randint(100)),100);a.r2=div(Math.floor(randint(100)),100);a.g2=div(Math.floor(randint(100)),100);a.b2=div(Math.floor(randint(100)),100);a.r_border=div(Math.floor(randint(100)),100);a.g_border=div(Math.floor(randint(100)),100);a.b_border=div(Math.floor(randint(100)),100);\"},{baseVals:{enabled:1,sides:23,num_inst:1024,rad:.10262,ang:.43982,tex_ang:.62832,a:.5,r2:1,g2:0,a2:.5,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;a.r_border=0;a.g_border=0;a.b_border=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.05*a.bass;a.ma-=3.1415*above(a.mid,1)*.05*a.mid;a.mx+=.0001*Math.cos(a.ma);a.my+=.0001*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.rad=div(a.bass+a.treb,75);a.a=above(a.bass+a.mid+a.treb,.1);a.r=div(Math.floor(randint(100)),100);a.g=div(Math.floor(randint(100)),\\n100);a.b=div(Math.floor(randint(100)),100);a.r2=div(Math.floor(randint(100)),100);a.g2=div(Math.floor(randint(100)),100);a.b2=div(Math.floor(randint(100)),100);a.r_border=div(Math.floor(randint(100)),100);a.g_border=div(Math.floor(randint(100)),100);a.b_border=div(Math.floor(randint(100)),100);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.n=0;a.z=0;a.n2=0;a.q25=0;a.w2=0;a.q22=0;a.q21=0;a.q29=0;a.j3=0;a.q1=0;a.n1=0;a.v=0;a.w3=0;a.q31=0;a.q23=0;a.q24=0;a.pi=0;a.pi2inv=0;a.j2=0;a.w1=0;a.zz=0;a.vol=0;a.j1=0;a.q27=0;a.maskangle=0;a.q3=0;a.q32=0;a.q28=0;a.q30=0;a.q20=0;a.mtime=0;a.x1=2;a.y1=2;a.z1=2;\",frame_eqs_str:\"a.d=20;a.z=4;a.zz=1+0*a.bass_att;a.pi=2*Math.asin(1);a.pi2inv=div(.5,a.pi);a.maskangle=Math.asin(div(1,a.d));a.q32=a.maskangle;a.q31=a.d;a.q30=a.z;a.q29=a.pi2inv;a.q28=a.pi;a.q27=div(1,a.zz);a.v=.4;a.j1=.95*a.j1+sqr(4*a.bass)*a.v;a.j2=.95*a.j2+sqr(4*a.mid)*a.v;a.j3=.95*a.j3+sqr(4*a.treb)*a.v;a.n+=.0152*a.j1;a.n1+=.0152*a.j2;a.n2+=.0152*a.j3;a.vol=.25*(a.bass+a.mid+a.treb);a.vol=a.vol;a.q3=a.vol;a.mtime+=.01*a.vol;a.q1=a.mtime;a.zoom+=.015*a.vol;a.w1=.01*a.n;a.w2=.01*a.n1;a.w3=\\n.01*a.n2;a.q20=Math.cos(a.w1);a.q21=Math.sin(a.w1);a.q22=Math.cos(a.w2);a.q23=Math.sin(a.w2);a.q24=Math.cos(a.w3);a.q25=Math.sin(a.w3);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = (((uv_orig * texsize.xy) * (texsize_noise_lq.zw * 1.5)) + rand_frame.xy);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ((texture (sampler_main, (\\n    mix (uv_orig, uv, vec2(((dot (texture (sampler_main, \\n      mix (uv_orig, uv, vec2(4.0, 4.0))\\n    ).xyz, vec3(0.32, 0.49, 0.29)) - dot (\\n      ((texture (sampler_blur2, mix (uv_orig, uv, vec2(-12.0, -12.0))).xyz * scale2) + bias2)\\n    , vec3(0.32, 0.49, 0.29))) * 12.0)))\\n   + \\n    (((texture (sampler_noise_lq, tmpvar_1) - 0.5).xy * texsize.zw) * 0.5)\\n  )).xyz + (\\n    (texture (sampler_noise_lq, tmpvar_1) - 0.5)\\n   * 0.006).xyz) + -0.0006);\\n  ret = tmpvar_2.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret2_2;\\n  vec2 uv2_3;\\n  vec3 ret_4;\\n  uv2_3.y = uv.y;\\n  uv2_3.x = (1.0 - uv.x);\\n  uv2_3 = (0.5 + ((uv2_3 - 0.5) * 0.98));\\n  uv_1 = (0.5 + ((uv - 0.5) * 0.98));\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (texsize.zw * 4.0);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = (((texture (sampler_blur1, \\n    (uv_1 + (vec2(1.0, 0.0) * tmpvar_5))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_1 - (vec2(1.0, 0.0) * tmpvar_5))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_7;\\n  tmpvar_7 = (((texture (sampler_blur1, \\n    (uv_1 + (vec2(0.0, 1.0) * tmpvar_5))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_1 - (vec2(0.0, 1.0) * tmpvar_5))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_8;\\n  tmpvar_8.z = 0.0;\\n  tmpvar_8.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_8.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  vec4 tmpvar_9;\\n  tmpvar_9 = texture (sampler_noisevol_hq, ((vec3(0.05, 0.05, 0.0) * (\\n    ((uv_1.xyy + (tmpvar_8 * 0.5)) * texsize.xyy)\\n   * texsize_noisevol_hq.zww)) + (vec3(0.0, 0.0, 0.2) * time)));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = dot (tmpvar_6, vec3(0.32, 0.49, 0.29));\\n  tmpvar_10.y = dot (tmpvar_7, vec3(0.32, 0.49, 0.29));\\n  uv_1 = (uv_1 - (tmpvar_10 * 0.04));\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = dot (((\\n    (texture (sampler_blur1, (uv2_3 + (vec2(1.0, 0.0) * tmpvar_5))).xyz * scale1)\\n   + bias1) - (\\n    (texture (sampler_blur1, (uv2_3 - (vec2(1.0, 0.0) * tmpvar_5))).xyz * scale1)\\n   + bias1)), vec3(0.32, 0.49, 0.29));\\n  tmpvar_11.y = dot (((\\n    (texture (sampler_blur1, (uv2_3 + (vec2(0.0, 1.0) * tmpvar_5))).xyz * scale1)\\n   + bias1) - (\\n    (texture (sampler_blur1, (uv2_3 - (vec2(0.0, 1.0) * tmpvar_5))).xyz * scale1)\\n   + bias1)), vec3(0.32, 0.49, 0.29));\\n  uv2_3 = (uv2_3 - (tmpvar_11 * 0.04));\\n  ret_4 = (abs((\\n    ((texture (sampler_main, uv_1).xyz + ((texture (sampler_blur1, uv_1).xyz * scale1) + bias1)) - ((texture (sampler_blur2, uv_1).xyz * scale2) + bias2))\\n   - \\n    ((texture (sampler_blur3, uv_1).xyz * scale3) + bias3)\\n  )) * (dot (tmpvar_9, vec4(0.32, 0.49, 0.29, 0.0)) * 3.0));\\n  ret2_2 = (abs((\\n    ((texture (sampler_main, uv2_3).xyz + ((texture (sampler_blur1, uv2_3).xyz * scale1) + bias1)) - ((texture (sampler_blur2, uv2_3).xyz * scale2) + bias2))\\n   - \\n    ((texture (sampler_blur3, uv2_3).xyz * scale3) + bias3)\\n  )) * (dot (tmpvar_9, vec4(0.32, 0.49, 0.29, 0.0)) * 3.0));\\n  ret2_2 = (0.5 - pow (ret2_2, vec3(0.5, 0.5, 0.5)));\\n  ret_4 = (pow (ret_4, vec3(0.5, 0.5, 0.5)) - (0.3 - ret2_2));\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = ret_4;\\n  ret = tmpvar_12.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:4,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,darken_center:1,darken:1,wave_a:.001,wave_scale:.527429,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:.442,warpscale:.498,zoom:.9999,warp:.01,sx:.9999,wave_r:.8,wave_g:.49,ob_size:0,ob_r:1,ob_g:1,ob_b:1,ob_a:.05,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,thickoutline:1,textured:1,x:.26,y:.2,rad:.393173,tex_zoom:1.392831,r:0,g:.55,b:.5,a:.9,g2:.4,b2:.4,border_r:.3,border_g:.7,border_b:.8,border_a:.2},init_eqs_str:\"a.g0=0;a.y0=0;a.q1=0;a.x0=0;a.q24=0;a.q26=0;a.r0=0;a.trig=0;a.q2=0;a.b0=0;a.rad0=0;\",frame_eqs_str:\"a.trig=a.q24;a.textured=1;a.x0=a.x0*bnot(a.trig)+a.trig*(.2+div(randint(100),200));a.y0=a.y0*bnot(a.trig)+a.trig*(.2+div(randint(100),200));a.x0+=div(.03*a.q1*(3+a.q26),a.fps);a.y0+=div(.03*a.q2*(3+a.q26),a.fps);a.x0-=Math.floor(a.x0);a.y0-=Math.floor(a.y0);a.tex_ang=a.time;a.ang=a.time*a.q2;a.x=a.x0;a.y=a.y0;a.rad0=a.rad0*bnot(a.trig)+div(a.trig*randint(100),200);a.rad=a.rad0;a.r0=a.r0*bnot(a.trig)+div(a.trig*randint(10),10);a.b0=a.b0*bnot(a.trig)+div(a.trig*randint(10),10);\\na.g0=a.g0*bnot(a.trig)+div(a.trig*randint(10),10);a.border_r=a.r0;a.border_g=a.g0;a.border_b=a.b0;a.r=a.r0;a.b=a.b0;a.g=a.g0;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.rm=0;a.ampl=0;a.index2=0;a.index=0;a.q18=0;a.q22=0;a.q21=0;a.movex=0;a.q1=0;a.dec_med=0;a.index3=0;a.trel=0;a.rott=0;a.ava=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.mov=0;a.avg=0;a.movez=0;a.q19=0;a.beat=0;a.q17=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.movey=0;a.q3=0;a.t0=0;a.q28=0;a.q30=0;a.q20=0;a.dirx=1;\",frame_eqs_str:\"a.dec_med=pow(.6,div(30,a.fps));a.dec_slow=pow(.9,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),4);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),3);a.q20=a.avg;a.q21=\\na.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass+a.mid+a.treb;a.ava=a.ava*a.dec_slow+a.q26*(1-a.dec_slow);a.k1=a.is_beat*equal(mod(a.index,2),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,2);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.q27=8-a.index;a.q28=.5+div(Math.sin(div(a.time,7)),10);a.rm=Math.min(a.q26-1.5*a.ava,2);a.mov=a.is_beat*a.rm+(1-a.is_beat)*a.mov;a.movez+=div(.4,a.fps)*a.mov;a.q30=a.movez;a.ampl=\\ndiv(a.q26,8);a.movex+=div(.2,a.fps)*Math.sin(a.rott);a.movey+=div(.2,a.fps)*Math.cos(a.rott);a.q18=a.movex;a.q19=a.movey;a.trel=a.trel+div(1,a.fps)+a.q24;a.q17=2*Math.sin(div(a.trel,4));\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 uv6_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_4;\\n  tmpvar_4 = (((q28 * 2.0) * sqrt(\\n    dot (tmpvar_3, tmpvar_3)\\n  )) + (rand_frame * 64.0)).x;\\n  uv_1 = (uv + (clamp (\\n    ((sin(tmpvar_4) / cos(tmpvar_4)) * normalize(tmpvar_3))\\n  , vec2(-16.0, -16.0), vec2(16.0, 16.0)) / 20.0));\\n  uv6_2 = (0.4 * sin((tmpvar_3 * 12.0)));\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = (((q24 * \\n    (((texture (sampler_main, uv_1).xyz - (\\n      ((texture (sampler_blur1, fract(uv_1)).xyz * scale1) + bias1)\\n     * 0.04)) + (0.15 * (vec3(\\n      (0.1 / sqrt(dot (uv6_2, uv6_2)))\\n    ) * roam_cos.xyz))) - 0.04)\\n  ) * 0.98) + ((1.0 - q24) * texture (sampler_main, uv_orig).xyz));\\n  ret = tmpvar_5.xyz;\\n }\",comp:\"vec3 xlat_mutableneu;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutablers2;\\n shader_body { \\n  vec2 uv_1;\\n  float inten_3;\\n  float dist_4;\\n  float ang2_5;\\n  vec2 uv2_6;\\n  uv_1 = (uv - 0.5);\\n  uv_1 = (uv_1 * aspect.xy);\\n  dist_4 = 1.0;\\n  inten_3 = 1.0;\\n  xlat_mutableret1 = vec3(0.0, 0.0, 0.0);\\n  for (float n_2 = 0.0; n_2 <= 4.0; n_2 += 1.0) {\\n    vec2 uv3_7;\\n    ang2_5 = ((6.28 * n_2) / 4.0);\\n    float tmpvar_8;\\n    tmpvar_8 = cos(ang2_5);\\n    float tmpvar_9;\\n    tmpvar_9 = sin(ang2_5);\\n    uv2_6.x = ((uv_1.x * tmpvar_8) - (uv_1.y * tmpvar_9));\\n    uv2_6.y = ((uv_1.x * tmpvar_9) + (uv_1.y * tmpvar_8));\\n    uv2_6 = (uv2_6 * aspect.yx);\\n    dist_4 = (1.0 - fract((\\n      (0.25 * n_2)\\n     + q30)));\\n    inten_3 = ((sqrt(dist_4) * (1.0 - dist_4)) * 4.0);\\n    vec2 tmpvar_10;\\n    tmpvar_10.x = tmpvar_8;\\n    tmpvar_10.y = tmpvar_9;\\n    uv3_7 = (fract((\\n      ((3.0 * uv2_6) * dist_4)\\n     + \\n      (0.3 * q27)\\n    )) + (q17 * tmpvar_10));\\n    xlat_mutableneu = (texture (sampler_main, uv3_7).xyz - ((texture (sampler_blur2, \\n      ((uv3_7 * 1.02) * q1)\\n    ).xyz * scale2) + bias2));\\n    xlat_mutableneu = (xlat_mutableneu * vec3(greaterThanEqual (xlat_mutableneu, vec3(0.0, 0.0, 0.0))));\\n    xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * inten_3));\\n  };\\n  xlat_mutablers2 = ((0.4 * cos(\\n    ((uv_1 * 13.0) + time)\\n  )) - dot (xlat_mutableret1, vec3(0.32, 0.49, 0.29)));\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = (xlat_mutableret1 + ((\\n    ((0.05 / sqrt(dot (xlat_mutablers2, xlat_mutablers2))) * q26)\\n   / 4.0) * hue_shader));\\n  ret = tmpvar_11.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:7,wave_dots:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.39158,wave_scale:.01,wave_smoothing:.504,wave_mystery:-1,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_r:.7,wave_g:0,ob_r:1,ob_g:1,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:0,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:5,additive:1,x:.9,rad:.22613,g:.6,g2:0,b2:.4,a2:.3,border_a:0},init_eqs_str:\"a.dx=0;a.dy=0;a.q22=0;a.q24=0;a.t_rel=5*a.time;a.t1=Math.floor(a.t_rel);\",frame_eqs_str:\"a.dx=div(randint(1E3),1E3)-.5;a.dy=div(randint(1E3),1E3)-.5;a.x=.5+a.dx*(1-div(a.q22,4));a.y=.5+a.dy*(1-div(a.q22,4));a.ang=a.time;a.a=1;a.rad=.1*a.q24+.08+div(a.q22,40);\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:256,spectrum:1,usedots:1,scaling:.5033,g:.6,b:.4},init_eqs_str:\"a.xang=0;a.ampl=0;a.fov=0;a.t1=0;a.yang=0;a.my=0;a.oz=0;a.t_rel=0;a.mz=0;a.q26=0;a.oy=0;a.mx=0;a.zang=0;a.t_abs=0;a.ox=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.t_abs=a.sample;a.t_rel=a.sample-div(a.time,1);a.ampl=a.time;a.ox=10*a.ampl*Math.sin(68*a.t_abs);a.oy=10*a.ampl*Math.cos(28*a.t_abs);a.oz=10*a.ampl*Math.cos(128*a.t_abs);a.r=1;a.g=.5;a.b=1;a.a=div(a.q26,18);a.xang=a.t1;a.yang=2*a.t1;a.zang=a.t1;a.fov=.12;a.mx=a.ox*Math.cos(a.zang)-a.oy*Math.sin(a.zang);a.my=a.ox*Math.sin(a.zang)+a.oy*Math.cos(a.zang);a.ox=a.mx;a.oy=a.my;a.mx=a.ox*Math.cos(a.yang)+a.oz*Math.sin(a.yang);a.mz=-a.ox*Math.sin(a.yang)+a.oz*Math.cos(a.yang);a.ox=\\na.mx;a.oz=a.mz;a.my=a.oy*Math.cos(a.xang)-a.oz*Math.sin(a.xang);a.mz=a.oy*Math.sin(a.xang)+a.oz*Math.cos(a.xang);a.oy=a.my;a.oz=a.mz;a.oz-=6;a.x=div(a.ox*a.fov,a.oz)+.5;a.y=div(a.oy*a.fov,a.oz)+.5;\"},{baseVals:{enabled:1},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"a.a=Math.max(Math.sin(div(a.time,8))-.5,0);a.r=.4;a.g=.2;a.b=.7;a.x=a.sample+.01*Math.cos(243*a.sample+a.time);a.y=.5+.5*Math.sin(div(a.time,13))+.02*Math.sin(143*a.sample);a.a=.7;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.index4=0;a.index=0;a.q22=0;a.q21=0;a.q29=0;a.q1=0;a.dec_med=0;a.index3=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.t_rel=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.movez=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.q28=0;a.q20=0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.5+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),4);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),3);a.q20=a.avg;a.q21=\\na.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass+a.mid+a.treb;a.k1=a.is_beat*equal(a.index,0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_slow*a.p2+(1-a.dec_slow)*a.p1;a.rott=div(3.14159265359*a.p2,2);a.q27=8-a.index;a.q28=.5+div(Math.sin(div(a.time,7)),10);a.q29=a.index4;a.mv_a=.2;a.t_rel=div(a.time,3);a.wave_a=Math.max(Math.sin(div(a.time,8))-.5,0);a.wave_a=0;a.wave_x=.5+.5*Math.sin(div(a.time,13));a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.movez+=div(.3,a.fps);\\na.q29=a.movez;a.zoom=1;a.rot=0;a.dx=.003;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = (((uv - vec2(0.5, 0.5)) * texsize.xy) * 0.03);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ((0.99 * texture (sampler_main, (uv + \\n    (((clamp (\\n      (sin(tmpvar_1) / cos(tmpvar_1))\\n    , vec2(-12.0, -12.0), vec2(12.0, 12.0)) * cos(\\n      (tmpvar_1.yx * tmpvar_1.yx)\\n    )) * texsize.zw) * 12.0)\\n  )).xyz) - 0.01);\\n  ret = tmpvar_2.xyz;\\n }\",comp:\"vec3 xlat_mutableret1;\\nvec2 xlat_mutableuv2;\\n shader_body { \\n  vec2 uv_1;\\n  float inten_2;\\n  float dist_3;\\n  uv_1 = (uv - 0.5);\\n  uv_1 = (uv_1 * aspect.xy);\\n  dist_3 = (1.0 - fract((0.25 + q29)));\\n  inten_2 = (sqrt(dist_3) * (1.0 - (dist_3 * dist_3)));\\n  xlat_mutableret1 = max (vec3(0.0, 0.0, 0.0), (texture (sampler_main, fract(\\n    (((2.0 * uv_1) * dist_3) + 0.5)\\n  )).xyz * inten_2));\\n  xlat_mutableuv2.x = -(uv_1.y);\\n  xlat_mutableuv2.y = uv_1.x;\\n  dist_3 = (1.0 - fract((0.5 + q29)));\\n  inten_2 = (sqrt(dist_3) * (1.0 - (dist_3 * dist_3)));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, fract(\\n    (((2.0 * xlat_mutableuv2) * dist_3) + 0.5)\\n  )).xyz * inten_2));\\n  dist_3 = (1.0 - fract((0.75 + q29)));\\n  inten_2 = (sqrt(dist_3) * (1.0 - (dist_3 * dist_3)));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, fract(\\n    (((2.0 * uv_1) * dist_3) + 0.5)\\n  )).xyz * inten_2));\\n  xlat_mutableuv2.x = -(uv_1.y);\\n  xlat_mutableuv2.y = uv_1.x;\\n  dist_3 = (1.0 - fract((1.0 + q29)));\\n  inten_2 = (sqrt(dist_3) * (1.0 - (dist_3 * dist_3)));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, fract(\\n    (((2.0 * xlat_mutableuv2) * dist_3) + 0.5)\\n  )).xyz * inten_2));\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = (xlat_mutableret1 * 3.0);\\n  ret = tmpvar_4.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.980001,decay:.5,echo_zoom:.952379,echo_alpha:.5,echo_orient:3,wave_mode:4,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.391579,wave_scale:1.575857,wave_smoothing:.45,wave_mystery:.08,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_r:.5,wave_g:.79,ob_size:0,ob_a:.8,ib_size:.26,mv_x:31.999998,mv_y:24.000004,mv_l:.05,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,textured:1,rad:.545996,ang:2.199115,tex_ang:.502655,tex_zoom:2.02311,g:1,b:.9,a:.6,r2:.8,g2:.8,b2:.8,a2:.6,border_b:0,border_a:.7},init_eqs_str:\"a.q29=0;a.q22=0;a.q23=0;a.q24=0;\",frame_eqs_str:\"a.tex_ang=1+Math.sin(div(a.time,9));a.rad=a.q29;a.tex_zoom=2+Math.sin(div(a.time,17));a.additive=div(a.q22,6);a.textured=1-bnot(a.q23)*a.q24;\"},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:100,x:.503,rad:.01,tex_zoom:.609857,g:.1,a:.9,r2:1,b2:1,border_r:.5,border_g:.5,border_b:.5,border_a:0},init_eqs_str:\"a.q21=0;\",frame_eqs_str:\"a.x=.5+div(randint(10),25);a.y=.5+div(randint(10),25);a.ang=randint(6);a.r=div(randint(4),3);a.g=div(randint(4),3);a.b=div(randint(4),3);a.r2=a.b;a.g2=a.r;a.b2=a.g;a.a=Math.min(div(a.q21,2),.9);a.rad=div(a.a,9);a.a=.5;a.a2=.8;\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.index=0;a.copy=0;a.q22=0;a.q21=0;a.grid=0;a.q29=0;a.q1=0;a.dec_med=0;a.str=0;a.index3=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.go=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.movez=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.p3=0;a.q3=0;a.t0=0;a.rot1=0;a.q28=0;a.q30=0;a.q20=0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.5+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,4);a.index2=mod(a.index2+a.is_beat*bnot(a.index),4);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),3);a.q20=a.avg;a.q21=\\na.beat;a.q22=Math.max(a.peak,4);a.q23=a.index;a.q24=a.is_beat;a.q26=Math.max(a.bass+a.mid+a.treb,3);a.go=a.go*a.dec_slow+(1-a.dec_slow)*equal(a.index2,2);a.movez+=div(3*(1+.3*a.q26),a.fps)*a.go;a.q30=a.movez;a.k1=a.is_beat*equal(a.index,0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.p3=a.dec_med*a.p3+(1-a.dec_med)*a.p2;a.rott=div(3.1416*a.p3,2);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.str=a.str*a.dec_slow+(1-a.dec_slow)*a.index3;a.q27=4-a.str;\\na.grid=a.grid*a.dec_med+(1-a.dec_med)*equal(a.index2,2)*bnot(a.index);a.mv_a=.6*a.grid;a.rot1=a.dec_med*a.rot1+(1-a.dec_med)*bnot(a.index2);a.q28=a.rot1;a.copy=a.copy*a.dec_slow+(1-a.dec_slow)*a.index3;a.q29=.3*a.copy;\",pixel_eqs_str:\"a.dx=.02*a.q28;a.rot=.04*a.q2;a.zoom=.96+.1*Math.sin(div(a.time,7));\",warp:\" shader_body { \\n  vec2 zz_1;\\n  mat2 tmpvar_2;\\n  tmpvar_2[uint(0)] = _qa.xy;\\n  tmpvar_2[1u] = _qa.zw;\\n  zz_1 = (((\\n    (uv - vec2(0.5, 0.5))\\n   * texsize.xy) * 0.01) * tmpvar_2);\\n  zz_1 = -(zz_1.yx);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ((texture (sampler_main, (uv + \\n    (((clamp (\\n      (sin(zz_1.yx) / cos(zz_1.yx))\\n    , vec2(-8.0, -8.0), vec2(8.0, 8.0)) * cos(\\n      (4.0 * zz_1)\\n    )) * texsize.zw) * 16.0)\\n  )).xyz * 0.99) - 0.01);\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv3_1;\\n  vec2 uv2_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_4;\\n  tmpvar_4 = (0.1 / (sqrt(\\n    dot (tmpvar_3, tmpvar_3)\\n  ) + 0.1));\\n  vec2 tmpvar_5;\\n  float tmpvar_6;\\n  tmpvar_6 = (ang / 3.14);\\n  tmpvar_5.x = tmpvar_6;\\n  tmpvar_5.y = (q27 * tmpvar_4);\\n  uv2_2.y = (tmpvar_5.y + (0.1 * q30));\\n  uv2_2.x = (tmpvar_6 + (0.2 * time));\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_6;\\n  tmpvar_7.y = (4.0 * tmpvar_4);\\n  uv3_1.y = (tmpvar_7.y - (0.2 * q30));\\n  uv3_1.x = tmpvar_7.x;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = fract(uv3_1);\\n  uv3_1 = tmpvar_8;\\n  float tmpvar_9;\\n  tmpvar_9 = clamp ((1.0 - (4.0 * rad)), 0.0, 1.0);\\n  vec4 tmpvar_10;\\n  tmpvar_10.w = 1.0;\\n  tmpvar_10.xyz = (((\\n    (3.0 * max (((2.0 * texture (sampler_main, uv2_2).xyz) + texture (sampler_main, tmpvar_8).xyz), ((2.0 * \\n      ((texture (sampler_blur2, fract(uv2_2)).xyz * scale2) + bias2)\\n    ) + (\\n      (texture (sampler_blur2, fract(tmpvar_8)).xyz * scale2)\\n     + bias2))))\\n   * rad) + (\\n    ((uv.y * pow ((1.0 - rad), 8.0)) * roam_cos)\\n  .xyz * tmpvar_9)) + ((tmpvar_9 * 2.0) * (\\n    (texture (sampler_blur1, fract(uv)).xyz * scale1)\\n   + bias1)));\\n  ret = tmpvar_10.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:6,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,darken_center:1,darken:1,wave_a:.001,wave_scale:.236,wave_smoothing:0,wave_mystery:-.64,modwavealphastart:.81,modwavealphaend:1.4,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_b:.6,ob_size:.005,ob_a:.8,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:18,num_inst:4,x:.83,rad:.14349,tex_ang:3.76991,tex_zoom:5.27784,r:0,g:1,b:1,a:.5,r2:1,g2:.2,b2:1,border_b:0,border_a:0},init_eqs_str:\"a.d=0;a.k1=0;a.q22=0;a.q27=0;a.r0=0;a.q24=0;a.g0=0;a.b0=0;\",frame_eqs_str:\"a.d=.3+.2*div(mod(a.frame,8),8);a.k1=6.28*div(a.instance,a.num_inst);a.d=.3+div(a.q22,8);a.x=.5+a.d*Math.cos(a.k1);a.y=.5+a.d*Math.sin(a.k1);a.a=Math.min(1,.2+div(.8*a.q22,2)*mod(a.q27,2));a.a2=0;a.r=.6+.4*Math.sin(div(a.time,4)+1.56);a.b=.6+.4*Math.sin(div(a.time,4)+3.14);a.g=.6+.4*Math.sin(div(a.time,4));a.r0=a.r0*bnot(a.q24)+(.5+.5*Math.sin(a.time))*a.q24;a.g0=a.g0*bnot(a.q24)+(.5+.5*Math.sin(1.7*a.time))*a.q24;a.b0=div(2-a.r0-a.g0,2);a.r=a.r0;a.b=a.b0;a.g=a.g0;a.r2=1-a.g;\\na.g2=1-a.b;a.b2=1-a.r;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:128,scaling:.89152,smoothing:0},init_eqs_str:\"a.q22=0;a.q27=0;a.q24=0;a.t1=0;a.t2=0;a.r0=0;a.g0=0;\",frame_eqs_str:\"a.t1=a.t1*bnot(a.q24)+(.5+.5*Math.sin(a.time))*a.q24;a.t2=a.t2*bnot(a.q24)+(.5+.5*Math.sin(1.7*a.time))*a.q24;\",point_eqs_str:\"a.x=a.sample;a.y=.5;a.a=a.q22*mod(a.q27+1,2);a.a=div(a.q24*mod(a.q27+1,2),2)+0;a.r=a.t1;a.b=a.t2;a.g=div(2-a.r0-a.g0,2);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.speed_=0;a.index=0;a.q12=0;a.q22=0;a.q21=0;a.q13=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.movz=0;a.trel=0;a.q9=0;a.rott=0;a.spg=0;a.vol__=0;a.is_beat=0;a.q31=0;a.k1=0;a.q24=0;a.vx=0;a.dec_slow=0;a.vy=0;a.vz=0;a.q4=0;a.dir=0;a.p2=0;a.avg=0;a.trig=0;a.beat=0;a.q17=0;a.vol=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.speed=0;a.q3=0;a.t0=0;a.vol_=0;a.q7=0;a.q28=0;a.q30=0;a.q20=0;a.q8=0;a.ang0=0;a.speed_=1;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.96,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.1);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,12);a.index2=mod(a.index2+a.is_beat*bnot(a.index),8);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q24=a.is_beat;a.vol=div(a.bass_att+a.mid_att+\\na.treb_att,2);a.vol_=a.dec_med*a.vol_+(1-a.dec_med)*a.vol;a.vol__=a.dec_med*a.vol__+(1-a.dec_med)*a.vol_;a.q27=a.index+1;a.q28=a.index2+2;a.k1=a.is_beat*equal(mod(a.index,4),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,4);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.trig=a.q24*bnot(mod(a.index,8));a.vx=a.vx*bnot(a.trig)+a.trig*(div(randint(100),100)-.5);a.vy=a.vy*bnot(a.trig)+a.trig*(div(randint(100),100)-.5);a.vz=a.vz*bnot(a.trig)+\\na.trig*(div(randint(100),100)-.5);a.speed=Math.min(a.vol_-a.vol__+.5,1);a.speed=Math.max(a.speed,-.5);a.speed_=bnot(a.trig)*a.speed_+a.trig*a.speed;a.spg=a.dec_med*a.spg+(1-a.dec_med)*a.speed_;a.movz+=div(1,a.fps)*(a.speed_+div(0*a.vol_,6));a.q9=a.movz;a.q12=2*Math.min(a.q22,6);a.q13=2*Math.sin(div(a.movz,3)-div(a.time,11));a.trig=bnot(mod(a.index,4))*a.q24;a.dir=bnot(a.trig)*a.dir+a.trig*(randint(10)-5);a.trel+=div(.1,a.fps)*a.dir;a.q5=Math.cos(a.trel-a.movz);a.q6=Math.sin(div(a.trel,2)-a.movz);\\na.q7=-a.q6;a.q8=a.q5;a.ang0=a.ang0*a.dec_med+a.vz*(1-a.dec_med);a.q17=2*a.ang0;a.q30=.2*Math.sin(div(a.time,8));a.q31=.5+.5*Math.sin(div(a.time,3.3));a.zoom=1;a.rot=0;a.dx=0;a.monitor=a.q28;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\"vec3 xlat_mutablemus;\\n shader_body { \\n  vec2 d_1;\\n  vec2 uv6_2;\\n  vec2 uv1_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (uv - 0.5);\\n  uv1_3 = tmpvar_4;\\n  uv6_2 = tmpvar_4;\\n  float x_5;\\n  x_5 = (abs(tmpvar_4.x) - abs(tmpvar_4.y));\\n  float tmpvar_6;\\n  tmpvar_6 = (12.0 * sqrt((x_5 * x_5)));\\n  vec2 tmpvar_7;\\n  tmpvar_7 = normalize(tmpvar_4);\\n  d_1 = tmpvar_7;\\n  float tmpvar_8;\\n  tmpvar_8 = (float(mod (q28, 2.0)));\\n  if ((tmpvar_8 == 0.0)) {\\n    d_1 = ((q1 * tmpvar_7) - (q2 / tmpvar_7));\\n  };\\n  uv1_3 = (tmpvar_4 + ((-0.06 * \\n    dot (((texture (sampler_blur1, uv).xyz * scale1) + bias1), vec3(0.32, 0.49, 0.29))\\n  ) * normalize(tmpvar_4)));\\n  uv1_3 = (uv1_3 - (clamp (\\n    ((sin(tmpvar_6) / cos(tmpvar_6)) * d_1)\\n  , vec2(-4.0, -4.0), vec2(4.0, 4.0)) / 60.0));\\n  uv6_2 = (0.4 * cos((\\n    (uv1_3 * 2.0)\\n   * q28)));\\n  xlat_mutablemus = (clamp (vec3((0.0006 / \\n    (sqrt(dot (uv6_2, uv6_2)) - (0.002 * (q27 + (8.0 * q28))))\\n  )), 0.0, 1.0) * q31);\\n  xlat_mutablemus = (xlat_mutablemus * (1.0 + roam_cos).xyz);\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = ((0.4 * (\\n    ((texture (sampler_main, ((uv1_3 * \\n      (0.8 + (0.2 * tmpvar_6))\\n    ) + 0.5)).xyz + xlat_mutablemus) * 0.95)\\n   - 0.025)) + (0.6 * texture (sampler_main, uv_orig)).xyz);\\n  ret = tmpvar_9.xyz;\\n }\",comp:\"vec3 xlat_mutableneu;\\nvec3 xlat_mutableret2;\\nvec2 xlat_mutablers0;\\nvec2 xlat_mutablerss;\\nvec2 xlat_mutableuv2;\\n shader_body { \\n  vec2 uv_1;\\n  vec2 ofs_2;\\n  vec3 ret1_3;\\n  vec2 uv5_4;\\n  uv_1 = ((uv - 0.5) * aspect.xy);\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = q5;\\n  tmpvar_5.y = q6;\\n  uv_1 = (uv_1 + (tmpvar_5 / 4.0));\\n  uv5_4 = uv_1;\\n  mat2 tmpvar_6;\\n  tmpvar_6[uint(0)] = _qb.xy;\\n  tmpvar_6[1u] = _qb.zw;\\n  uv_1 = (uv_1 * tmpvar_6);\\n  float tmpvar_7;\\n  float tmpvar_8;\\n  tmpvar_8 = (min (abs(\\n    (uv5_4.y / uv5_4.x)\\n  ), 1.0) / max (abs(\\n    (uv5_4.y / uv5_4.x)\\n  ), 1.0));\\n  float tmpvar_9;\\n  tmpvar_9 = (tmpvar_8 * tmpvar_8);\\n  tmpvar_9 = (((\\n    ((((\\n      ((((-0.01213232 * tmpvar_9) + 0.05368138) * tmpvar_9) - 0.1173503)\\n     * tmpvar_9) + 0.1938925) * tmpvar_9) - 0.3326756)\\n   * tmpvar_9) + 0.9999793) * tmpvar_8);\\n  tmpvar_9 = (tmpvar_9 + (float(\\n    (abs((uv5_4.y / uv5_4.x)) > 1.0)\\n  ) * (\\n    (tmpvar_9 * -2.0)\\n   + 1.570796)));\\n  tmpvar_7 = (tmpvar_9 * sign((uv5_4.y / uv5_4.x)));\\n  if ((abs(uv5_4.x) > (1e-08 * abs(uv5_4.y)))) {\\n    if ((uv5_4.x < 0.0)) {\\n      if ((uv5_4.y >= 0.0)) {\\n        tmpvar_7 += 3.141593;\\n      } else {\\n        tmpvar_7 = (tmpvar_7 - 3.141593);\\n      };\\n    };\\n  } else {\\n    tmpvar_7 = (sign(uv5_4.y) * 1.570796);\\n  };\\n  xlat_mutablers0.x = (((tmpvar_7 / 3.1416) * 6.0) * q28);\\n  float tmpvar_10;\\n  tmpvar_10 = (1.5 / sqrt(dot (uv_1, uv_1)));\\n  xlat_mutablers0.y = tmpvar_10;\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = (xlat_mutablers0.x + (q9 * 4.0));\\n  tmpvar_11.y = (tmpvar_10 + ((q9 * q28) * 4.0));\\n  xlat_mutablerss = (tmpvar_11 / 12.0);\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = q5;\\n  tmpvar_12.y = q6;\\n  ofs_2 = (0.1 * tmpvar_12.yx);\\n  float tmpvar_13;\\n  float tmpvar_14;\\n  tmpvar_14 = -(q9);\\n  tmpvar_13 = fract(tmpvar_14);\\n  mat2 tmpvar_15;\\n  tmpvar_15[uint(0)].x = 1.0;\\n  tmpvar_15[uint(0)].y = -0.0;\\n  tmpvar_15[1u].x = 0.0;\\n  tmpvar_15[1u].y = 1.0;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_13)\\n   * tmpvar_15)) * aspect.yx);\\n  xlat_mutableneu = (3.0 * texture (sampler_main, fract((\\n    (xlat_mutableuv2 + 0.5)\\n   + ofs_2)))).xyz;\\n  ret1_3 = max (vec3(0.0, 0.0, 0.0), (xlat_mutableneu * (1.0 - \\n    (tmpvar_13 * tmpvar_13)\\n  )));\\n  float tmpvar_16;\\n  tmpvar_16 = fract((tmpvar_14 + 0.3333333));\\n  mat2 tmpvar_17;\\n  tmpvar_17[uint(0)].x = -0.4990803;\\n  tmpvar_17[uint(0)].y = -0.8665558;\\n  tmpvar_17[1u].x = 0.8665558;\\n  tmpvar_17[1u].y = -0.4990803;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_16)\\n   * tmpvar_17)) * aspect.yx);\\n  xlat_mutableneu = (3.0 * texture (sampler_main, fract((\\n    (xlat_mutableuv2 + 0.5)\\n   + ofs_2)))).xyz;\\n  ret1_3 = max (ret1_3, (xlat_mutableneu * (1.0 - \\n    (tmpvar_16 * tmpvar_16)\\n  )));\\n  float tmpvar_18;\\n  tmpvar_18 = fract((tmpvar_14 + 0.6666667));\\n  mat2 tmpvar_19;\\n  tmpvar_19[uint(0)].x = -0.5018377;\\n  tmpvar_19[uint(0)].y = 0.8649619;\\n  tmpvar_19[1u].x = -0.8649619;\\n  tmpvar_19[1u].y = -0.5018377;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_18)\\n   * tmpvar_19)) * aspect.yx);\\n  xlat_mutableneu = (3.0 * texture (sampler_main, fract((\\n    (xlat_mutableuv2 + 0.5)\\n   + ofs_2)))).xyz;\\n  ret1_3 = max (ret1_3, (xlat_mutableneu * (1.0 - \\n    (tmpvar_18 * tmpvar_18)\\n  )));\\n  float tmpvar_20;\\n  tmpvar_20 = fract((tmpvar_14 + 1.0));\\n  mat2 tmpvar_21;\\n  tmpvar_21[uint(0)].x = 0.9999949;\\n  tmpvar_21[uint(0)].y = 0.003185092;\\n  tmpvar_21[1u].x = -0.003185092;\\n  tmpvar_21[1u].y = 0.9999949;\\n  xlat_mutableuv2 = ((uv_1 * (\\n    (q13 * tmpvar_20)\\n   * tmpvar_21)) * aspect.yx);\\n  xlat_mutableneu = (3.0 * texture (sampler_main, fract((\\n    (xlat_mutableuv2 + 0.5)\\n   + ofs_2)))).xyz;\\n  ret1_3 = max (ret1_3, (xlat_mutableneu * (1.0 - \\n    (tmpvar_20 * tmpvar_20)\\n  )));\\n  vec2 tmpvar_22;\\n  tmpvar_22.x = (ret1_3.x + ret1_3.z);\\n  tmpvar_22.y = (ret1_3.x - ret1_3.y);\\n  xlat_mutableret2 = (((\\n    (texture (sampler_blur1, fract((xlat_mutablerss + (tmpvar_22 / 2.0)))).xyz * scale1)\\n   + bias1) / tmpvar_10) * 12.0);\\n  vec4 tmpvar_23;\\n  tmpvar_23.w = 1.0;\\n  tmpvar_23.xyz = ((ret1_3 + (\\n    ((bass_att * 0.004) / sqrt(dot (uv_1, uv_1)))\\n   * roam_sin).xyz) + (sqrt(xlat_mutableret2.zxy) * clamp (\\n    (1.0 - (ret1_3 * 4.0))\\n  , 0.0, 1.0)));\\n  ret = tmpvar_23.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:2,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:7,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,darken:1,wave_a:.001,wave_scale:.958,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:0,wave_b:0,ob_size:0,ob_g:.1,ob_b:1,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:25.6,mv_y:9.6,mv_l:0,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.n=0;a.reg26=0;a.uvx0=0;a.reg34=0;a.reg28=0;a.reg23=0;a.q25=0;a.angchg=0;a.reg20=0;a.reg15=0;a.reg10=0;a.q12=0;a.v3=0;a.q22=0;a.q21=0;a.diry=0;a.q13=0;a.q6=0;a.posx=0;a.fps_=0;a.reg25=0;a.uvx=0;a.q1=0;a.travel=0;a.posz=0;a.q5=0;a.movz=0;a.dirz=0;a.dec_s=0;a.reg16=0;a.slow=0;a.reg36=0;a.reg22=0;a.uvy=0;a.rotz=0;a.dist_=0;a.q23=0;a.q24=0;a.reg24=0;a.cran0=0;a.vx=0;a.ran2=0;a.q11=0;a.q10=0;a.reg14=0;a.posy=0;a.vy=0;a.vz=0;a.reg31=0;a.dirx=0;a.dec_m=0;a.q4=0;a.start=0;a.reg12=\\n0;a.reg13=0;a.c2=0;a.reg37=0;a.s3=0;a.yslope=0;a.q16=0;a.xslope=0;a.q26=0;a.reg38=0;a.reg35=0;a.reg11=0;a.tx=0;a.avg=0;a.uvz=0;a.c3=0;a.uvy0=0;a.reg27=0;a.q19=0;a.beat=0;a.q17=0;a.vol=0;a.reg32=0;a.reg21=0;a.uvz0=0;a.len=0;a.reg18=0;a.reg30=0;a.q27=0;a.slen=0;a.q14=0;a.dist=0;a.reg17=0;a.v1=0;a.speed=0;a.s1=0;a.t0=0;a.s2=0;a.ran1=0;a.reg33=0;a.q7=0;a.ds=0;a.q28=0;a.ty=0;a.c1=0;a.v2=0;a.q20=0;a.q8=0;a.avg=.01;a.q7=.2;a.q8=div(randint(200),100)-1;a.q16=1.2;a.q18=randint(.8)+.1;a.q17=2.6;a.start=1;a.travel=\\n0;a.rotz=0;a.look=0;a.slow=0;a.t0=a.time+3;a.lampx=.5;a.lampy=.5;a.cran0=randint(1);for(var b=a.n=0;1E4>b;b++)a.gmegabuf[Math.floor(a.n)]=0,a.n+=1;for(b=a.n=0;1E4>b;b++)a.megabuf[Math.floor(a.n)]=0,a.n+=1;a.trelx=0;a.trely=0;a.trelz=0;a.reg20=1;a.reg21=0;a.reg22=0;a.reg23=0;a.reg24=1;a.reg25=0;a.reg26=0;a.reg27=0;a.reg28=1;b=0;do{b+=1;var c;a.ran1=div(randint(800),100);a.ran2=div(randint(800),100);a.ran3=div(randint(800),100);a.posx=randint(10)-5;a.posy=randint(10)-5;a.posz=randint(10)-5;a.c1=Math.cos(a.ran1);\\na.c2=Math.cos(a.ran2);a.c3=Math.cos(a.ran3);a.s1=Math.sin(a.ran1);a.s2=Math.sin(a.ran2);a.s3=Math.sin(a.ran3);a.reg20=a.c2*a.c1;a.reg21=a.c2*a.s1;a.reg22=-a.s2;a.reg23=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg24=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg25=a.s3*a.c2;a.reg26=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg27=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg28=a.c3*a.c2;a.dist=.001;var d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;a.uvx=8*(div(a.uvx,\\n8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=\\na.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)*a.q17+a.uvx0,a.uvy=(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)*a.q17+a.uvy0,a.uvz=(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)*a.q17+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.05;c=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<Math.abs(c)&&\\n1048576>d);d=.06>a.dist?1:0}while(.00001<Math.abs(d)&&1048576>b);\",frame_eqs_str:\"a.fps_=0*a.fps_+1*(.00001<Math.abs(25>=a.fps?1:0)?a.fps:25+.5*(a.fps-25));a.dec_s=1-div(.03*30,a.fps_);a.dec_m=1-div(3,a.fps_);a.beat=a.time>a.t0+3?1:0;a.t0=.00001<Math.abs(a.beat)?a.time:a.t0;a.speed=div(Math.min(.2,a.dist_-.02)*(1+2*a.avg)*(1-0*a.slow)*.1,a.q7);a.ds=a.ds*a.dec_s+div((1-a.dec_s)*a.speed*.4,a.fps_);a.rotz=.00001<Math.abs(2<a.travel?1:0)?.5:0;a.vol=a.vol*a.dec_m+div((1-a.dec_m)*(a.bass_att+a.mid_att+a.treb_att),4);a.q1=div(a.vol,2)+.3;a.dirx=a.reg26;a.diry=a.reg27;\\na.dirz=a.reg28;a.posx+=a.ds*a.dirx;a.posy+=a.ds*a.diry;a.posz+=a.ds*a.dirz;a.q4=a.posx;a.q5=a.posy;a.q6=a.posz;a.angchg=(.1-a.dist_)*(.1>a.dist_?1:0);a.travel=.00001<Math.abs(0<a.angchg?1:0)?0:a.travel+a.ds;a.v1=a.v1*a.dec_s+div((1-a.dec_s)*a.rotz*a.ds,2);a.v2=a.v2*a.dec_s+div((1-a.dec_s)*a.angchg*a.xslope,a.fps_);a.v3=a.v3*a.dec_s+(1-a.dec_s)*(div(a.angchg*a.yslope,a.fps_)+2*a.v1*Math.sin(.1*a.time));a.reg30=a.reg20;a.reg31=a.reg21;a.reg32=a.reg22;a.reg33=a.reg23;a.reg34=a.reg24;a.reg35=a.reg25;\\na.reg36=a.reg26;a.reg37=a.reg27;a.reg38=a.reg28;a.n=0;for(var b=a.avg=0;5>b;b++){a.n+=1;a.ran1=div(randint(100),100);a.ran2=div(randint(100),200)-.25;a.tx=Math.cos(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.ty=Math.sin(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.c1=Math.cos(a.v1);a.c2=Math.cos(a.v2+a.ty);a.c3=Math.cos(a.v3+a.tx);a.s1=Math.sin(a.v1);a.s2=Math.sin(a.v2+a.ty);a.s3=Math.sin(a.v3+a.tx);a.reg10=a.c2*a.c1;a.reg11=a.c2*a.s1;a.reg12=-a.s2;a.reg13=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg14=a.s3*a.s2*a.s1+a.c3*\\na.c1;a.reg15=a.s3*a.c2;a.reg16=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg17=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg18=a.c3*a.c2;a.reg20=a.reg30;a.reg21=a.reg31;a.reg22=a.reg32;a.reg23=a.reg33;a.reg24=a.reg34;a.reg25=a.reg35;a.reg26=a.reg36;a.reg27=a.reg37;a.reg28=a.reg38;a.q20=a.reg10*a.reg20+a.reg11*a.reg23+a.reg12*a.reg26;a.q21=a.reg10*a.reg21+a.reg11*a.reg24+a.reg12*a.reg27;a.q22=a.reg10*a.reg22+a.reg11*a.reg25+a.reg12*a.reg28;a.q23=a.reg13*a.reg20+a.reg14*a.reg23+a.reg15*a.reg26;a.q24=a.reg13*a.reg21+a.reg14*a.reg24+\\na.reg15*a.reg27;a.q25=a.reg13*a.reg22+a.reg14*a.reg25+a.reg15*a.reg28;a.q26=a.reg16*a.reg20+a.reg17*a.reg23+a.reg18*a.reg26;a.q27=a.reg16*a.reg21+a.reg17*a.reg24+a.reg18*a.reg27;a.q28=a.reg16*a.reg22+a.reg17*a.reg25+a.reg18*a.reg28;a.reg20=a.q20;a.reg21=a.q21;a.reg22=a.q22;a.reg23=a.q23;a.reg24=a.q24;a.reg25=a.q25;a.reg26=a.q26;a.reg27=a.q27;a.reg28=a.q28;a.dist=.002;var c,d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=\\na.posy;a.uvz+=a.posz;a.uvx=8*(div(a.uvx,8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>\\na.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)*a.q17+a.uvx0,a.uvy=(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)*a.q17+a.uvy0,a.uvz=(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)*a.q17+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.1;c=(.6>a.dist?1:0)*(30<a.len?\\n1:0)}while(.00001<Math.abs(c)&&1048576>d);a.megabuf[Math.floor(a.n)]=a.megabuf[Math.floor(a.n)]*a.dec_s+(1-a.dec_s)*a.dist;a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5))}a.n=0;for(b=a.avg=0;5>b;b++)a.n+=1,a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5));a.xslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[1]-a.megabuf[3]),-3),3);a.yslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[4]-a.megabuf[2]),-3),3);a.monitor=a.avg;a.dist_=a.dist_*a.dec_s+(1-a.dec_s)*a.dist;a.q10=a.ds*a.q7;a.q14=Math.abs(a.ds)+\\n2*(Math.abs(a.v1)+Math.abs(a.v2)+Math.abs(a.v3))+.05*a.start;a.q19=.6+.4*Math.sin(.02*a.time+6*a.cran0);a.start*=.9;a.warp=0;a.zoom=1;a.dx=div(-a.v2,a.q16);a.dy=div(a.v3,a.q16);a.rot=a.v1;a.vx-=div(a.v2,a.q16);a.vy+=div(a.v3,a.q16);a.vz+=a.v1;a.q11=a.vx;a.q12=a.vy;a.movz+=a.ds;a.q13=a.movz;a.monitor=a.q13;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\"float sustain;\\nfloat ffac;\\nfloat xlat_mutabledist;\\nfloat xlat_mutablelimit;\\nfloat xlat_mutablestruc;\\nvec2 xlat_mutableuv1;\\nvec3 xlat_mutableuv2;\\n shader_body { \\n  mat3 tmpvar_1;\\n  tmpvar_1[uint(0)].x = q20;\\n  tmpvar_1[uint(0)].y = q23;\\n  tmpvar_1[uint(0)].z = q26;\\n  tmpvar_1[1u].x = q21;\\n  tmpvar_1[1u].y = q24;\\n  tmpvar_1[1u].z = q27;\\n  tmpvar_1[2u].x = q22;\\n  tmpvar_1[2u].y = q25;\\n  tmpvar_1[2u].z = q28;\\n  vec3 tmpvar_2;\\n  tmpvar_2.x = q4;\\n  tmpvar_2.y = q5;\\n  tmpvar_2.z = q6;\\n  sustain = (0.98 - q14);\\n  ffac = q17;\\n  vec2 uv_3;\\n  uv_3 = (((uv - 0.5) * (1.0 - \\n    (q10 / (1.0 - ((texture (sampler_blur1, uv).xyz * scale1) + bias1).z))\\n  )) + 0.5);\\n  xlat_mutableuv1 = (((uv_orig - 0.5) * aspect.xy) * q16);\\n  vec4 tmpvar_4;\\n  tmpvar_4 = fract((8.0 * texture (sampler_noise_lq, (uv_3 + rand_frame.yz))));\\n  vec3 tmpvar_5;\\n  tmpvar_5 = tmpvar_4.xyz;\\n  if ((tmpvar_4.y > (0.4 * rad))) {\\n    vec3 tmpvar_6;\\n    tmpvar_6 = (tmpvar_4.xyz - vec3(0.5, 0.5, 0.5));\\n    vec4 nb2_7;\\n    vec4 nb_8;\\n    vec2 tmpvar_9;\\n    tmpvar_9 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 - texsize.zw)).yz)\\n     + vec2(0.5, 0.5))));\\n    nb_8.x = (1.0 - (tmpvar_9.y + (0.015625 * \\n      (tmpvar_9.x - 0.5)\\n    )));\\n    vec2 tmpvar_10;\\n    tmpvar_10 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 + (texsize.zw * vec2(1.0, -1.0)))).yz)\\n     + vec2(0.5, 0.5))));\\n    nb_8.y = (1.0 - (tmpvar_10.y + (0.015625 * \\n      (tmpvar_10.x - 0.5)\\n    )));\\n    vec2 tmpvar_11;\\n    tmpvar_11 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 + texsize.zw)).yz)\\n     + vec2(0.5, 0.5))));\\n    nb_8.z = (1.0 - (tmpvar_11.y + (0.015625 * \\n      (tmpvar_11.x - 0.5)\\n    )));\\n    vec2 tmpvar_12;\\n    tmpvar_12 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 + (texsize.zw * vec2(-1.0, 1.0)))).yz)\\n     + vec2(0.5, 0.5))));\\n    nb_8.w = (1.0 - (tmpvar_12.y + (0.015625 * \\n      (tmpvar_12.x - 0.5)\\n    )));\\n    vec2 tmpvar_13;\\n    tmpvar_13 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 + (texsize.zw * vec2(0.0, -1.0)))).yz)\\n     + vec2(0.5, 0.5))));\\n    nb2_7.x = (1.0 - (tmpvar_13.y + (0.015625 * \\n      (tmpvar_13.x - 0.5)\\n    )));\\n    vec2 tmpvar_14;\\n    tmpvar_14 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 + (texsize.zw * vec2(1.0, 0.0)))).yz)\\n     + vec2(0.5, 0.5))));\\n    nb2_7.y = (1.0 - (tmpvar_14.y + (0.015625 * \\n      (tmpvar_14.x - 0.5)\\n    )));\\n    vec2 tmpvar_15;\\n    tmpvar_15 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 + (texsize.zw * vec2(0.0, 1.0)))).yz)\\n     + vec2(0.5, 0.5))));\\n    nb2_7.z = (1.0 - (tmpvar_15.y + (0.015625 * \\n      (tmpvar_15.x - 0.5)\\n    )));\\n    vec2 tmpvar_16;\\n    tmpvar_16 = (0.0078125 * floor((\\n      (128.0 * texture (sampler_pc_main, (uv_3 + (texsize.zw * vec2(-1.0, 0.0)))).yz)\\n     + vec2(0.5, 0.5))));\\n    nb2_7.w = (1.0 - (tmpvar_16.y + (0.015625 * \\n      (tmpvar_16.x - 0.5)\\n    )));\\n    vec4 tmpvar_17;\\n    tmpvar_17 = min (nb_8, nb2_7);\\n    nb_8.zw = tmpvar_17.zw;\\n    nb_8.xy = min (tmpvar_17.xy, tmpvar_17.zw);\\n    xlat_mutabledist = (min (nb_8.x, nb_8.y) + ((0.006 * tmpvar_6.x) * abs(tmpvar_6.y)));\\n  } else {\\n    xlat_mutabledist = tmpvar_5.x;\\n  };\\n  vec2 tmpvar_18;\\n  tmpvar_18 = (0.0078125 * floor((\\n    (128.0 * texture (sampler_pc_main, uv_3).yz)\\n   + vec2(0.5, 0.5))));\\n  xlat_mutabledist = (min (xlat_mutabledist, (1.0 - \\n    (tmpvar_18.y + (0.015625 * (tmpvar_18.x - 0.5)))\\n  )) - (q10 * 0.8));\\n  xlat_mutablelimit = (15.0 + (10.0 * xlat_mutabledist));\\n  vec3 tmpvar_19;\\n  tmpvar_19.xy = (xlat_mutableuv1 * xlat_mutabledist);\\n  tmpvar_19.z = xlat_mutabledist;\\n  xlat_mutableuv2 = (((tmpvar_19 / q7) * tmpvar_1) + tmpvar_2);\\n  xlat_mutableuv2 = ((fract(\\n    ((xlat_mutableuv2 / 8.0) + 0.5)\\n  ) - 0.5) * 8.0);\\n  int iterations_21;\\n  vec3 zz0_22;\\n  vec3 zz_23;\\n  zz_23 = xlat_mutableuv2;\\n  zz0_22 = (xlat_mutableuv2 + q8);\\n  iterations_21 = int((8.0 - float(\\n    (xlat_mutabledist > 0.8)\\n  )));\\n  for (int n_20 = 0; n_20 <= iterations_21; n_20++) {\\n    zz_23 = ((2.0 * clamp (zz_23, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_23);\\n    zz_23 = (zz_23 * (clamp (\\n      max ((0.25 / dot (zz_23, zz_23)), 0.25)\\n    , 0.0, 1.0) * 4.0));\\n    zz_23 = ((ffac * zz_23) + zz0_22);\\n  };\\n  xlat_mutablestruc = (sqrt(dot (zz_23.xz, zz_23.xz)) / xlat_mutablelimit);\\n  vec2 tmpvar_24;\\n  tmpvar_24 = (0.0078125 * floor((\\n    (128.0 * vec2((1.0 - xlat_mutabledist)))\\n   + vec2(0.5, 0.5))));\\n  vec2 tmpvar_25;\\n  tmpvar_25.x = ((64.0 * (\\n    (1.0 - xlat_mutabledist)\\n   - tmpvar_24.x)) + 0.5);\\n  tmpvar_25.y = tmpvar_24.x;\\n  vec3 tmpvar_26;\\n  float tmpvar_27;\\n  tmpvar_27 = (q14 * 2.0);\\n  tmpvar_26.x = (((1.0 - sustain) * xlat_mutablestruc) + (sustain * mix (texture (sampler_main, uv_3).xyz, \\n    ((texture (sampler_blur1, uv_3).xyz * scale1) + bias1)\\n  , vec3(tmpvar_27)).x));\\n  tmpvar_26.yz = tmpvar_25;\\n  vec3 tmpvar_28;\\n  tmpvar_28.y = 1.0;\\n  tmpvar_28.x = sustain;\\n  tmpvar_28.z = 1.0;\\n  vec3 tmpvar_29;\\n  tmpvar_29.y = 0.0;\\n  tmpvar_29.x = 0.003921569;\\n  tmpvar_29.z = (0.01568628 * (0.2 + rad));\\n  vec4 tmpvar_30;\\n  tmpvar_30.w = 1.0;\\n  tmpvar_30.xyz = mix (tmpvar_26, ((\\n    mix (texture (sampler_main, uv_3).xyz, ((texture (sampler_blur1, uv_3).xyz * scale1) + bias1), vec3(tmpvar_27))\\n   * tmpvar_28) - tmpvar_29), vec3(clamp ((\\n    sqrt(dot (zz_23, zz_23))\\n   - xlat_mutablelimit), 0.0, 1.0)));\\n  ret = tmpvar_30.xyz;\\n }\",comp:\"float xlat_mutableinten;\\nfloat xlat_mutabletmp;\\nvec2 xlat_mutableuv1;\\nvec2 xlat_mutableuv2;\\nfloat xlat_mutablez;\\n shader_body { \\n  float t_rel_2;\\n  vec3 ret1_3;\\n  float struc_4;\\n  xlat_mutableuv1 = ((uv * aspect.xy) - vec2(0.5, 0.5));\\n  vec4 tmpvar_5;\\n  tmpvar_5 = texture (sampler_main, uv);\\n  float tmpvar_6;\\n  vec4 tmpvar_7;\\n  tmpvar_7 = texture (sampler_blur1, uv);\\n  tmpvar_6 = mix (min ((1.0 - tmpvar_5.z), (1.0 - \\n    ((texture (sampler_blur2, uv).xyz * scale2) + bias2)\\n  .z)), (1.0 - (\\n    (tmpvar_7.xyz * scale1)\\n   + bias1).z), 0.5);\\n  struc_4 = ((mix (tmpvar_5.xyz, \\n    ((tmpvar_7.xyz * scale1) + bias1)\\n  , vec3(tmpvar_6)).x * (1.0 - tmpvar_6)) * tmpvar_6);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = q11;\\n  tmpvar_8.y = q12;\\n  xlat_mutableuv2 = ((xlat_mutableuv1 * 0.2) - (tmpvar_8 * 0.2));\\n  vec2 uvi_9;\\n  uvi_9 = (xlat_mutableuv2 * 4.0);\\n  float zv_10;\\n  zv_10 = (0.008 * time);\\n  xlat_mutabletmp = clamp (dot ((texture (sampler_noise_hq, \\n    (xlat_mutableuv2 + (0.03 * ((\\n      (dot (texture (sampler_noise_hq, uvi_9), vec4(0.32, 0.49, 0.29, 0.0)) + (dot (texture (sampler_noise_hq, (\\n        (uvi_9 * 2.0)\\n       + zv_10)), vec4(0.32, 0.49, 0.29, 0.0)) / 2.0))\\n     + \\n      (dot (texture (sampler_noise_hq, ((uvi_9 * 4.0) + (2.0 * zv_10))), vec4(0.32, 0.49, 0.29, 0.0)) / 4.0)\\n    ) + (\\n      dot (texture (sampler_noise_hq, ((uvi_9 * 8.0) + (4.0 * zv_10))), vec4(0.32, 0.49, 0.29, 0.0))\\n     / 8.0))))\\n  ) - 0.4), vec4(0.32, 0.49, 0.29, 0.0)), 0.0, 1.0);\\n  float tmpvar_11;\\n  tmpvar_11 = clamp ((pow (xlat_mutabletmp, 1.2) * sign(xlat_mutabletmp)), 0.0, 1.0);\\n  xlat_mutabletmp = tmpvar_11;\\n  vec3 tmpvar_12;\\n  tmpvar_12.xy = vec2(0.1, 0.1);\\n  tmpvar_12.z = (1.2 - uv.y);\\n  ret1_3 = ((tmpvar_12 + 0.07) + ((\\n    clamp (((tmpvar_6 * 2.0) - 1.5), 0.0, 1.0)\\n   * tmpvar_11) * 4.0));\\n  t_rel_2 = (q13 * 6.0);\\n  for (int n_1 = 1; n_1 <= 3; n_1++) {\\n    xlat_mutablez = (1.0 - fract((\\n      (float(n_1) / 3.0)\\n     - \\n      (fract(-(t_rel_2)) / 3.0)\\n    )));\\n    xlat_mutableinten = (((1.0 - xlat_mutablez) * xlat_mutablez) * 2.0);\\n    vec2 tmpvar_13;\\n    tmpvar_13.x = q11;\\n    tmpvar_13.y = q12;\\n    xlat_mutableuv2 = (((xlat_mutablez * xlat_mutableuv1) / 4.0) - (tmpvar_13 / 6.0));\\n    vec2 uvi_14;\\n    uvi_14 = (xlat_mutableuv2 * 4.0);\\n    float zv_15;\\n    zv_15 = (0.008 * time);\\n    xlat_mutabletmp = clamp (dot ((\\n      (texture (sampler_noise_hq, (xlat_mutableuv2 + (0.03 * (\\n        ((dot (texture (sampler_noise_hq, uvi_14), vec4(0.32, 0.49, 0.29, 0.0)) + (dot (texture (sampler_noise_hq, \\n          ((uvi_14 * 2.0) + zv_15)\\n        ), vec4(0.32, 0.49, 0.29, 0.0)) / 2.0)) + (dot (texture (sampler_noise_hq, (\\n          (uvi_14 * 4.0)\\n         + \\n          (2.0 * zv_15)\\n        )), vec4(0.32, 0.49, 0.29, 0.0)) / 4.0))\\n       + \\n        (dot (texture (sampler_noise_hq, ((uvi_14 * 8.0) + (4.0 * zv_15))), vec4(0.32, 0.49, 0.29, 0.0)) / 8.0)\\n      )))) - (xlat_mutablez * 0.5))\\n     - 0.3), vec4(0.32, 0.49, 0.29, 0.0)), 0.0, 1.0);\\n    xlat_mutabletmp = (((\\n      clamp ((xlat_mutabletmp * sign(xlat_mutabletmp)), 0.0, 1.0)\\n     * xlat_mutableinten) * q1) * 2.0);\\n    ret1_3 = (((ret1_3 + \\n      ((vec3(4.0, 3.0, 0.8) * q1) * struc_4)\\n    ) * clamp (\\n      (1.0 - xlat_mutabletmp)\\n    , 0.0, 1.0)) + xlat_mutabletmp);\\n  };\\n  vec4 tmpvar_16;\\n  tmpvar_16.w = 1.0;\\n  tmpvar_16.xyz = (1.0 - exp((-1.6 * ret1_3)));\\n  ret = tmpvar_16.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,additivewave:1,wave_dots:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.527,wave_smoothing:0,wave_mystery:.6,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_g:.49,ob_a:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b2x:.6,b3x:.4,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:5,additive:1,num_inst:256,x:.26,y:.2,rad:.39317,tex_zoom:.9355,g2:0,a2:.2,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.n=0;a.w=0;a.high=0;a.q12=0;a.arg=0;a.q13=0;a.y0=0;a.flen=0;a.x0=0;a.k1=0;a.q11=0;a.z0=0;a.exc=0;a.p2=0;a.p1=0;a.a0=0;a.q2=0;a.slen=0;a.q14=0;a.q3=0;a.q32=0;a.rad0=0;\",frame_eqs_str:\"a.n=a.instance;a.flen=a.reg00;a.slen=div(a.reg00,2);a.z0=10;a.y0=div(a.gmegabuf[Math.floor(2E3+a.n+a.flen)],a.z0);a.x0=div(a.gmegabuf[Math.floor(2E3+a.n)],a.z0);a.a0=a.gmegabuf[Math.floor(a.n+1E4)];a.k1=div(a.instance,a.num_inst)-.5;a.x=.5+a.x0+Math.sin(8*a.k1*Math.sin(.07*a.q12))*Math.sin(.13*a.q11)*a.q3*.7;a.y=.5+a.q32*(a.y0+Math.sin(8*a.k1*Math.sin(.1*a.q14))*Math.sin(.2*a.q13)*a.q3*.7);a.arg=div(a.q2,8);a.high=Math.exp(-500*pow(a.arg+.5-div(a.instance,a.num_inst),2));a.high+=\\nMath.exp(-500*pow(-a.arg+.5-div(a.instance,a.num_inst),2));a.exc=sqrt(pow(a.x-.5,2)+pow(a.y-.5,2));a.rad0=above(a.z0,0)*Math.min(.1,div(a.a0,60))+.005;a.rad0=a.rad0*(1+2*a.exc)*(1+a.high);a.p1=.5+div(Math.sin(a.q12),2);a.p2=.5+div(Math.sin(1.4*a.q13),2);a.exc=pow(a.x-a.p1,2)+pow(a.y-a.p2,2);a.rad=Math.min(a.rad0*(1+div(.004*a.q3,Math.abs(a.exc))),1);a.a=Math.min(8*a.a0+.4,1);a.k1=5*div(a.instance,a.num_inst)+a.high;a.w=1-Math.exp(div(-a.treb_att,2)-.5);a.g=a.w+(1-a.w)*Math.sin(a.k1);a.r=a.w+(1-a.w)*\\nMath.sin(a.k1-div(6.28,3));a.b=a.w+(1-a.w)*Math.sin(a.k1-div(12.56,3));a.a2=div(a.a,4);a.g2=0*a.g;a.b2=0*a.b;a.r2=0*a.r;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,sep:120,spectrum:1,additive:1,scaling:7.52386,smoothing:0,r:0,a:.7},init_eqs_str:\"a.flen=0;a.n=0;a.vol=0;a.chg=0;a.dec=0;a.q1=0;a.q2=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.flen=a.reg00;a.n=Math.floor(a.sample*a.flen);a.vol=(a.value1+a.value2)*(1+div(.1,a.sample+.03));a.chg=Math.min(Math.max(a.vol-a.gmegabuf[Math.floor(a.n)],-1),1);a.dec=.00001<Math.abs(0<a.chg?1:0)?1-.3*a.chg:1+.2*a.chg;a.chg=a.q1-a.q2;a.dec=.94-Math.abs(a.chg)*(.00001<Math.abs(0<a.chg?1:0)?.2:.1);a.dec=Math.min(Math.max(a.dec,0),1);a.gmegabuf[Math.floor(a.n)]=a.gmegabuf[Math.floor(a.n)]*a.dec+a.vol*(1-a.dec);a.dec=div(a.q2,4);a.dec=Math.max(Math.min(a.dec,1),.1);a.gmegabuf[Math.floor(a.n)]=\\na.gmegabuf[Math.floor(a.n)]*a.dec+a.gmegabuf[Math.floor(a.n+(.8>a.q2?1:0))]*(1-a.dec);a.gmegabuf[Math.floor(a.n+1E4)]=.2*a.gmegabuf[Math.floor(a.n+1E4)]+div(.8*a.vol,3);a.a=0;a.x=a.sample;a.y=.2+.23*a.gmegabuf[Math.floor(a.n+0)];\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.n=0;a.sw2=0;a.in1=0;a.q12=0;a.q13=0;a.sw3=0;a.dif=0;a.q1=0;a.lev3=0;a.flen=0;a.lev4=0;a.in2=0;a.lev1=0;a.k1=0;a.q11=0;a.ofs=0;a.dec_m=0;a.i=0;a.k=0;a.m2=0;a.vol=0;a.q2=0;a.slen=0;a.m1=0;a.q14=0;a.sw1=0;a.lev2=0;a.q3=0;a.reg00=0;a.vol_=0;a.dec=0;a.q32=0;a.sw4=0;for(var b=a.n=0;5E4>b;b++)a.gmegabuf[Math.floor(a.n)]=0,a.megabuf[Math.floor(a.n)]=0,a.n+=1;a.sw1=randint(8);a.sw2=randint(8);a.sw3=randint(8);a.sw4=randint(8);\",frame_eqs_str:\"a.flen=512;a.reg00=a.flen;a.slen=div(a.flen,2);a.dec_m=pow(.94,div(30,a.fps));a.n=0;for(var b=a.vol=0;b<a.slen;b++)a.vol+=div(pow(a.gmegabuf[Math.floor(a.n)],2),a.flen),a.n+=1;a.vol=div(sqrt(a.vol),2);a.vol_=a.vol_*a.dec_m+(1-a.dec_m)*a.vol;a.lev1=a.lev1*a.dec_m+(1-a.dec_m)*a.gmegabuf[1];a.lev2=a.lev2*a.dec_m+(1-a.dec_m)*a.gmegabuf[20];a.lev3=a.lev3*a.dec_m+(1-a.dec_m)*a.gmegabuf[50];a.lev4=a.lev4*a.dec_m+(1-a.dec_m)*a.gmegabuf[100];a.sw1+=div(0<a.lev1-a.gmegabuf[1]?1:0,a.fps);\\na.sw2+=div(0<a.lev2-a.gmegabuf[20]?1:0,a.fps);a.sw3+=div(0<a.lev3-a.gmegabuf[50]?1:0,a.fps);a.sw4+=div(0<a.lev4-a.gmegabuf[100]?1:0,a.fps);a.dif=16*(1+Math.sin(div(a.sw3,4)))+2;a.ofs=8*Math.sin(div(a.sw2,3));a.n=0;a.k1=0*a.frame;for(b=0;b<a.slen;b++)a.m1=mod(a.n,a.slen),a.m2=mod(a.n+a.ofs,a.slen),a.k=mod(a.m1+a.dif,a.slen),a.i=mod(a.slen+a.m2-a.dif,a.slen),a.in1=1.2*div(a.gmegabuf[Math.floor(a.m1)]-a.gmegabuf[Math.floor(a.k)],pow(a.vol_+.03,.8)),a.in2=1.2*div(a.gmegabuf[Math.floor(a.m2)]-a.gmegabuf[Math.floor(a.i)],\\npow(a.vol_+.03,.8)),a.dec=.00001<Math.abs(pow(a.gmegabuf[Math.floor(2E3+a.n)],2)+pow(a.gmegabuf[Math.floor(2E3+a.flen+a.n)],2)>a.in1*a.in1+a.in2*a.in2?1:0)?.8:.94,a.dec=pow(a.dec,div(30,a.fps)),a.gmegabuf[Math.floor(2E3+a.n)]=a.gmegabuf[Math.floor(2E3+a.n)]*a.dec+(1-a.dec)*a.in1,a.gmegabuf[Math.floor(2E3+a.flen+a.n)]=a.gmegabuf[Math.floor(2E3+a.flen+a.n)]*a.dec+(1-a.dec)*a.in2,a.n+=1;a.q1=div(a.bass+a.treb+a.mid,3);a.q2=div(a.bass_att+a.treb_att+a.mid_att,3);a.q3=a.vol_;a.q11=a.sw1;a.q12=a.sw2;a.q13=\\na.sw3;a.q14=a.sw4;a.rot=0;a.zoom=.98;a.warp=.3;a.rot=0;a.q32=a.aspecty;a.monitor=a.dif;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = ((texture (sampler_main, uv).xyz * clamp (\\n    (q1 - 0.8)\\n  , 0.0, 1.0)) * 0.92);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = (texture (sampler_main, uv).xyz + ((texture (sampler_blur2, uv).xyz * scale2) + bias2));\\n  ret_1 = (ret_1 + ((0.8 * \\n    (hue_shader - 0.8)\\n  ) * (1.0 - uv.y)));\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ret_1;\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:4,additivewave:1,wave_dots:1,modwavealphabyvolume:1,darken:1,wave_a:.33064,wave_scale:.897961,wave_smoothing:.108,wave_mystery:.1,modwavealphastart:.72,modwavealphaend:1.28,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:.5,wave_b:.5,wave_y:.54,ob_r:1,ob_g:1,ob_b:1,ib_size:.26,mv_x:24.799994,mv_dy:.16,mv_l:1.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:352,usedots:1,additive:1,scaling:.038558,smoothing:.2,g:0},init_eqs_str:\"a.t02=0;a.q1=0;a.ratio=0;a.ampl=0;a.x1=0;a.y1=0;\",frame_eqs_str:\"a.q1=a.bass_att;\",point_eqs_str:\"a.r=Math.abs(Math.sin(div(a.frame,38)));a.g=.5*Math.abs(Math.cos(div(a.frame,45)));a.b=.5*Math.abs(Math.sin(div(a.frame,133)));a.a=.3;a.t02+=div(a.q1,10);a.ratio=Math.sin(div(a.frame,49));a.ampl=.01+.4*sqr(Math.sin(div(a.frame,18))*Math.cos(div(a.frame,123)));a.x1=div(a.r-.5,15)+.5+a.ampl*Math.sin(6.28*a.sample);a.y1=div(a.b-.5,15)+.5+a.ampl*Math.cos(6.28*a.sample);a.x=a.x1+.2*(a.ampl+a.ratio)*Math.sin(6.28*a.sample*a.ratio*7.3);a.y=a.y1+.2*(a.ampl+a.ratio)*Math.cos(37.68*a.sample);\\n\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.q25=0;a.index=0;a.q18=0;a.q22=0;a.q21=0;a.q29=0;a.q6=0;a.movex=0;a.q1=0;a.dec_med=0;a.q5=0;a.index3=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.mov=0;a.avg=0;a.beat=0;a.p1=0;a.dx1=0;a.peak=0;a.q2=0;a.q27=0;a.clear=0;a.p3=0;a.q3=0;a.t0=0;a.rot1=0;a.q32=0;a.q28=0;a.q20=0;a.clear=.5;\",frame_eqs_str:\"a.dec_med=pow(.96,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,4);a.index2=mod(a.index2+a.is_beat*bnot(a.index),8);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),3);a.q20=a.avg;a.q21=\\na.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass+a.mid+a.treb;a.k1=a.is_beat*equal(a.index,0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.p3=a.dec_med*a.p3+(1-a.dec_med)*a.p2;a.rott=div(3.1416*a.p3,4);a.rot1+=a.q26;a.q25=.01*a.rot1;a.q27=8-a.index;a.q28=a.index3;a.dx1=a.dec_med*a.dx1+(1-a.dec_med)*bnot(a.index2);a.q29=a.dx1;a.monitor=a.q29;a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.q5=1.5*Math.cos(div(a.time,9));a.q6=.5*Math.sin(div(a.time,\\n7));a.clear=a.clear*a.dec_med+1-a.dec_med;a.q32=a.clear;a.mov=bnot(a.q24)*a.movex+(div(randint(100),100)-50)*a.q2;a.movex+=div(.2,a.fps)*a.q2;a.q18=a.movex;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 uv6_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_3;\\n  tmpvar_3 = (rand_frame * 64.0).x;\\n  uv6_1 = (0.5 * cos((\\n    ((tmpvar_2 * mat2(0.7, -0.7, 0.7, 0.7)) * 17.0)\\n   + \\n    (rand_frame * 6.0)\\n  .xy)));\\n  float x_4;\\n  x_4 = (uv6_1.x + uv6_1.y);\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = ((0.147 * (\\n    (texture (sampler_main, (uv + clamp ((\\n      (sin(tmpvar_3) / cos(tmpvar_3))\\n     * \\n      normalize(tmpvar_2)\\n    ), vec2(-8.0, -8.0), vec2(8.0, 8.0)))).xyz + (0.15 * (vec3((0.01 / \\n      sqrt((x_4 * x_4))\\n    )) * roam_cos.xyz)))\\n   - 0.02)) + ((0.85 * \\n    (texture (sampler_main, uv_orig).xyz - 0.002)\\n  ) * q32));\\n  ret = tmpvar_5.xyz;\\n }\",comp:\"vec2 xlat_mutabledz;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutableuv3;\\nvec2 xlat_mutableuv4;\\n shader_body { \\n  vec2 uv_1;\\n  float inten_2;\\n  float dist_3;\\n  vec3 ret_4;\\n  uv_1 = (uv - 0.5);\\n  float tmpvar_5;\\n  tmpvar_5 = (time / 2.0);\\n  dist_3 = (1.0 - fract(tmpvar_5));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 2.0);\\n  vec2 tmpvar_6;\\n  tmpvar_6.y = 0.4;\\n  tmpvar_6.x = q18;\\n  xlat_mutableuv3 = (((2.0 * uv_1) * dist_3) + tmpvar_6);\\n  vec2 tmpvar_7;\\n  tmpvar_7.y = 0.0;\\n  tmpvar_7.x = texsize.z;\\n  vec2 tmpvar_8;\\n  tmpvar_8.y = 0.0;\\n  tmpvar_8.x = texsize.z;\\n  xlat_mutabledz.x = (inten_2 * dot ((texture (sampler_main, \\n    (xlat_mutableuv3 + tmpvar_7)\\n  ).xyz - texture (sampler_main, \\n    (xlat_mutableuv3 - tmpvar_8)\\n  ).xyz), vec3(0.32, 0.49, 0.29)));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = 0.0;\\n  tmpvar_9.y = texsize.w;\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = 0.0;\\n  tmpvar_10.y = texsize.w;\\n  xlat_mutabledz.y = (inten_2 * dot ((texture (sampler_main, \\n    (xlat_mutableuv3 + tmpvar_9)\\n  ).xyz - texture (sampler_main, \\n    (xlat_mutableuv3 - tmpvar_10)\\n  ).xyz), vec3(0.32, 0.49, 0.29)));\\n  xlat_mutableret1 = max (vec3(0.0, 0.0, 0.0), (texture (sampler_main, xlat_mutableuv3).xyz * inten_2));\\n  dist_3 = (1.0 - fract((0.3333333 + tmpvar_5)));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 2.0);\\n  vec2 tmpvar_11;\\n  tmpvar_11.y = 0.4;\\n  tmpvar_11.x = q18;\\n  xlat_mutableuv3 = (((2.0 * uv_1) * dist_3) + tmpvar_11);\\n  vec2 tmpvar_12;\\n  tmpvar_12.y = 0.0;\\n  tmpvar_12.x = texsize.z;\\n  vec2 tmpvar_13;\\n  tmpvar_13.y = 0.0;\\n  tmpvar_13.x = texsize.z;\\n  xlat_mutabledz.x = (xlat_mutabledz.x + (inten_2 * dot (\\n    (texture (sampler_main, (xlat_mutableuv3 + tmpvar_12)).xyz - texture (sampler_main, (xlat_mutableuv3 - tmpvar_13)).xyz)\\n  , vec3(0.32, 0.49, 0.29))));\\n  vec2 tmpvar_14;\\n  tmpvar_14.x = 0.0;\\n  tmpvar_14.y = texsize.w;\\n  vec2 tmpvar_15;\\n  tmpvar_15.x = 0.0;\\n  tmpvar_15.y = texsize.w;\\n  xlat_mutabledz.y = (xlat_mutabledz.y + (inten_2 * dot (\\n    (texture (sampler_main, (xlat_mutableuv3 + tmpvar_14)).xyz - texture (sampler_main, (xlat_mutableuv3 - tmpvar_15)).xyz)\\n  , vec3(0.32, 0.49, 0.29))));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, xlat_mutableuv3).xyz * inten_2));\\n  dist_3 = (1.0 - fract((0.6666667 + tmpvar_5)));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 2.0);\\n  vec2 tmpvar_16;\\n  tmpvar_16.y = 0.4;\\n  tmpvar_16.x = q18;\\n  xlat_mutableuv3 = (((2.0 * uv_1) * dist_3) + tmpvar_16);\\n  vec2 tmpvar_17;\\n  tmpvar_17.y = 0.0;\\n  tmpvar_17.x = texsize.z;\\n  vec2 tmpvar_18;\\n  tmpvar_18.y = 0.0;\\n  tmpvar_18.x = texsize.z;\\n  xlat_mutabledz.x = (xlat_mutabledz.x + (inten_2 * dot (\\n    (texture (sampler_main, (xlat_mutableuv3 + tmpvar_17)).xyz - texture (sampler_main, (xlat_mutableuv3 - tmpvar_18)).xyz)\\n  , vec3(0.32, 0.49, 0.29))));\\n  vec2 tmpvar_19;\\n  tmpvar_19.x = 0.0;\\n  tmpvar_19.y = texsize.w;\\n  vec2 tmpvar_20;\\n  tmpvar_20.x = 0.0;\\n  tmpvar_20.y = texsize.w;\\n  xlat_mutabledz.y = (xlat_mutabledz.y + (inten_2 * dot (\\n    (texture (sampler_main, (xlat_mutableuv3 + tmpvar_19)).xyz - texture (sampler_main, (xlat_mutableuv3 - tmpvar_20)).xyz)\\n  , vec3(0.32, 0.49, 0.29))));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, xlat_mutableuv3).xyz * inten_2));\\n  dist_3 = (1.0 - fract((1.0 + tmpvar_5)));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 2.0);\\n  vec2 tmpvar_21;\\n  tmpvar_21.y = 0.4;\\n  tmpvar_21.x = q18;\\n  xlat_mutableuv3 = (((2.0 * uv_1) * dist_3) + tmpvar_21);\\n  vec2 tmpvar_22;\\n  tmpvar_22.y = 0.0;\\n  tmpvar_22.x = texsize.z;\\n  vec2 tmpvar_23;\\n  tmpvar_23.y = 0.0;\\n  tmpvar_23.x = texsize.z;\\n  xlat_mutabledz.x = (xlat_mutabledz.x + (inten_2 * dot (\\n    (texture (sampler_main, (xlat_mutableuv3 + tmpvar_22)).xyz - texture (sampler_main, (xlat_mutableuv3 - tmpvar_23)).xyz)\\n  , vec3(0.32, 0.49, 0.29))));\\n  vec2 tmpvar_24;\\n  tmpvar_24.x = 0.0;\\n  tmpvar_24.y = texsize.w;\\n  vec2 tmpvar_25;\\n  tmpvar_25.x = 0.0;\\n  tmpvar_25.y = texsize.w;\\n  xlat_mutabledz.y = (xlat_mutabledz.y + (inten_2 * dot (\\n    (texture (sampler_main, (xlat_mutableuv3 + tmpvar_24)).xyz - texture (sampler_main, (xlat_mutableuv3 - tmpvar_25)).xyz)\\n  , vec3(0.32, 0.49, 0.29))));\\n  xlat_mutableret1 = max (xlat_mutableret1, (texture (sampler_main, xlat_mutableuv3).xyz * inten_2));\\n  uv_1 = (uv_1 + xlat_mutabledz);\\n  vec2 tmpvar_26;\\n  tmpvar_26.x = q5;\\n  tmpvar_26.y = q6;\\n  xlat_mutableuv4 = (uv_1 - (0.4 * tmpvar_26));\\n  float tmpvar_27;\\n  tmpvar_27 = (0.1 * clamp ((1.0/(\\n    (abs(uv_1.y) + 0.1)\\n  )), 0.0, 12.0));\\n  vec2 tmpvar_28;\\n  tmpvar_28.x = (uv_1.x * tmpvar_27);\\n  tmpvar_28.y = tmpvar_27;\\n  vec3 tmpvar_29;\\n  tmpvar_29.xy = vec2(0.0, 0.0);\\n  tmpvar_29.z = clamp ((1.0 - (3.0 * uv_1.y)), 0.0, 1.0);\\n  ret_4 = (vec3(0.0, 0.1, 0.1) + (0.1 * tmpvar_29));\\n  ret_4 = (ret_4 + (vec3(dot (texture (sampler_noise_hq, \\n    (tmpvar_28 + (0.1 * time))\\n  ), vec4(0.32, 0.49, 0.29, 0.0))) * (\\n    (clamp ((1.0 - (12.0 * uv_1.y)), 0.0, 1.0) * 0.1)\\n   / \\n    (0.05 + sqrt(dot (xlat_mutableuv4, xlat_mutableuv4)))\\n  )));\\n  ret_4 = (ret_4 + ((0.4 * xlat_mutableret1) + (xlat_mutableret1 * q22)));\\n  vec4 tmpvar_30;\\n  tmpvar_30.w = 1.0;\\n  tmpvar_30.xyz = ret_4;\\n  ret = tmpvar_30.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:2,modwavealphabyvolume:1,wave_brighten:0,wrap:0,darken:1,wave_a:.001,wave_scale:20.944651,wave_smoothing:0,wave_mystery:.08,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:.99,ob_size:.015,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,textured:1,y:.47,rad:.24057,tex_zoom:.14057,g:.3,b:.5,g2:0,b2:.3,a2:1,border_b:0,border_a:0},init_eqs_str:\"a.q24=0;\",frame_eqs_str:\"a.x=.5;a.y=.5;a.a=a.q24;a.a2=a.q24;\"},{baseVals:{enabled:1,sides:100,additive:1,thickoutline:1,rad:.05134,tex_zoom:.12288,r:.3,g:.2,b:.2,a:.7,g2:0,border_r:0,border_g:.5,border_b:.5,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"a.r=.5+.3*Math.sin(a.time);a.g=.5+.3*Math.sin(div(a.time,1.5));a.b=.5+.3*Math.sin(div(a.time,3.7));a.r2=0;a.b2=0;a.g2=0;a.a=.05;a.a2=0;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:100,thick:1,scaling:.045052,smoothing:.1,a:.6},init_eqs_str:\"a.k1=0;a.dy=0;a.dx=0;a.t2=0;a.q24=0;a.q27=0;\",frame_eqs_str:\"a.t2=.45+div(randint(10),100);\",point_eqs_str:\"a.k1=bnot(mod(100*a.sample+a.time,2));a.dy=.015*above(Math.sin(11*a.sample),0)+.008*above(Math.sin(a.time+74*a.sample),0)+.008*above(Math.sin(a.time+128*a.sample),0);a.dx=.01*above(Math.sin(27*a.sample),0)+.01*above(Math.sin(a.time+134*a.sample),0);a.x=.2*(a.sample-.5)+.5+a.dx;a.y=a.t2+a.dy;a.a=a.q24*a.k1*bnot(mod(a.q27,4));a.r=.6;a.g=0;a.b=.6;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.dec_xlow=0;a.index2=0;a.speed_=0;a.index=0;a.q12=0;a.q22=0;a.q21=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.q9=0;a.movx=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q10=0;a.tilt_=0;a.q4=0;a.peakx=0;a.dir__=0;a.dir=0;a.dir_=0;a.movy=0;a.q26=0;a.maxp=0;a.p2=0;a.avg=0;a.trig=0;a.beat=0;a.p1=0;a.peak=0;a.tilt=0;a.q2=0;a.q27=0;a.speed=0;a.q3=0;a.t0=0;a.q7=0;a.q20=0;a.q8=0;a.xk=0;\",frame_eqs_str:\"a.dec_med=pow(.8,div(30,a.fps));a.dec_slow=pow(.95,div(30,a.fps));a.dec_xlow=pow(.995,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,16);a.index2=mod(a.index2+a.is_beat*bnot(a.index),2);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q23=\\na.index;a.q24=a.is_beat;a.q26=a.bass_att+a.mid_att+a.treb_att;a.q27=a.index+1;a.peakx=above(a.q22,1.5*a.maxp);a.maxp=Math.max(a.maxp,a.q22);a.maxp*=a.dec_xlow;a.k1=a.is_beat*equal(mod(a.index,3),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,4);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.trig=a.q24*bnot(mod(a.index,4));a.dir=a.dir+div(a.trig*a.q26*(div(randint(100),100)-.5),2)+a.peakx;a.dir_=a.dir_*a.dec_slow+a.dir*(1-a.dec_slow);\\na.dir__=a.dir__*a.dec_slow+a.dir_*(1-a.dec_slow);a.q5=Math.cos(a.dir__);a.q6=Math.sin(a.dir__);a.speed=a.speed*bnot(a.trig)+div(a.trig*a.q26*5,a.fps);a.speed_=a.speed_*a.dec_slow+a.speed*(1-a.dec_slow);a.movx+=a.speed_*a.q6;a.movy+=a.speed_*a.q5;a.q7=a.movx;a.q8=a.movy;a.tilt=a.dir-a.dir__;a.tilt_=a.dec_slow*a.tilt_+(1-a.dec_slow)*a.tilt;a.monitor=a.maxp;a.q9=Math.cos(a.tilt_*a.speed_);a.q10=Math.sin(a.tilt_*a.speed_);a.q12=a.time;\",pixel_eqs_str:\"a.zoom=1.3;\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 uv6_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_4;\\n  tmpvar_4 = ((2.0 * sqrt(\\n    dot (tmpvar_3, tmpvar_3)\\n  )) + (rand_frame * 64.0)).x;\\n  uv_1 = (uv + (clamp (\\n    ((sin(tmpvar_4) / cos(tmpvar_4)) * normalize(tmpvar_3))\\n  , vec2(-2.0, -2.0), vec2(2.0, 2.0)) / 20.0));\\n  uv6_2 = (0.4 * sin((tmpvar_3 * 22.0)));\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = (((q24 * \\n    (((texture (sampler_main, uv_1).xyz - (\\n      ((texture (sampler_blur1, fract(uv_1)).xyz * scale1) + bias1)\\n     * 0.04)) + (0.15 * (vec3(\\n      (0.1 / sqrt(dot (uv6_2, uv6_2)))\\n    ) * roam_cos.xyz))) - 0.02)\\n  ) * 0.98) + ((1.0 - q24) * texture (sampler_main, uv_orig).xyz));\\n  ret = tmpvar_5.xyz;\\n }\",comp:\"vec3 xlat_mutableret1;\\nvec2 xlat_mutablers;\\n shader_body { \\n  vec2 uv1_1;\\n  mat2 tmpvar_2;\\n  tmpvar_2[uint(0)].x = q9;\\n  tmpvar_2[uint(0)].y = -(q10);\\n  tmpvar_2[1u].x = q10;\\n  tmpvar_2[1u].y = q9;\\n  uv1_1 = (((uv_orig - 0.5) * aspect.xy) * tmpvar_2);\\n  uv1_1 = (uv1_1 * aspect.yx);\\n  float tmpvar_3;\\n  tmpvar_3 = (3.0 / abs(uv1_1.y));\\n  xlat_mutablers.x = (uv1_1.x * tmpvar_3);\\n  xlat_mutablers.y = (tmpvar_3 / 2.0);\\n  mat2 tmpvar_4;\\n  tmpvar_4[uint(0)].x = q5;\\n  tmpvar_4[uint(0)].y = -(q6);\\n  tmpvar_4[1u].x = q6;\\n  tmpvar_4[1u].y = q5;\\n  xlat_mutablers = (tmpvar_4 * xlat_mutablers);\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = q7;\\n  tmpvar_5.y = q8;\\n  xlat_mutablers = (xlat_mutablers + tmpvar_5);\\n  xlat_mutableret1 = ((texture (sampler_blur1, fract(\\n    (xlat_mutablers / 12.0)\\n  )).xyz * scale1) + bias1);\\n  vec2 tmpvar_6;\\n  tmpvar_6.y = 0.0;\\n  tmpvar_6.x = q5;\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = (((xlat_mutableret1 * 32.0) / tmpvar_3) + ((\\n    ((q22 * sqrt(tmpvar_3)) / 4.0)\\n   * \\n    sin(((uv1_1 - q12) * q27))\\n  .x) * texture (sampler_main, (\\n    (((4.0 * xlat_mutableret1) / tmpvar_3).xy + ((uv1_1 / 2.0) / (0.5 + abs(uv1_1.y))))\\n   + tmpvar_6)).xyz));\\n  ret = tmpvar_7.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.98,decay:.5,echo_zoom:.952,echo_alpha:.5,echo_orient:3,wave_mode:5,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.474,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:.8,wave_g:.49,ob_size:0,ob_a:.3,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1x:.8,b1ed:0},shapes:[{baseVals:{enabled:1,sides:7,additive:1,num_inst:1024,rad:.04896,tex_ang:1.00531,tex_zoom:1.53117,r:0,g:1,b:1,a:0,g2:0,border_b:0,border_a:0},init_eqs_str:\"a.max_age=0;a.n=0;a.x0=0;a.y0=0;a.z0=0;a.rad0=0;\",frame_eqs_str:\"a.max_age=a.reg00;a.n=12*a.instance;a.x0=a.gmegabuf[Math.floor(a.n)];a.y0=a.gmegabuf[Math.floor(a.n+1)];a.z0=a.gmegabuf[Math.floor(a.n+2)];.00001<Math.abs(-100>a.z0?1:0)?(a.rad=0,a.gmegabuf[Math.floor(a.n+8)]=a.max_age):(a.rad0=div(pow(1-div(a.gmegabuf[Math.floor(a.n+8)],a.max_age),.2),a.z0)*a.gmegabuf[Math.floor(a.n+7)]+.01,a.rad=.032*Math.abs(a.rad0),a.x=.5+div(a.x0,a.z0),a.y=.5+div(a.y0,a.z0));a.a=1;a.a2=.2;a.g=.8;a.g2=0;a.b=.2*(3<randint(10)?1:0)+.2*(0>a.z0?1:0);a.b2=0;\\n\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:160,sep:20,usedots:1,additive:1,scaling:7.858,smoothing:.1,r:.2,g:.3,a:.6},init_eqs_str:\"a.q32=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.x=div(randint(100),100);a.y=.5-div(1-.7,a.q32)-.15*(div(randint(100),100)-.5);a.a=.15;a.r=0;a.b=1;a.g=0;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:'a.max_age=0;a.ind2=0;a.n=0;a.free=0;a.high=0;a.index=0;a.tht=0;a.v00=0;a.yobf=0;a.dt=0;a.y0=0;a.q1=0;a.dec_med=0;a.q5=0;a.ran1_=0;a[\"new\"]=0;a.push=0;a.new1=0;a.is_beat=0;a.q24=0;a.vol_alt=0;a.dec_slow=0;a.ran2=0;a.ind1=0;a.q10=0;a.v0=0;a.med=0;a.beat=0;a.vol=0;a.peak=0;a.dec_fast=0;a.q27=0;a.bass1=0;a.q3=0;a.t0=0;a.vol_=0;a.dec=0;a.m=0;a.ran1=0;a.q32=0;a.phi=0;a.air=0;a.max_age=4.5;a.reg00=a.max_age;for(var b=a.n=0;12288>b;b++)a.gmegabuf[Math.floor(a.n)]=a.max_age-1+randint(2),\\na.n+=1;a.q9=2*(randint(25)-10);a.q3=div(randint(100),100);a.q4=div(randint(100),100);',frame_eqs_str:'a.dec_fast=1-div(8.8,a.fps);a.dec_med=1-div(6,a.fps);a.dec_slow=1-div(1.6,a.fps);a.vol=div(a.bass+a.med+a.treb,3);a.vol_=a.vol_*a.dec_slow+(1-a.dec_slow)*a.vol;a.beat=a.vol;a.is_beat=above(a.beat,1+4*a.peak)*above(a.time,a.t0+.2);a.t0=.00001<Math.abs(a.is_beat)?a.time:a.t0;a.peak=.00001<Math.abs(a.is_beat)?a.beat:a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,1024);a.ind1=a.ind1*a.dec_med+(1-a.dec_fast)*a.index;a.ind2=a.ind2*a.dec_med+(1-a.dec_fast)*a.ind1;a.q27=a.ind2;a.q24=\\na.is_beat;a.ran1=.00001<Math.abs(a.is_beat)?div(randint(100),100)-.5:a.ran1;a.ran2=.00001<Math.abs(a.is_beat)?div(randint(100),50)+1:a.ran2;a.ran1_=a.dec_med*a.ran1_+(1-a.dec_med)*a.ran1;a.high=2.9<a.ran2?1:0;a.q5=a.ran1_;a.n=0;a.push=Math.max(0,a.vol-a.vol_alt)*a.vol_;a.air=.1*a.dt;a.dt=div(1,a.fps);a.v00=pow(a.push,.25)+.4;a.free=512;a[\"new\"]=0;a.y0=-.68;a.yobf=a.y0+.1;for(var b=0;512>b;b++)a.megabuf[Math.floor(a.n)]=a.gmegabuf[Math.floor(a.n)],a.megabuf[Math.floor(a.n+1)]=a.gmegabuf[Math.floor(a.n+\\n1)],a.megabuf[Math.floor(a.n+2)]=a.gmegabuf[Math.floor(a.n+2)],.00001<Math.abs(a.gmegabuf[Math.floor(a.n+8)]>a.max_age?1:0)?.00001<Math.abs(band(a.push>=10*a.dt*bnot(a.high)?1:0,200>a[\"new\"]?1:0))?(--a.free,a[\"new\"]+=1,a.tht=div(randint(100),500)*(1+1.5*a.high),a.phi=randint(12),a.v0=a.v00*(1+div(randint(10),40)),a.gmegabuf[Math.floor(a.n)]=1.7*a.ran1,a.gmegabuf[Math.floor(a.n+1)]=a.y0+2.2*a.high,a.gmegabuf[Math.floor(a.n+2)]=2,a.gmegabuf[Math.floor(a.n+3)]=a.v0*Math.sin(a.tht)*Math.cos(a.phi),a.gmegabuf[Math.floor(a.n+\\n4)]=a.v0*Math.cos(4*a.tht)*(1-1.5*a.high),a.gmegabuf[Math.floor(a.n+5)]=a.v0*Math.sin(a.tht)*Math.sin(a.phi)*1.5*a.vol,a.gmegabuf[Math.floor(a.n+7)]=0,a.gmegabuf[Math.floor(a.n+8)]=div(randint(100),100)):0:(--a.free,a.gmegabuf[Math.floor(a.n)]+=a.gmegabuf[Math.floor(a.n+3)]*a.dt,a.gmegabuf[Math.floor(a.n+1)]+=a.gmegabuf[Math.floor(a.n+4)]*a.dt,a.gmegabuf[Math.floor(a.n+2)]+=a.gmegabuf[Math.floor(a.n+5)]*a.dt,a.gmegabuf[Math.floor(a.n+3)]*=1-a.air,a.gmegabuf[Math.floor(a.n+4)]*=1-a.air,a.gmegabuf[Math.floor(a.n+\\n4)]-=.8*a.dt,a.gmegabuf[Math.floor(a.n+5)]*=1-a.air,a.gmegabuf[Math.floor(a.n+7)]=(a.gmegabuf[Math.floor(a.n+1)]>a.yobf?1:0)*Math.min(1,18*(a.gmegabuf[Math.floor(a.n+1)]-a.yobf)),.00001<Math.abs(band(a.gmegabuf[Math.floor(a.n+1)]<a.yobf?1:0,0>a.gmegabuf[Math.floor(a.n+4)]?1:0))?a.gmegabuf[8]=a.max_age:0,a.gmegabuf[Math.floor(a.n+8)]+=a.dt),a.n+=12;for(b=a.n=0;512>b;b++)a.m=6132+a.n,a.gmegabuf[Math.floor(a.m)]=div(a.gmegabuf[Math.floor(a.n)]+a.megabuf[Math.floor(a.n)],2),a.gmegabuf[Math.floor(a.m+\\n1)]=div(a.gmegabuf[Math.floor(a.n+1)]+a.megabuf[Math.floor(a.n+1)],2),a.gmegabuf[Math.floor(a.m+2)]=div(a.gmegabuf[Math.floor(a.n+2)]+a.megabuf[Math.floor(a.n+2)],2),a.gmegabuf[Math.floor(a.m+7)]=a.gmegabuf[Math.floor(a.n+7)],a.gmegabuf[Math.floor(a.m+8)]=a.gmegabuf[Math.floor(a.n+8)],a.n+=12;a.dec=.00001<Math.abs(a.bass>a.bass1?1:0)?.5:.9;a.bass1=a.bass1*a.dec+a.bass*(1-a.dec);a.q1=Math.min(1,Math.max(0,a.bass1-1.5)*Math.abs(a.q3-.5)*3);a.q10=Math.max(a.vol_-.1,.1);a.vol_alt=a.vol;a.q32=a.aspecty;\\na.new1=.00001<Math.abs(0<a[\"new\"]?1:0)?a[\"new\"]:a.new1;a.monitor=a.new1;',pixel_eqs_str:\"a.dy=-.007*a.y;a.warp=0;a.rot=div(.025*Math.sin(a.q27+7*a.x+0*a.y)*.2,Math.abs(a.y-.7)+.1)*a.q10;a.zoom=1.003+.2*Math.max(0,a.y-.7);\",warp:\"vec2 ver;\\nfloat xlat_mutablecloud;\\nvec2 xlat_mutabledz;\\nvec2 xlat_mutableuv1;\\nvec2 xlat_mutableuv2;\\nfloat xlat_mutablez;\\n shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1.y = 0.0;\\n  tmpvar_1.x = texsize.z;\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = 0.0;\\n  tmpvar_2.y = texsize.w;\\n  ver = (tmpvar_2 * 2.0);\\n  vec3 ret_3;\\n  xlat_mutabledz.x = (2.0 * dot (vec3((texture (sampler_main, \\n    (uv + tmpvar_1)\\n  ).z - texture (sampler_main, \\n    (uv - tmpvar_1)\\n  ).z)), vec3(0.32, 0.49, 0.29)));\\n  xlat_mutabledz.y = (2.0 * dot (vec3((texture (sampler_main, \\n    (uv + ver)\\n  ).z - texture (sampler_main, \\n    (uv - ver)\\n  ).z)), vec3(0.32, 0.49, 0.29)));\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = q3;\\n  tmpvar_4.y = (0.4 + (q4 * 0.4));\\n  xlat_mutableuv1 = (uv_orig - tmpvar_4);\\n  vec4 tmpvar_5;\\n  tmpvar_5 = texture (sampler_main, uv_orig);\\n  xlat_mutablez = ((0.8 * (xlat_mutableuv1.y - 0.4)) - (mix (tmpvar_5.x, \\n    ((texture (sampler_blur1, uv_orig).xyz * scale1) + bias1)\\n  .x, 0.5) * 0.03));\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = (xlat_mutableuv1.x * xlat_mutablez);\\n  tmpvar_6.y = xlat_mutablez;\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = 0.0;\\n  tmpvar_7.y = (-(time) * 0.014);\\n  xlat_mutableuv2 = (tmpvar_6 + tmpvar_7);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = 0.0;\\n  tmpvar_8.y = (time * 0.004);\\n  vec2 uvi_9;\\n  uvi_9 = ((xlat_mutableuv2 * 1.5) + tmpvar_8);\\n  float zv_10;\\n  zv_10 = (0.002 * time);\\n  xlat_mutablecloud = (1.0 - (1.5 * abs(\\n    (texture (sampler_noise_hq, ((xlat_mutableuv2 + (0.07 * \\n      abs((((\\n        (dot (texture (sampler_noise_hq, uvi_9), vec4(0.32, 0.49, 0.29, 0.0)) + (dot (texture (sampler_noise_hq, (\\n          (uvi_9 * 2.0)\\n         + zv_10)), vec4(0.32, 0.49, 0.29, 0.0)) / 2.0))\\n       + \\n        (dot (texture (sampler_noise_hq, ((uvi_9 * 4.0) + zv_10)), vec4(0.32, 0.49, 0.29, 0.0)) / 4.0)\\n      ) + (\\n        dot (texture (sampler_noise_hq, ((uvi_9 * 8.0) + zv_10)), vec4(0.32, 0.49, 0.29, 0.0))\\n       / -8.0)) - 1.0))\\n    )) / 2.0)) - 0.5)\\n  ))).x;\\n  xlat_mutablecloud = (xlat_mutablecloud * clamp ((\\n    (texture (sampler_noise_hq, (xlat_mutableuv2 * vec2(2.0, 0.5))).x + 0.5)\\n   - \\n    (3.0 * abs(xlat_mutableuv2.x))\\n  ), 0.0, 1.0));\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = 0.0;\\n  tmpvar_11.y = ((-0.01 * time) * (0.125 * float(\\n    int((8.0 * pow (xlat_mutablecloud, 4.0)))\\n  )));\\n  float tmpvar_12;\\n  tmpvar_12 = (texture (sampler_noise_hq, (18.0 * (\\n    (xlat_mutableuv2 + (0.05 * xlat_mutablecloud))\\n   + tmpvar_11))) - 0.75).x;\\n  xlat_mutablecloud = (xlat_mutablecloud * (1.0 + (\\n    (0.2 * tmpvar_12)\\n   * \\n    (xlat_mutablecloud * xlat_mutablecloud)\\n  )));\\n  ret_3.x = ((0.3 * xlat_mutablecloud) + (0.7 * tmpvar_5.xyz)).x;\\n  xlat_mutableuv1 = (uv - vec2(0.0, 0.71));\\n  vec4 tmpvar_13;\\n  tmpvar_13 = texture (sampler_blur1, uv);\\n  float tmpvar_14;\\n  tmpvar_14 = clamp (((12.0 * \\n    (((10.0 * xlat_mutableuv1.y) + ((\\n      (tmpvar_13.xyz * scale1)\\n     + bias1).x / 2.0)) - 1.0)\\n  ) + tmpvar_12), 0.0, 1.0);\\n  xlat_mutableuv1 = (uv - 0.7);\\n  ret_3.z = (((\\n    ((((4.0 * tmpvar_14) * (1.0 - tmpvar_14)) * clamp ((tmpvar_5.x - 0.2), 0.0, 1.0)) + texture (sampler_main, (uv + (xlat_mutabledz * 0.003))).z)\\n   - \\n    (0.03 * sqrt(dot (xlat_mutabledz, xlat_mutabledz)))\\n  ) - (\\n    pow (((tmpvar_13.xyz * scale1) + bias1).z, 8.0)\\n   * 0.2)) - 0.01);\\n  ret_3.y = (texture (sampler_main, mix (uv, uv_orig, vec2(0.5, 0.5))).y * (0.85 - (0.2 * \\n    ((tmpvar_13.xyz * scale1) + bias1)\\n  .y)));\\n  ret_3.x = (ret_3.x + ((texture (sampler_noise_lq, \\n    (2.0 * xlat_mutableuv2)\\n  ) * 0.08) * clamp (\\n    (1.0 - (3.0 * ret_3.x))\\n  , 0.0, 1.0)).x);\\n  vec4 tmpvar_15;\\n  tmpvar_15.w = 1.0;\\n  tmpvar_15.xyz = ret_3;\\n  ret = tmpvar_15.xyz;\\n }\",comp:\"float dunk;\\nfloat xlat_mutablenoise;\\nvec2 xlat_mutablers;\\nvec2 xlat_mutablers0;\\nfloat xlat_mutablesmask;\\nfloat xlat_mutablesmoke;\\nvec2 xlat_mutableuv1;\\nfloat xlat_mutablez;\\n shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1.y = 0.0;\\n  tmpvar_1.x = texsize.z;\\n  dunk = ((rand_preset.x * 0.3) + 0.1);\\n  vec2 uv_2;\\n  vec3 ret_3;\\n  uv_2 = (uv + (texsize.zw / 2.0));\\n  xlat_mutableuv1 = (uv_2 - vec2(0.0, 0.7));\\n  xlat_mutablesmask = (((10.0 * xlat_mutableuv1.y) + (\\n    ((texture (sampler_blur1, uv_2).xyz * scale1) + bias1)\\n  .x / 2.0)) - 1.0);\\n  float tmpvar_4;\\n  tmpvar_4 = clamp (((2.0 * xlat_mutablesmask) + 0.3), 0.0, 1.0);\\n  xlat_mutablenoise = ((3.0 * (1.0 - tmpvar_4)) * texture (sampler_noise_lq, ((xlat_mutableuv1 * 1.5) + (rand_frame * 0.2).xy)).x);\\n  float tmpvar_5;\\n  tmpvar_5 = clamp (((12.0 * xlat_mutablesmask) + (xlat_mutablenoise / 2.0)), 0.0, 1.0);\\n  xlat_mutablez = ((0.35 / xlat_mutableuv1.y) + (xlat_mutablenoise / 2.0));\\n  xlat_mutablers0.x = (xlat_mutableuv1.x * xlat_mutablez);\\n  xlat_mutablers0.y = xlat_mutablez;\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = (xlat_mutablers0.x + (time / 4.0));\\n  tmpvar_6.y = (xlat_mutablez + (time * 0.21));\\n  xlat_mutablers = (tmpvar_6 * tmpvar_5);\\n  float t_7;\\n  t_7 = ((texture (sampler_main, uv_2).x - dunk) * (1.0 - (tmpvar_5 * \\n    pow (uv_2.y, 4.0)\\n  )));\\n  float tmpvar_8;\\n  tmpvar_8 = clamp (((1.2 * t_7) - 0.2), 0.0, 1.0);\\n  t_7 = tmpvar_8;\\n  vec3 tmpvar_9;\\n  tmpvar_9.x = tmpvar_8;\\n  tmpvar_9.y = (tmpvar_8 * tmpvar_8);\\n  tmpvar_9.z = pow (tmpvar_8, 8.0);\\n  vec3 tmpvar_10;\\n  tmpvar_10 = clamp ((tmpvar_9 / vec3(0.8, 0.8, 0.8)), 0.0, 1.0);\\n  float t_11;\\n  t_11 = ((texture (sampler_blur2, (uv_2 + 0.03)).xyz * scale2) + bias2).x;\\n  float tmpvar_12;\\n  tmpvar_12 = clamp (((1.2 * t_11) - 0.2), 0.0, 1.0);\\n  t_11 = tmpvar_12;\\n  vec3 tmpvar_13;\\n  tmpvar_13.x = tmpvar_12;\\n  tmpvar_13.y = (tmpvar_12 * tmpvar_12);\\n  tmpvar_13.z = pow (tmpvar_12, 8.0);\\n  vec3 tmpvar_14;\\n  tmpvar_14 = clamp ((tmpvar_13 / vec3(0.8, 0.8, 0.8)), 0.0, 1.0);\\n  ret_3 = ((tmpvar_10 * (tmpvar_10 * \\n    (3.0 - (2.0 * tmpvar_10))\\n  )) + ((\\n    (((1.0 - texture (sampler_main, uv_2).x) * (1.0 - tmpvar_5)) * abs((texture (sampler_main, (uv_2 - tmpvar_1)).x - texture (sampler_main, (uv_2 + tmpvar_1)).x)))\\n   * \\n    (tmpvar_14 * (tmpvar_14 * (3.0 - (2.0 * tmpvar_14))))\\n  ) * q9));\\n  xlat_mutablesmoke = ((texture (sampler_blur1, uv_2).xyz * scale1) + bias1).z;\\n  vec2 tmpvar_15;\\n  tmpvar_15.x = uv_2.x;\\n  tmpvar_15.y = ((0.85 - xlat_mutableuv1.y) + ((\\n    ((texture (sampler_noise_hq, xlat_mutablers) + texture (sampler_noise_hq, ((xlat_mutablers / 4.0) - (time / 8.0)))) - 1.0)\\n  .x * 0.2) * q10));\\n  float t_16;\\n  t_16 = ((texture (sampler_main, tmpvar_15).x + texture (sampler_main, tmpvar_15).y) - dunk);\\n  float tmpvar_17;\\n  tmpvar_17 = clamp (((1.2 * t_16) - 0.2), 0.0, 1.0);\\n  t_16 = tmpvar_17;\\n  vec3 tmpvar_18;\\n  tmpvar_18.x = tmpvar_17;\\n  tmpvar_18.y = (tmpvar_17 * tmpvar_17);\\n  tmpvar_18.z = pow (tmpvar_17, 8.0);\\n  vec3 tmpvar_19;\\n  tmpvar_19 = clamp ((tmpvar_18 / vec3(0.8, 0.8, 0.8)), 0.0, 1.0);\\n  ret_3 = (ret_3 + ((\\n    (tmpvar_19 * (tmpvar_19 * (3.0 - (2.0 * tmpvar_19))))\\n   * tmpvar_5) * 0.85));\\n  float tmpvar_20;\\n  tmpvar_20 = ((3.6 * tmpvar_4) * (1.0 - tmpvar_4));\\n  ret_3 = (ret_3 * (clamp (\\n    (1.0 - (xlat_mutablesmoke * (1.0 - tmpvar_20)))\\n  , 0.0, 1.0) * clamp (\\n    (1.0 - (tmpvar_20 * float((rand_preset.x > 0.5))))\\n  , 0.0, 1.0)));\\n  vec3 tmpvar_21;\\n  tmpvar_21.z = 0.0;\\n  tmpvar_21.xy = (((texture (sampler_blur3, uv_2).xyz * scale3) + bias3).xy * vec2(3.0, 5.0));\\n  ret_3 = (ret_3 + ((xlat_mutablesmoke * \\n    dot (tmpvar_21, vec3(0.32, 0.49, 0.29))\\n  ) * vec3(1.0, 0.84, 0.62)));\\n  float tmpvar_22;\\n  tmpvar_22 = clamp (((1.2 * \\n    clamp (texture (sampler_main, uv_2).y, 0.0, 1.0)\\n  ) - 0.2), 0.0, 1.0);\\n  vec3 tmpvar_23;\\n  tmpvar_23.x = tmpvar_22;\\n  tmpvar_23.y = (tmpvar_22 * tmpvar_22);\\n  tmpvar_23.z = pow (tmpvar_22, 8.0);\\n  vec3 tmpvar_24;\\n  tmpvar_24 = clamp ((tmpvar_23 / vec3(0.8, 0.8, 0.8)), 0.0, 1.0);\\n  ret_3 = (ret_3 + (tmpvar_24 * (tmpvar_24 * \\n    (3.0 - (2.0 * tmpvar_24))\\n  )));\\n  float tmpvar_25;\\n  tmpvar_25 = clamp (0.52, 0.0, 1.0);\\n  vec3 tmpvar_26;\\n  tmpvar_26.x = tmpvar_25;\\n  tmpvar_26.y = (tmpvar_25 * tmpvar_25);\\n  tmpvar_26.z = pow (tmpvar_25, 8.0);\\n  vec3 tmpvar_27;\\n  tmpvar_27 = clamp ((tmpvar_26 / vec3(0.8, 0.8, 0.8)), 0.0, 1.0);\\n  vec3 tmpvar_28;\\n  tmpvar_28 = mix (clamp (ret_3, 0.0, 1.0), (tmpvar_27 * (tmpvar_27 * \\n    (3.0 - (2.0 * tmpvar_27))\\n  )), vec3((pow (\\n    ((1.0 - uv_2.y) - ((uv_2.x - 0.5) * (q3 - 0.5)))\\n  , 4.0) * q1)));\\n  ret_3 = tmpvar_28;\\n  vec4 tmpvar_29;\\n  tmpvar_29.w = 1.0;\\n  tmpvar_29.xyz = tmpvar_28;\\n  ret = tmpvar_29.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:7,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,darken:1,wave_a:.001,wave_scale:.698,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:0,wave_b:0,ob_size:0,ob_g:.1,ob_b:1,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:25.6,mv_y:9.6,mv_l:5,mv_g:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.n=0;a.maxbpm=0;a.reg26=0;a.maxind1=0;a.uvx0=0;a.cosb_=0;a.reg34=0;a.num_res=0;a.reg28=0;a.reg23=0;a.q25=0;a.angchg=0;a.reg20=0;a.reg15=0;a.reg10=0;a.sinb_=0;a.index=0;a.quali=0;a.v3=0;a.q18=0;a.q22=0;a.q21=0;a.diry=0;a.q6=0;a.posx=0;a.dt=0;a.reg25=0;a.mean=0;a.uvx=0;a.q1=0;a.posz=0;a.q5=0;a.reg52=0;a.dt1=0;a.dec_f=0;a.dirz=0;a.dec_s=0;a.reg16=0;a.bt2=0;a.reg36=0;a.minbpm=0;a.reg22=0;a.uvy=0;a.rotz=0;a.cosb=0;a.omega=0;a.dist_=0;a.ec_steps=0;a.bpm=0;a.q23=0;a.q24=0;a.reg24=\\n0;a.ran2=0;a.pi=0;a.q10=0;a.reg14=0;a.sinb=0;a.reg53=0;a.posy=0;a.reg31=0;a.dirx=0;a.dec_m=0;a.q4=0;a.start=0;a.reg12=0;a.reg13=0;a.v2p=0;a.c2=0;a.reg37=0;a.ex=0;a.s3=0;a.yslope=0;a.q16=0;a.xslope=0;a.q26=0;a.reg38=0;a.v3p=0;a.reg35=0;a.p2=0;a.mov=0;a.reg11=0;a.tx=0;a.avg=0;a.bt1=0;a.beatsin=0;a.uvz=0;a.c3=0;a.uvy0=0;a.reg27=0;a.q19=0;a.q17=0;a.vol=0;a.reg32=0;a.reg21=0;a.uvz0=0;a.len=0;a.reg18=0;a.beatcos=0;a.reg30=0;a.q2=0;a.b1y=0;a.q27=0;a.bri=0;a.slen=0;a.q14=0;a.dist=0;a.trel1=0;a.p3=0;a.reg17=\\n0;a.v1=0;a.speed=0;a.vol2=0;a.q3=0;a.s1=0;a.vol_=0;a.dec=0;a.s2=0;a.quad=0;a.b2y=0;a.ran1=0;a.q32=0;a.reg33=0;a.q7=0;a.ds=0;a.q28=0;a.ty=0;a.excite=0;a.c1=0;a.v2=0;a.q20=0;a.p4=0;a.q8=0;a.maxvol=0;for(var b=a.n=0;2E4>b;b++)a.megabuf[Math.floor(a.n)]=0,a.gmegabuf[Math.floor(a.n)]=0,a.n+=1;a.minbpm=30;a.maxbpm=230;a.num_res=100;for(b=a.index=0;b<a.num_res;b++)a.n=12*a.index,a.bpm=a.minbpm*pow(div(a.maxbpm,a.minbpm),div(a.index,a.num_res)),a.gmegabuf[Math.floor(a.n)]=a.bpm,a.index+=1;a.pi=3.1416;a.octave=\\ndiv(a.num_res*Math.log(2),Math.log(div(a.maxbpm,a.minbpm)));a.q7=.15;a.q8=.2+randint(1);a.q16=1.6;a.start=1;a.travel=0;a.rotz=0;a.t0=a.time+3;a.cran0=randint(1);a.trelx=0;a.trely=0;a.trelz=0;a.reg20=1;a.reg21=0;a.reg22=0;a.reg23=0;a.reg24=1;a.reg25=0;a.reg26=0;a.reg27=0;a.reg28=1;b=0;do{b+=1;var c;a.ran1=randint(8);a.ran2=randint(8);a.ran3=randint(8);a.posx=randint(8);a.posy=randint(8);a.posz=randint(8);a.c1=Math.cos(a.ran1);a.c2=Math.cos(a.ran2);a.c3=Math.cos(a.ran3);a.s1=Math.sin(a.ran1);a.s2=Math.sin(a.ran2);\\na.s3=Math.sin(a.ran3);a.reg20=a.c2*a.c1;a.reg21=a.c2*a.s1;a.reg22=-a.s2;a.reg23=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg24=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg25=a.s3*a.c2;a.reg26=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg27=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg28=a.c3*a.c2;a.dist=.001;var d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;a.uvx=1+2*(div(a.uvx,4)+30.5-Math.floor(div(a.uvx,4)+30.5)-.5);a.uvy=2+2*(div(a.uvy,4)+30.5-Math.floor(div(a.uvy,\\n4)+30.5)-.5);a.uvz=3+2*(div(a.uvz,4)+30.5-Math.floor(div(a.uvz,4)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:\\n.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.05;c=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<Math.abs(c)&&1048576>d);d=.06>a.dist?1:0}while(.00001<Math.abs(d)&&1048576>b);\",frame_eqs_str:\"a.dt=Math.min(div(1,a.fps),.1);a.dec_f=.8;a.dec_m=1-4*a.dt;a.dec_s=1-a.dt;a.vol=div(a.bass+div(a.mid,2)+a.treb,3);a.vol_=a.vol_*a.dec_m+(1-a.dec_m)*a.vol;a.dec=a.dec_s;a.vol2=a.vol2*a.dec+(1-a.dec)*Math.min(3,a.vol);a.maxvol=.00001<Math.abs(a.vol>a.maxvol?1:0)?a.vol:a.maxvol*a.dec_s;a.excite=a.vol-a.vol_;a.index=0;a.maxind1=0;for(var b=a.mean=0;b<a.num_res;b++){a.n=12*a.index;a.omega=div(2*a.gmegabuf[Math.floor(a.n)]*a.pi,60);a.gmegabuf[Math.floor(a.n+1)]*=1-.25*a.dt;a.ec_steps=\\nMath.floor(10*a.dt*a.omega)+1;a.dt1=div(a.dt,a.ec_steps);a.ex=a.excite;for(var c=0;c<a.ec_steps;c++)a.gmegabuf[Math.floor(a.n+1)]+=(a.ex-sqr(a.omega)*a.gmegabuf[Math.floor(a.n+2)])*a.dt1,a.gmegabuf[Math.floor(a.n+2)]+=a.gmegabuf[Math.floor(a.n+1)]*a.dt1;a.beatcos=a.gmegabuf[Math.floor(a.n+1)];a.beatsin=a.gmegabuf[Math.floor(a.n+2)]*a.omega;a.quad=sqrt(pow(a.beatsin,2)+pow(a.beatcos,2));a.mean+=div(a.quad,a.num_res);a.gmegabuf[Math.floor(a.n+3)]=a.gmegabuf[Math.floor(a.n+3)]*a.dec_m+a.quad*(1-a.dec_m);\\n.00001<Math.abs(a.gmegabuf[Math.floor(a.n+3)]>a.gmegabuf[Math.floor(12*a.maxind1+3)]?1:0)?a.maxind1=a.index:0;a.index+=1}a.quali=div(a.gmegabuf[Math.floor(12*a.maxind1+3)],a.mean);a.bpm=a.minbpm*pow(div(a.maxbpm,a.minbpm),div(a.maxind1,a.num_res));.00001<Math.abs(160<a.bpm?1:0)?a.bpm/=2:0;a.trel1+=(div(a.bpm,60)*a.pi+a.excite*a.cosb)*(.7<a.maxvol?1:0)*a.dt;a.q32=a.trel1;a.speed=div((.15+.25*a.dist_)*(1+a.avg),a.q7)*(.34+.34*a.vol_)*(a.q8+.8);a.ds=a.ds*a.dec_s+(1-a.dec_s)*a.speed*.25*a.dt;a.rotz=.8*\\npow(Math.sin(div(a.time,12)),5);a.dirx=a.reg26;a.diry=a.reg27;a.dirz=a.reg28;a.posx+=a.ds*a.dirx;a.posy+=a.ds*a.diry;a.posz+=a.ds*a.dirz;a.q4=a.posx;a.q5=a.posy;a.q6=a.posz;a.angchg=Math.max(0,.4-a.dist_);a.v1=a.v1*a.dec_m+(1-a.dec_m)*a.rotz*a.ds;a.dec=1-3*a.dt;a.v2p=a.v2p*a.dec+(1-a.dec)*(a.angchg*a.xslope+.02*a.p2)*a.dt;a.v3p=a.v3p*a.dec+(1-a.dec)*(a.angchg*a.yslope+.02*a.p3)*a.dt;a.v2=a.v2*a.dec+(1-a.dec)*a.v2p;a.v3=a.v3*a.dec+(1-a.dec)*a.v3p;a.p3=sign(a.v3);a.p4=sign(a.v2);a.reg30=a.reg20;a.reg31=\\na.reg21;a.reg32=a.reg22;a.reg33=a.reg23;a.reg34=a.reg24;a.reg35=a.reg25;a.reg36=a.reg26;a.reg37=a.reg27;a.reg38=a.reg28;a.n=0;for(b=a.avg=0;5>b;b++){a.n+=1;a.ran1=div(randint(100),100);a.ran2=div(randint(100),200)-.25;a.tx=Math.cos(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.ty=Math.sin(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.c1=Math.cos(a.v1);a.c2=Math.cos(a.v2+a.ty);a.c3=Math.cos(a.v3+a.tx);a.s1=Math.sin(a.v1);a.s2=Math.sin(a.v2+a.ty);a.s3=Math.sin(a.v3+a.tx);a.reg10=a.c2*a.c1;a.reg11=a.c2*a.s1;a.reg12=\\n-a.s2;a.reg13=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg14=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg15=a.s3*a.c2;a.reg16=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg17=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg18=a.c3*a.c2;a.reg20=a.reg30;a.reg21=a.reg31;a.reg22=a.reg32;a.reg23=a.reg33;a.reg24=a.reg34;a.reg25=a.reg35;a.reg26=a.reg36;a.reg27=a.reg37;a.reg28=a.reg38;a.q20=a.reg10*a.reg20+a.reg11*a.reg23+a.reg12*a.reg26;a.q21=a.reg10*a.reg21+a.reg11*a.reg24+a.reg12*a.reg27;a.q22=a.reg10*a.reg22+a.reg11*a.reg25+a.reg12*a.reg28;a.q23=a.reg13*a.reg20+\\na.reg14*a.reg23+a.reg15*a.reg26;a.q24=a.reg13*a.reg21+a.reg14*a.reg24+a.reg15*a.reg27;a.q25=a.reg13*a.reg22+a.reg14*a.reg25+a.reg15*a.reg28;a.q26=a.reg16*a.reg20+a.reg17*a.reg23+a.reg18*a.reg26;a.q27=a.reg16*a.reg21+a.reg17*a.reg24+a.reg18*a.reg27;a.q28=a.reg16*a.reg22+a.reg17*a.reg25+a.reg18*a.reg28;a.reg20=a.q20;a.reg21=a.q21;a.reg22=a.q22;a.reg23=a.q23;a.reg24=a.q24;a.reg25=a.q25;a.reg26=a.q26;a.reg27=a.q27;a.reg28=a.q28;a.dist=.002;var d;c=0;do{c+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*\\na.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;a.uvx=1+2*(div(a.uvx,4)+30.5-Math.floor(div(a.uvx,4)+30.5)-.5);a.uvy=2+2*(div(a.uvy,4)+30.5-Math.floor(div(a.uvy,4)+30.5)-.5);a.uvz=3+2*(div(a.uvz,4)+30.5-Math.floor(div(a.uvz,4)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(d=0;8>d;d++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?\\n1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)+a.uvz0;a.len=sqrt(a.uvx*\\na.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.1;d=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<Math.abs(d)&&1048576>c);a.megabuf[Math.floor(a.n)]=a.megabuf[Math.floor(a.n)]*a.dec_s+(1-a.dec_s)*a.dist;a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5))}a.n=0;for(b=a.avg=0;5>b;b++)a.n+=1,a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5));a.xslope=Math.min(Math.max(8*(a.megabuf[1]-a.megabuf[3]),-2),2);a.yslope=Math.min(Math.max(8*(a.megabuf[4]-a.megabuf[2]),-2),2);a.dist_=a.dist_*a.dec_m+(1-a.dec_m)*a.dist;\\na.q10=a.ds*a.q7;a.q14=Math.abs(a.ds)+2*(Math.abs(a.v1)+Math.abs(a.v2)+Math.abs(a.v3))+div(1,255)+0*a.start;a.start*=.9;a.reg52=-a.v2;a.reg53=a.v3;a.warp=0;a.zoom=1;a.rot=a.v1;a.sinb=Math.sin(a.trel1);a.cosb=Math.cos(a.trel1);a.bt1=0>a.sinb*a.sinb_?1:0;a.bt2=0>a.cosb*a.cosb_?1:0;.00001<Math.abs(a.bt1)?(a.b1x=randint(2)-1,a.b1y=randint(2)-1):0;.00001<Math.abs(a.bt2)?(a.b2x=randint(2)-1,a.b2y=randint(2)-1):0;a.sinb_=a.sinb;a.cosb_=a.cosb;a.bri=.012*a.vol2*sqrt(div(100,a.bpm))+.01*a.excite;a.mov=div(sqrt(a.v3*\\na.v3+a.v2*a.v2),a.dt);a.q1=a.b1x*Math.abs(a.b1x);a.q2=a.b1y*Math.abs(a.b1y);a.q17=.4*a.b2x;a.q18=.4*a.b2y;a.len=pow(a.q1,2)+pow(a.q2,2);a.q3=pow(a.sinb,2)*a.bri*(1+4*a.len)*Math.max(0,1-5*a.mov);a.q19=pow(a.cosb,2)*a.bri*1.2;a.monitor=a.q8;\",pixel_eqs_str:\"a.warp=0;a.zoom=1;a.tx=Math.tan(.9*(2*a.x-1));a.ty=Math.tan(.9*(2*a.y-1));a.dx=div(a.reg52,a.q16)*(1+.5*Math.abs(a.tx));a.dy=div(a.reg53,a.q16)*(1+.5*Math.abs(a.ty));a.dx+=a.reg53*a.ty*(a.x-.5);a.dy+=a.reg52*a.tx*(a.y-.5);\",warp:\"float sustain;\\nfloat pix;\\nvec3 mod1;\\nfloat xlat_mutabledist;\\nfloat xlat_mutablestruc;\\nvec2 xlat_mutableuv1;\\nvec3 xlat_mutableuv2;\\n shader_body { \\n  mat3 tmpvar_1;\\n  tmpvar_1[uint(0)].x = q20;\\n  tmpvar_1[uint(0)].y = q23;\\n  tmpvar_1[uint(0)].z = q26;\\n  tmpvar_1[1u].x = q21;\\n  tmpvar_1[1u].y = q24;\\n  tmpvar_1[1u].z = q27;\\n  tmpvar_1[2u].x = q22;\\n  tmpvar_1[2u].y = q25;\\n  tmpvar_1[2u].z = q28;\\n  vec3 tmpvar_2;\\n  tmpvar_2.x = q4;\\n  tmpvar_2.y = q5;\\n  tmpvar_2.z = q6;\\n  sustain = (0.97 - q14);\\n  pix = (texsize.z * 2.0);\\n  mod1 = (rand_preset.xyz - 0.5);\\n  vec2 uv_3;\\n  vec3 ret_4;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (uv - 0.5);\\n  xlat_mutableuv1 = ((tmpvar_5 * aspect.xy) * q16);\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_pw_main, uv);\\n  uv_3 = ((tmpvar_5 * (1.0 - \\n    (q10 / (1.0 - (tmpvar_6.z + (0.003921569 * tmpvar_6.y))))\\n  )) + 0.5);\\n  vec4 tmpvar_7;\\n  tmpvar_7 = fract((8.0 * texture (sampler_noise_lq, (uv_3 + rand_frame.yz))));\\n  xlat_mutabledist = tmpvar_7.x;\\n  if ((tmpvar_7.y > 0.16)) {\\n    vec4 nb2_8;\\n    vec4 nb_9;\\n    vec4 tmpvar_10;\\n    tmpvar_10 = texture (sampler_pw_main, (uv_3 + vec2(-(pix))));\\n    nb_9.x = (1.0 - (tmpvar_10.z + (0.003921569 * tmpvar_10.y)));\\n    vec4 tmpvar_11;\\n    tmpvar_11 = texture (sampler_pw_main, (uv_3 + (pix * vec2(1.0, -1.0))));\\n    nb_9.y = (1.0 - (tmpvar_11.z + (0.003921569 * tmpvar_11.y)));\\n    vec4 tmpvar_12;\\n    tmpvar_12 = texture (sampler_pw_main, (uv_3 + vec2(pix)));\\n    nb_9.z = (1.0 - (tmpvar_12.z + (0.003921569 * tmpvar_12.y)));\\n    vec4 tmpvar_13;\\n    tmpvar_13 = texture (sampler_pw_main, (uv_3 + (pix * vec2(-1.0, 1.0))));\\n    nb_9.w = (1.0 - (tmpvar_13.z + (0.003921569 * tmpvar_13.y)));\\n    vec4 tmpvar_14;\\n    tmpvar_14 = texture (sampler_pw_main, (uv_3 + (pix * vec2(0.0, -1.0))));\\n    nb2_8.x = (1.0 - (tmpvar_14.z + (0.003921569 * tmpvar_14.y)));\\n    vec4 tmpvar_15;\\n    tmpvar_15 = texture (sampler_pw_main, (uv_3 + (pix * vec2(1.0, 0.0))));\\n    nb2_8.y = (1.0 - (tmpvar_15.z + (0.003921569 * tmpvar_15.y)));\\n    vec4 tmpvar_16;\\n    tmpvar_16 = texture (sampler_pw_main, (uv_3 + (pix * vec2(0.0, 1.0))));\\n    nb2_8.z = (1.0 - (tmpvar_16.z + (0.003921569 * tmpvar_16.y)));\\n    vec4 tmpvar_17;\\n    tmpvar_17 = texture (sampler_pw_main, (uv_3 + (pix * vec2(-1.0, 0.0))));\\n    nb2_8.w = (1.0 - (tmpvar_17.z + (0.003921569 * tmpvar_17.y)));\\n    vec4 tmpvar_18;\\n    tmpvar_18 = min (nb_9, nb2_8);\\n    nb_9.zw = tmpvar_18.zw;\\n    nb_9.xy = min (tmpvar_18.xy, tmpvar_18.zw);\\n    xlat_mutabledist = ((min (nb_9.x, nb_9.y) + (\\n      (0.006 * (tmpvar_7.xyz - 0.5).x)\\n     * tmpvar_7.y)) - (q10 * 0.5));\\n  };\\n  float theta_19;\\n  theta_19 = (xlat_mutabledist * 1.35);\\n  float theta_20;\\n  theta_20 = (xlat_mutabledist * 1.35);\\n  vec3 tmpvar_21;\\n  tmpvar_21.xy = (xlat_mutableuv1 * ((\\n    sin(theta_19)\\n   / \\n    cos(theta_19)\\n  ) / 1.35));\\n  tmpvar_21.z = ((sin(theta_20) / cos(theta_20)) / 1.35);\\n  xlat_mutableuv2 = (((tmpvar_21 / q7) * tmpvar_1) + tmpvar_2);\\n  xlat_mutableuv2 = (((\\n    fract(((xlat_mutableuv2 / 4.0) + 0.5))\\n   - 0.5) * 2.0) + vec3(1.0, 2.0, 3.0));\\n  vec3 zz0_23;\\n  vec3 zz_24;\\n  zz_24 = xlat_mutableuv2;\\n  zz0_23 = (xlat_mutableuv2 + q8);\\n  for (int n_22 = 0; n_22 <= 8; n_22++) {\\n    zz_24 = ((2.0 * clamp (zz_24, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_24);\\n    zz_24 = (zz_24 * max ((1.0/(\\n      dot (zz_24, zz_24)\\n    )), 1.0));\\n    zz_24 = ((2.6 * zz_24) + zz0_23);\\n  };\\n  vec4 tmpvar_25;\\n  tmpvar_25.w = 0.0;\\n  tmpvar_25.xyz = zz_24;\\n  float tmpvar_26;\\n  tmpvar_26 = sqrt(dot (zz_24, zz_24));\\n  vec4 tmpvar_27;\\n  tmpvar_27.w = 0.0;\\n  tmpvar_27.xyz = mod1;\\n  xlat_mutablestruc = ((1.0 - (\\n    (1.4 * dot (tmpvar_25, tmpvar_27))\\n   / 40.0)) - (xlat_mutabledist * 0.3));\\n  if (((tmpvar_26 < 40.0) && (xlat_mutabledist > (0.04 * \\n    (1.0 - rad)\\n  )))) {\\n    ret_4.x = mix (xlat_mutablestruc, texture (sampler_main, uv_3).x, sustain);\\n    float x_28;\\n    x_28 = ((1.0 - xlat_mutabledist) * 255.0);\\n    float ip_29;\\n    ip_29 = float(int(x_28));\\n    vec2 tmpvar_30;\\n    tmpvar_30.x = (x_28 - ip_29);\\n    tmpvar_30.y = (ip_29 / 255.0);\\n    ret_4.yz = tmpvar_30;\\n  } else {\\n    ret_4 = ((texture (sampler_fc_main, uv_3) * sustain) - 0.003921569).xyz;\\n  };\\n  vec4 tmpvar_31;\\n  tmpvar_31.w = 1.0;\\n  tmpvar_31.xyz = ret_4;\\n  ret = tmpvar_31.xyz;\\n }\",comp:\"float xlat_mutablecross1;\\nvec2 xlat_mutabledz1;\\nfloat xlat_mutablerdist;\\nvec2 xlat_mutableuv0;\\nvec2 xlat_mutableuv4;\\nvec2 xlat_mutableuva;\\nvec2 xlat_mutableuvb;\\n shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1.x = q1;\\n  tmpvar_1.y = q2;\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = q17;\\n  tmpvar_2.y = q18;\\n  vec2 uv_3;\\n  vec3 ret_4;\\n  uv_3 = (uv + (texsize.zw / 2.0));\\n  xlat_mutableuv0 = uv_3;\\n  vec2 uvi_5;\\n  uvi_5 = (uv_3 + vec2(0.002, 0.0));\\n  float tmpvar_6;\\n  tmpvar_6 = mix (((texture (sampler_blur1, uvi_5).xyz * scale1) + bias1).x, texture (sampler_main, uvi_5).x, 0.1);\\n  vec2 uvi_7;\\n  uvi_7 = (uv_3 - vec2(0.002, 0.0));\\n  float tmpvar_8;\\n  tmpvar_8 = mix (((texture (sampler_blur1, uvi_7).xyz * scale1) + bias1).x, texture (sampler_main, uvi_7).x, 0.1);\\n  xlat_mutabledz1.x = ((tmpvar_6 * float(\\n    (tmpvar_6 > 0.02)\\n  )) - (tmpvar_8 * float(\\n    (tmpvar_8 > 0.02)\\n  )));\\n  vec2 uvi_9;\\n  uvi_9 = (uv_3 + vec2(0.0, 0.002));\\n  float tmpvar_10;\\n  tmpvar_10 = mix (((texture (sampler_blur1, uvi_9).xyz * scale1) + bias1).x, texture (sampler_main, uvi_9).x, 0.1);\\n  vec2 uvi_11;\\n  uvi_11 = (uv_3 - vec2(0.0, 0.002));\\n  float tmpvar_12;\\n  tmpvar_12 = mix (((texture (sampler_blur1, uvi_11).xyz * scale1) + bias1).x, texture (sampler_main, uvi_11).x, 0.1);\\n  xlat_mutabledz1.y = ((tmpvar_10 * float(\\n    (tmpvar_10 > 0.02)\\n  )) - (tmpvar_12 * float(\\n    (tmpvar_12 > 0.02)\\n  )));\\n  uv_3 = (uv_3 + (xlat_mutabledz1 * 0.26));\\n  xlat_mutablerdist = ((texture (sampler_blur1, uv_3).xyz * scale1) + bias1).z;\\n  vec4 tmpvar_13;\\n  tmpvar_13.w = 0.0;\\n  tmpvar_13.xyz = texture (sampler_noise_hq, vec2(((xlat_mutablerdist * 0.05) + (time * 0.02)))).xyz;\\n  vec4 tmpvar_14;\\n  tmpvar_14 = mix (tmpvar_13, roam_sin, vec4(0.5, 0.5, 0.5, 0.5));\\n  xlat_mutableuv4 = (uv_3 - 0.4);\\n  xlat_mutableuva = ((xlat_mutableuv4 - tmpvar_1) - ((\\n    ((texture (sampler_blur1, uv_3).xyz * scale1) + bias1)\\n  .x * 0.4) * float(\\n    (xlat_mutablerdist > 0.2)\\n  )));\\n  xlat_mutableuvb = ((xlat_mutableuv4 - tmpvar_2) - ((\\n    (texture (sampler_blur1, uv_3).xyz * scale1)\\n   + bias1).x * 0.4));\\n  float angle_15;\\n  float tmpvar_16;\\n  tmpvar_16 = abs(xlat_mutableuva.x);\\n  if ((xlat_mutableuva.y >= 0.0)) {\\n    angle_15 = (1.0 - ((xlat_mutableuva.y - tmpvar_16) / (xlat_mutableuva.y + tmpvar_16)));\\n  } else {\\n    angle_15 = (3.0 - ((xlat_mutableuva.y + tmpvar_16) / (tmpvar_16 - xlat_mutableuva.y)));\\n  };\\n  float tmpvar_17;\\n  if ((xlat_mutableuva.x < 0.0)) {\\n    tmpvar_17 = -(angle_15);\\n  } else {\\n    tmpvar_17 = angle_15;\\n  };\\n  xlat_mutablecross1 = ((pow (\\n    sin((3.141593 * (tmpvar_17 + (5.1 * q20))))\\n  , 1.5) + (xlat_mutablerdist / 2.0)) + 0.1);\\n  vec3 tmpvar_18;\\n  tmpvar_18 = vec3((((1.0/(\\n    dot (xlat_mutableuva, xlat_mutableuva)\\n  )) / xlat_mutablecross1) * q3));\\n  vec3 tmpvar_19;\\n  tmpvar_19 = vec3(((1.0/(dot (xlat_mutableuvb, xlat_mutableuvb))) * q19));\\n  ret_4 = (clamp ((1.0 - \\n    (2.0 * xlat_mutablerdist)\\n  ), 0.0, 1.0) * ((\\n    (tmpvar_18 * tmpvar_14.xyz)\\n   + \\n    (tmpvar_19 * (1.0 - tmpvar_14.xyz))\\n  ) + 0.1));\\n  ret_4 = (ret_4 + (clamp (\\n    (2.0 * xlat_mutablerdist)\\n  , 0.0, 1.0) * (\\n    (tmpvar_18 * tmpvar_14.zyx)\\n   + \\n    (tmpvar_19 * (1.0 - tmpvar_14.zyx))\\n  )));\\n  ret_4 = (ret_4 + ((\\n    (texture (sampler_blur1, xlat_mutableuv0).xyz * scale1)\\n   + bias1).x * 0.05));\\n  ret_4 = (1.0 - exp(-(ret_4)));\\n  vec4 tmpvar_20;\\n  tmpvar_20.w = 1.0;\\n  tmpvar_20.xyz = ret_4;\\n  ret = tmpvar_20.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:2,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:5,wave_dots:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:1.169162,wave_smoothing:0,wave_mystery:.08,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:.99,ob_size:.015,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:0,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b2x:.3,b1ed:0},shapes:[{baseVals:{enabled:1,sides:53,rad:.05408,tex_ang:1.00531,tex_zoom:1.531168,r:.2,g:.7,g2:0,a2:1,border_b:0,border_a:0},init_eqs_str:\"a.q24=0;a.rad0=0;\",frame_eqs_str:\"a.x=.5;a.y=.5;a.a=a.q24;a.a2=0;a.a=0;a.rad0=bnot(a.q24)*a.rad0+div(randint(10),50)*a.q24;a.rad=a.rad0;a.b=0;a.r=div(randint(10),10);a.g=1;a.a2=a.q24;\"},{baseVals:{enabled:1,sides:44,textured:1,x:.7,rad:.2173,tex_zoom:3.277448,g:1,b:.5,r2:1,b2:1,a2:1,border_r:.5,border_g:.5,border_b:0},init_eqs_str:\"a.rot0=0;a.q1=0;a.posx=0;a.q24=0;a.posy=0;a.rad0=0;\",frame_eqs_str:\"a.textured=1;a.rot0+=div(1,a.fps)*a.q1;a.posx=(1-a.q24)*a.posx+a.q24*(.3+div(randint(100),200));a.posy=(1-a.q24)*a.posy+a.q24*(.3+div(randint(100),200));a.rad0=(1-a.q24)*a.rad0+a.q24*(.05+div(randint(100),300));a.rad=a.rad0;a.x=a.posx;a.y=a.posy;a.ang=a.rot0;\"},{baseVals:{enabled:1,sides:63,x:.503,rad:.038857,tex_zoom:2.2233,g:.1,r2:1,b2:1,a2:.7,border_a:0},init_eqs_str:\"a.rot0=0;a.q2=0;a.posx=0;a.q24=0;a.posy=0;a.rad0=0;a.q26=0;\",frame_eqs_str:\"a.textured=1;a.rot0+=div(.1,a.fps)*a.q2;a.posx=(1-a.q24)*a.posx+a.q24*(.3+div(randint(100),200));a.posy=(1-a.q24)*a.posy+a.q24*(.3+div(randint(100),200));a.rad0=(1-a.q24)*a.rad0+a.q24*(.05+div(randint(100),400));a.rad=a.rad0;a.x=a.posx+a.q26;a.y=a.posy;a.ang=a.rot0;\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.q25=0;a.index=0;a.q22=0;a.q21=0;a.q29=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.rott=0;a.is_beat=0;a.q31=0;a.q23=0;a.k1=0;a.q24=0;a.t_rel=0;a.dec_slow=0;a.q10=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.p3=0;a.q3=0;a.t0=0;a.q7=0;a.ds=0;a.q28=0;a.q30=0;a.q20=0;a.p4=0;a.q8=0;\",frame_eqs_str:\"a.dec_med=pow(.7,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.beat=a.bass+a.mid+a.treb;a.beat*=a.beat;a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2*a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),2);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;\\na.q23=a.index;a.q24=a.is_beat;a.q26=a.bass_att+a.mid_att+a.treb_att+3;a.q27=a.index+1;a.q28=a.index2;a.q29=a.index2;a.monitor=a.q29;a.k1=a.is_beat*equal(mod(a.index,2),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,4);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.q5=Math.cos(div(a.time,17));a.q6=Math.sin(div(a.time,17));a.q7=-a.q2;a.q8=a.q1;a.ds=a.ds*a.dec_med+a.q24*(1-a.dec_med);a.q25=a.q24;a.q10=a.q22+3;a.t_rel=8*a.time;a.p3=\\na.p3*a.dec_med+(1-a.dec_med)*(100*a.index+0*a.q26);a.q30=a.p3;a.p4=a.dec_med*a.p4+(1-a.dec_med)*a.q27;a.q31=a.p4;a.zoom=1.1+.2*a.q1;a.warp=0;a.ob_size=.01;a.ob_r=.9;a.ob_g=1;a.ob_b=0;a.ob_a=.2*Math.sin(div(a.time,7));\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_3;\\n  tmpvar_3 = (sqrt(dot (tmpvar_2, tmpvar_2)) + (rand_frame * 13.0)).x;\\n  uv_1 = (uv + (clamp (\\n    ((sin(tmpvar_3) / cos(tmpvar_3)) / normalize(tmpvar_2))\\n  , vec2(-2.0, -2.0), vec2(2.0, 2.0)) / 16.0));\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = ((q24 * (\\n    ((texture (sampler_main, uv_1).xyz + ((0.1 * vec3(\\n      ((q1 * cos((uv_1.x * 44.0))) - cos((uv_1.y * 82.0)))\\n    )) * (1.0 + texture (sampler_noise_lq, \\n      ((uv_1 / 16.0) + (time / 100.0))\\n    )).xyz)) * 0.98)\\n   - 0.025)) + ((1.0 - q24) * texture (sampler_main, uv_orig).xyz));\\n  ret = tmpvar_4.xyz;\\n }\",comp:\"vec2 xlat_mutabledz;\\nvec3 xlat_mutableneu;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutableuv3;\\n shader_body { \\n  vec2 uv2_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.y = 0.0;\\n  tmpvar_2.x = texsize.z;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = 0.0;\\n  tmpvar_3.y = texsize.w;\\n  xlat_mutabledz.x = dot ((texture (sampler_main, (uv + tmpvar_2)).xyz - texture (sampler_main, (uv - tmpvar_2)).xyz), vec3(0.32, 0.49, 0.29));\\n  xlat_mutabledz.y = dot ((texture (sampler_main, (uv + tmpvar_3)).xyz - texture (sampler_main, (uv - tmpvar_3)).xyz), vec3(0.32, 0.49, 0.29));\\n  uv2_1 = (uv - 0.5);\\n  vec2 tmpvar_4;\\n  tmpvar_4.y = 0.0;\\n  float tmpvar_5;\\n  tmpvar_5 = (time / 8.0);\\n  tmpvar_4.x = tmpvar_5;\\n  float tmpvar_6;\\n  tmpvar_6 = (q27 * 2.0);\\n  xlat_mutableuv3 = (((tmpvar_6 * uv2_1) * 0.1) + tmpvar_4);\\n  xlat_mutableuv3 = (fract(xlat_mutableuv3) * aspect.yx);\\n  xlat_mutableuv3 = ((0.1 * cos(\\n    (22.0 * xlat_mutableuv3)\\n  )) + (18.0 * xlat_mutabledz));\\n  float tmpvar_7;\\n  tmpvar_7 = clamp ((0.02 / sqrt(\\n    dot (xlat_mutableuv3, xlat_mutableuv3)\\n  )), 0.0, 1.0);\\n  vec4 tmpvar_8;\\n  tmpvar_8 = (1.0 + roam_cos);\\n  xlat_mutableneu = ((0.1 * vec3(tmpvar_7)) + ((0.45 * \\n    dot (vec3(tmpvar_7), vec3(0.32, 0.49, 0.29))\\n  ) * tmpvar_8).xyz);\\n  xlat_mutableret1 = max (vec3(0.0, 0.0, 0.0), (xlat_mutableneu * 1.252262));\\n  vec2 tmpvar_9;\\n  tmpvar_9.y = 0.0;\\n  tmpvar_9.x = tmpvar_5;\\n  xlat_mutableuv3 = (((tmpvar_6 * uv2_1) * 0.1) + tmpvar_9);\\n  xlat_mutableuv3 = (fract(xlat_mutableuv3) * aspect.yx);\\n  xlat_mutableuv3 = ((0.1 * cos(\\n    (22.0 * xlat_mutableuv3)\\n  )) + (18.0 * xlat_mutabledz));\\n  float tmpvar_10;\\n  tmpvar_10 = clamp ((0.02 / sqrt(\\n    dot (xlat_mutableuv3, xlat_mutableuv3)\\n  )), 0.0, 1.0);\\n  xlat_mutableneu = ((0.1 * vec3(tmpvar_10)) + ((0.45 * \\n    dot (vec3(tmpvar_10), vec3(0.32, 0.49, 0.29))\\n  ) * tmpvar_8).xyz);\\n  xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * 1.252262));\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = (xlat_mutableret1 + clamp ((\\n    (texture (sampler_main, uv).xyz * 4.0)\\n   * \\n    (0.2 + xlat_mutableret1)\\n  ), 0.0, 1.0));\\n  ret = tmpvar_11.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:6,wave_thick:1,modwavealphabyvolume:1,darken:1,wave_a:.001,wave_scale:.159809,wave_smoothing:.45,wave_mystery:.08,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:0,wave_b:0,wave_y:.9,ob_r:1,ob_g:1,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b1x:.6999,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index=0;a.q22=0;a.q21=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.movez=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.q32=0;a.q7=0;a.q20=0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass+a.mid+a.treb;a.k1=a.is_beat*equal(a.index,0);a.p1=\\na.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_slow*a.p2+(1-a.dec_slow)*a.p1;a.rott=div(3.1416*a.p2,4);a.q27=a.index+1;a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.zoom=1;a.rot=-0*a.index;a.q32=pow(.996,div(30,a.fps));a.q5=div(Math.sin(div(a.time,11))+1,5);a.movez+=div(.06,a.fps)*(1.1+a.q1);a.q6=a.movez;a.q7=.005*Math.sin(div(a.time,15));\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\"vec3 xlat_mutablenoise;\\nvec2 xlat_mutablers;\\nvec2 xlat_mutablers0;\\nvec2 xlat_mutableuv1;\\n shader_body { \\n  vec3 copy_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = 0.5;\\n  tmpvar_2.y = q5;\\n  xlat_mutableuv1 = (uv - tmpvar_2);\\n  float tmpvar_3;\\n  tmpvar_3 = (1.0/(xlat_mutableuv1.y));\\n  xlat_mutablers0.x = (xlat_mutableuv1.x * tmpvar_3);\\n  xlat_mutablers0.y = tmpvar_3;\\n  xlat_mutablers.x = xlat_mutablers0.x;\\n  xlat_mutablers.y = (tmpvar_3 + (time * 0.3));\\n  xlat_mutablenoise = (vec3(dot (texture (sampler_pw_noise_lq, (xlat_mutablers / 63.0)), vec4(0.32, 0.49, 0.29, 0.0))) * (dot (texture (sampler_pw_noise_lq, \\n    (xlat_mutablers / 12.0)\\n  ), vec4(0.32, 0.49, 0.29, 0.0)) + 0.5));\\n  xlat_mutablenoise = (xlat_mutablenoise * (clamp (\\n    ((10.0 * xlat_mutablenoise) - 8.0)\\n  , 0.0, 1.0) * clamp (\\n    (2.0 / tmpvar_3)\\n  , 0.0, 1.0)));\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = uv.x;\\n  tmpvar_4.y = (uv.y - (0.024 / tmpvar_3));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = uv.x;\\n  tmpvar_5.y = (uv.y - (0.012 / tmpvar_3));\\n  copy_1 = (texture (sampler_main, tmpvar_4).xyz + texture (sampler_main, tmpvar_5).xyz);\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = uv.x;\\n  tmpvar_6.y = (uv.y - (0.006 / tmpvar_3));\\n  copy_1 = (copy_1 + texture (sampler_main, tmpvar_6).xyz);\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = ((xlat_mutablenoise + (\\n    (((copy_1 / 3.0) * (1.0 + slow_roam_cos).xyz) / 2.0)\\n   * 0.99)) - 0.005);\\n  ret = tmpvar_7.xyz;\\n }\",comp:\"vec3 xlat_mutablecont;\\nvec3 xlat_mutableneu;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutablers2;\\n shader_body { \\n  vec2 uv_1;\\n  float inten_2;\\n  float dist_3;\\n  uv_1 = (uv - 0.5);\\n  uv_1 = (uv_1 * aspect.xy);\\n  dist_3 = (1.0 - fract(q6));\\n  inten_2 = ((dist_3 * (1.0 - dist_3)) * 6.0);\\n  vec2 tmpvar_4;\\n  tmpvar_4 = fract(((uv_1 * dist_3) + 0.55));\\n  xlat_mutableneu = texture (sampler_main, tmpvar_4).xyz;\\n  xlat_mutableret1 = max (vec3(0.0, 0.0, 0.0), (xlat_mutableneu * inten_2));\\n  xlat_mutablecont = max (vec3(0.0, 0.0, 0.0), ((\\n    -(texture (sampler_main, tmpvar_4).xyz)\\n   + \\n    ((texture (sampler_blur1, (tmpvar_4 + q7)).xyz * scale1) + bias1)\\n  ) * inten_2));\\n  dist_3 = (1.0 - fract((0.5 + q6)));\\n  inten_2 = ((dist_3 * (1.0 - dist_3)) * 6.0);\\n  vec2 tmpvar_5;\\n  tmpvar_5 = fract(((uv_1 * dist_3) + 0.55));\\n  xlat_mutableneu = texture (sampler_main, tmpvar_5).xyz;\\n  xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * inten_2));\\n  xlat_mutablecont = max (xlat_mutablecont, ((\\n    -(texture (sampler_main, tmpvar_5).xyz)\\n   + \\n    ((texture (sampler_blur1, (tmpvar_5 + q7)).xyz * scale1) + bias1)\\n  ) * inten_2));\\n  dist_3 = (1.0 - fract((1.0 + q6)));\\n  inten_2 = ((dist_3 * (1.0 - dist_3)) * 6.0);\\n  vec2 tmpvar_6;\\n  tmpvar_6 = fract(((uv_1 * dist_3) + 0.55));\\n  xlat_mutableneu = texture (sampler_main, tmpvar_6).xyz;\\n  xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * inten_2));\\n  xlat_mutablecont = max (xlat_mutablecont, ((\\n    -(texture (sampler_main, tmpvar_6).xyz)\\n   + \\n    ((texture (sampler_blur1, (tmpvar_6 + q7)).xyz * scale1) + bias1)\\n  ) * inten_2));\\n  vec2 tmpvar_7;\\n  tmpvar_7.y = 5.0;\\n  tmpvar_7.x = (time / 12.0);\\n  xlat_mutablers2 = ((0.1 * cos(\\n    ((uv_1 * 3.0) + tmpvar_7)\\n  )) + (0.1 * xlat_mutableret1).xy);\\n  vec4 tmpvar_8;\\n  tmpvar_8.w = 1.0;\\n  tmpvar_8.xyz = (((-0.1 * xlat_mutableret1) + (\\n    (clamp ((0.005 / sqrt(\\n      dot (xlat_mutablers2, xlat_mutablers2)\\n    )), 0.0, 1.0) * vec3(18.0, 16.2, 10.8))\\n   * \\n    (0.2 + (0.3 * xlat_mutableret1))\\n  )) + ((\\n    dot (xlat_mutablecont, vec3(0.32, 0.49, 0.29))\\n   * \\n    (1.0 + slow_roam_cos)\\n  ) / 2.0).xyz);\\n  ret = tmpvar_8.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:6,wave_dots:1,modwavealphabyvolume:1,darken:1,wave_a:.001,wave_scale:1.740724,wave_smoothing:.45,wave_mystery:.08,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_g:.99,ob_size:0,ob_r:1,ob_b:1,ob_a:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.index4=0;a.index=0;a.q22=0;a.q21=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.index3=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.t_rel=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.movez=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.p3=0;a.q3=0;a.t0=0;a.q7=0;a.q28=0;a.q30=0;a.q20=0;a.q8=0;a.p3=0;a.t_rel=0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.5+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),4);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),3);a.monitor=a.index4;\\na.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass_att+a.mid_att+a.treb_att+1;a.k1=a.is_beat*equal(a.index,0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.p3=a.dec_med*a.p3+(1-a.dec_med)*a.p2;a.rott=div(3.14159265359*a.p3,2);a.q27=8-a.index;a.q28=a.index2+1;a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.t_rel+=div(.6,a.fps)*a.q1*a.q1;a.q5=Math.cos(a.t_rel);a.q6=Math.sin(a.t_rel);a.q7=-a.q6;a.q8=a.q5;a.movez+=div(div(.6,\\na.fps),(1.4-a.q5)*(1.4-a.q5));a.q30=a.movez;a.zoom=1;\",pixel_eqs_str:\"a.dx=div(0*a.q28,8);\",warp:\"vec3 xlat_mutablenoise;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutablers;\\n shader_body { \\n  float z_1;\\n  mat2 tmpvar_2;\\n  tmpvar_2[uint(0)] = _qb.xy;\\n  tmpvar_2[1u] = _qb.zw;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = ((uv * tmpvar_2) - 0.5);\\n  float tmpvar_4;\\n  tmpvar_4 = (0.4 / abs(tmpvar_3.y));\\n  xlat_mutablers.x = (tmpvar_3.x * tmpvar_4);\\n  xlat_mutablers.y = (tmpvar_4 + q30);\\n  vec4 tmpvar_5;\\n  tmpvar_5 = texture (sampler_pw_noise_lq, (xlat_mutablers / 32.0));\\n  xlat_mutablenoise = (tmpvar_5.xyz * vec3(greaterThanEqual (tmpvar_5.xyz, vec3(0.9, 0.9, 0.9))));\\n  xlat_mutablenoise = (xlat_mutablenoise * (1.0 + (0.5 * \\n    (dot (texture (sampler_noise_hq, (16.0 * xlat_mutablers)), vec4(0.32, 0.49, 0.29, 0.0)) - 0.5)\\n  )));\\n  xlat_mutableret1 = xlat_mutablenoise;\\n  z_1 = (1.2 / abs(tmpvar_3.y));\\n  xlat_mutablers.x = (tmpvar_3.x * z_1);\\n  xlat_mutablers.y = (z_1 + q30);\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_pw_noise_lq, (xlat_mutablers / 32.0));\\n  xlat_mutablenoise = (tmpvar_6.xyz * vec3(greaterThanEqual (tmpvar_6.xyz, vec3(0.9, 0.9, 0.9))));\\n  xlat_mutableret1 = (xlat_mutableret1 + xlat_mutablenoise);\\n  z_1 = (0.4 / abs(tmpvar_3.x));\\n  xlat_mutablers.y = (tmpvar_3.y * z_1);\\n  xlat_mutablers.x = (z_1 + q30);\\n  vec4 tmpvar_7;\\n  tmpvar_7 = texture (sampler_pw_noise_lq, (xlat_mutablers / 32.0));\\n  xlat_mutablenoise = (tmpvar_7.xyz * vec3(greaterThanEqual (tmpvar_7.xyz, vec3(0.9, 0.9, 0.9))));\\n  xlat_mutablenoise = (xlat_mutablenoise * (1.0 + (0.5 * \\n    (dot (texture (sampler_noise_hq, (16.0 * xlat_mutablers)), vec4(0.32, 0.49, 0.29, 0.0)) - 0.5)\\n  )));\\n  xlat_mutableret1 = (xlat_mutableret1 + xlat_mutablenoise);\\n  z_1 = (1.2 / abs(tmpvar_3.x));\\n  xlat_mutablers.y = (tmpvar_3.y * z_1);\\n  xlat_mutablers.x = (z_1 + q30);\\n  vec4 tmpvar_8;\\n  tmpvar_8 = texture (sampler_pw_noise_lq, (xlat_mutablers / 32.0));\\n  xlat_mutablenoise = (tmpvar_8.xyz * vec3(greaterThanEqual (tmpvar_8.xyz, vec3(0.9, 0.9, 0.9))));\\n  xlat_mutableret1 = (xlat_mutableret1 + xlat_mutablenoise);\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = xlat_mutableret1;\\n  ret = tmpvar_9.xyz;\\n }\",comp:\"uniform sampler2D sampler_clouds2;\\n shader_body { \\n  vec2 uv_1;\\n  vec2 uv1_2;\\n  uv_1 = (uv * aspect.xy);\\n  vec2 tmpvar_3;\\n  tmpvar_3.y = 0.0;\\n  tmpvar_3.x = texsize.z;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = 0.0;\\n  tmpvar_4.y = texsize.w;\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (dot (texture (sampler_main, (uv_1 - tmpvar_3)).xyz, vec3(0.32, 0.49, 0.29)) - dot (texture (sampler_main, (uv_1 + tmpvar_3)).xyz, vec3(0.32, 0.49, 0.29)));\\n  tmpvar_5.y = (dot (texture (sampler_main, (uv_1 - tmpvar_4)).xyz, vec3(0.32, 0.49, 0.29)) - dot (texture (sampler_main, (uv_1 + tmpvar_4)).xyz, vec3(0.32, 0.49, 0.29)));\\n  uv1_2 = ((0.3 * sin(\\n    ((uv_1 + (0.02 * time)) * 6.0)\\n  )) + (0.2 * tmpvar_5));\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_clouds2, (uv_orig + tmpvar_5));\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = (((-2.0 * \\n    (0.1 * texture (sampler_main, uv_1))\\n  .xyz) + (\\n    clamp (((0.004 * q26) / sqrt(dot (uv1_2, uv1_2))), 0.0, 1.0)\\n   * vec3(1.0, 0.8, 0.4))) + (0.4 * (tmpvar_6.xyz + \\n    (dot (tmpvar_6.xyz, vec3(0.32, 0.49, 0.29)) - 0.7)\\n  )));\\n  ret = tmpvar_7.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.780001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:5,wave_dots:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:5.552,wave_smoothing:.504,wave_mystery:-1,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_g:0,wave_b:0,ob_size:.06,ob_r:1,ob_g:1,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1x:.6999,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:5,additive:1,x:.9,rad:.22613,g:.6,g2:0,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"a.x=.05+div(randint(900),1E3);a.y=.05+div(randint(900),1E3);a.ang=div(randint(320),100);\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.ready=0;a.index2=0;a.index4=0;a.index=0;a.q22=0;a.q21=0;a.sp0=0;a.q29=0;a.q1=0;a.dec_med=0;a.q5=0;a.index3=0;a.rott=0;a.is_beat=0;a.q31=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.go=0;a.q4=0;a.is_beat2=0;a.q26=0;a.p2=0;a.avg=0;a.movez=0;a.q19=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.q32=0;a.q28=0;a.q30=0;a.q20=0;a.index4=randint(2);a.index3=randint(4);\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.5+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,4);a.index2=mod(a.index2+a.is_beat*bnot(a.index),4);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),4);a.index4=mod(a.index4+\\na.is_beat*bnot(a.index)*bnot(a.index2)*bnot(a.index3),2);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass+a.mid+a.treb;a.ready=a.is_beat*bnot(a.ready)+bnot(a.is_beat2)*a.ready;a.is_beat2=a.ready*above(a.time,a.t0+.2);a.q19=a.is_beat2;a.k1=a.is_beat*equal(a.index,0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.14159265359*a.p2,2);a.q27=a.index+1;a.q28=a.index2+1;a.q29=4*a.index3+1;a.q30=a.index4;a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);\\na.q3=-a.q2;a.q4=a.q1;a.sp0=a.dec_slow*a.sp0+(a.q24+.05)*(1-a.dec_slow);a.go=a.go*a.dec_med+(1-a.dec_med)*(1-bnot(a.index2+a.index3));a.movez+=div(.015*30,a.fps)*a.go;a.q31=a.movez;a.q32=.5+.02*Math.sin(div(a.time,5));a.q5=mod(a.index4,2);a.zoom=1;a.rot=0;a.dx=.05*Math.max(Math.sin(div(a.time,9.7))-.95,0);a.dy=.002*(1-a.go);a.rot=50*(a.dx-a.dy);\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = ((uv * texsize.xy) * 0.03);\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = (cos((tmpvar_1.y * q1)) * sin(-(tmpvar_1.y)));\\n  tmpvar_2.y = (sin(tmpvar_1.x) * cos((tmpvar_1.y * q2)));\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ((texture (sampler_main, (uv - \\n    ((tmpvar_2 * texsize.zw) * 18.0)\\n  )).xyz * 0.99) - 0.01);\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv1_1;\\n  vec3 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv).xyz;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = (texture (sampler_main, (uv - vec2(0.001, 0.0))).xyz - texture (sampler_main, (uv + vec2(0.001, 0.0))).xyz).x;\\n  tmpvar_3.y = (texture (sampler_main, (uv - vec2(0.0, 0.001))).xyz - texture (sampler_main, (uv + vec2(0.0, 0.001))).xyz).x;\\n  uv1_1 = ((0.3 * cos(\\n    ((uv - 0.5) + 1.8)\\n  )) - (2.0 * tmpvar_3));\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = (0.8 * ((0.3 * \\n    dot (tmpvar_2, vec3(0.32, 0.49, 0.29))\\n  ) + (\\n    (22.0 * clamp ((0.01 / sqrt(\\n      dot (uv1_1, uv1_1)\\n    )), 0.0, 1.0))\\n   * \\n    (tmpvar_2 + 0.1)\\n  )));\\n  ret = tmpvar_4.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:7,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,wrap:0,darken:1,wave_a:.001,wave_scale:.958,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:0,wave_b:0,ob_size:.05,ob_g:.1,ob_b:1,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:25.6,mv_y:9.6,mv_l:0,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.look=0;a.n=0;a.reg26=0;a.uvx0=0;a.reg34=0;a.reg28=0;a.reg23=0;a.q25=0;a.angchg=0;a.reg20=0;a.reg15=0;a.reg10=0;a.q12=0;a.v3=0;a.q22=0;a.q21=0;a.diry=0;a.q13=0;a.q6=0;a.posx=0;a.fps_=0;a.reg25=0;a.uvx=0;a.q1=0;a.travel=0;a.posz=0;a.q5=0;a.dirz=0;a.dec_s=0;a.reg16=0;a.slow=0;a.reg36=0;a.reg22=0;a.uvy=0;a.rotz=0;a.ly=0;a.dist_=0;a.q23=0;a.q24=0;a.reg24=0;a.cran0=0;a.ran2=0;a.q11=0;a.q10=0;a.reg14=0;a.posy=0;a.reg31=0;a.dirx=0;a.q4=0;a.start=0;a.reg12=0;a.reg13=0;a.c2=0;a.reg37=\\n0;a.s3=0;a.yslope=0;a.lampy=0;a.q16=0;a.xslope=0;a.q26=0;a.reg38=0;a.reg35=0;a.reg11=0;a.tx=0;a.avg=0;a.uvz=0;a.c3=0;a.uvy0=0;a.reg27=0;a.q19=0;a.beat=0;a.reg32=0;a.lx=0;a.reg21=0;a.uvz0=0;a.len=0;a.reg18=0;a.reg30=0;a.q2=0;a.q27=0;a.slen=0;a.q14=0;a.dist=0;a.reg17=0;a.v1=0;a.speed=0;a.s1=0;a.t0=0;a.s2=0;a.ran1=0;a.reg33=0;a.q7=0;a.ds=0;a.q28=0;a.lampx=0;a.ty=0;a.c1=0;a.v2=0;a.q20=0;a.q8=0;a.avg=.01;a.q7=.25;a.q8=randint(2)-1;a.q16=1+randint(2);a.q18=randint(.8)+.1;a.q30=1;a.q31=128;a.start=1;a.travel=\\n0;a.rotz=0;a.look=0;a.slow=0;a.t0=a.time+3;a.lampx=.5;a.lampy=.5;a.cran0=randint(1);for(var b=a.n=0;1E4>b;b++)a.gmegabuf[Math.floor(a.n)]=0,a.n+=1;for(b=a.n=0;1E4>b;b++)a.megabuf[Math.floor(a.n)]=0,a.n+=1;a.trelx=0;a.trely=0;a.trelz=0;a.reg20=1;a.reg21=0;a.reg22=0;a.reg23=0;a.reg24=1;a.reg25=0;a.reg26=0;a.reg27=0;a.reg28=1;b=0;do{b+=1;var c;a.ran1=div(randint(800),100);a.ran2=div(randint(800),100);a.ran3=div(randint(800),100);a.posx=randint(5)-2;a.posy=randint(5)-2;a.posz=randint(5)-2;a.c1=Math.cos(a.ran1);\\na.c2=Math.cos(a.ran2);a.c3=Math.cos(a.ran3);a.s1=Math.sin(a.ran1);a.s2=Math.sin(a.ran2);a.s3=Math.sin(a.ran3);a.reg20=a.c2*a.c1;a.reg21=a.c2*a.s1;a.reg22=-a.s2;a.reg23=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg24=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg25=a.s3*a.c2;a.reg26=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg27=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg28=a.c3*a.c2;a.dist=.001;var d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;a.uvx=8*(div(a.uvx,\\n8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=\\na.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.05;c=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<Math.abs(c)&&1048576>\\nd);d=.06>a.dist?1:0}while(.00001<Math.abs(d)&&1048576>b);\",frame_eqs_str:\"a.fps_=0*a.fps_+1*(.00001<Math.abs(25>=a.fps?1:0)?a.fps:25+.5*(a.fps-25));a.dec_s=1-div(.06*30,a.fps_);a.beat=a.time>a.t0+3?1:0;a.t0=.00001<Math.abs(a.beat)?a.time:a.t0;a.speed=div(Math.min(.2,a.dist_-.02)*(1+2*a.avg)*(1-0*a.slow)*.7,a.q7);a.ds=a.ds*a.dec_s+div((1-a.dec_s)*a.speed*.25,a.fps_);a.rotz=.00001<Math.abs(.00001>Math.abs(a.rotz-0)?1:0)?a.beat*(randint(100)<20*a.travel?1:0)*(div(randint(10),10)-.3):bnot(a.beat*(30>randint(100)?1:0))*a.rotz;a.slow=.00001<Math.abs(bnot(a.slow))?\\na.beat*(6>randint(1E3*a.avg)?1:0):bnot(a.beat*(50>randint(100)?1:0));a.look=.00001<Math.abs(bnot(a.look))?a.beat*(12>randint(1E3*a.speed)?1:0):bnot(a.beat*(50>randint(100)?1:0));a.lx=.00001<Math.abs(a.beat)?div(randint(150),200)+.15:a.lx;a.ly=.00001<Math.abs(a.beat)?div(randint(150),200)+.15:a.ly;a.lampx=a.lampx*a.dec_s+(1-a.dec_s)*(.00001<Math.abs(a.look)?a.lx:.5);a.lampy=a.lampy*a.dec_s+(1-a.dec_s)*(.00001<Math.abs(a.look)?a.ly:.5);a.q1=a.lampx;a.q2=a.lampy;a.dirx=a.reg26;a.diry=a.reg27;a.dirz=\\na.reg28;a.posx+=a.ds*a.dirx;a.posy+=a.ds*a.diry;a.posz+=a.ds*a.dirz;a.q4=a.posx;a.q5=a.posy;a.q6=a.posz;a.angchg=(.2-a.dist_)*(.2>a.dist_?1:0)*2;a.travel=.00001<Math.abs(0<a.angchg?1:0)?0:a.travel+a.ds;a.v1=a.v1*a.dec_s+(1-a.dec_s)*a.rotz*a.ds;a.v2=a.v2*a.dec_s+div((1-a.dec_s)*a.angchg*a.xslope,a.fps_);a.v3=a.v3*a.dec_s+(1-a.dec_s)*(div(a.angchg*a.yslope,a.fps_)+2*a.v1*Math.sin(.1*a.time));a.reg30=a.reg20;a.reg31=a.reg21;a.reg32=a.reg22;a.reg33=a.reg23;a.reg34=a.reg24;a.reg35=a.reg25;a.reg36=a.reg26;\\na.reg37=a.reg27;a.reg38=a.reg28;a.n=0;for(var b=a.avg=0;5>b;b++){a.n+=1;a.ran1=div(randint(100),100);a.ran2=div(randint(100),200)-.25;a.tx=Math.cos(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.ty=Math.sin(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.c1=Math.cos(a.v1);a.c2=Math.cos(a.v2+a.ty);a.c3=Math.cos(a.v3+a.tx);a.s1=Math.sin(a.v1);a.s2=Math.sin(a.v2+a.ty);a.s3=Math.sin(a.v3+a.tx);a.reg10=a.c2*a.c1;a.reg11=a.c2*a.s1;a.reg12=-a.s2;a.reg13=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg14=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg15=a.s3*\\na.c2;a.reg16=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg17=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg18=a.c3*a.c2;a.reg20=a.reg30;a.reg21=a.reg31;a.reg22=a.reg32;a.reg23=a.reg33;a.reg24=a.reg34;a.reg25=a.reg35;a.reg26=a.reg36;a.reg27=a.reg37;a.reg28=a.reg38;a.q20=a.reg10*a.reg20+a.reg11*a.reg23+a.reg12*a.reg26;a.q21=a.reg10*a.reg21+a.reg11*a.reg24+a.reg12*a.reg27;a.q22=a.reg10*a.reg22+a.reg11*a.reg25+a.reg12*a.reg28;a.q23=a.reg13*a.reg20+a.reg14*a.reg23+a.reg15*a.reg26;a.q24=a.reg13*a.reg21+a.reg14*a.reg24+a.reg15*a.reg27;\\na.q25=a.reg13*a.reg22+a.reg14*a.reg25+a.reg15*a.reg28;a.q26=a.reg16*a.reg20+a.reg17*a.reg23+a.reg18*a.reg26;a.q27=a.reg16*a.reg21+a.reg17*a.reg24+a.reg18*a.reg27;a.q28=a.reg16*a.reg22+a.reg17*a.reg25+a.reg18*a.reg28;a.reg20=a.q20;a.reg21=a.q21;a.reg22=a.q22;a.reg23=a.q23;a.reg24=a.q24;a.reg25=a.q25;a.reg26=a.q26;a.reg27=a.q27;a.reg28=a.q28;a.dist=.002;var c,d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;\\na.uvx=8*(div(a.uvx,8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?\\n-2-a.uvz:a.uvz,a.slen=a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.1;c=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<\\nMath.abs(c)&&1048576>d);a.megabuf[Math.floor(a.n)]=a.megabuf[Math.floor(a.n)]*a.dec_s+(1-a.dec_s)*a.dist;a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5))}a.n=0;for(b=a.avg=0;5>b;b++)a.n+=1,a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5));a.xslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[1]-a.megabuf[3]),-3),3);a.yslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[4]-a.megabuf[2]),-3),3);a.monitor=a.avg;a.dist_=a.dist_*a.dec_s+(1-a.dec_s)*a.dist;a.q10=a.ds*a.q7;a.q14=Math.abs(a.ds)+2*(Math.abs(a.v1)+\\nMath.abs(a.v2)+Math.abs(a.v3))+div(1,255)+.05*a.start;a.q19=.6+.4*Math.sin(.02*a.time+6*a.cran0);a.start*=.9;a.q11=a.v1;a.q12=a.v2;a.q13=a.v3;a.monitor=a.q16;\",pixel_eqs_str:\"a.warp=0;a.zoom=1;a.dx=div(-a.q12,a.q16)*(1+0*pow(a.x-.5,2));a.dy=div(a.q13,a.q16)*(1+0*pow(a.y-.5,2));a.rot=a.q11;\",warp:\"float sustain;\\nfloat xlat_mutabledist;\\nfloat xlat_mutablestruc;\\nvec2 xlat_mutableuv1;\\nvec3 xlat_mutableuv2;\\n shader_body { \\n  mat3 tmpvar_1;\\n  tmpvar_1[uint(0)].x = q20;\\n  tmpvar_1[uint(0)].y = q23;\\n  tmpvar_1[uint(0)].z = q26;\\n  tmpvar_1[1u].x = q21;\\n  tmpvar_1[1u].y = q24;\\n  tmpvar_1[1u].z = q27;\\n  tmpvar_1[2u].x = q22;\\n  tmpvar_1[2u].y = q25;\\n  tmpvar_1[2u].z = q28;\\n  vec3 tmpvar_2;\\n  tmpvar_2.x = q4;\\n  tmpvar_2.y = q5;\\n  tmpvar_2.z = q6;\\n  sustain = (0.98 - q14);\\n  vec2 uv_3;\\n  vec3 ret_4;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (uv - 0.5);\\n  xlat_mutableuv1 = ((tmpvar_5 * aspect.xy) * q16);\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_pc_main, uv);\\n  uv_3 = ((tmpvar_5 * (1.0 - \\n    (q10 / (1.0 - ((tmpvar_6.z + \\n      (0.003921569 * tmpvar_6.y)\\n    ) + (q10 * 0.7))))\\n  )) + 0.5);\\n  vec4 tmpvar_7;\\n  tmpvar_7 = fract((8.0 * texture (sampler_noise_lq, (uv_3 + rand_frame.yz))));\\n  xlat_mutabledist = tmpvar_7.x;\\n  if ((tmpvar_7.y > 0.2)) {\\n    vec3 tmpvar_8;\\n    tmpvar_8 = (tmpvar_7.xyz - vec3(0.4, 0.5, 0.5));\\n    vec2 uvi_9;\\n    uvi_9 = ((tmpvar_8.zy * 0.003) + uv_3);\\n    vec2 pix_10;\\n    vec4 nb2_11;\\n    vec4 nb_12;\\n    vec2 x_13;\\n    x_13 = (uvi_9 - 0.5);\\n    pix_10 = (texsize.zw * (1.0 + (\\n      sqrt(dot (x_13, x_13))\\n     * 8.0)));\\n    float tmpvar_14;\\n    tmpvar_14 = (q10 * 0.7);\\n    vec4 tmpvar_15;\\n    tmpvar_15 = texture (sampler_pc_main, (uvi_9 - pix_10));\\n    nb_12.x = (1.0 - ((tmpvar_15.z + \\n      (0.003921569 * tmpvar_15.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_16;\\n    tmpvar_16 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(1.0, -1.0))));\\n    nb_12.y = (1.0 - ((tmpvar_16.z + \\n      (0.003921569 * tmpvar_16.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_17;\\n    tmpvar_17 = texture (sampler_pc_main, (uvi_9 + pix_10));\\n    nb_12.z = (1.0 - ((tmpvar_17.z + \\n      (0.003921569 * tmpvar_17.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_18;\\n    tmpvar_18 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(-1.0, 1.0))));\\n    nb_12.w = (1.0 - ((tmpvar_18.z + \\n      (0.003921569 * tmpvar_18.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_19;\\n    tmpvar_19 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(0.0, -1.0))));\\n    nb2_11.x = (1.0 - ((tmpvar_19.z + \\n      (0.003921569 * tmpvar_19.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_20;\\n    tmpvar_20 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(1.0, 0.0))));\\n    nb2_11.y = (1.0 - ((tmpvar_20.z + \\n      (0.003921569 * tmpvar_20.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_21;\\n    tmpvar_21 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(0.0, 1.0))));\\n    nb2_11.z = (1.0 - ((tmpvar_21.z + \\n      (0.003921569 * tmpvar_21.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_22;\\n    tmpvar_22 = texture (sampler_pc_main, (uvi_9 + (pix_10 * vec2(-1.0, 0.0))));\\n    nb2_11.w = (1.0 - ((tmpvar_22.z + \\n      (0.003921569 * tmpvar_22.y)\\n    ) + tmpvar_14));\\n    vec4 tmpvar_23;\\n    tmpvar_23 = min (nb_12, nb2_11);\\n    nb_12.zw = tmpvar_23.zw;\\n    nb_12.xy = min (tmpvar_23.xy, tmpvar_23.zw);\\n    xlat_mutabledist = (min (nb_12.x, nb_12.y) + ((0.008 * tmpvar_8.x) * abs(tmpvar_8.y)));\\n  };\\n  vec4 tmpvar_24;\\n  tmpvar_24 = texture (sampler_pc_main, uv_3);\\n  float tmpvar_25;\\n  tmpvar_25 = min (xlat_mutabledist, (1.0 - (\\n    (tmpvar_24.z + (0.003921569 * tmpvar_24.y))\\n   + \\n    (q10 * 0.7)\\n  )));\\n  xlat_mutabledist = tmpvar_25;\\n  float tmpvar_26;\\n  tmpvar_26 = (tmpvar_25 + pow (tmpvar_25, 3.0));\\n  vec3 tmpvar_27;\\n  tmpvar_27.xy = (xlat_mutableuv1 * tmpvar_26);\\n  tmpvar_27.z = tmpvar_26;\\n  xlat_mutableuv2 = (((tmpvar_27 / q7) * tmpvar_1) + tmpvar_2);\\n  xlat_mutableuv2 = ((fract(\\n    ((xlat_mutableuv2 / 8.0) + 0.5)\\n  ) - 0.5) * 8.0);\\n  float li_28;\\n  vec3 zz0_29;\\n  vec3 zz_30;\\n  zz0_29 = (xlat_mutableuv2 + q8);\\n  li_28 = 0.0;\\n  zz_30 = ((2.0 * clamp (xlat_mutableuv2, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - xlat_mutableuv2);\\n  float tmpvar_31;\\n  tmpvar_31 = dot (zz_30, zz_30);\\n  if ((tmpvar_31 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_31 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_31);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_32;\\n  tmpvar_32 = dot (zz_30, zz_30);\\n  if ((tmpvar_32 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_32 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_32);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_33;\\n  tmpvar_33 = dot (zz_30, zz_30);\\n  if ((tmpvar_33 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_33 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_33);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_34;\\n  tmpvar_34 = dot (zz_30, zz_30);\\n  if ((tmpvar_34 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_34 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_34);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_35;\\n  tmpvar_35 = dot (zz_30, zz_30);\\n  if ((tmpvar_35 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_35 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_35);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_36;\\n  tmpvar_36 = dot (zz_30, zz_30);\\n  if ((tmpvar_36 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_36 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_36);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_37;\\n  tmpvar_37 = dot (zz_30, zz_30);\\n  if ((tmpvar_37 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_37 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_37);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  zz_30 = ((2.0 * clamp (zz_30, vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0))) - zz_30);\\n  float tmpvar_38;\\n  tmpvar_38 = dot (zz_30, zz_30);\\n  if ((tmpvar_38 <= 0.25)) {\\n    zz_30 = (zz_30 * 4.0);\\n    li_28 = 24.0;\\n  } else {\\n    if ((tmpvar_38 <= 1.0)) {\\n      zz_30 = (zz_30 / tmpvar_38);\\n    };\\n  };\\n  zz_30 = ((2.6 * zz_30) + zz0_29);\\n  vec4 tmpvar_39;\\n  tmpvar_39.xyz = zz_30;\\n  tmpvar_39.w = li_28;\\n  float tmpvar_40;\\n  tmpvar_40 = sqrt(dot (zz_30, zz_30));\\n  xlat_mutablestruc = (sqrt(dot (tmpvar_39.xyw, tmpvar_39.xyw)) / 24.0);\\n  vec4 tmpvar_41;\\n  tmpvar_41 = texture (sampler_pc_main, uv_3);\\n  float tmpvar_42;\\n  float tmpvar_43;\\n  tmpvar_43 = (q10 * 0.7);\\n  tmpvar_42 = ((log(\\n    (1.0 + (tmpvar_40 / 24.0))\\n  ) * 0.02) * (1.0 - (1.0 - \\n    ((tmpvar_41.z + (0.003921569 * tmpvar_41.y)) + tmpvar_43)\\n  )));\\n  float tmpvar_44;\\n  vec4 tmpvar_45;\\n  tmpvar_45 = texture (sampler_pc_main, uv_3);\\n  tmpvar_44 = (1.0 - ((tmpvar_45.z + \\n    (0.003921569 * tmpvar_45.y)\\n  ) + tmpvar_43));\\n  if ((((tmpvar_25 <= tmpvar_44) && (tmpvar_40 < 24.0)) && (tmpvar_25 > 0.005))) {\\n    ret_4.x = (((1.0 - sustain) * xlat_mutablestruc) + (sustain * mix (texture (sampler_main, uv_3).xyz, \\n      ((texture (sampler_blur1, uv_3).xyz * scale1) + bias1)\\n    , vec3(\\n      (q14 * 4.0)\\n    )).x));\\n    float x_46;\\n    x_46 = ((1.0 - tmpvar_25) * 255.0);\\n    float ip_47;\\n    ip_47 = float(int(x_46));\\n    vec2 tmpvar_48;\\n    tmpvar_48.x = (x_46 - ip_47);\\n    tmpvar_48.y = (ip_47 / 255.0);\\n    ret_4.yz = tmpvar_48;\\n  } else {\\n    vec3 tmpvar_49;\\n    tmpvar_49.y = 0.0;\\n    tmpvar_49.x = sustain;\\n    tmpvar_49.z = (1.0 - tmpvar_42);\\n    vec3 tmpvar_50;\\n    tmpvar_50.xy = vec2(0.003921569, 0.0);\\n    tmpvar_50.z = (q14 / 6.0);\\n    ret_4 = ((texture (sampler_fc_main, uv_3).xyz * tmpvar_49) - tmpvar_50);\\n  };\\n  vec4 tmpvar_51;\\n  tmpvar_51.w = 1.0;\\n  tmpvar_51.xyz = ret_4;\\n  ret = tmpvar_51.xyz;\\n }\",comp:\" shader_body { \\n  vec3 tmpvar_1;\\n  tmpvar_1.x = q4;\\n  tmpvar_1.y = q5;\\n  tmpvar_1.z = q6;\\n  mat3 tmpvar_2;\\n  tmpvar_2[uint(0)].x = q20;\\n  tmpvar_2[uint(0)].y = q23;\\n  tmpvar_2[uint(0)].z = q26;\\n  tmpvar_2[1u].x = q21;\\n  tmpvar_2[1u].y = q24;\\n  tmpvar_2[1u].z = q27;\\n  tmpvar_2[2u].x = q22;\\n  tmpvar_2[2u].y = q25;\\n  tmpvar_2[2u].z = q28;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = q1;\\n  tmpvar_3.y = q2;\\n  vec2 uv_4;\\n  vec3 ret_5;\\n  uv_4 = (((uv - 0.5) * 0.9) + 0.5);\\n  vec3 tmpvar_6;\\n  tmpvar_6.xy = ((uv_4 - 0.5) * min ((1.0 - texture (sampler_main, uv_4).z), (1.0 - \\n    ((texture (sampler_blur2, uv_4).xyz * scale2) + bias2)\\n  .z)));\\n  tmpvar_6.z = min ((1.0 - texture (sampler_main, uv_4).z), (1.0 - (\\n    (texture (sampler_blur2, uv_4).xyz * scale2)\\n   + bias2).z));\\n  float tmpvar_7;\\n  tmpvar_7 = clamp ((abs(\\n    ((1.0 - ((texture (sampler_blur2, uv_4).xyz * scale2) + bias2).z) - clamp ((1.0 - (\\n      (texture (sampler_blur2, tmpvar_3).xyz * scale2)\\n     + bias2).z), 0.1, 0.4))\\n  ) + 0.2), 0.0, 1.0);\\n  float tmpvar_8;\\n  tmpvar_8 = clamp (((1.0 - \\n    exp(-(((texture (sampler_blur1, uv_4).xyz * scale1) + bias1).x))\\n  ) - 0.2), 0.0, 1.0);\\n  ret_5 = ((mix (texture (sampler_main, uv_4).xyz, \\n    ((texture (sampler_blur1, uv_4).xyz * scale1) + bias1)\\n  , vec3(tmpvar_7)).x * (0.2 + \\n    ((1.0 - tmpvar_7) * (1.0 - min ((1.0 - texture (sampler_main, uv_4).z), (1.0 - \\n      ((texture (sampler_blur2, uv_4).xyz * scale2) + bias2)\\n    .z))))\\n  )) * (1.0 + (0.5 * \\n    sin((((tmpvar_6 / q7) * tmpvar_2) + tmpvar_1))\\n  )));\\n  vec3 tmpvar_9;\\n  tmpvar_9.xy = vec2(0.0, 1.0);\\n  tmpvar_9.z = (tmpvar_8 * 3.0);\\n  ret_5 = (mix (ret_5, tmpvar_9, vec3(tmpvar_8)) + ((\\n    pow ((1.0 - mix (texture (sampler_main, uv_4).xyz, (\\n      (texture (sampler_blur1, uv_4).xyz * scale1)\\n     + bias1), vec3(0.8, 0.8, 0.8)).z), 3.0)\\n   * \\n    (0.5 + (0.5 * slow_roam_cos))\\n  ) * q19).xyz);\\n  ret_5 = (1.0 - exp((-2.0 * ret_5)));\\n  vec4 tmpvar_10;\\n  tmpvar_10.w = 1.0;\\n  tmpvar_10.xyz = ret_5;\\n  ret = tmpvar_10.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,wave_mode:7,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.958178,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,ob_r:.3999,ob_a:.2,ib_size:0,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:100,additive:1,x:.26,y:.2,rad:.393173,tex_zoom:.9355,r:0,g:.55,b:.5,g2:.4,b2:.4,a2:.07,border_r:.3,border_g:.7,border_b:.8,border_a:0},init_eqs_str:\"a.g0=0;a.y0=0;a.q1=0;a.x0=0;a.q24=0;a.q26=0;a.r0=0;a.trig=0;a.q2=0;a.b0=0;a.rad0=0;\",frame_eqs_str:\"a.trig=a.q24;a.x0=a.x0*bnot(a.trig)+a.trig*(.5+div(randint(100),200));a.y0=a.y0*bnot(a.trig)+a.trig*(.5+div(randint(100),200));a.x0+=div(.1*a.q1*(3+a.q26),a.fps);a.y0+=div(.1*a.q2*(3+a.q26),a.fps);a.x0-=Math.floor(a.x0);a.y0-=Math.floor(a.y0);a.tex_ang=a.time;a.tex_zoom=a.q1;a.ang=div(a.time,100)*a.q2;a.x=a.x0;a.y=a.y0;a.rad0=a.rad0*bnot(a.trig)+a.trig*(.04+div(randint(100),1E3));a.rad=a.rad0;a.r0=bnot(a.trig)*a.r0+div(a.trig*randint(10),10);a.g0=bnot(a.trig)*a.g0+div(a.trig*\\nrandint(10),10);a.b0=bnot(a.trig)*a.b0+div(a.trig*randint(10),10);a.r=a.r0;a.b=a.b0;a.g=a.g0;a.r2=0;a.b2=0;a.g2=0;a.a=1;a.a2=.3;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.index4=0;a.index=0;a.q22=0;a.q21=0;a.q1=0;a.dec_med=0;a.index3=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q11=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.q28=0;a.q20=0;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),2);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),3);a.monitor=a.index4;\\na.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass+a.mid+a.treb;a.q11=Math.min(a.q22,3);a.k1=a.is_beat*equal(a.index,0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.14159265359*a.p2,2);a.q27=8-a.index;a.q28=a.index2;a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.zoom=1+.02*a.q1;a.rot=.01*a.q2;a.dx=0*a.index;a.wave_a=0;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\"float xlat_mutabledx;\\nfloat xlat_mutabledy;\\nvec2 xlat_mutableuv2;\\nvec2 xlat_mutablezz;\\n shader_body { \\n  vec2 uv_1;\\n  vec3 crisp_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3.y = 0.0;\\n  tmpvar_3.x = texsize.w;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = 0.0;\\n  tmpvar_4.y = texsize.z;\\n  xlat_mutablezz = ((uv * texsize.xy) * 0.01);\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (cos((xlat_mutablezz.y * q1)) * sin(-(xlat_mutablezz.y)));\\n  tmpvar_5.y = (sin(xlat_mutablezz.x) * cos((xlat_mutablezz.y * q2)));\\n  uv_1 = (uv - ((tmpvar_5 * texsize.zw) * (8.0 + \\n    (6.0 * q11)\\n  )));\\n  xlat_mutableuv2 = (((uv_1 / 2.0) * q27) / 4.0);\\n  xlat_mutabledx = dot ((texture (sampler_main, (xlat_mutableuv2 + tmpvar_3)).xyz - texture (sampler_main, (xlat_mutableuv2 - tmpvar_3)).xyz), vec3(0.32, 0.49, 0.29));\\n  xlat_mutabledy = dot ((texture (sampler_main, (xlat_mutableuv2 + tmpvar_4)).xyz - texture (sampler_main, (xlat_mutableuv2 - tmpvar_4)).xyz), vec3(0.32, 0.49, 0.29));\\n  float tmpvar_6;\\n  tmpvar_6 = (0.15 + (0.1 * q28));\\n  vec2 tmpvar_7;\\n  tmpvar_7 = (xlat_mutableuv2 + (time / 100.0));\\n  xlat_mutabledx = (xlat_mutabledx + (tmpvar_6 * (texture (sampler_noise_hq, tmpvar_7).x - 0.5)));\\n  xlat_mutabledy = (xlat_mutabledy + (tmpvar_6 * (texture (sampler_noise_hq, tmpvar_7).y - 0.5)));\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = xlat_mutabledx;\\n  tmpvar_8.y = xlat_mutabledy;\\n  xlat_mutablezz = tmpvar_8;\\n  crisp_2 = (texture (sampler_main, (uv_1 + (tmpvar_8 * 0.04))).xyz + texture (sampler_main, uv_1).xyz);\\n  crisp_2 = (crisp_2 * 0.5);\\n  crisp_2 = (crisp_2 + ((0.05 * \\n    (0.9 + (0.1 * roam_cos))\\n  .xyz) - (\\n    sqrt(dot (tmpvar_8, tmpvar_8))\\n   * 0.3)));\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = ((crisp_2 * 0.97) - 0.015);\\n  ret = tmpvar_9.xyz;\\n }\",comp:\"vec2 xlat_mutabledz;\\nvec3 xlat_mutableneu;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutableuv3;\\n shader_body { \\n  vec2 uv2_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.y = 0.0;\\n  tmpvar_2.x = texsize.z;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = 0.0;\\n  tmpvar_3.y = texsize.w;\\n  xlat_mutabledz.x = dot ((texture (sampler_main, (uv + tmpvar_2)).xyz - texture (sampler_main, (uv - tmpvar_2)).xyz), vec3(0.32, 0.49, 0.29));\\n  xlat_mutabledz.y = dot ((texture (sampler_main, (uv + tmpvar_3)).xyz - texture (sampler_main, (uv - tmpvar_3)).xyz), vec3(0.32, 0.49, 0.29));\\n  uv2_1 = (uv - 0.5);\\n  xlat_mutableuv3 = ((0.2 * uv2_1) + 0.5);\\n  float tmpvar_4;\\n  tmpvar_4 = (time / 2.0);\\n  xlat_mutableuv3 = ((0.2 * cos(\\n    ((42.0 * fract(xlat_mutableuv3)) + tmpvar_4)\\n  )) + (99.0 * xlat_mutabledz));\\n  float tmpvar_5;\\n  tmpvar_5 = clamp ((0.01 / sqrt(\\n    dot (xlat_mutableuv3, xlat_mutableuv3)\\n  )), 0.0, 1.0);\\n  xlat_mutableneu = ((0.1 * vec3(tmpvar_5)) + (0.9 * dot (vec3(tmpvar_5), vec3(0.32, 0.49, 0.29))));\\n  xlat_mutableret1 = max (vec3(0.0, 0.0, 0.0), (xlat_mutableneu * 1.252262));\\n  xlat_mutableuv3 = ((0.2 * uv2_1) + 0.5);\\n  xlat_mutableuv3 = ((0.2 * cos(\\n    ((42.0 * fract(xlat_mutableuv3)) + tmpvar_4)\\n  )) + (99.0 * xlat_mutabledz));\\n  float tmpvar_6;\\n  tmpvar_6 = clamp ((0.01 / sqrt(\\n    dot (xlat_mutableuv3, xlat_mutableuv3)\\n  )), 0.0, 1.0);\\n  xlat_mutableneu = ((0.1 * vec3(tmpvar_6)) + (0.9 * dot (vec3(tmpvar_6), vec3(0.32, 0.49, 0.29))));\\n  xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * 1.252262));\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = (xlat_mutableret1 + clamp ((\\n    (16.0 * ((0.5 * texture (sampler_main, (uv + \\n      (0.1 * xlat_mutabledz)\\n    )).xyz) + 0.01))\\n   * \\n    (0.1 + xlat_mutableret1)\\n  ), 0.0, 1.0));\\n  ret = tmpvar_7.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:4,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.527,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:.8,wave_g:.49,ob_size:.015,ob_a:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b2x:.3,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:506,sep:116,spectrum:1,thick:1,scaling:1.07408,smoothing:0,a:.7},init_eqs_str:\"a.n=0;a.m=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.n=Math.floor((a.reg00+.5)*a.sample);a.m=30001+div(a.n,div(a.reg00,a.reg01));a.gmegabuf[Math.floor(a.m)]=a.value1+a.value2;a.x=a.gmegabuf[Math.floor(1E4+a.n)];a.y=a.gmegabuf[Math.floor(15E3+a.n)];a.a=a.gmegabuf[Math.floor(2E4+a.n)];a.b=Math.min(Math.max(a.gmegabuf[Math.floor(25E3+a.n)],0),1);a.r=1-a.b;a.g=.5;\"},{baseVals:{enabled:1,samples:506,thick:1,scaling:.89152,smoothing:.82},init_eqs_str:\"a.n=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.n=Math.floor((a.reg00+.5)*a.sample)+a.reg00;a.x=a.gmegabuf[Math.floor(1E4+a.n)];a.y=a.gmegabuf[Math.floor(15E3+a.n)];a.a=a.gmegabuf[Math.floor(2E4+a.n)];a.b=Math.min(Math.max(a.gmegabuf[Math.floor(25E3+a.n)],0),1);a.r=1-a.b;a.g=.5;\"},{baseVals:{enabled:1,samples:506,thick:1,scaling:.89152,smoothing:.82},init_eqs_str:\"a.n=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.n=Math.floor((a.reg00+.5)*a.sample)+2*a.reg00;a.x=a.gmegabuf[Math.floor(1E4+a.n)];a.y=a.gmegabuf[Math.floor(15E3+a.n)];a.a=a.gmegabuf[Math.floor(2E4+a.n)];a.b=Math.min(Math.max(a.gmegabuf[Math.floor(25E3+a.n)],0),1);a.r=1-a.b;a.g=.5;\"},{baseVals:{enabled:1,samples:506,spectrum:1,thick:1},init_eqs_str:\"a.n=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.n=Math.floor((a.reg00-.5)*a.sample)+3*a.reg00;a.x=a.gmegabuf[Math.floor(1E4+a.n)];a.y=a.gmegabuf[Math.floor(15E3+a.n)];a.a=a.gmegabuf[Math.floor(2E4+a.n)];a.b=Math.min(Math.max(a.gmegabuf[Math.floor(25E3+a.n)],0),1);a.r=1-a.b;a.g=.5;\"}],init_eqs_str:\"a.xang=0;a.fov=0;a.hell=0;a.cbeat=0;a.index2=0;a.bindex=0;a.ran4=0;a.index=0;a.dec_v=0;a.yang=0;a.q29=0;a.q6=0;a.amp_=0;a.xlen=0;a.smooth=0;a.q1=0;a.dec_med=0;a.sum=0;a.q5=0;a.dec_f=0;a.trely=0;a.flen=0;a.reg01=0;a.my=0;a.oz=0;a.imag=0;a.is_beat=0;a.yind=0;a.oy0a=0;a.dec_slow=0;a.ran2=0;a.ind=0;a.z0=0;a.ylen=0;a.real=0;a.ran4_=0;a.ran3=0;a.q4=0;a.mz=0;a.oy0=0;a.amp=0;a.tc0=0;a.oy=0;a.avg=0;a.mx=0;a.vol=0;a.ran2_=0;a.peak=0;a.decc=0;a.q2=0;a.bd_bt=0;a.zang=0;a.q3=0;a.reg00=0;\\na.trelz=0;a.q32=0;a.ran3_=0;a.q28=0;a.trelx=0;a.q30=0;a.ox=0;a.xind=0;for(var b=a.index=0;7E4>b;b++)a.megabuf[Math.floor(a.index)]=0,a.gmegabuf[Math.floor(a.index)]=0,a.index+=1;a.zang=1;a.yang=0;a.zang=2;\",frame_eqs_str:\"a.xlen=45;a.ylen=45;a.flen=30;a.reg00=div(a.xlen*a.ylen,4);a.reg01=div(a.reg00,4);a.dec_med=1-div(.06*30,a.fps);a.dec_slow=1-div(.6,a.fps);a.dec_f=pow(.8,div(30,a.fps));a.q30=a.dec_slow;a.smooth=Math.max(1,pow(6,div(a.fps,30))-2);a.cbeat=a.bass+a.mid+a.treb;a.decc=.00001<Math.abs(a.vol>a.cbeat?1:0)?.8:a.dec_med;a.vol=a.vol*a.decc+(1-a.decc)*a.cbeat;a.avg=a.avg*a.dec_slow+a.cbeat*(1-a.dec_slow);a.is_beat=above(a.cbeat,1.5*a.avg)*above(a.time,a.tc0+.2);a.tc0=.00001<Math.abs(bor(a.is_beat,\\na.bd_bt))?a.time:a.tc0;a.peak=.00001<Math.abs(a.is_beat)?a.cbeat:a.peak*a.dec_med;a.ind=0;a.sum=0;a.amp=.01;for(var b=0;b<a.reg01;b++)a.sum+=div(a.gmegabuf[Math.floor(a.ind+3E4)],a.reg01),a.amp+=pow(a.gmegabuf[Math.floor(a.ind+3E4)],2),a.ind+=1;a.ind=0;a.amp_=a.amp_*a.dec_med+600*div((1-a.dec_med)*sqrt(a.amp),a.reg01);for(b=0;b<a.reg01;b++)a.megabuf[Math.floor(a.ind+3E4)]=div(a.gmegabuf[Math.floor(a.ind+3E4)]-a.sum,a.amp_),a.ind+=1;for(b=a.index2=0;b<a.flen;b++){a.index=0;a.real=0;for(var c=a.imag=\\n0;c<a.flen;c++)a.real+=Math.cos(6.28*div(a.index,a.flen)*a.index2)*a.megabuf[Math.floor(div(a.index*a.reg01,8)+30002)],a.imag+=Math.sin(6.28*div(a.index,a.flen)*a.index2)*a.megabuf[Math.floor(div(a.index*a.reg01,8)+30002)],a.index+=1;a.megabuf[Math.floor(1E4+a.index2)]=a.megabuf[Math.floor(1E4+a.index2)]*a.dec_f+a.real;a.megabuf[Math.floor(15E3+a.index2)]=a.megabuf[Math.floor(15E3+a.index2)]*a.dec_f+a.imag;a.index2+=1}a.ind=1;for(b=0;b<div(a.flen,2);b++){a.cx=a.megabuf[Math.floor(1E4+a.ind)];a.cy=\\na.megabuf[Math.floor(15E3+a.ind)];a.yind=-1;for(c=0;3>c;c++){a.xind=-1;for(var d=0;3>d;d++)a.ox=mod((a.cx+.5)*a.xlen+a.xind,a.xlen),a.oy=mod((a.cy+.5)*a.ylen+a.yind,a.ylen),a.amp=3*(a.cx*a.cx+a.cy*a.cy),a.megabuf[Math.floor(a.oy*a.ylen+a.ox)]-=div(div(60,a.fps)*sqrt(a.amp)*above(a.amp,.02),1+a.xind*a.xind+a.yind*a.yind),a.xind+=1;a.yind+=1}a.ind+=1}for(b=a.yind=0;b<a.ylen;b++){for(c=a.xind=0;c<a.xlen;c++)a.megabuf[Math.floor(a.yind*a.ylen+a.xind+5E3)]=a.dec_med*(div(a.gmegabuf[Math.floor(a.yind*a.ylen+\\nmod(a.xind+1,a.xlen))]+a.gmegabuf[Math.floor(a.yind*a.ylen+mod(a.xlen+a.xind-1,a.xlen))]+a.gmegabuf[Math.floor(mod(a.yind+1,a.ylen)*a.ylen+a.xind)]+a.gmegabuf[Math.floor(mod(a.yind+a.ylen-1,a.ylen)*a.ylen+a.xind)]+a.gmegabuf[Math.floor(a.yind*a.ylen+a.xind)]*a.smooth*4,2+2*a.smooth)-a.megabuf[Math.floor(a.yind*a.ylen+a.xind)]),a.xind+=1;a.yind+=1}a.bindex+=a.is_beat;.00001<Math.abs(a.is_beat&&.00001>Math.abs(mod(a.bindex,4)-0)?1:0)?a.ran2=div(randint(100)-30,60):0;.00001<Math.abs(a.is_beat&&.00001>\\nMath.abs(mod(a.bindex,4)-2)?1:0)?a.ran3=div(randint(100)-30,60):0;.00001<Math.abs(a.is_beat&&.00001>Math.abs(mod(a.bindex,6)-2)?1:0)?a.ran4=div(randint(100)-30,60):0;a.dec_v=Math.min(Math.max(0,1-div(8*a.vol,a.fps)),a.dec_slow);a.ran2_=a.ran2_*a.dec_v+(1-a.dec_v)*a.ran2;a.ran3_=a.ran3_*a.dec_v+(1-a.dec_v)*a.ran3;a.ran4_=a.ran4_*a.dec_v+(1-a.dec_v)*a.ran4;a.trelx+=div(div(a.ran2_,a.fps),7);a.trely+=div(div(a.ran3_,a.fps),2);a.trelz+=div(div(a.ran4_,a.fps),6);a.zang=6*Math.sin(a.trelz);a.xang=6*Math.sin(div(a.zang,\\n5)+a.trelx);a.yang=6*Math.sin(0*div(a.zang,3)+a.trely);a.q1=Math.cos(a.xang);a.q2=Math.sin(a.xang);a.q3=Math.cos(a.yang);a.q4=Math.sin(a.yang);a.q5=Math.cos(a.zang);a.q6=Math.sin(a.zang);a.fov=1;for(b=a.yind=0;b<a.ylen;b++){for(c=a.xind=0;c<a.xlen;c++)a.ind=a.yind*a.ylen+a.xind,a.megabuf[Math.floor(a.ind)]=a.gmegabuf[Math.floor(a.ind)],a.gmegabuf[Math.floor(a.ind)]=a.megabuf[Math.floor(a.ind+5E3)],a.oz=a.yind-div(a.ylen,2),a.ox=.00001<Math.abs(bnot(mod(a.yind,2)))?a.xind:a.xlen-a.xind-1,a.oy0a=div(a.oy0+\\na.oy0a,2.5),a.oy=a.gmegabuf[Math.floor(a.yind*a.ylen+a.ox)],a.oy0=a.oy,a.ox-=div(a.xlen,2),a.mx=a.ox*a.q5-a.oy*a.q6,a.my=a.ox*a.q6+a.oy*a.q5,a.ox=a.mx,a.oy=a.my,a.mx=a.ox*a.q3+a.oz*a.q4,a.mz=-a.ox*a.q4+a.oz*a.q3,a.ox=a.mx,a.oz=a.mz,a.my=a.oy*a.q1-a.oz*a.q2,a.mz=a.oy*a.q2+a.oz*a.q1,a.z0=90+40*Math.sin(14*a.trelz),a.oy=a.my,a.oz=a.mz+a.z0,a.gmegabuf[Math.floor(1E4+a.ind)]=div(a.fov*a.ox,a.oz)+.5,a.gmegabuf[Math.floor(15E3+a.ind)]=div(a.fov*a.oy,a.oz)+.5,a.hell=Math.max(Math.min(.5+div(a.oy0,4),1),.1),\\na.gmegabuf[Math.floor(2E4+a.ind)]=Math.max(Math.min(a.hell*(.5+.1*(a.oy0a-a.oy0)),1),.1),a.gmegabuf[Math.floor(25E3+a.ind)]=div(a.oy0,16)+.5,a.xind+=1;a.yind+=1}a.q29=div(50*a.fov,a.z0);a.q32=a.aspecty;a.q28=Math.min(div(a.vol,3)-.3,1);a.monitor=a.is_beat;\",pixel_eqs_str:\"a.rot=0;a.zoom=1.1;a.warp=0;a.dy=.02;\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = vec3(0.0, 0.0, 0.0);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\"vec3 xlat_mutablecol;\\n shader_body { \\n  vec2 uv_1;\\n  uv_1 = uv;\\n  int iter_3;\\n  vec3 ret_4;\\n  ret_4 = texture (sampler_main, uv).xyz;\\n  iter_3 = int((clamp (q29, 0.0, 1.0) * 8.0));\\n  for (int n_2 = 1; n_2 < iter_3; n_2++) {\\n    vec2 tmpvar_5;\\n    tmpvar_5.y = 0.0;\\n    tmpvar_5.x = float(n_2);\\n    vec2 tmpvar_6;\\n    tmpvar_6.y = 0.0;\\n    tmpvar_6.x = float(n_2);\\n    ret_4 = max (max (ret_4, texture (sampler_main, (uv_1 - \\n      (texsize.zw * tmpvar_5)\\n    )).xyz), texture (sampler_main, (uv_1 + (texsize.zw * tmpvar_6))).xyz);\\n  };\\n  float tmpvar_7;\\n  tmpvar_7 = clamp ((1.0 - (2.0 * \\n    dot (ret_4, vec3(0.32, 0.49, 0.29))\\n  )), 0.0, 1.0);\\n  float tmpvar_8;\\n  float tmpvar_9;\\n  tmpvar_9 = (uv.x - 0.5);\\n  tmpvar_8 = (0.5 / ((\\n    (uv.y + ((tmpvar_9 * 1.4) * (q5 * q3)))\\n   - 0.4) + (0.3 * q4)));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = (tmpvar_8 * tmpvar_9);\\n  tmpvar_10.y = tmpvar_8;\\n  vec3 tmpvar_11;\\n  tmpvar_11.x = q2;\\n  tmpvar_11.y = q4;\\n  tmpvar_11.z = q6;\\n  xlat_mutablecol = (0.5 + (0.5 * tmpvar_11));\\n  float x_12;\\n  x_12 = ((uv.x - (\\n    dot (ret_4, vec3(0.32, 0.49, 0.29))\\n   * 5.0)) + 0.5);\\n  ret_4 = (ret_4 * (q28 + (\\n    ((6.0 * (0.05 / sqrt(\\n      (x_12 * x_12)\\n    ))) * (1.0 + xlat_mutablecol))\\n   / 2.0)));\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = q1;\\n  tmpvar_13.y = (q3 + time);\\n  float tmpvar_14;\\n  tmpvar_14 = (((\\n    (texture (sampler_noise_lq, (tmpvar_10 + tmpvar_13)).x * tmpvar_7)\\n   * \\n    float((tmpvar_8 > 0.0))\\n  ) * 0.2) * min (1.0, (1.0/(tmpvar_8))));\\n  ret_4 = (ret_4 + tmpvar_14);\\n  ret_4 = (ret_4 + ((\\n    (sin((12.0 * q2)) * tmpvar_7)\\n   * tmpvar_14) * dot (\\n    (12.0 * ((texture (sampler_blur1, (tmpvar_10 - vec2(-0.5, 0.3))).xyz * scale1) + bias1))\\n  , vec3(0.32, 0.49, 0.29))));\\n  ret_4 = (ret_4 + ((\\n    ((0.5 / abs(tmpvar_8)) * normalize(xlat_mutablecol))\\n   * \\n    float((tmpvar_8 < 0.0))\\n  ) * tmpvar_7));\\n  vec4 tmpvar_15;\\n  tmpvar_15.w = 1.0;\\n  tmpvar_15.xyz = ret_4;\\n  ret = tmpvar_15.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1.980001,decay:.5,echo_zoom:.999998,echo_alpha:.5,echo_orient:3,modwavealphabyvolume:1,darken:1,wave_a:.001,wave_scale:10.437056,wave_smoothing:.45,wave_mystery:.08,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.4595,warpscale:2.0067,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:.99,ob_size:0,ob_r:1,ob_g:1,ob_b:1,ib_size:0,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.4999,mv_g:.4999,mv_b:.4999,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,rad:.048958,tex_ang:1.00531,tex_zoom:1.531168,r:.5,g:1,b:.9,r2:.83,g2:.93,b2:.8,a2:1,border_b:0,border_a:0},init_eqs_str:\"a.trel=0;a.q20=0;a.q28=0;a.q26=0;\",frame_eqs_str:\"a.trel=div(a.time,2)+a.q20;a.x=.5+Math.sin(2*a.trel);a.y=.5+Math.cos(1.3*a.trel+div(a.q28,3));a.a=div(a.q26,4)+.2;\"},{baseVals:{enabled:0}},{baseVals:{enabled:1,x:.503,rad:.038857,tex_zoom:.609857,g:.1,a:.9,r2:1,b2:1,border_r:.5,border_g:.5,border_b:.5,border_a:0},init_eqs_str:\"a.is_beat=0;a.t0=0;a.q21=0;\",frame_eqs_str:\"a.x=div(randint(10),10);a.y=div(randint(10),10);a.r=div(randint(4),3);a.g=div(randint(4),3);a.b=div(randint(4),3);a.is_beat=above(a.time,a.t0+.03);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.a=Math.min(div(a.q21,2),.9)*a.is_beat;a.rad=div(a.a*a.a,3);\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,sep:120,additive:1,scaling:.891519,smoothing:.82,a:.6},init_eqs_str:\"a.k1=0;a.k2=0;a.xi=0;a.yi=0;a.dx=0;a.dy=0;a.q22=0;a.t2=0;a.t1=1+.3*(.01*randint(101)-.01*randint(101));a.t2=1+.3*(.01*randint(101)-.01*randint(101));a.t3=1+.3*(.01*randint(101)-.01*randint(101));a.t4=1+.3*(.01*randint(101)-.01*randint(101));a.t5=1+.3*(.01*randint(101)-.01*randint(101));a.t6=1+.3*(.01*randint(101)-.01*randint(101));a.t7=1+.3*(.01*randint(101)-.01*randint(101));a.t8=1+.3*(.01*randint(101)-.01*randint(101));\",frame_eqs_str:\"a.t2+=a.bass_att;\",point_eqs_str:\"a.k1=mod(100*a.sample,8);a.k2=bnot(a.k1);a.xi=a.value1*a.k2+a.xi*(1-a.k2);a.yi=a.value2*(1-a.k2)+a.yi*a.k2;a.dx=.99*a.dx+a.xi;a.dy=.99*a.dy+a.yi;a.x=.5+div(a.xi,2);a.y=.5+div(a.yi,2);a.a=div(a.q22,8);a.a=Math.min(a.a,.2);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index=0;a.q22=0;a.q21=0;a.fade=0;a.q1=0;a.dec_med=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.q32=0;a.q20=0;a.fade=.5;\",frame_eqs_str:\"a.dec_med=pow(.9,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.5+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.q26=a.bass+a.mid+a.treb;a.k1=a.is_beat*equal(a.index,0);a.p1=\\na.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.14159265358*a.p2,2);a.q27=a.index+1;a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.zoom=1;a.rot=-0*a.index;a.fade=a.fade*a.dec_med+pow(.996,div(30,a.fps))*(1-a.dec_med);a.q32=a.fade;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 zz_1;\\n  mat2 tmpvar_2;\\n  tmpvar_2[uint(0)] = _qa.xy;\\n  tmpvar_2[1u] = _qa.zw;\\n  zz_1 = (((\\n    (uv - vec2(0.5, 0.5))\\n   * texsize.xy) * (0.015 * q27)) * tmpvar_2);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = (((q32 * texture (sampler_main, \\n    (uv + ((clamp (\\n      (sin(zz_1) / cos(zz_1))\\n    , vec2(-20.0, -20.0), vec2(20.0, 20.0)) * texsize.zw) * 8.0))\\n  ).xyz) + (\\n    (0.03 * texture (sampler_noise_lq, ((uv * 0.3) + (0.01 * rand_frame).xy)))\\n  .xyz * \\n    (1.0 - ((texture (sampler_blur1, uv).xyz * scale1) + bias1))\\n  )) - 0.02);\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1 = texture (sampler_main, uv);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ((tmpvar_1.xyz + clamp (\\n    (3.0 * (((texture (sampler_blur1, \\n      (uv - (0.01 * tmpvar_1.xyz).xy)\\n    ).xyz * scale1) + bias1) - vec3(0.1, 0.1, 0.2)))\\n  , 0.0, 1.0)) * 1.3);\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,decay:.5,echo_zoom:.952,echo_alpha:.5,echo_orient:3,wave_mode:6,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:2.103,wave_smoothing:.54,wave_mystery:.38,modwavealphastart:.81,modwavealphaend:1.4,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:0,wave_g:0,wave_b:0,ob_size:.015,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:1,sides:16,thickoutline:1,textured:1,num_inst:3,x:.73,rad:.29466,tex_zoom:1.87511,r:.7,g:.7,b:1,g2:0,border_b:0,border_a:0},init_eqs_str:\"a.trig=0;a.q25=0;a.x0=0;a.y0=0;\",frame_eqs_str:\"a.trig=a.q25;a.a=.8*a.trig;a.a2=0;a.x0=a.x0*bnot(a.trig)+div(a.trig*randint(100),100);a.y0=a.y0*bnot(a.trig)+div(a.trig*randint(100),100);a.tex_ang=randint(20);a.rad=.1+div(randint(10),8);a.x=a.x0;a.y=a.y0;a.r=.7+.3*Math.sin(div(a.time,12));a.b=.7+.3*Math.sin(div(a.time,15));a.g=.7+.3*Math.sin(div(a.time,8));a.r2=a.r;a.b2=a.b;a.g2=a.g;\"},{baseVals:{enabled:1,sides:36,thickoutline:1,textured:1,num_inst:4,x:.3,rad:.05429,ang:1.25664,tex_ang:.37699,tex_zoom:1.02841,g:.7,b:.5,r2:1,g2:0,border_g:.59,border_b:0,border_a:0},init_eqs_str:\"a.q31=0;a.q32=0;a.q30=0;\",frame_eqs_str:\"a.x=a.q31;a.y=a.q32;a.rad=.06;a.tex_ang=a.time;a.a=a.q30;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.q25=0;a.index=0;a.q12=0;a.q22=0;a.q21=0;a.q15=0;a.q29=0;a.q6=0;a.dec_med=0;a.q5=0;a.mindev=0;a.trel=0;a.t0a=0;a.mov1=0;a.vis=0;a.is_beat=0;a.q31=0;a.q23=0;a.q24=0;a.dec_slow=0;a.q11=0;a.hpeak=0;a.q10=0;a.sdev=0;a.med=0;a.spb=0;a.dir=0;a.spb_=0;a.q16=0;a.rota=0;a.q19=0;a.vol=0;a.peak=0;a.trig1=0;a.wamp=0;a.speed=0;a.t0=0;a.vol_=0;a.q32=0;a.q7=0;a.wamp_=0;a.q30=0;a.q20=0;a.q8=0;a.t0a=a.time;a.t0=a.time+.5;a.spb_=.5;a.volb=.5;a.volx=.5;a.vol_=1;a.index=0;a.mov1=0;a.sdev=.1;a.wamp_=\\n.1;\",frame_eqs_str:\"a.dec_med=pow(.8,div(30,a.fps));a.dec_slow=pow(.95,div(30,a.fps));a.vol=div(a.bass+a.med+a.treb,1.5);a.vol_=a.vol_*a.dec_slow+(1-a.dec_slow)*a.vol;a.is_beat=above(a.vol,a.vol_+2*a.peak)*above(a.time,a.t0+.45*a.spb_);a.t0a=.00001<Math.abs(a.is_beat)?a.t0:a.t0a;a.t0=.00001<Math.abs(a.is_beat)?a.time:a.t0;a.peak=.00001<Math.abs(a.is_beat)?a.vol:a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,128);a.spb=Math.min(a.t0-a.t0a+.01,2);a.spb_=.00001<Math.abs(a.is_beat)?.9*a.spb_+.1*a.spb:\\na.spb_;a.q20=a.vol_;a.q21=above(a.vol,2.7*a.vol_);a.q22=Math.max(0,a.peak-0)+.01;a.hpeak=a.hpeak*a.dec_med+(1-a.dec_med)*a.q21;a.q23=a.hpeak*(1+randint(8));a.q24=a.is_beat;a.q25=div(a.q22*(1+randint(8)),8);a.mindev=Math.min(Math.min(Math.abs(a.spb-a.spb_),Math.abs(2*a.spb-a.spb_)),Math.abs(a.spb-2*a.spb_));a.sdev=.00001<Math.abs(a.is_beat)?.8*a.sdev+.2*pow(a.mindev+.02,2):a.sdev;a.speed=div(div(1,a.fps),a.spb_);a.trel+=a.speed;a.q10=a.trel;a.wamp=Math.min(div(.001,a.sdev),.15);a.wamp_=a.wamp_*a.dec_slow+\\n(1-a.dec_slow)*a.wamp;a.q11=Math.sin(div(a.trel,2))*a.wamp_;a.q12=div(a.wamp_,2);a.rota=2*a.wamp_*Math.sin(div(a.trel,3));a.q5=Math.cos(a.rota);a.q6=Math.sin(a.rota);a.q7=-a.q6;a.q8=a.q5;a.q15=.05*-Math.sin(.5*a.trel);a.q16=div(Math.cos(a.trel)*a.wamp_,2);a.q19=.1*Math.sin(div(a.trel,12));a.trig1=bnot(a.vis)*bnot(randint(100*a.fps));a.vis=.00001<Math.abs(a.trig1)?1:a.vis*below(a.mov1,1);a.q30=a.vis;a.mov1=.00001<Math.abs(a.vis)?a.mov1+div(2*a.speed,a.fps):-1;a.dir=.00001<Math.abs(a.trig1)?randint(100):\\na.dir;a.q31=.5+.5*Math.cos(a.dir)*a.mov1;a.q32=.5+.5*Math.sin(a.dir)*a.mov1;a.q29=2+Math.sin(div(a.time,17));a.monitor=a.wamp;\",pixel_eqs_str:\"a.zoom=1+.02*a.rad*a.q20;a.dy=-0;a.warp=.1;a.dx=0;\",warp:\"mat2 ofs;\\nvec2 xlat_mutableuv2;\\nfloat xlat_mutablezv;\\n shader_body { \\n  mat2 tmpvar_1;\\n  tmpvar_1[uint(0)].x = texsize.z;\\n  tmpvar_1[uint(0)].y = 0.0;\\n  tmpvar_1[1u].x = 0.0;\\n  tmpvar_1[1u].y = texsize.w;\\n  ofs = (tmpvar_1 * 4.0);\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = ((uv.x - 0.5) + q19);\\n  tmpvar_2.y = (uv.y - 0.5);\\n  vec2 v_3;\\n  v_3.x = ofs[0].x;\\n  v_3.y = ofs[1].x;\\n  vec2 v_4;\\n  v_4.x = ofs[0].x;\\n  v_4.y = ofs[1].x;\\n  vec2 v_5;\\n  v_5.x = ofs[0].y;\\n  v_5.y = ofs[1].y;\\n  vec2 v_6;\\n  v_6.x = ofs[0].y;\\n  v_6.y = ofs[1].y;\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = (texture (sampler_main, (uv + v_3)) - texture (sampler_main, (uv - v_4))).z;\\n  tmpvar_7.y = (texture (sampler_main, (uv + v_5)) - texture (sampler_main, (uv - v_6))).z;\\n  xlat_mutablezv = (time * 0.08);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = (0.02 * time);\\n  tmpvar_8.y = (-0.05 * time);\\n  xlat_mutableuv2 = ((3.0 * tmpvar_2) + tmpvar_8);\\n  vec3 tmpvar_9;\\n  tmpvar_9.xy = xlat_mutableuv2;\\n  tmpvar_9.z = xlat_mutablezv;\\n  vec3 tmpvar_10;\\n  tmpvar_10.xy = (xlat_mutableuv2 * vec2(2.0, 2.0));\\n  tmpvar_10.z = (xlat_mutablezv * 2.0);\\n  vec3 tmpvar_11;\\n  tmpvar_11.xy = (xlat_mutableuv2 * vec2(4.0, 4.0));\\n  tmpvar_11.z = (xlat_mutablezv * 3.0);\\n  vec3 tmpvar_12;\\n  tmpvar_12.xy = (xlat_mutableuv2 * vec2(8.0, 8.0));\\n  tmpvar_12.z = (xlat_mutablezv * 7.0);\\n  xlat_mutableuv2 = (tmpvar_2 + ((\\n    (((texture (sampler_noisevol_hq, tmpvar_9).z + (texture (sampler_noisevol_hq, tmpvar_10).z / 2.0)) + (texture (sampler_noisevol_hq, tmpvar_11).z / 4.0)) + (texture (sampler_noisevol_hq, tmpvar_12).z / 8.0))\\n   - 1.0) * 0.1));\\n  vec4 tmpvar_13;\\n  tmpvar_13.w = 1.0;\\n  tmpvar_13.xyz = (((\\n    (((0.2 + (\\n      (((1.0 + bass_att) * 0.01) / sqrt(dot (xlat_mutableuv2, xlat_mutableuv2)))\\n     * \\n      (1.0 + normalize(slow_roam_cos))\\n    .xyz)) + ((rand_preset.z - 0.5) * xlat_mutableuv2.y)) * 0.1)\\n   / 2.0) + (texture (sampler_main, \\n    (uv - (0.02 * tmpvar_7))\\n  ).xyz * 0.9)) - 0.01);\\n  ret = tmpvar_13.xyz;\\n }\",comp:\"float xlat_mutablerain;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutablers;\\nvec2 xlat_mutablers0;\\nvec2 xlat_mutableuv1;\\nfloat xlat_mutablewater;\\nfloat xlat_mutablez;\\n shader_body { \\n  vec2 uv_1;\\n  mat2 tmpvar_2;\\n  tmpvar_2[uint(0)] = _qb.xy;\\n  tmpvar_2[1u] = _qb.zw;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = q15;\\n  tmpvar_3.y = q16;\\n  uv_1 = (((\\n    (((uv - 0.5) * tmpvar_2) * 0.7)\\n   * aspect.xy) + 0.5) + tmpvar_3);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = 0.5;\\n  tmpvar_4.y = ((q11 + 0.6) + (q12 * (\\n    sin(((uv_1.x * 6.0) + q10))\\n   * \\n    cos(((uv_1.y * 8.0) + (time * 0.6)))\\n  )));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (uv_1.x * 4.0);\\n  tmpvar_5.y = uv_1.y;\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = (uv_1.x * 4.0);\\n  tmpvar_6.y = uv_1.y;\\n  xlat_mutablerain = (texture (sampler_noise_lq, ((tmpvar_5 * 0.2) - time)).x + texture (sampler_noise_lq, ((tmpvar_6 * 0.5) - time)).x);\\n  float tmpvar_7;\\n  tmpvar_7 = (time / 4.0);\\n  xlat_mutablerain = (xlat_mutablerain * clamp ((\\n    (q20 / 2.0)\\n   - \\n    abs(sin(((uv.x / 4.0) - tmpvar_7)))\\n  ), 0.0, 1.0));\\n  xlat_mutableuv1 = ((uv_1 - tmpvar_4) + (xlat_mutablerain * 0.01));\\n  vec3 tmpvar_8;\\n  tmpvar_8.x = xlat_mutableuv1.y;\\n  tmpvar_8.y = (xlat_mutableuv1.x * 2.0);\\n  tmpvar_8.z = (time * 0.2);\\n  xlat_mutableuv1 = (xlat_mutableuv1 + ((texture (sampler_noisevol_hq, tmpvar_8) * \\n    (0.5 - abs(xlat_mutableuv1.y))\\n  ).x * 0.05));\\n  float tmpvar_9;\\n  tmpvar_9 = clamp ((128.0 * xlat_mutableuv1.y), 0.0, 1.0);\\n  xlat_mutablez = (0.4 / xlat_mutableuv1.y);\\n  xlat_mutablers0.x = (xlat_mutableuv1.x * xlat_mutablez);\\n  xlat_mutablers0.y = xlat_mutablez;\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = (xlat_mutablers0.x + tmpvar_7);\\n  tmpvar_10.y = (xlat_mutablez + (time * 4.0));\\n  xlat_mutablers = (tmpvar_10 * tmpvar_9);\\n  xlat_mutablewater = (texture (sampler_noise_hq, xlat_mutablers) + texture (sampler_noise_hq, ((xlat_mutablers / 4.0) - (time / 8.0)))).x;\\n  xlat_mutablewater = (xlat_mutablewater - 1.0);\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = (xlat_mutableuv1.x + 0.5);\\n  tmpvar_11.y = abs((0.5 - xlat_mutableuv1.y));\\n  xlat_mutableret1 = (((texture (sampler_main, uv_1).xyz * \\n    (1.0 - tmpvar_9)\\n  ) + (\\n    ((texture (sampler_main, (tmpvar_11 - (0.2 * xlat_mutablewater))).xyz * tmpvar_9) * pow ((1.0/(xlat_mutablez)), 0.2))\\n   * \\n    (2.0 - rand_preset.y)\\n  )) + ((\\n    (((0.25 + rand_preset.y) * (1.0 + (rand_preset.x * xlat_mutablewater))) * tmpvar_9)\\n   / xlat_mutablez) * vec3(0.0, 0.1, 0.1)));\\n  xlat_mutableret1 = (xlat_mutableret1 + (0.06 * xlat_mutablerain));\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 1.0;\\n  tmpvar_12.xyz = (1.0 - exp((\\n    (-(pow (xlat_mutableret1, vec3(1.5, 1.5, 1.5))) * 8.0)\\n   * \\n    (1.0 + (q23 * 4.0))\\n  )));\\n  ret = tmpvar_12.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,decay:.5,echo_zoom:.952,echo_alpha:.5,echo_orient:3,wave_mode:4,additivewave:1,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.527,wave_smoothing:.45,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:.8,wave_g:.49,ob_size:.015,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:12,additive:1,num_inst:571,x:.26,y:.2,rad:.39317,tex_zoom:.9355,g2:0,a2:.2,border_g:0,border_b:0,border_a:0},init_eqs_str:\"a.px=0;a.fov=0;a.q12=0;a.copy=0;a.q18=0;a.tht=0;a.q15=0;a.flim=0;a.q1=0;a.q5=0;a.py=0;a.mov1=0;a.vis=0;a.oz=0;a.k1=0;a.q11=0;a.z0=0;a.q10=0;a.copies=0;a.v0=0;a.q4=0;a.burst=0;a.oy=0;a.rota=0;a.q19=0;a.q17=0;a.spur=0;a.q2=0;a.q14=0;a.rotmode=0;a.q3=0;a.t0=0;a.phi=0;a.ox=0;\",frame_eqs_str:\"a.mov1=a.q1;a.rotmode=a.q3;a.burst=a.q10;a.copies=a.q14;a.copy=div(mod(a.instance,a.copies),a.copies);a.k1=div(Math.floor(div(a.instance,a.copies))*a.copies,a.num_inst);a.k1=div(Math.floor(a.k1*a.burst),a.burst)+div(a.k1,a.burst);a.mov1=a.mov1+a.k1-a.copy*a.q2;a.mov1-=Math.floor(a.mov1);a.rotmode-=a.copy*a.q4;a.rota=a.mov1*a.rotmode*a.q5*2;a.mov1=a.mov1*(1-a.rotmode)+a.rotmode*(.5+.025*a.k1);a.mov1=pow(a.mov1,.9);a.tht=Math.sin(a.k1*a.k1*123.2)*(.2+0*a.rotmode);a.phi=1613.3*\\na.k1+a.rota;a.v0=(1+.3*Math.cos(13234.7*a.k1))*a.q5;a.z0=div(a.q18,a.q5);a.t0=.4;a.spur=(a.mov1-a.t0)*above(a.mov1-a.t0,0)*a.q15;a.py=a.spur*Math.sin(6.28*a.copy);a.px=a.spur*Math.cos(6.28*a.copy);a.fov=2*a.z0;a.ox=(a.mov1-a.q19)*a.v0*Math.sin(a.tht)*Math.cos(a.phi);a.oy=a.mov1*a.v0*(1-a.mov1)*Math.cos(2*a.tht)-.25;a.oz=a.mov1*a.v0*Math.sin(a.tht)*Math.sin(a.phi);a.ox=a.ox+(a.k1-.5)*a.q17+a.px;a.oy-=a.py;a.oz+=3*a.py;a.rad=div(.025*a.z0,a.oz+a.z0)*(1-.5*a.mov1);a.x=.5+div(a.fov*a.ox,a.oz+a.z0);a.y=\\n.5+div(a.fov*a.oy,a.oz+a.z0);a.vis=above(a.mov1,a.q11)*below(a.mov1,a.q12)*above(a.oz,-a.z0);a.a=div(.7*a.vis,sqrt(a.copies))*(1+above(a.spur,0));a.a2=0;a.g=a.flim;\"},{baseVals:{enabled:1,sides:13,additive:1,num_inst:212,x:.65,y:.38,rad:1.26467,tex_zoom:.73678,g:1,a:.3,r2:1,g2:0,border_r:.5,border_g:.5,border_b:0,border_a:0},init_eqs_str:\"a.mov2=0;a.q25=0;a.copy=0;a.tht=0;a.q29=0;a.trel=0;a.mov1=0;a.oz=0;a.k1=0;a.z0=0;a.copies=0;a.k2=0;a.oy=0;a.stray=0;a.q27=0;a.size0=0;a.phase=0;a.t0=0;a.phi=0;a.ox=0;\",frame_eqs_str:\"a.trel=a.q25;a.copies=1;a.copy=div(mod(a.instance,a.copies),a.copies);a.k1=div(Math.floor(div(a.instance,a.copies))*a.copies,a.num_inst);a.k2=a.k1+.5;a.trel=a.trel;a.t0=.5;a.phase=above(a.trel,a.t0);a.mov1=bnot(a.phase)*(a.t0-a.trel+.01*a.k1);a.mov2=a.phase*(a.trel-a.t0);a.stray=1.2-a.phase;a.tht=3.14*Math.sin(1234.2*a.k1+a.time*bnot(a.phase))*a.stray;a.phi=3245.1*a.k1;a.size0=.02;a.ox=a.mov1*a.q27+Math.sin(a.tht)*Math.cos(a.phi)*(a.size0+a.mov2*(2+a.k1));a.oy=12*a.mov1+div(Math.cos(a.tht)*\\n(a.size0+4*a.mov2*a.k2)*(1-a.mov2*a.k2),2);a.oz=8*a.mov1+Math.sin(a.tht)*Math.sin(a.phi)*(a.size0+2*a.mov2*(2+a.k1));a.z0=1;a.rad=div(div(.03,a.oz+a.z0),1+div(a.trel*randint(100),50));a.x=.5+div(a.ox,a.oz+a.z0);a.y=a.q29+.2+div(a.oy,a.oz+a.z0);a.a=.1*bnot(a.phase)+a.phase*Math.max(0,1-0*a.mov2)*above(a.oz+a.z0,0)*.8;\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.stop=0;a.q25=0;a.index=0;a.q12=0;a.q18=0;a.q22=0;a.q21=0;a.q13=0;a.q15=0;a.q29=0;a.q6=0;a.q1=0;a.dec_med=0;a.q5=0;a.vshift=0;a.lo=0;a.xtime=0;a.t0a=0;a.mov1=0;a.is_beat=0;a.q31=0;a.q23=0;a.q24=0;a.dec_slow=0;a.q11=0;a.hpeak=0;a.q10=0;a.copies=0;a.q4=0;a.med=0;a.hi=0;a.vs0=0;a.bursts=0;a.spb_=0;a.volb=0;a.q16=0;a.q26=0;a.q19=0;a.q17=0;a.vol=0;a.peak=0;a.spur=0;a.q2=0;a.q27=0;a.q14=0;a.rotmode=0;a.wind=0;a.tmp=0;a.xbase=0;a.speed=0;a.q3=0;a.t0=0;a.vol_=0;a.q32=0;a.spread=0;\\na.q28=0;a.q30=0;a.q20=0;a.volx=0;a.t0a=a.time;a.t0=a.time+.5;a.spb_=.5;a.volb=.5;a.volx=.5;a.vol_=1;a.index=0;a.mov1=0;\",frame_eqs_str:\"a.dec_med=pow(.85,div(30,a.fps));a.dec_slow=pow(.95,div(30,a.fps));a.vol=div(a.bass+a.med+a.treb,1.5);a.vol_=a.vol_*a.dec_slow+(1-a.dec_slow)*a.vol;a.is_beat=above(a.vol,.1+a.vol_+2*a.peak)*above(a.time,a.t0+.45*a.spb_);a.t0a=.00001<Math.abs(a.is_beat)?a.t0:a.t0a;a.t0=.00001<Math.abs(a.is_beat)?a.time:a.t0;a.peak=.00001<Math.abs(a.is_beat)?a.vol:a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,128);a.spb_=.00001<Math.abs(a.is_beat)?.9*a.spb_+.1*Math.min(a.t0-a.t0a+.01,2):a.spb_;\\na.q20=a.vol_;a.q21=above(a.vol,2.7*a.vol_);a.q22=Math.max(0,a.peak-0)+.01;a.hpeak=a.hpeak*a.dec_med+(1-a.dec_med)*a.q21;a.q23=a.hpeak*(1+randint(8));a.q24=a.is_beat;a.volb=bnot(a.q24)*a.volb+a.q24*a.vol_;a.volx+=div(.2,a.fps)*Math.max(Math.min(a.volb-a.volx,1),-1)*bnot(a.rotmode);a.rotmode=Math.max(Math.min(4*Math.sin(div(a.mov1,2.4)-1.5)-3,1),0);a.stop=(.00001<Math.abs(bnot(a.stop))?bnot(mod(a.index,24)):below(a.lo,1))*bnot(a.rotmode);a.spread=.00001<Math.abs(below(a.lo,1))?a.spread:div(randint(2)*\\nrandint(12),20);a.copies=.00001<Math.abs(below(a.lo,1))?a.copies:3+randint(2)*randint(8);a.spur=.00001<Math.abs(below(a.lo,1))?a.spur:.1*above(a.copies,5);a.bursts=.00001<Math.abs(below(a.lo,1))?a.bursts:1+randint(2)*randint(6);a.xbase=.00001<Math.abs(below(a.lo,1))?a.xbase:randint(2)*(div(randint(10),10)-.5);a.vs0=.00001<Math.abs(a.is_beat*bnot(mod(a.index,77)))?div(randint(5),4)-.7:a.vs0;a.vshift+=div(3,a.fps)*Math.max(Math.min(a.vs0-a.vshift,.04),-.04);a.speed=div(div(.15,a.fps),a.spb_);a.tmp=\\na.mov1;a.mov1+=a.speed;a.q2=a.mov1-a.tmp;a.q1=a.mov1;a.tmp=a.rotmode;a.q3=a.rotmode;a.q4=a.rotmode-a.tmp;a.tmp=a.volx;a.q5=a.volx;a.q6=a.q5-a.tmp;a.q10=a.bursts;a.lo=.00001<Math.abs(a.stop)?a.lo+a.speed:0;a.hi=.00001<Math.abs(above(a.lo,1))?0:a.hi+a.speed;a.q11=a.lo;a.q12=a.hi;a.q13=0*sqrt(a.q22);a.q14=a.copies;a.q15=a.spur*(1-a.rotmode);a.q16=0;a.q17=a.spread*(1-a.rotmode);a.q18=div(1,Math.min(Math.max(10*Math.sin(div(a.mov1,2)),1),4));a.q19=a.xbase;a.xtime=.00001<Math.abs(a.stop*a.q21*above(a.xtime,\\n2))?0:a.xtime+div(.2,a.fps);a.q25=a.xtime;a.q26=.00001<Math.abs(below(a.xtime,.55))?pow(32,512*-sqr(a.xtime-.55)):pow(2,3*-sqr(a.xtime-.55));a.q27=4*Math.sin(div(a.time,29));a.wind+=div(.5,a.fps)*(a.volx-1.5);a.q28=a.wind;a.q29=a.vshift;a.q30=Math.max(Math.sin(div(a.mov1,2.2))*Math.sin(div(a.time,7)),0)+a.q26;a.q31=2*a.q5-2+Math.sin(div(a.time,17));a.q32=3+2*Math.sin(div(a.time,27));a.monitor=a.vshift;\",pixel_eqs_str:\"a.zoom=1;a.dy=-0;a.warp=0;\",warp:\"mat2 ofs;\\nfloat xlat_mutablegreen;\\nfloat xlat_mutablek1;\\nfloat xlat_mutablered;\\nvec2 xlat_mutableuv2;\\nfloat xlat_mutablewave;\\nfloat xlat_mutablezv;\\n shader_body { \\n  mat2 tmpvar_1;\\n  tmpvar_1[uint(0)].x = texsize.z;\\n  tmpvar_1[uint(0)].y = 0.0;\\n  tmpvar_1[1u].x = 0.0;\\n  tmpvar_1[1u].y = texsize.w;\\n  ofs = (tmpvar_1 * 4.0);\\n  float delta_2;\\n  float ky_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (uv.x - 0.5);\\n  tmpvar_4.y = ((uv.y - 0.5) + q29);\\n  vec2 v_5;\\n  v_5.x = ofs[0].x;\\n  v_5.y = ofs[1].x;\\n  vec2 v_6;\\n  v_6.x = ofs[0].x;\\n  v_6.y = ofs[1].x;\\n  vec2 v_7;\\n  v_7.x = ofs[0].y;\\n  v_7.y = ofs[1].y;\\n  vec2 v_8;\\n  v_8.x = ofs[0].y;\\n  v_8.y = ofs[1].y;\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = (texture (sampler_main, (uv + v_5)) - texture (sampler_main, (uv - v_6))).x;\\n  tmpvar_9.y = (texture (sampler_main, (uv + v_7)) - texture (sampler_main, (uv - v_8))).x;\\n  xlat_mutablered = (0.5 * texture (sampler_main, (uv - (0.004 * tmpvar_9))).x);\\n  xlat_mutablered = (xlat_mutablered + (0.5 * texture (sampler_main, uv).x));\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_4.x;\\n  tmpvar_10.y = (0.0078125 * (float(\\n    int((tmpvar_4.y * 128.0))\\n  ) + abs(\\n    (fract((tmpvar_4.y * 128.0)) - 0.5)\\n  )));\\n  vec2 tmpvar_11;\\n  tmpvar_11 = (tmpvar_10 * 4.0);\\n  ky_3 = clamp ((-0.5 - tmpvar_11.y), 0.0, 1.0);\\n  xlat_mutablek1 = (abs((\\n    fract((tmpvar_11.x * 2.0))\\n   - 0.5)) * 8.0);\\n  xlat_mutablek1 = (xlat_mutablek1 - sign(xlat_mutablek1));\\n  delta_2 = (0.1 + (rand_preset * 0.05)).x;\\n  xlat_mutablek1 = (xlat_mutablek1 - ((\\n    (4.0 * sign(xlat_mutablek1))\\n   * ky_3) * ky_3));\\n  ky_3 = clamp ((ky_3 - delta_2), 0.0, 1.0);\\n  xlat_mutablek1 = (xlat_mutablek1 - ((\\n    (8.0 * sign(xlat_mutablek1))\\n   * ky_3) * ky_3));\\n  ky_3 = clamp ((ky_3 - delta_2), 0.0, 1.0);\\n  xlat_mutablek1 = (xlat_mutablek1 - ((\\n    (12.0 * sign(xlat_mutablek1))\\n   * ky_3) * ky_3));\\n  ky_3 = clamp ((ky_3 - delta_2), 0.0, 1.0);\\n  xlat_mutablek1 = (xlat_mutablek1 - ((\\n    (16.0 * sign(xlat_mutablek1))\\n   * ky_3) * ky_3));\\n  ky_3 = clamp ((ky_3 - delta_2), 0.0, 1.0);\\n  float tmpvar_12;\\n  tmpvar_12 = clamp (xlat_mutablek1, -1.6, 1.6);\\n  xlat_mutablek1 = tmpvar_12;\\n  xlat_mutablegreen = (cos((tmpvar_12 * 2.0)) - 0.1);\\n  xlat_mutablewave = ((sin(\\n    ((q1 * 8.0) - (uv.x * 6.0))\\n  ) / 2.0) * q3);\\n  xlat_mutablewave = ((xlat_mutablewave * float(\\n    (xlat_mutablewave >= 0.0)\\n  )) + (q30 * 0.02));\\n  xlat_mutablered = (xlat_mutablered + ((\\n    (xlat_mutablewave / abs(sin((\\n      (1.0/(tmpvar_12))\\n     + \\n      (q1 / 8.0)\\n    ))))\\n   * xlat_mutablegreen) * ky_3));\\n  xlat_mutablezv = ((time * 0.08) + (0.2 * sin(\\n    ((uv * 16.0) + time)\\n  ))).x;\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = q28;\\n  tmpvar_13.y = (0.2 * time);\\n  xlat_mutableuv2 = ((tmpvar_4 * 2.0) + tmpvar_13);\\n  vec3 tmpvar_14;\\n  tmpvar_14.xy = xlat_mutableuv2;\\n  tmpvar_14.z = xlat_mutablezv;\\n  vec3 tmpvar_15;\\n  tmpvar_15.xy = (xlat_mutableuv2 * vec2(2.0, 2.0));\\n  tmpvar_15.z = (xlat_mutablezv * 2.0);\\n  vec3 tmpvar_16;\\n  tmpvar_16.xy = (xlat_mutableuv2 * vec2(4.0, 4.0));\\n  tmpvar_16.z = (xlat_mutablezv * 3.0);\\n  vec3 tmpvar_17;\\n  tmpvar_17.xy = (xlat_mutableuv2 * vec2(8.0, 8.0));\\n  tmpvar_17.z = (xlat_mutablezv * 7.0);\\n  xlat_mutableuv2 = (tmpvar_4 + ((\\n    ((texture (sampler_noisevol_hq, tmpvar_14).z + (texture (sampler_noisevol_hq, tmpvar_15).z / 2.0)) + (texture (sampler_noisevol_hq, tmpvar_16).z / 4.0))\\n   + \\n    (texture (sampler_noisevol_hq, tmpvar_17).z / 8.0)\\n  ) * 0.1));\\n  vec3 tmpvar_18;\\n  tmpvar_18.x = xlat_mutablered;\\n  tmpvar_18.y = xlat_mutablegreen;\\n  tmpvar_18.z = ((1.0 + xlat_mutableuv2.y) * sqrt(dot (xlat_mutableuv2, xlat_mutableuv2)));\\n  vec4 tmpvar_19;\\n  tmpvar_19.w = 1.0;\\n  tmpvar_19.xyz = ((tmpvar_18 * 0.8) - 0.005);\\n  ret = tmpvar_19.xyz;\\n }\",comp:\"float trel;\\nfloat vshift;\\nvec3 xlat_mutableret1;\\nvec2 xlat_mutablers;\\nvec2 xlat_mutablers0;\\nfloat xlat_mutablesmoke;\\nfloat xlat_mutablesmoke2;\\nvec2 xlat_mutableuv_l;\\nfloat xlat_mutablew;\\nfloat xlat_mutablez;\\n shader_body { \\n  trel = (time / 2.0);\\n  vshift = (0.5 - q29);\\n  vec2 tmpvar_1;\\n  tmpvar_1.x = rand_preset.x;\\n  tmpvar_1.y = ((-0.1 - (rand_preset.y / 2.0)) + vshift);\\n  vec2 tmpvar_2;\\n  tmpvar_2.y = 0.0;\\n  tmpvar_2.x = (0.005 * time);\\n  xlat_mutableuv_l = (uv + tmpvar_2);\\n  vec2 tmpvar_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (uv - 0.5);\\n  tmpvar_3 = sin(((\\n    (tmpvar_4 * aspect.xy)\\n   + 0.5) - (tmpvar_1 * aspect.xy)));\\n  vec2 tmpvar_5;\\n  tmpvar_5 = fract(uv);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = vec3((texture (sampler_fc_main, tmpvar_5).x + (2.0 * (\\n    (texture (sampler_blur2, tmpvar_5).xyz * scale2)\\n   + bias2).x)));\\n  vec3 tmpvar_7;\\n  tmpvar_7.x = tmpvar_6.x;\\n  tmpvar_7.y = pow (tmpvar_6.x, 2.1);\\n  tmpvar_7.z = pow (tmpvar_6.x, 4.0);\\n  xlat_mutablew = ((uv.y - (\\n    ((dot (texture (sampler_noise_hq, vec2((xlat_mutableuv_l.x / 6.0))), vec4(0.32, 0.49, 0.29, 0.0)) + uv.x) - 0.5)\\n   / 4.0)) - vshift);\\n  xlat_mutablez = (0.2 / xlat_mutablew);\\n  float tmpvar_8;\\n  tmpvar_8 = clamp ((-0.2 - (\\n    (8.0 * q5)\\n   * xlat_mutablew)), 0.0, 1.0);\\n  xlat_mutablers0.x = (((uv.x - 0.5) * (1.0 + \\n    abs(xlat_mutablez)\\n  )) * 2.0);\\n  xlat_mutablers0.y = xlat_mutablez;\\n  xlat_mutablers0 = (xlat_mutablers0 * ((4.0 * \\n    float((xlat_mutablez <= 0.0))\\n  ) + 1.0));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = 0.0;\\n  tmpvar_9.y = (1.5 + xlat_mutablew);\\n  vec2 x_10;\\n  x_10 = (xlat_mutablers0 - tmpvar_9);\\n  float tmpvar_11;\\n  tmpvar_11 = ((q26 / sqrt(\\n    dot (x_10, x_10)\\n  )) / 4.0);\\n  xlat_mutablers0 = (xlat_mutablers0 * (1.0 + (tmpvar_11 * tmpvar_11)));\\n  xlat_mutablers.x = (xlat_mutablers0 * 2.0).x;\\n  xlat_mutablers.y = (xlat_mutablers0.y + (trel * 0.5));\\n  float tmpvar_12;\\n  tmpvar_12 = (texture (sampler_main, uv).y * tmpvar_8);\\n  vec3 tmpvar_13;\\n  tmpvar_13.xy = (xlat_mutablers * 2.0);\\n  tmpvar_13.z = (0.2 * trel);\\n  float tmpvar_14;\\n  tmpvar_14 = dot (((\\n    ((2.0 * clamp ((texture (sampler_noisevol_hq, \\n      (tmpvar_13 * float((xlat_mutablez >= 0.0)))\\n    ) - 0.2), 0.0, 1.0)).xyz * clamp ((texture (sampler_noise_hq, (xlat_mutablers / 16.0)) - 0.5), 0.0, 1.0).x)\\n   / \\n    sqrt(abs(xlat_mutablez))\\n  ) + tmpvar_11), vec3(0.32, 0.49, 0.29));\\n  vec3 tmpvar_15;\\n  tmpvar_15.x = tmpvar_14;\\n  tmpvar_15.y = pow (tmpvar_14, 2.1);\\n  tmpvar_15.z = pow (tmpvar_14, 6.0);\\n  xlat_mutableret1 = (((\\n    ((uv.y * (1.0 + q23)) + (0.1 / sqrt(dot (tmpvar_3, tmpvar_3))))\\n   * vec3(0.1, 0.1, 0.2)) * tmpvar_8) + (clamp (tmpvar_15, 0.0, 1.0) * (1.0 - \\n    clamp ((-1.0 - (12.0 * xlat_mutablew)), 0.0, 1.0)\\n  )));\\n  xlat_mutableret1 = (xlat_mutableret1 * clamp ((1.0 - \\n    (tmpvar_12 * 8.0)\\n  ), 0.0, 1.0));\\n  vec4 tmpvar_16;\\n  tmpvar_16 = texture (sampler_main, fract((tmpvar_4 + 0.5)));\\n  xlat_mutablesmoke = (tmpvar_16.z * (tmpvar_16.z * q5));\\n  xlat_mutableret1 = (xlat_mutableret1 * clamp ((1.0 - \\n    ((xlat_mutablesmoke * q32) * tmpvar_8)\\n  ), 0.0, 1.0));\\n  xlat_mutablesmoke2 = (texture (sampler_main, ((tmpvar_4 / 2.0) + 0.5)).z * q30);\\n  xlat_mutableret1 = (xlat_mutableret1 + (clamp (tmpvar_7, 0.0, 1.0) - (\\n    ((xlat_mutablez * clamp ((xlat_mutablesmoke + \\n      (xlat_mutablew * q31)\\n    ), 0.0, 1.0)) * vec3(1.0, 0.4, 0.1))\\n   * tmpvar_8)));\\n  float tmpvar_17;\\n  tmpvar_17 = clamp (((\\n    (tmpvar_12 * xlat_mutablez)\\n   * xlat_mutablez) / 16.0), 0.0, 1.0);\\n  vec3 tmpvar_18;\\n  tmpvar_18.x = tmpvar_17;\\n  tmpvar_18.y = pow (tmpvar_17, 2.1);\\n  tmpvar_18.z = pow (tmpvar_17, 6.0);\\n  xlat_mutableret1 = (xlat_mutableret1 + clamp (tmpvar_18, 0.0, 1.0));\\n  xlat_mutableret1 = (xlat_mutableret1 * clamp ((\\n    (((dot (texture (sampler_noise_mq, vec2(\\n      ((xlat_mutableuv_l.x / 4.0) + (0.02 * trel))\\n    )), vec4(0.32, 0.49, 0.29, 0.0)) / 6.0) - uv.y) + 0.8)\\n   * 32.0), 0.0, 1.0));\\n  vec3 tmpvar_19;\\n  tmpvar_19.x = xlat_mutablesmoke2;\\n  tmpvar_19.y = pow (xlat_mutablesmoke2, 2.1);\\n  tmpvar_19.z = pow (xlat_mutablesmoke2, 6.0);\\n  xlat_mutableret1 = ((xlat_mutableret1 * clamp (\\n    (1.0 - xlat_mutablesmoke2)\\n  , 0.0, 1.0)) + clamp (tmpvar_19, 0.0, 1.0));\\n  vec4 tmpvar_20;\\n  tmpvar_20.w = 1.0;\\n  tmpvar_20.xyz = (1.0 - exp((\\n    -(xlat_mutableret1)\\n   * 2.0)));\\n  ret = tmpvar_20.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:6,wave_thick:1,modwavealphabyvolume:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.527,wave_smoothing:.09,modwavealphastart:0,modwavealphaend:1.32,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:.8,wave_g:.49,ob_a:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:1.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0,b2x:.7,b1ed:0},shapes:[{baseVals:{enabled:1,sides:12,num_inst:1024,rad:.03632,tex_ang:1.00531,tex_zoom:1.53117,b:1,a:0,g2:0,border_b:0,border_a:0},init_eqs_str:\"a.fov=0;a.n=0;a.x0=0;a.y0=0;a.z0=0;a.q32=0;a.t1=0;\",frame_eqs_str:\"a.fov=a.reg03;a.n=a.instance*a.reg00;a.x0=a.gmegabuf[Math.floor(a.n)];a.y0=a.gmegabuf[Math.floor(a.n+1)];a.z0=a.gmegabuf[Math.floor(a.n+2)]+a.reg02;a.x=div(a.x0,a.z0)*a.fov+.5;a.y=div(a.y0,a.z0)*a.q32*a.fov+.5;a.r=a.gmegabuf[Math.floor(a.n+3)];a.g=a.gmegabuf[Math.floor(a.n+4)];a.b=a.gmegabuf[Math.floor(a.n+5)];a.r2=div(a.r,2);a.g2=div(a.g,2);a.b2=div(a.b2,2);a.a=div(a.instance,1024);a.a2=.5*a.a;a.rad=Math.min(div(.02,a.z0),.5)*(0<a.z0?1:0)*2.5*sqrt(a.a);a.rad*=a.gmegabuf[Math.floor(a.n+\\n6)];--a.t1;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,scaling:2.15542,smoothing:.2,r:0,a:.7},init_eqs_str:\"a.fov=0;a.n=0;a.t1=0;a.x0=0;a.y0=0;a.z0=0;a.k1=0;a.t2=0;\",frame_eqs_str:\"a.t1=1023;a.t2=0;\",point_eqs_str:\"a.fov=a.reg03;a.n=a.t1*a.reg00;a.x0=a.gmegabuf[Math.floor(a.n)];a.y0=a.gmegabuf[Math.floor(a.n+1)];a.z0=a.gmegabuf[Math.floor(a.n+2)]+a.reg02;a.x=div(a.x0,a.z0)*a.fov+.5;a.y=div(a.y0,a.z0)*a.fov+.5;a.a=Math.max(0,div(a.t1,1024));a.k1=a.reg01+a.t1;a.r=a.gmegabuf[Math.floor(a.n+3)];a.g=a.gmegabuf[Math.floor(a.n+4)];a.b=a.gmegabuf[Math.floor(a.n+5)];a.a=div(div(a.t1,1024)*(.5<=a.z0?1:0),2);--a.t1;a.gmegabuf[Math.floor(1E4+a.t2)]=Math.abs(a.value1+a.value2);a.t2+=1;\"},{baseVals:{enabled:1,scaling:.89152,smoothing:.82,r:0,a:.1},init_eqs_str:\"a.fov=0;a.n=0;a.t1=0;a.x0=0;a.y0=0;a.z0=0;\",frame_eqs_str:\"a.t1=512;\",point_eqs_str:\"a.fov=a.reg03;a.n=a.t1*a.reg00;a.x0=a.gmegabuf[Math.floor(a.n)];a.y0=a.gmegabuf[Math.floor(a.n+1)];a.z0=a.gmegabuf[Math.floor(a.n+2)]+a.reg02;a.x=div(a.x0,a.z0)*a.fov+.5;a.y=div(a.y0,a.z0)*a.fov+.5;a.r=a.gmegabuf[Math.floor(a.n+3)];a.g=a.gmegabuf[Math.floor(a.n+4)];a.b=a.gmegabuf[Math.floor(a.n+5)];a.a=div(div(a.t1,1024)*(.5<=a.z0?1:0),2);--a.t1;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:'a.xang=0;a.n=0;a.fov=0;a.index2=0;a.ran9=0;a.ran5_=0;a.right=0;a.ran4=0;a.index=0;a.q12=0;a.yang=0;a.q6=0;a.y0=0;a.ran8=0;a.q1=0;a.r1=0;a.q5=0;a.ran1_=0;a.points=0;a.dt1=0;a.dec_f=0;a.x0=0;a[\"new\"]=0;a.dec_s=0;a.k3=0;a.reg01=0;a.my=0;a.oz=0;a.is_beat=0;a.k1=0;a.ran2=0;a.q11=0;a.z0=0;a.q10=0;a.ran4_=0;a.ran9_=0;a.ran3=0;a.ran5=0;a.dec_m=0;a.ran7=0;a.k2=0;a.mz=0;a.ran8_=0;a.ddy=0;a.ran6=0;a.dec2=0;a.ran6_=0;a.oy=0;a.rsum=0;a.mx=0;a.beat=0;a.vol=0;a.ran2_=0;a.peak=0;a.ddx=0;a.q2=\\n0;a.zang=0;a.trel1=0;a.ran7_=0;a.t0=0;a.dec=0;a.m=0;a.ran1=0;a.q32=0;a.ran3_=0;a.left=0;a.pk=0;a.recsize=0;a.ox=0;a.zofs=0;for(var b=a.index=0;1E5>b;b++)a.megabuf[Math.floor(a.index)]=0,a.gmegabuf[Math.floor(a.index)]=0,a.index+=1;a.recsize=8;a.reg00=a.recsize;a.points=1024;a.reg01=0;a.zofs=1+2*div(randint(100),100);a.reg02=a.zofs;a.fov=.3;a.reg03=a.fov;',frame_eqs_str:'a.dec_f=pow(.3,div(30,a.fps));a.dec_m=pow(.85,div(30,a.fps));a.dec_s=pow(.95,div(30,a.fps));a.beat=a.bass+a.mid+a.treb-(a.bass_att+a.mid_att+a.treb_att)+(a.bass+a.mid+a.treb);a.beat/=3;a.peak=a.peak*a.dec_m+(1-a.dec_m)*pow(a.beat-1,1)*(1<a.beat?1:0)*4;a.is_beat=above(a.beat,1)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),8);.00001<Math.abs(a.is_beat)?(a.ran1=div(randint(100),50)-\\n1,a.ran2=div(randint(100),50)-1,a.ran3=div(randint(100),50)-1):0;a.ran1_=a.dec_m*a.ran1_+(1-a.dec_m)*a.ran1;a.ran2_=a.dec_m*a.ran2_+(1-a.dec_m)*a.ran2;a.ran3_=a.dec_m*a.ran3_+(1-a.dec_m)*a.ran3;a.rsum=sqrt(a.ran1_*a.ran1_+a.ran2_*a.ran2_+a.ran3_*a.ran3_);.00001<Math.abs(a.is_beat*(.00001>Math.abs(a.index-2)?1:0))?(a.ran4=div(randint(100),50)-1,a.ran5=div(randint(100),50)-1,a.ran6=div(randint(100),50)-1):0;a.ran4_=a.dec_m*a.ran4_+(1-a.dec_m)*a.ran4;a.ran5_=a.dec_m*a.ran5_+(1-a.dec_m)*a.ran5;a.ran6_=\\na.dec_m*a.ran6_+(1-a.dec_m)*a.ran6;.00001<Math.abs(a.is_beat*(.00001>Math.abs(a.index-6)?1:0))?(a.ran7=div(randint(100),50)-1,a.ran8=div(randint(100),50)-1,a.ran9=div(randint(100),50)-1):0;a.ran7_=a.dec_m*a.ran7_+(1-a.dec_m)*a.ran7;a.ran8_=a.dec_m*a.ran8_+(1-a.dec_m)*a.ran8;a.ran9_=a.dec_m*a.ran9_+(1-a.dec_m)*a.ran9;a.pk=sqrt(a.peak+.1);a[\"new\"]=Math.floor(12*(a.ran4-a.ran5)*a.pk-div(12*(a.ran3-a.ran1),a.pk));a[\"new\"]=Math.max(Math.min(a[\"new\"],20),2);a.reg01+=a[\"new\"];a.dec=a.dec_m;a.n=a.recsize*\\na.points;a.m=0;a.dt1=div(div(.00001<Math.abs(0<a.ran1?1:0)?4*a.pk:div(4,a.pk),a.fps)*a[\"new\"],6);a.vol=Math.max(a.ran1+a.ran2,.2)*a.pk*2;for(var b=0;b<a[\"new\"];b++)a.trel1+=a.dt1,a.x0=a.x0*a.dec+(1-a.dec)*(Math.sin(a.trel1+6*a.ran3)*a.vol+a.ran1),a.y0=a.y0*a.dec+(1-a.dec)*(Math.sin(a.trel1+6*a.ran2)*a.vol+a.ran2),a.z0=a.z0*a.dec+(1-a.dec)*(Math.sin(a.trel1+6*a.ran1)*a.vol+a.ran3),a.gmegabuf[Math.floor(a.n)]=a.x0,a.gmegabuf[Math.floor(a.n+1)]=a.y0,a.gmegabuf[Math.floor(a.n+2)]=a.z0,a.gmegabuf[Math.floor(a.n+\\n3)]=div(div(a.ran1_,a.rsum),3)+.5,a.gmegabuf[Math.floor(a.n+4)]=div(div(a.ran2_,a.rsum),3)+.5,a.gmegabuf[Math.floor(a.n+5)]=div(div(a.ran3_,a.rsum),3)+.5,a.gmegabuf[Math.floor(a.n+6)]=0*a.gmegabuf[Math.floor(1E4+a.m)]+1,a.n+=a.recsize,a.m+=1;for(b=a.n=0;b<a.recsize*a.points;b++)a.gmegabuf[Math.floor(a.n)]=a.gmegabuf[Math.floor(a.n+a[\"new\"]*a.recsize)],a.n+=1;a.xang=div(a.ran4_,a.fps);a.yang=div(a.ran5_,a.fps);a.zang=div(a.ran6_,a.fps);a.ddx=Math.min(Math.max(a.ddx+div(a.yang,a.fps),-1),1);a.ddy=Math.min(Math.max(a.ddy+\\ndiv(a.xang,a.fps),-1),1);a.q1=2*a.ddx;a.q2=2*a.ddy;for(b=a.n=0;b<a.points;b++)a.ox=a.gmegabuf[Math.floor(a.n)],a.oy=a.gmegabuf[Math.floor(a.n+1)],a.oz=a.gmegabuf[Math.floor(a.n+2)],a.mx=a.ox*Math.cos(a.zang)-a.oy*Math.sin(a.zang),a.my=a.ox*Math.sin(a.zang)+a.oy*Math.cos(a.zang),a.ox=a.mx,a.oy=a.my,a.mx=a.ox*Math.cos(a.yang)+a.oz*Math.sin(a.yang),a.mz=-a.ox*Math.sin(a.yang)+a.oz*Math.cos(a.yang),a.ox=a.mx,a.oz=a.mz,a.my=a.oy*Math.cos(a.xang)-a.oz*Math.sin(a.xang),a.mz=a.oy*Math.sin(a.xang)+a.oz*Math.cos(a.xang),\\na.oy=a.my,a.oz=a.mz,a.gmegabuf[Math.floor(a.n)]=a.ox,a.gmegabuf[Math.floor(a.n+1)]=a.oy,a.gmegabuf[Math.floor(a.n+2)]=a.oz,a.n+=a.recsize;a.k1=div(div(a.ran7_,a.fps),2);a.k2=div(div(a.ran8_,a.fps),2);a.k3=div(Math.abs(a.ran9_),a.fps);a.dec=.4+.6*a.ran5_;a.dec2=1-a.dec;a.r1=.5+.3*a.ran4_;for(b=a.n=0;b<a.points-1;b++)a.m=a.n*a.recsize,a.left=mod(a.n-1+a.points,a.points)*a.recsize,a.right=mod(a.n+1+a.points,a.points)*a.recsize,a.gmegabuf[Math.floor(a.m)]=a.dec*a.gmegabuf[Math.floor(a.m)]+a.dec2*(a.gmegabuf[Math.floor(a.left)]*\\na.r1+a.gmegabuf[Math.floor(a.right)]*(1-a.r1)+a.k1),a.gmegabuf[Math.floor(a.m+1)]=a.dec*a.gmegabuf[Math.floor(a.m+1)]+a.dec2*(a.gmegabuf[Math.floor(a.left+1)]*a.r1+a.gmegabuf[Math.floor(a.right+1)]*(1-a.r1)+a.k2),a.n+=1;a.m=mod(a.frame,a.points);a.m=Math.max(0,Math.floor(1024+200*(a.t0-a.time)));a.n=a.m*a.recsize;a.q5=div(a.gmegabuf[Math.floor(a.n)],a.gmegabuf[Math.floor(a.n+2)]+a.zofs)*a.fov;a.q6=div(-a.gmegabuf[Math.floor(a.n+1)],a.gmegabuf[Math.floor(a.n+2)]+a.zofs)*a.fov;a.q10=sqrt(a.gmegabuf[Math.floor(a.n+\\n3)]);a.q11=sqrt(a.gmegabuf[Math.floor(a.n+4)]);a.q12=sqrt(a.gmegabuf[Math.floor(a.n+5)]);a.monitor=a.m;a.q32=a.aspecty;',pixel_eqs_str:\"a.rot=0;a.zoom=1;a.warp=0;a.dy=0;a.dx=-0;\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = vec3(0.0, 0.0, 0.0);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\"float xlat_mutablesmask;\\nvec2 xlat_mutableuv1;\\nvec2 xlat_mutableuv2;\\nvec2 xlat_mutableuv3;\\nvec2 xlat_mutableuv4;\\n shader_body { \\n  float flash_1;\\n  float dist_2;\\n  float stars_3;\\n  vec3 ret_4;\\n  xlat_mutableuv1 = ((uv - 0.5) * aspect.xy);\\n  float tmpvar_5;\\n  tmpvar_5 = (0.1 * time);\\n  float tmpvar_6;\\n  tmpvar_6 = (0.2 * rad);\\n  dist_2 = ((1.0 - fract(\\n    (0.3333333 + tmpvar_5)\\n  )) * (1.0 - tmpvar_6));\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = q1;\\n  tmpvar_7.y = q2;\\n  xlat_mutableuv3 = (xlat_mutableuv1 + tmpvar_7);\\n  xlat_mutableuv4 = ((32.0 * dist_2) * xlat_mutableuv3);\\n  xlat_mutablesmask = (texture (sampler_pw_noise_lq, (xlat_mutableuv4 / 256.0)).y - 0.9);\\n  vec2 tmpvar_8;\\n  tmpvar_8 = abs((fract(xlat_mutableuv4) - 0.5));\\n  stars_3 = max (0.0, clamp ((\\n    (1.0 - dist_2)\\n   * \\n    ((0.1 / sqrt(dot (tmpvar_8, tmpvar_8))) * xlat_mutablesmask)\\n  ), 0.0, 1.0));\\n  dist_2 = ((1.0 - fract(\\n    (0.6666667 + tmpvar_5)\\n  )) * (1.0 - tmpvar_6));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = q1;\\n  tmpvar_9.y = q2;\\n  xlat_mutableuv3 = (xlat_mutableuv1 + tmpvar_9);\\n  xlat_mutableuv4 = ((32.0 * dist_2) * xlat_mutableuv3);\\n  xlat_mutablesmask = (texture (sampler_pw_noise_lq, (xlat_mutableuv4 / 256.0)).y - 0.9);\\n  vec2 tmpvar_10;\\n  tmpvar_10 = abs((fract(xlat_mutableuv4) - 0.5));\\n  stars_3 = (stars_3 + max (stars_3, clamp (\\n    ((1.0 - dist_2) * ((0.1 / sqrt(\\n      dot (tmpvar_10, tmpvar_10)\\n    )) * xlat_mutablesmask))\\n  , 0.0, 1.0)));\\n  dist_2 = ((1.0 - fract(\\n    (1.0 + tmpvar_5)\\n  )) * (1.0 - tmpvar_6));\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = q1;\\n  tmpvar_11.y = q2;\\n  xlat_mutableuv3 = (xlat_mutableuv1 + tmpvar_11);\\n  xlat_mutableuv4 = ((32.0 * dist_2) * xlat_mutableuv3);\\n  xlat_mutablesmask = (texture (sampler_pw_noise_lq, (xlat_mutableuv4 / 256.0)).y - 0.9);\\n  vec2 tmpvar_12;\\n  tmpvar_12 = abs((fract(xlat_mutableuv4) - 0.5));\\n  stars_3 = (stars_3 + max (stars_3, clamp (\\n    ((1.0 - dist_2) * ((0.1 / sqrt(\\n      dot (tmpvar_12, tmpvar_12)\\n    )) * xlat_mutablesmask))\\n  , 0.0, 1.0)));\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = q5;\\n  tmpvar_13.y = q6;\\n  xlat_mutableuv2 = (xlat_mutableuv1 - tmpvar_13);\\n  float tmpvar_14;\\n  tmpvar_14 = ((0.01 / sqrt(\\n    dot (xlat_mutableuv2, xlat_mutableuv2)\\n  )) * min (3.0, (\\n    ((mid - 0.5) * float((mid > 0.5)))\\n   * 2.0)));\\n  flash_1 = tmpvar_14;\\n  float angle_15;\\n  float tmpvar_16;\\n  tmpvar_16 = abs(xlat_mutableuv2.x);\\n  if ((xlat_mutableuv2.y >= 0.0)) {\\n    angle_15 = (1.0 - ((xlat_mutableuv2.y - tmpvar_16) / (xlat_mutableuv2.y + tmpvar_16)));\\n  } else {\\n    angle_15 = (3.0 - ((xlat_mutableuv2.y + tmpvar_16) / (tmpvar_16 - xlat_mutableuv2.y)));\\n  };\\n  angle_15 = (angle_15 * 0.25);\\n  float tmpvar_17;\\n  if ((xlat_mutableuv2.x < 0.0)) {\\n    tmpvar_17 = -(angle_15);\\n  } else {\\n    tmpvar_17 = angle_15;\\n  };\\n  flash_1 = (tmpvar_14 * (tmpvar_14 / (\\n    abs((fract((\\n      (3.0 * tmpvar_17)\\n     + \\n      (time * 2.0)\\n    )) - 0.5))\\n   + 0.18)));\\n  vec3 tmpvar_18;\\n  tmpvar_18 = max ((texture (sampler_main, uv).xyz * 2.0), ((\\n    (texture (sampler_blur2, uv).xyz * scale2)\\n   + bias2) * 2.0));\\n  vec2 tmpvar_19;\\n  tmpvar_19 = sin(xlat_mutableuv3);\\n  ret_4 = (clamp ((0.025 / \\n    sqrt(dot (tmpvar_19, tmpvar_19))\\n  ), 0.0, 1.0) * vec3(0.4, 0.1, 1.0));\\n  ret_4 = (ret_4 + clamp ((stars_3 * stars_3), 0.0, 1.0));\\n  ret_4 = (ret_4 * clamp ((1.0 - \\n    (2.0 * dot (tmpvar_18, vec3(0.32, 0.49, 0.29)))\\n  ), 0.0, 1.0));\\n  ret_4 = (ret_4 + tmpvar_18);\\n  vec3 tmpvar_20;\\n  tmpvar_20.x = q10;\\n  tmpvar_20.y = q11;\\n  tmpvar_20.z = q12;\\n  ret_4 = (ret_4 + ((2.0 * \\n    clamp (flash_1, 0.0, 1.0)\\n  ) * tmpvar_20));\\n  vec4 tmpvar_21;\\n  tmpvar_21.w = 1.0;\\n  tmpvar_21.xyz = ret_4;\\n  ret = tmpvar_21.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,additivewave:1,wave_thick:1,modwavealphabyvolume:1,darken:1,wave_a:.001,wave_scale:.133,wave_smoothing:0,wave_mystery:-1,modwavealphastart:1,modwavealphaend:1.3,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.015,ob_b:1,ib_size:.26,mv_a:0,b2x:.3,b1ed:0},shapes:[{baseVals:{enabled:1,sides:40,thickoutline:1,rad:.06623,tex_zoom:1.79845,r:0,a:.1,g2:0,border_b:0,border_a:0},init_eqs_str:\"a.vol=0;a.bob=0;a.border_1=0;a.ro=0;a.sp=0;a.red=0;a.spi=0;a.tm=0;a.bob=1.5;a.ro=0;a.red=randint(20);\",frame_eqs_str:\"a.vol=1+.2*div(a.bass_att+a.treb_att+a.mid_att,3);a.bob=a.bob*above(a.bob,.01)-.01+(1-above(a.bob,.01));a.bob=.4+.4*Math.sin(.8*a.time);a.bob*=a.vol;a.border_1=.4;a.sides=30;a.ro+=.02;a.ang=a.ro;a.sp=.025*a.red;a.spi=.5-a.sp;a.tm=.1*a.time;a.border_r=.5+a.sp*Math.sin(.6*a.tm)+a.spi*Math.cos(1.46*a.tm);a.border_g=.5+a.sp*Math.sin(1.294*a.tm)+a.spi*Math.cos(.87*a.tm);a.border_b=.5+a.sp*Math.sin(1.418*a.tm)+a.spi*Math.cos(.76*a.tm);\"},{baseVals:{enabled:1,sides:40,additive:1,num_inst:4,g:1,b:1,g2:0,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"a.x=.5+.225*Math.sin(.7*div(a.time,a.instance));a.y=.5+.3*Math.cos(.7*div(a.time,a.instance));a.x-=.4*a.x*Math.sin(a.time);a.y-=.4*a.y*Math.cos(a.time);a.rad*=a.mid_att;a.r=.5+.5*Math.sin(.5*a.frame);a.b=.5+.5*Math.sin(.5*a.frame+2.094);a.g=.5+.5*Math.sin(.5*a.frame+4.188);\"},{baseVals:{enabled:1,sides:40,additive:1,g:1,b:1,g2:0,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"a.x=.5+.5*(.3*Math.sin(1.1*a.time)+.7*Math.sin(.5*a.time));a.x=.5+.225*Math.sin(a.time+2.09);a.y=.5+.3*Math.cos(a.time+2.09);a.rad*=a.bass_att;a.r=.5+.5*Math.sin(.5*a.frame);a.b=.5+.5*Math.sin(.5*a.frame+2.094);a.g=.5+.5*Math.sin(.5*a.frame+4.188);\"},{baseVals:{enabled:1,sides:40,additive:1,num_inst:5,rad:.07419,g:1,b:1,g2:0,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"a.x=.5+.225*Math.sin(div(a.time,a.instance));a.y=.5+.3*Math.cos(div(a.time,a.instance));a.x+=.4*a.x*Math.sin(a.time);a.y+=.4*a.y*Math.cos(a.time);a.rad*=a.treb_att;a.r=.5+.5*Math.sin(.5*a.frame);a.b=.5+.5*Math.sin(.5*a.frame+2.094);a.g=.5+.5*Math.sin(.5*a.frame+4.188);\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.index=0;a.q22=0;a.q21=0;a.q1=0;a.dec_med=0;a.ps=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.dec_slow=0;a.q4=0;a.q26=0;a.p2=0;a.avg=0;a.beat=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.q28=0;a.q20=0;\",frame_eqs_str:\"a.dec_med=pow(.7,div(30,a.fps));a.dec_slow=pow(.99,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.2+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),2);a.q20=a.avg;a.q21=a.beat;a.q22=a.peak;a.ps=.9*a.ps+.1*a.q22;a.q23=a.ps;a.q24=a.is_beat;\\na.q26=a.bass_att+a.mid_att+a.treb_att;a.q27=a.index+1;a.q28=a.index2;a.k1=a.is_beat*equal(mod(a.index,2),0);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,4);a.q1=Math.cos(a.rott);a.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;\",pixel_eqs_str:\"a.zoom=1.05;\",warp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (uv - vec2(0.5, 0.5));\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 0.0;\\n  vec4 tmpvar_4;\\n  tmpvar_4 = texture (sampler_blur1, uv);\\n  tmpvar_3.xyz = ((tmpvar_4.xyz * scale1) + bias1);\\n  float tmpvar_5;\\n  tmpvar_5 = (dot (tmpvar_3, roam_sin) * 16.0);\\n  mat2 tmpvar_6;\\n  tmpvar_6[uint(0)].x = cos(tmpvar_5);\\n  tmpvar_6[uint(0)].y = -(sin(tmpvar_5));\\n  tmpvar_6[1u].x = sin(tmpvar_5);\\n  tmpvar_6[1u].y = cos(tmpvar_5);\\n  uv_1 = ((tmpvar_2 + (\\n    (0.2 * dot (((tmpvar_4.xyz * scale1) + bias1), vec3(0.32, 0.49, 0.29)))\\n   * \\n    (tmpvar_2 * tmpvar_6)\\n  )) - 0.5);\\n  vec2 tmpvar_7;\\n  tmpvar_7 = ((uv_1 * texsize.xy) * 0.02);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = (cos((tmpvar_7.y * q1)) * sin(-(tmpvar_7.y)));\\n  tmpvar_8.y = (sin(tmpvar_7.x) * cos((tmpvar_7.y * q2)));\\n  uv_1 = (uv_1 - ((tmpvar_8 * texsize.zw) * 12.0));\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = ((texture (sampler_main, uv_1).xyz * 0.98) - 0.02);\\n  ret = tmpvar_9.xyz;\\n }\",comp:\"vec3 xlat_mutableret1;\\nvec2 xlat_mutablers;\\nvec2 xlat_mutableuv1;\\nfloat xlat_mutablez;\\n shader_body { \\n  xlat_mutableuv1 = (uv - 0.5);\\n  xlat_mutablez = (0.2 / abs(xlat_mutableuv1.y));\\n  xlat_mutablers.x = (xlat_mutableuv1.x * xlat_mutablez);\\n  xlat_mutablers.y = ((xlat_mutablez / 2.0) + (time * 4.0));\\n  vec4 tmpvar_1;\\n  tmpvar_1 = texture (sampler_noise_hq, xlat_mutablers);\\n  xlat_mutableret1 = ((tmpvar_1.xyz * vec3(\\n    greaterThanEqual (tmpvar_1.xyz, vec3(0.0, 0.0, 0.0))\\n  )) - 0.6);\\n  float tmpvar_2;\\n  tmpvar_2 = clamp ((128.0 * xlat_mutableuv1.y), 0.0, 1.0);\\n  vec2 tmpvar_3;\\n  tmpvar_3 = fract(((\\n    (xlat_mutableuv1 * (1.0 - abs(xlat_mutableuv1.x)))\\n   - 0.5) - (\\n    (xlat_mutableret1 * 0.05)\\n   * tmpvar_2).xy));\\n  float x_4;\\n  x_4 = (tmpvar_3.y - 0.52);\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (texture (sampler_main, tmpvar_3) + ((0.02 / \\n    (0.02 + sqrt((x_4 * x_4)))\\n  ) * slow_roam_sin)).xyz;\\n  xlat_mutableret1 = tmpvar_5;\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (32.0 * ((\\n    (uv * mat2(0.6, -0.8, 0.8, 0.6))\\n   + \\n    (tmpvar_5 * 0.1)\\n  .xy) + (time / 64.0)));\\n  vec2 tmpvar_7;\\n  tmpvar_7 = abs((fract(tmpvar_6) - 0.5));\\n  vec3 tmpvar_8;\\n  tmpvar_8 = clamp (((0.25 / \\n    sqrt(dot (tmpvar_7, tmpvar_7))\\n  ) * vec3((texture (sampler_pw_noise_lq, \\n    (tmpvar_6 / 256.0)\\n  ).y - 0.9))), 0.0, 1.0);\\n  vec4 tmpvar_9;\\n  tmpvar_9.w = 1.0;\\n  tmpvar_9.xyz = (tmpvar_5 + ((\\n    (tmpvar_8.x * tmpvar_8.x)\\n   + \\n    ((rand_preset * (0.5 - uv.y)).xyz * vec3(0.0, 0.0, 1.0))\\n  ) * (1.0 - tmpvar_2)));\\n  ret = tmpvar_9.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:2,gammaadj:1.98,decay:.5,echo_zoom:1,echo_alpha:.5,echo_orient:3,wave_mode:3,wave_thick:1,wrap:0,darken:1,wave_a:100,wave_scale:.282,wave_smoothing:.9,wave_mystery:1,warpanimspeed:1.459,warpscale:2.007,zoom:.9999,warp:.01,sx:.9999,wave_r:.5,wave_g:.5,wave_b:.5,ob_size:.05,ob_g:.1,ob_b:1,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_a:0,b1ed:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,spectrum:1,thick:1,scaling:.2248},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"a.r=a.bass;a.g=a.treb;a.b=.5;\",point_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.01*a.bass;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0002*Math.cos(a.ma);a.my+=.0002*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.8);\"},{baseVals:{enabled:1,spectrum:1,thick:1,scaling:.2743},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;\",frame_eqs_str:\"a.r=a.bass;a.g=a.treb;a.b=.5;\",point_eqs_str:\"a.ma+=3.1415*above(a.mid,1)*.01*a.mid;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0004*Math.cos(a.ma);a.my+=.0004*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.a=above(a.bass+a.mid+a.treb,.3);\"},{baseVals:{enabled:1,thick:1,scaling:2.0231,smoothing:0},init_eqs_str:\"a.d=0;a.tt2=0;a.res=0;a.tt1=0;a.diff=0;a.tt3=0;a.beat=0;a.vol=0;a.m=0;a.monitor=0;a.t2=0;a.t3=0;a.t4=0;a.cl=0;\",frame_eqs_str:\"a.vol=8*a.bass+5*a.mid+3*a.treb;a.m=.97*a.m+.08*a.vol;a.monitor=a.vol;a.beat=above(a.vol,a.res)*above(a.vol,a.m)*above(a.vol,16);a.diff=(1-a.beat)*a.diff+a.beat*(a.vol-a.res);a.res=a.beat*(a.vol+.04*a.m)+(1-a.beat)*(a.res-div(60*(.1+.02*a.diff),a.fps));a.res=Math.max(0,a.res);\",point_eqs_str:\"a.tt3=.6*a.tt3+1*a.value1;a.tt2=.7*a.tt2+.2*a.tt3;a.tt1=.8*a.tt1+.1*a.tt2;a.d=.9*a.d+.2*a.tt1;a.y=.5+a.d*a.sample*(1-a.sample)*2;a.x=-.05+1.1*a.sample;\"},{baseVals:{enabled:0}}],init_eqs_str:\"a.look=0;a.n=0;a.reg26=0;a.uvx0=0;a.reg34=0;a.reg28=0;a.reg23=0;a.q25=0;a.angchg=0;a.reg20=0;a.reg15=0;a.reg10=0;a.q12=0;a.v3=0;a.q22=0;a.q21=0;a.diry=0;a.q13=0;a.q6=0;a.posx=0;a.fps_=0;a.reg25=0;a.uvx=0;a.q1=0;a.travel=0;a.posz=0;a.q5=0;a.dirz=0;a.dec_s=0;a.reg16=0;a.slow=0;a.reg36=0;a.reg22=0;a.uvy=0;a.rotz=0;a.ly=0;a.dist_=0;a.q23=0;a.q24=0;a.reg24=0;a.cran0=0;a.ran2=0;a.q11=0;a.q10=0;a.reg14=0;a.posy=0;a.reg31=0;a.dirx=0;a.q4=0;a.start=0;a.reg12=0;a.reg13=0;a.c2=0;a.reg37=\\n0;a.s3=0;a.yslope=0;a.lampy=0;a.q16=0;a.xslope=0;a.q26=0;a.reg38=0;a.reg35=0;a.reg11=0;a.tx=0;a.avg=0;a.uvz=0;a.c3=0;a.uvy0=0;a.reg27=0;a.q19=0;a.beat=0;a.reg32=0;a.lx=0;a.reg21=0;a.uvz0=0;a.len=0;a.reg18=0;a.reg30=0;a.q2=0;a.q27=0;a.slen=0;a.q14=0;a.dist=0;a.reg17=0;a.v1=0;a.speed=0;a.s1=0;a.t0=0;a.s2=0;a.ran1=0;a.reg33=0;a.q7=0;a.ds=0;a.q28=0;a.lampx=0;a.ty=0;a.c1=0;a.v2=0;a.q20=0;a.q8=0;a.avg=.01;a.q7=.25;a.q8=randint(2)-1;a.q16=1+randint(2);a.q18=randint(.8)+.1;a.q30=1;a.q31=128;a.start=1;a.travel=\\n0;a.rotz=0;a.look=0;a.slow=0;a.t0=a.time+3;a.lampx=.5;a.lampy=.5;a.cran0=randint(1);for(var b=a.n=0;1E4>b;b++)a.gmegabuf[Math.floor(a.n)]=0,a.n+=1;for(b=a.n=0;1E4>b;b++)a.megabuf[Math.floor(a.n)]=0,a.n+=1;a.trelx=0;a.trely=0;a.trelz=0;a.reg20=1;a.reg21=0;a.reg22=0;a.reg23=0;a.reg24=1;a.reg25=0;a.reg26=0;a.reg27=0;a.reg28=1;b=0;do{b+=1;var c;a.ran1=div(randint(800),100);a.ran2=div(randint(800),100);a.ran3=div(randint(800),100);a.posx=randint(5)-2;a.posy=randint(5)-2;a.posz=randint(5)-2;a.c1=Math.cos(a.ran1);\\na.c2=Math.cos(a.ran2);a.c3=Math.cos(a.ran3);a.s1=Math.sin(a.ran1);a.s2=Math.sin(a.ran2);a.s3=Math.sin(a.ran3);a.reg20=a.c2*a.c1;a.reg21=a.c2*a.s1;a.reg22=-a.s2;a.reg23=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg24=a.s3*a.s2*a.s1+a.c3*a.c1;a.reg25=a.s3*a.c2;a.reg26=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg27=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg28=a.c3*a.c2;a.dist=.001;var d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;a.uvy+=a.posy;a.uvz+=a.posz;a.uvx=8*(div(a.uvx,\\n8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<Math.abs(-1>a.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=\\na.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.05;c=(.6>a.dist?1:0)*(30<a.len?1:0)}while(.00001<Math.abs(c)&&1048576>\\nd);d=.06>a.dist?1:0}while(.00001<Math.abs(d)&&1048576>b);\",frame_eqs_str:\"a.wave_a=0;a.fps_=0*a.fps_+1*(.00001<Math.abs(25>=a.fps?1:0)?a.fps:25+.5*(a.fps-25));a.dec_s=1-div(.06*30,a.fps_);a.beat=a.time>a.t0+3?1:0;a.t0=.00001<Math.abs(a.beat)?a.time:a.t0;a.speed=div(Math.min(.2,a.dist_-.02)*(1+2*a.avg)*(1-0*a.slow)*.7,a.q7);a.ds=a.ds*a.dec_s+div((1-a.dec_s)*a.speed*.25,a.fps_);a.rotz=.00001<Math.abs(.00001>Math.abs(a.rotz-0)?1:0)?a.beat*(randint(100)<20*a.travel?1:0)*(div(randint(10),10)-.3):bnot(a.beat*(30>randint(100)?1:0))*a.rotz;a.slow=.00001<\\nMath.abs(bnot(a.slow))?a.beat*(6>randint(1E3*a.avg)?1:0):bnot(a.beat*(50>randint(100)?1:0));a.look=.00001<Math.abs(bnot(a.look))?a.beat*(12>randint(1E3*a.speed)?1:0):bnot(a.beat*(50>randint(100)?1:0));a.lx=.00001<Math.abs(a.beat)?div(randint(150),200)+.15:a.lx;a.ly=.00001<Math.abs(a.beat)?div(randint(150),200)+.15:a.ly;a.lampx=a.lampx*a.dec_s+(1-a.dec_s)*(.00001<Math.abs(a.look)?a.lx:.5);a.lampy=a.lampy*a.dec_s+(1-a.dec_s)*(.00001<Math.abs(a.look)?a.ly:.5);a.q1=a.lampx;a.q2=a.lampy;a.dirx=a.reg26;\\na.diry=a.reg27;a.dirz=a.reg28;a.posx+=a.ds*a.dirx;a.posy+=a.ds*a.diry;a.posz+=a.ds*a.dirz;a.q4=a.posx;a.q5=a.posy;a.q6=a.posz;a.angchg=(.2-a.dist_)*(.2>a.dist_?1:0)*2;a.travel=.00001<Math.abs(0<a.angchg?1:0)?0:a.travel+a.ds;a.v1=a.v1*a.dec_s+(1-a.dec_s)*a.rotz*a.ds;a.v2=a.v2*a.dec_s+div((1-a.dec_s)*a.angchg*a.xslope,a.fps_);a.v3=a.v3*a.dec_s+(1-a.dec_s)*(div(a.angchg*a.yslope,a.fps_)+2*a.v1*Math.sin(.1*a.time));a.reg30=a.reg20;a.reg31=a.reg21;a.reg32=a.reg22;a.reg33=a.reg23;a.reg34=a.reg24;a.reg35=\\na.reg25;a.reg36=a.reg26;a.reg37=a.reg27;a.reg38=a.reg28;a.n=0;for(var b=a.avg=0;5>b;b++){a.n+=1;a.ran1=div(randint(100),100);a.ran2=div(randint(100),200)-.25;a.tx=Math.cos(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.ty=Math.sin(1.57*a.n+a.ran2)*(4>=a.n?1:0)*a.ran1;a.c1=Math.cos(a.v1);a.c2=Math.cos(a.v2+a.ty);a.c3=Math.cos(a.v3+a.tx);a.s1=Math.sin(a.v1);a.s2=Math.sin(a.v2+a.ty);a.s3=Math.sin(a.v3+a.tx);a.reg10=a.c2*a.c1;a.reg11=a.c2*a.s1;a.reg12=-a.s2;a.reg13=a.s3*a.s2*a.c1-a.c3*a.s1;a.reg14=a.s3*a.s2*\\na.s1+a.c3*a.c1;a.reg15=a.s3*a.c2;a.reg16=a.c3*a.s2*a.c1+a.s3*a.s1;a.reg17=a.c3*a.s2*a.s1-a.s3*a.c1;a.reg18=a.c3*a.c2;a.reg20=a.reg30;a.reg21=a.reg31;a.reg22=a.reg32;a.reg23=a.reg33;a.reg24=a.reg34;a.reg25=a.reg35;a.reg26=a.reg36;a.reg27=a.reg37;a.reg28=a.reg38;a.q20=a.reg10*a.reg20+a.reg11*a.reg23+a.reg12*a.reg26;a.q21=a.reg10*a.reg21+a.reg11*a.reg24+a.reg12*a.reg27;a.q22=a.reg10*a.reg22+a.reg11*a.reg25+a.reg12*a.reg28;a.q23=a.reg13*a.reg20+a.reg14*a.reg23+a.reg15*a.reg26;a.q24=a.reg13*a.reg21+a.reg14*\\na.reg24+a.reg15*a.reg27;a.q25=a.reg13*a.reg22+a.reg14*a.reg25+a.reg15*a.reg28;a.q26=a.reg16*a.reg20+a.reg17*a.reg23+a.reg18*a.reg26;a.q27=a.reg16*a.reg21+a.reg17*a.reg24+a.reg18*a.reg27;a.q28=a.reg16*a.reg22+a.reg17*a.reg25+a.reg18*a.reg28;a.reg20=a.q20;a.reg21=a.q21;a.reg22=a.q22;a.reg23=a.q23;a.reg24=a.q24;a.reg25=a.q25;a.reg26=a.q26;a.reg27=a.q27;a.reg28=a.q28;a.dist=.002;var c,d=0;do{d+=1;a.uvx=div(a.reg26*a.dist,a.q7);a.uvy=div(a.reg27*a.dist,a.q7);a.uvz=div(a.reg28*a.dist,a.q7);a.uvx+=a.posx;\\na.uvy+=a.posy;a.uvz+=a.posz;a.uvx=8*(div(a.uvx,8)+30.5-Math.floor(div(a.uvx,8)+30.5)-.5);a.uvy=8*(div(a.uvy,8)+30.5-Math.floor(div(a.uvy,8)+30.5)-.5);a.uvz=8*(div(a.uvz,8)+30.5-Math.floor(div(a.uvz,8)+30.5)-.5);a.uvx0=a.uvx+a.q8;a.uvy0=a.uvy+a.q8;a.uvz0=a.uvz+a.q8;for(c=0;8>c;c++)a.uvx=.00001<Math.abs(1<a.uvx?1:0)?2-a.uvx:.00001<Math.abs(-1>a.uvx?1:0)?-2-a.uvx:a.uvx,a.uvy=.00001<Math.abs(1<a.uvy?1:0)?2-a.uvy:.00001<Math.abs(-1>a.uvy?1:0)?-2-a.uvy:a.uvy,a.uvz=.00001<Math.abs(1<a.uvz?1:0)?2-a.uvz:.00001<\\nMath.abs(-1>a.uvz?1:0)?-2-a.uvz:a.uvz,a.slen=a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz,a.uvx=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvx:.00001<Math.abs(1>a.slen?1:0)?div(a.uvx,a.slen):a.uvx)+a.uvx0,a.uvy=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvy:.00001<Math.abs(1>a.slen?1:0)?div(a.uvy,a.slen):a.uvy)+a.uvy0,a.uvz=2.6*(.00001<Math.abs(.25>a.slen?1:0)?4*a.uvz:.00001<Math.abs(1>a.slen?1:0)?div(a.uvz,a.slen):a.uvz)+a.uvz0;a.len=sqrt(a.uvx*a.uvx+a.uvy*a.uvy+a.uvz*a.uvz);a.dist*=1.1;c=(.6>a.dist?1:0)*(30<\\na.len?1:0)}while(.00001<Math.abs(c)&&1048576>d);a.megabuf[Math.floor(a.n)]=a.megabuf[Math.floor(a.n)]*a.dec_s+(1-a.dec_s)*a.dist;a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5))}a.n=0;for(b=a.avg=0;5>b;b++)a.n+=1,a.avg+=Math.abs(div(a.megabuf[Math.floor(a.n)],5));a.xslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[1]-a.megabuf[3]),-3),3);a.yslope=Math.min(Math.max(div(2,a.avg)*(a.megabuf[4]-a.megabuf[2]),-3),3);a.monitor=a.avg;a.dist_=a.dist_*a.dec_s+(1-a.dec_s)*a.dist;a.q10=a.ds*a.q7;a.q14=Math.abs(a.ds)+\\n2*(Math.abs(a.v1)+Math.abs(a.v2)+Math.abs(a.v3))+div(1,255)+.05*a.start;a.q19=.6+.4*Math.sin(.02*a.time+6*a.cran0);a.start*=.9;a.q11=a.v1;a.q12=a.v2;a.q13=a.v3;a.monitor=a.q16;\",pixel_eqs_str:\"a.warp=0;a.zoom=1;a.dx=div(-a.q12,a.q16)*(1+0*pow(a.x-.5,2));a.dy=div(a.q13,a.q16)*(1+0*pow(a.y-.5,2));a.rot=a.q11;\",warp:\" shader_body { \\n  float dy_1;\\n  float dx_2;\\n  vec3 ret_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = ((uv * texsize.xy) * texsize_noise_lq.zw);\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (texsize.zw * 4.0);\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (vec2(1.0, 0.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv - (vec2(1.0, 0.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  )).y * 0.5);\\n  tmpvar_6.y = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (vec2(0.0, 1.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv - (vec2(0.0, 1.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  )).y * 0.5);\\n  ret_3.y = texture (sampler_fw_main, clamp ((uv + (\\n    (tmpvar_6 * texsize.zw)\\n   * 4.0)), 0.0, 1.0)).y;\\n  ret_3.y = (ret_3.y + ((\\n    (ret_3 - ((texture (sampler_blur1, uv).xyz * scale1) + bias1))\\n  .y * 0.025) + -0.01));\\n  ret_3.y = (ret_3.y + ((texture (sampler_noise_lq, tmpvar_4).y - 0.5) * 0.02));\\n  dx_2 = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (vec2(1.0, 0.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv - (vec2(1.0, 0.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  )).z * 0.5);\\n  dy_1 = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (vec2(0.0, 1.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv - (vec2(0.0, 1.0) * tmpvar_5))).xyz * scale1) + bias1)\\n  )).z * 0.5);\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = dx_2;\\n  tmpvar_7.y = dy_1;\\n  ret_3.z = ((texture (sampler_main, (uv - \\n    ((tmpvar_7 * texsize.zw) * 4.0)\\n  )).z - (ret_3.y * 0.01)) + 0.004);\\n  ret_3.z = (ret_3.z + ((texture (sampler_noise_lq, tmpvar_4).y - 0.5) * 0.01));\\n  dx_2 = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (tmpvar_5 * vec2(1.0, 0.0)))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv + (tmpvar_5 * vec2(-1.0, 0.0)))).xyz * scale1) + bias1)\\n  )).x * 0.5);\\n  dy_1 = (((2.0 * \\n    ((texture (sampler_blur1, (uv + (tmpvar_5 * vec2(0.0, 1.0)))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv + (tmpvar_5 * vec2(0.0, -1.0)))).xyz * scale1) + bias1)\\n  )).x * 0.5);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = dx_2;\\n  tmpvar_8.y = dy_1;\\n  vec2 tmpvar_9;\\n  tmpvar_9 = (tmpvar_8 * texsize.zw);\\n  vec2 domain_10;\\n  domain_10 = (uv - (tmpvar_9 * 2.5));\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 0.0;\\n  tmpvar_11.xyz = max (vec4(0.0, 0.0, 0.0, 0.0), texture (sampler_fc_main, (domain_10 + (texsize.zw * vec2(-1.0, 0.0))))).xyz;\\n  vec4 tmpvar_12;\\n  tmpvar_12.w = 0.0;\\n  tmpvar_12.xyz = max (tmpvar_11, texture (sampler_fc_main, (domain_10 + (texsize.zw * vec2(0.0, -1.0))))).xyz;\\n  vec4 tmpvar_13;\\n  tmpvar_13.w = 0.0;\\n  tmpvar_13.xyz = max (tmpvar_12, texture (sampler_fc_main, domain_10)).xyz;\\n  vec4 tmpvar_14;\\n  tmpvar_14.w = 0.0;\\n  tmpvar_14.xyz = max (tmpvar_13, texture (sampler_fc_main, (domain_10 + (texsize.zw * vec2(0.0, 1.0))))).xyz;\\n  ret_3.x = ((max (tmpvar_14, texture (sampler_fc_main, \\n    (domain_10 + (texsize.zw * vec2(1.0, 0.0)))\\n  )).x + (\\n    (texture (sampler_main, (uv + (tmpvar_9 * 4.0))).x - ((texture (sampler_blur1, (uv + \\n      (tmpvar_9 * 4.0)\\n    )).xyz * scale1) + bias1).x)\\n   * 0.206)) - 0.09);\\n  vec4 tmpvar_15;\\n  tmpvar_15.w = 1.0;\\n  tmpvar_15.xyz = ret_3;\\n  ret = tmpvar_15.xyz;\\n }\",comp:\"float xlat_mutablelamp;\\nvec2 xlat_mutablers0;\\nvec2 xlat_mutablerss;\\nvec2 xlat_mutableuv1;\\n shader_body { \\n  vec3 tmpvar_1;\\n  tmpvar_1.x = q4;\\n  tmpvar_1.y = q5;\\n  tmpvar_1.z = q6;\\n  mat3 tmpvar_2;\\n  tmpvar_2[uint(0)].x = q20;\\n  tmpvar_2[uint(0)].y = q23;\\n  tmpvar_2[uint(0)].z = q26;\\n  tmpvar_2[1u].x = q21;\\n  tmpvar_2[1u].y = q24;\\n  tmpvar_2[1u].z = q27;\\n  tmpvar_2[2u].x = q22;\\n  tmpvar_2[2u].y = q25;\\n  tmpvar_2[2u].z = q28;\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = q1;\\n  tmpvar_3.y = q2;\\n  vec2 uv_4;\\n  vec3 dots_5;\\n  vec3 ret_6;\\n  vec2 tmpvar_7;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (uv - 0.5);\\n  tmpvar_7 = (0.5 + (tmpvar_8 * vec2(1.1, 0.81)));\\n  vec2 tmpvar_9;\\n  tmpvar_9 = (uv - vec2(0.5, 0.5));\\n  uv_4 = (tmpvar_8 * aspect.xy);\\n  float tmpvar_10;\\n  float tmpvar_11;\\n  tmpvar_11 = (min (abs(\\n    (uv_4.y / uv_4.x)\\n  ), 1.0) / max (abs(\\n    (uv_4.y / uv_4.x)\\n  ), 1.0));\\n  float tmpvar_12;\\n  tmpvar_12 = (tmpvar_11 * tmpvar_11);\\n  tmpvar_12 = (((\\n    ((((\\n      ((((-0.01213232 * tmpvar_12) + 0.05368138) * tmpvar_12) - 0.1173503)\\n     * tmpvar_12) + 0.1938925) * tmpvar_12) - 0.3326756)\\n   * tmpvar_12) + 0.9999793) * tmpvar_11);\\n  tmpvar_12 = (tmpvar_12 + (float(\\n    (abs((uv_4.y / uv_4.x)) > 1.0)\\n  ) * (\\n    (tmpvar_12 * -2.0)\\n   + 1.570796)));\\n  tmpvar_10 = (tmpvar_12 * sign((uv_4.y / uv_4.x)));\\n  if ((abs(uv_4.x) > (1e-08 * abs(uv_4.y)))) {\\n    if ((uv_4.x < 0.0)) {\\n      if ((uv_4.y >= 0.0)) {\\n        tmpvar_10 += 3.141593;\\n      } else {\\n        tmpvar_10 = (tmpvar_10 - 3.141593);\\n      };\\n    };\\n  } else {\\n    tmpvar_10 = (sign(uv_4.y) * 1.570796);\\n  };\\n  xlat_mutablers0.x = ((tmpvar_10 / 3.1416) * 2.0);\\n  xlat_mutablers0.y = (0.02 / sqrt(dot (uv_4, uv_4)));\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = xlat_mutablers0.x;\\n  tmpvar_13.y = (xlat_mutablers0.y + time);\\n  xlat_mutablerss = (tmpvar_13 * mat2(0.7, -0.7, 0.7, 0.7));\\n  vec4 tmpvar_14;\\n  tmpvar_14 = vec4(greaterThanEqual ((texture (sampler_pw_noise_lq, \\n    (xlat_mutablerss / 32.0)\\n  ) - 0.7), vec4(0.0, 0.0, 0.0, 0.0)));\\n  vec2 tmpvar_15;\\n  tmpvar_15 = abs((fract(\\n    (xlat_mutablerss * 8.0)\\n  ) - 0.5));\\n  vec2 tmpvar_16;\\n  tmpvar_16.x = (xlat_mutablers0.x * 2.0);\\n  tmpvar_16.y = (xlat_mutablers0.y + (time / 2.0));\\n  xlat_mutablerss = (tmpvar_16 * mat2(0.7, -0.7, 0.7, 0.7));\\n  vec4 tmpvar_17;\\n  tmpvar_17 = vec4(greaterThanEqual ((texture (sampler_pw_noise_lq, \\n    (xlat_mutablerss / 32.0)\\n  ) - 0.7), vec4(0.0, 0.0, 0.0, 0.0)));\\n  vec2 tmpvar_18;\\n  tmpvar_18 = abs((fract(\\n    (xlat_mutablerss * 8.0)\\n  ) - 0.5));\\n  xlat_mutablerss = tmpvar_18;\\n  dots_5 = (vec3((clamp (\\n    (0.04 / sqrt(dot (tmpvar_15, tmpvar_15)))\\n  , 0.0, 1.0) * tmpvar_14.x)) + (clamp (\\n    (0.04 / sqrt(dot (tmpvar_18, tmpvar_18)))\\n  , 0.0, 1.0) * tmpvar_17.x));\\n  dots_5 = (dots_5 * clamp ((0.04 / \\n    abs((0.01 / xlat_mutablers0.y))\\n  ), 0.0, 1.0));\\n  dots_5 = (dots_5 * (dots_5 * 2.0));\\n  vec2 tmpvar_19;\\n  tmpvar_19.x = -((tmpvar_9.y * -1024.0));\\n  tmpvar_19.y = (tmpvar_9.x * -1024.0);\\n  vec2 tmpvar_20;\\n  tmpvar_20.x = tmpvar_19.x;\\n  tmpvar_20.y = -(tmpvar_19.y);\\n  uv_4 = (vec2(-100.0, 100.0) * (tmpvar_20 / (\\n    (tmpvar_19.x * tmpvar_19.x)\\n   + \\n    (tmpvar_19.y * tmpvar_19.y)\\n  )).yx);\\n  uv_4 = (0.5 + ((\\n    (1.0 - abs(((\\n      fract((mix ((0.5 + \\n        ((tmpvar_7 - 0.5) * 2.0)\\n      ), (uv_4 + 0.5), vec2(0.5, 0.5)) * 0.5))\\n     * 2.0) - 1.0)))\\n   - 0.5) * 0.98));\\n  uv_4 = (((uv_4 - 0.5) * 0.9) + 0.5);\\n  xlat_mutableuv1 = ((uv_4 - tmpvar_3) * aspect.xy);\\n  float tmpvar_21;\\n  tmpvar_21 = min ((1.0 - texture (sampler_main, uv_4).z), (1.0 - (\\n    (texture (sampler_blur2, uv_4).xyz * scale2)\\n   + bias2).z));\\n  vec3 tmpvar_22;\\n  tmpvar_22.xy = ((uv_4 - 0.5) * min ((1.0 - texture (sampler_main, uv_4).z), (1.0 - \\n    ((texture (sampler_blur2, uv_4).xyz * scale2) + bias2)\\n  .z)));\\n  tmpvar_22.z = min ((1.0 - texture (sampler_main, uv_4).z), (1.0 - (\\n    (texture (sampler_blur2, uv_4).xyz * scale2)\\n   + bias2).z));\\n  float tmpvar_23;\\n  tmpvar_23 = clamp ((abs(\\n    ((1.0 - ((texture (sampler_blur2, uv_4).xyz * scale2) + bias2).z) - clamp ((1.0 - (\\n      (texture (sampler_blur2, tmpvar_3).xyz * scale2)\\n     + bias2).z), 0.1, 0.4))\\n  ) + 0.2), 0.0, 1.0);\\n  vec3 tmpvar_24;\\n  tmpvar_24 = mix (texture (sampler_main, uv_4).xyz, ((texture (sampler_blur1, uv_4).xyz * scale1) + bias1), vec3(tmpvar_23));\\n  float tmpvar_25;\\n  tmpvar_25 = clamp (((1.0 - \\n    exp(-(((texture (sampler_blur1, uv_4).xyz * scale1) + bias1).x))\\n  ) - 0.2), 0.0, 1.0);\\n  ret_6 = ((tmpvar_24.x * (0.2 + \\n    ((1.0 - tmpvar_23) * (1.0 - tmpvar_21))\\n  )) * (1.0 + (0.5 * \\n    sin((((tmpvar_22 / q7) * tmpvar_2) + tmpvar_1))\\n  )));\\n  vec3 tmpvar_26;\\n  tmpvar_26.xy = vec2(0.0, 1.0);\\n  tmpvar_26.z = (tmpvar_25 * 3.0);\\n  vec3 tmpvar_27;\\n  tmpvar_27 = mix (ret_6, tmpvar_26, vec3(tmpvar_25));\\n  xlat_mutablelamp = (((\\n    clamp ((1.0 - (4.0 * sqrt(\\n      dot (xlat_mutableuv1, xlat_mutableuv1)\\n    ))), 0.0, 1.0)\\n   * tmpvar_24.x) * clamp (\\n    (1.0 - (2.0 * mix (tmpvar_21, (1.0 - \\n      ((texture (sampler_blur1, uv_4).xyz * scale1) + bias1)\\n    .z), 0.2)))\\n  , 0.0, 1.0)) * 1.8);\\n  ret_6 = (tmpvar_27 + ((1.0 - \\n    dot (tmpvar_27, vec3(0.32, 0.49, 0.29))\\n  ) * xlat_mutablelamp));\\n  ret_6 = (1.0 - exp((-2.0 * ret_6)));\\n  ret_6 = (ret_6 + (dots_5 * (1.0 + ret_6)));\\n  vec4 tmpvar_28;\\n  tmpvar_28.w = 1.0;\\n  tmpvar_28.xyz = ret_6;\\n  ret = tmpvar_28.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,wave_mode:4,additivewave:1,wave_dots:1,modwavealphabyvolume:1,wave_a:.331,wave_scale:.898,wave_smoothing:.108,wave_mystery:.1,modwavealphastart:.72,modwavealphaend:1.28,zoom:1.3345,wave_r:0,wave_g:.5,wave_b:.5,wave_y:.54,mv_x:24.8,mv_dy:.16,mv_l:1.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,samples:352,usedots:1,additive:1,scaling:.03856,smoothing:.2,g:0},init_eqs_str:\"a.t02=0;a.q1=0;a.ratio=0;a.ampl=0;a.x1=0;a.y1=0;\",frame_eqs_str:\"a.q1=a.bass_att;\",point_eqs_str:\"a.r=Math.abs(Math.sin(div(a.frame,38)));a.g=.5*Math.abs(Math.cos(div(a.frame,45)));a.b=.5*Math.abs(Math.sin(div(a.frame,133)));a.a=.3;a.t02+=div(a.q1,10);a.ratio=Math.sin(div(a.frame,49));a.ampl=.01+.4*sqr(Math.sin(div(a.frame,18))*Math.cos(div(a.frame,123)));a.x1=div(a.r-.5,15)+.5+a.ampl*Math.sin(6.28*a.sample);a.y1=div(a.b-.5,15)+.5+a.ampl*Math.cos(6.28*a.sample);a.x=a.x1+.2*(a.ampl+a.ratio)*Math.sin(6.28*a.sample*a.ratio*7.3);a.y=a.y1+.2*(a.ampl+a.ratio)*Math.cos(37.68*a.sample);\\n\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.oldshift=0;a.shift=0;a.normalframez=0;a.crash=0;a.nex=0;a.rshift=0;a.q1=0;a.zoom1=0;\",frame_eqs_str:\"a.dx=0;a.oldshift=a.shift;a.normalframez+=1;a.shift=above(a.bass_att,1)*above(a.treb_att,.9);a.crash=Math.abs(a.oldshift-a.shift);a.nex=1*equal(a.rshift,0)+2*equal(a.rshift,1);a.rshift=.00001<Math.abs(a.crash)?a.nex:a.rshift;a.monitor=a.rshift;a.wave_r=div(Math.floor(randint(200)),200);a.wave_g=div(Math.floor(randint(200)),200);a.wave_b=div(Math.floor(randint(200)),200);a.warp=0;a.q1=above(a.bass_att,1.3);a.zoom1=a.zoom+.15-.3*mod(a.normalframez,2);a.zoom=.00001<Math.abs(a.shift)?\\na.zoom1:1;a.rot=a.rot-.1+.1*a.rshift;\",pixel_eqs_str:\"a.dy=.007*-below(a.y,.4)+.007*above(a.y,.6);\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = ((texture (sampler_main, (uv_orig + \\n    ((uv - uv_orig) * dot (texture (sampler_main, uv).xyz, vec3(0.32, 0.49, 0.29)))\\n  )).xyz * 0.99) - 0.002);\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = (texture (sampler_main, uv).xyz * 2.0);\\n  ret_1 = (ret_1 * (1.0 - ret_1));\\n  ret_1 = (((1.0 - \\n    pow (clamp (ret_1, 0.0, 1.0), vec3(0.5, 0.5, 0.5))\\n  ) * 1.5) - 0.75);\\n  vec4 tmpvar_2;\\n  tmpvar_2.w = 1.0;\\n  tmpvar_2.xyz = ret_1;\\n  ret = tmpvar_2.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,decay:1,echo_zoom:1,echo_orient:3,wave_mode:1,wrap:0,darken_center:1,wave_a:.001,zoom:.97,rot:-6.27999,warp:52e-5,wave_r:0,wave_g:0,wave_b:0,ob_r:1,ob_g:1,ob_b:1,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,textured:1,rad:.49849,g:1,b:1,a:.7,r2:1,g2:0,b2:1,a2:.7,border_a:0},init_eqs_str:\"a.q2=0;a.tex_capture=0;a.q3=0;\",frame_eqs_str:\"a.r2=.5+.5*Math.sin(.35*a.q2);a.g2=.5+.5*Math.sin(.578*a.q2);a.b2=.5+.5*Math.sin(.689*a.q2);a.ang=a.q2;a.tex_capture=above(a.q3,2);\"},{baseVals:{enabled:1,sides:100,textured:1,rad:.74218,g:1,b:1,a:.6,r2:1,g2:0,b2:1,a2:.6,border_a:0},init_eqs_str:\"a.q2=0;a.tex_capture=0;a.q3=0;\",frame_eqs_str:\"a.r2=.5+.5*Math.sin(.45*a.q2);a.g2=.5+.5*Math.sin(.678*a.q2);a.b2=.5+.5*Math.sin(.689*a.q2);a.ang=1.05*-a.q2;a.tex_capture=above(a.q3,2);\"},{baseVals:{enabled:1,sides:100,textured:1,rad:1.00035,g:1,b:1,a:.5,r2:1,g2:0,b2:1,a2:.5,border_a:0},init_eqs_str:\"a.q2=0;a.tex_capture=0;a.q3=0;\",frame_eqs_str:\"a.r2=.5+.5*Math.sin(.45*a.q2);a.g2=.5+.5*Math.sin(.578*a.q2);a.b2=.5+.5*Math.sin(.789*a.q2);a.ang=.899*a.q2;a.tex_capture=above(a.q3,2);\"},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,sep:1,spectrum:1,thick:1,additive:1},init_eqs_str:\"a.xx=0;a.s=0;a.xs=0;a.ss=0;a.q1=0;a.xd=0;a.zd=0;a.v=0;a.yx=0;a.angle2=0;a.zs=0;a.angle=0;a.ys=0;a.xn=0;a.yd=0;a.angle3=0;a.yn=0;a.u=0;a.zx=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.u=3.14159*Math.cos(.1*a.q1);a.v=6.28318*Math.cos(.015*a.q1);a.s=314*a.sample;a.ss=6280*a.sample;a.xs=(.3+.1*Math.cos(a.s))*Math.cos(a.ss)*.2*Math.cos(a.v);a.ys=(.3+.1*Math.cos(a.s))*Math.sin(a.ss)*6*a.u;a.zs=.1*Math.sin(a.s)*Math.sin(a.v);a.angle=.1*a.q1;a.yx=a.ys*Math.cos(a.angle)-a.zs*Math.sin(a.angle);a.zx=a.ys*Math.sin(a.angle)+a.zs*Math.cos(a.angle);a.xx=a.xs;a.angle2=.11*a.q1;a.xd=a.xx*Math.cos(a.angle2)-a.zx*Math.sin(a.angle2);a.zd=a.xx*Math.sin(a.angle2)+a.zx*Math.cos(a.angle2);\\na.yd=a.yx;a.angle3=.15*a.q1;a.xn=a.xd*Math.cos(a.angle3)-a.yd*Math.sin(a.angle3);a.yn=a.xd*Math.sin(a.angle3)+a.yd*Math.cos(a.angle3);a.zd=a.zd;a.x=a.xn*a.zd*.3+.5;a.y=a.yn*a.zd*.36+.5;a.r=.5+.5*Math.sin(1.2*a.q1+a.x+a.x);a.g=.5+.5*Math.sin(1.5*a.q1+a.x+a.y);a.b=.5+.5*Math.sin(1.36*a.q1+a.y+a.y);\"},{baseVals:{enabled:1,sep:1,spectrum:1,thick:1,additive:1},init_eqs_str:\"a.xx=0;a.s=0;a.xs=0;a.ss=0;a.q1=0;a.xd=0;a.zd=0;a.v=0;a.yx=0;a.angle2=0;a.zs=0;a.angle=0;a.ys=0;a.xn=0;a.yd=0;a.angle3=0;a.yn=0;a.u=0;a.zx=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.u=3.14159*Math.cos(.1*a.q1);a.v=6.28318*Math.cos(.015*a.q1);a.s=314*a.sample;a.ss=6280*a.sample;a.xs=(.3+.1*Math.cos(a.s))*Math.cos(a.ss)*.2*Math.cos(a.v);a.ys=(.3+.1*Math.cos(a.s))*Math.sin(a.ss)*6*a.u;a.zs=.1*Math.sin(a.s)*Math.sin(a.v);a.angle=.1*a.q1;a.yx=a.ys*Math.cos(a.angle)-a.zs*Math.sin(a.angle);a.zx=a.ys*Math.sin(a.angle)+a.zs*Math.cos(a.angle);a.xx=a.xs;a.angle2=.13*a.q1;a.xd=a.xx*Math.cos(a.angle2)-a.zx*Math.sin(a.angle2);a.zd=a.xx*Math.sin(a.angle2)+a.zx*Math.cos(a.angle2);\\na.yd=a.yx;a.angle3=.16*a.q1;a.xn=a.xd*Math.cos(a.angle3)-a.yd*Math.sin(a.angle3);a.yn=a.xd*Math.sin(a.angle3)+a.yd*Math.cos(a.angle3);a.zd=a.zd;a.x=a.xn*a.zd*.3+.5;a.y=a.yn*a.zd*.36+.5;a.r=.5+.5*Math.sin(1.2*a.q1+a.x+a.x);a.g=.5+.5*Math.sin(1.5*a.q1+a.x+a.y);a.b=.5+.5*Math.sin(1.36*a.q1+a.y+a.y);\"},{baseVals:{enabled:1,sep:1,spectrum:1,thick:1,additive:1},init_eqs_str:\"a.xx=0;a.s=0;a.xs=0;a.ss=0;a.q1=0;a.xd=0;a.zd=0;a.v=0;a.yx=0;a.angle2=0;a.zs=0;a.angle=0;a.ys=0;a.xn=0;a.yd=0;a.angle3=0;a.yn=0;a.u=0;a.zx=0;\",frame_eqs_str:\"\",point_eqs_str:\"a.u=3.14159*Math.cos(.1*a.q1);a.v=6.28318*Math.cos(.015*a.q1);a.s=314*a.sample;a.ss=6280*a.sample;a.xs=(.3+.1*Math.cos(a.s))*Math.cos(a.ss)*.2*Math.cos(a.v);a.ys=(.3+.1*Math.cos(a.s))*Math.sin(a.ss)*6*a.u;a.zs=.1*Math.sin(a.s)*Math.sin(a.v);a.angle=.1*a.q1;a.yx=a.ys*Math.cos(a.angle)-a.zs*Math.sin(a.angle);a.zx=a.ys*Math.sin(a.angle)+a.zs*Math.cos(a.angle);a.xx=a.xs;a.angle2=.16*a.q1;a.xd=a.xx*Math.cos(a.angle2)-a.zx*Math.sin(a.angle2);a.zd=a.xx*Math.sin(a.angle2)+a.zx*Math.cos(a.angle2);\\na.yd=a.yx;a.angle3=.16*a.q1;a.xn=a.xd*Math.cos(a.angle3)-a.yd*Math.sin(a.angle3);a.yn=a.xd*Math.sin(a.angle3)+a.yd*Math.cos(a.angle3);a.zd=a.zd;a.x=a.xn*a.zd*.3+.5;a.y=a.yn*a.zd*.36+.5;a.r=.5+.5*Math.sin(1.2*a.q1+a.x+a.x);a.g=.5+.5*Math.sin(1.5*a.q1+a.x+a.y);a.b=.5+.5*Math.sin(1.36*a.q1+a.y+a.y);\"},{baseVals:{enabled:0}}],init_eqs_str:\"a.basstime=0;a.stickybit=0;a.volavg2=0;a.q1=0;a.decay_r=0;a.sample1=0;a.difftime=0;a.diff=0;a.decay_b=0;a.edge=0;a.volavg=0;a.bit2=0;a.vol=0;a.q2=0;a.q3=0;a.basssum=0;a.decay_g=0;a.sample2=0;\",frame_eqs_str:\"a.basstime+=.03*a.bass;a.q1=4*a.basstime;a.basstime=.00001<Math.abs(below(a.basstime,1E3))?1E3:a.basstime;a.basstime+=.03*a.bass_att;a.vol=pow(a.bass+a.mid+a.treb,2);a.basssum=a.vol;a.stickybit=mod(a.time,2);a.volavg+=a.vol*equal(a.stickybit,1);a.sample1+=equal(a.stickybit,1);a.volavg2+=a.vol*equal(a.stickybit,0);a.sample2+=equal(a.stickybit,0);a.edge=bnot(equal(a.bit2,a.stickybit));a.volavg-=a.volavg*a.edge*a.stickybit;a.volavg2-=a.volavg2*a.edge*equal(a.stickybit,0);a.sample1-=\\na.sample1*a.edge*a.stickybit;a.sample2-=a.sample2*a.edge*equal(a.stickybit,0);a.diff=.00001<Math.abs(equal(a.stickybit,1))?div(a.basssum,div(a.volavg2,a.sample2)):0;a.diff=.00001<Math.abs(equal(a.stickybit,0))?div(a.basssum,div(a.volavg,a.sample1)):a.diff;a.q3=a.diff;a.bit2=mod(a.time,2);a.difftime+=.03*a.diff;a.q2=a.difftime;a.difftime=.00001<Math.abs(above(a.difftime,2E3))?0:a.difftime;a.monitor=3.14*Math.abs(Math.cos(a.time));a.mv_a=above(a.diff,10);\",pixel_eqs_str:\"a.zoom=1+.05*a.q3*a.rad;a.decay_r=.2*a.rad*Math.sin(.35*a.q2)+.85+.1*Math.sin(a.q2);a.decay_g=.2*a.rad*Math.sin(.5*a.q2)+.85+.1*Math.sin(.7*a.q2);a.decay_b=.2*a.rad*Math.sin(.4*a.q2)+.85+.1*Math.sin(.8*a.q2);a.rot=0;\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_fc_main, uv).xyz * (0.8 + (q3 * 0.1)));\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = (texture (sampler_main, uv).xyz * 2.0);\\n  ret = tmpvar_1.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1,decay:1,echo_zoom:1.007,echo_alpha:.5,echo_orient:1,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_a:.1,wave_scale:3.815,wave_smoothing:.9,modwavealphastart:0,modwavealphaend:1.1,zoom:1.0099,warp:.04177,wave_r:.65,wave_g:.65,ob_size:.007,ib_size:.26,mv_x:64,mv_y:48,mv_l:.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0},shapes:[{baseVals:{enabled:1,sides:3,x:.37,rad:6.81129,ang:3.64425,r:0,a:.5,g2:0,a2:.5,border_a:1},init_eqs_str:\"a.q1=0;a.t1=0;a.t1=.01*randint(100);a.t2=.01*randint(100);\",frame_eqs_str:\"a.ang=a.q1*(.303+.01*a.t1);a.r=Math.min(1,Math.max(0,.1*Math.sin(.417*a.time+1)));a.g=Math.min(1,Math.max(0,.1*Math.sin(.391*a.time+2)));a.b=Math.min(1,Math.max(0,.1*Math.sin(.432*a.time+4)));a.r2=Math.min(1,Math.max(0,a.r2+.02*Math.sin(.657*a.time+3)));a.g2=Math.min(1,Math.max(0,a.g2+.02*Math.sin(.737*a.time+5)));a.b2=Math.min(1,Math.max(0,a.b2+.02*Math.sin(.884*a.time+6)));a.additive=.5+.15*(a.bass+a.bass_att);\"},{baseVals:{enabled:1,sides:100,additive:1,textured:1,x:.37,rad:.89796,ang:3.64425,g:1,b:1,a:.5,g2:0,a2:1,border_a:0},init_eqs_str:\"a.q1=0;a.t1=0;a.t1=.01*randint(100);a.t2=.01*randint(100);\",frame_eqs_str:\"a.x+=.07*Math.sin(.15*a.q1+3);a.y+=.03*Math.sin(.19*a.q1+1);a.tex_ang=a.q1*(.01+.0001*a.t1);a.r=Math.min(1,Math.max(0,a.r+.01*Math.sin(.0417*a.time+1)));a.g=Math.min(1,Math.max(0,a.g+.01*Math.sin(.391*a.time+2)));a.b=Math.min(1,Math.max(0,a.b+.01*Math.sin(.432*a.time+4)));a.r2=Math.min(1,Math.max(0,a.r2+.01*Math.sin(.457*a.time+3)));a.g2=Math.min(1,Math.max(0,a.g2+.01*Math.sin(.0437*a.time+5)));a.b2=Math.min(1,Math.max(0,a.b2+.01*Math.sin(.484*a.time+6)));\"},{baseVals:{enabled:1,sides:100,additive:1,textured:1,x:.67,y:.43,rad:.51386,ang:4.20974,g:1,b:1,g2:0,a2:1,border_a:0},init_eqs_str:\"a.q1=0;a.t1=0;a.t2=0;a.t1=.01*randint(100);a.t2=.01*randint(100);\",frame_eqs_str:\"a.x+=.05*Math.sin(.017*a.q1);a.y+=.09*Math.sin(.013*a.q1);a.tex_ang=a.q1*(.02+.0001*a.t1);a.rad*=.9+.2*a.t2;a.r=Math.min(1,Math.max(0,a.r+.01*Math.sin(.417*a.time+1)));a.g=Math.min(1,Math.max(0,a.g+.01*Math.sin(.391*a.time+2)));a.b=Math.min(1,Math.max(0,a.b+.01*Math.sin(.432*a.time+4)));a.r2=Math.min(1,Math.max(0,a.r2+.01*Math.sin(.457*a.time+3)));a.g2=Math.min(1,Math.max(0,a.g2+.01*Math.sin(.437*a.time+5)));a.b2=Math.min(1,Math.max(0,a.b2+.01*Math.sin(.484*a.time+6)));\"},{baseVals:{enabled:1,sides:100,additive:1,textured:1,rad:.22298,r:.6,g:.8,b:1,g2:0,a2:1,border_a:0},init_eqs_str:\"a.q1=0;\",frame_eqs_str:\"a.x+=.08*Math.sin(.25*a.q1);a.y+=.1*Math.sin(.5*a.q1+2);a.ang=a.time;\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.movement=0;a.q1=0;\",frame_eqs_str:\"a.movement=a.movement+.1*Math.max(0,a.bass+a.bass_att-2)+.15*pow(a.bass,3)+.005;a.q1=a.movement;a.monitor=a.q1;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv);\\n  ret_1 = (tmpvar_2.xyz + ((tmpvar_2.xyz - \\n    ((texture (sampler_blur1, uv).xyz * scale1) + bias1)\\n  ) * 0.5));\\n  ret_1 = (ret_1 * 0.9);\\n  ret_1 = (ret_1 + ((\\n    ((texture (sampler_noise_lq, ((\\n      (uv_orig * texsize.xy)\\n     * \\n      (texsize_noise_lq.zw * 0.4)\\n    ) + rand_frame.xy)).xyz - 0.5) / 256.0)\\n   * 12.0) * clamp (\\n    (treb_att - 1.0)\\n  , 0.0, 1.0)));\\n  vec3 tmpvar_3;\\n  tmpvar_3 = mix (ret_1, vec3(dot (ret_1, vec3(0.32, 0.49, 0.29))), vec3(0.08, 0.08, 0.08));\\n  ret_1 = tmpvar_3;\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = tmpvar_3;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 uv3_2;\\n  vec2 uv2_3;\\n  uv_1 = (uv - 0.5);\\n  uv_1 = (uv_1 * aspect.xy);\\n  uv2_3.x = ((uv_1.x * -0.497265) - (uv_1.y * 0.8675987));\\n  uv2_3.y = ((uv_1.x * 0.8675987) + (uv_1.y * -0.497265));\\n  uv3_2.x = ((uv_1.x * -0.5000263) - (uv_1.y * -0.8660102));\\n  uv3_2.y = ((uv_1.x * -0.8660102) + (uv_1.y * -0.5000263));\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = max (max (texture (sampler_main, (uv_1 + 0.5)).xyz, texture (sampler_main, (uv2_3 + 0.5)).xyz), texture (sampler_main, (uv3_2 + 0.5)).xyz);\\n  ret = tmpvar_4.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.49,decay:.5,echo_zoom:1.002,echo_alpha:.5,echo_orient:1,wave_mode:7,additivewave:1,modwavealphabyvolume:1,wave_brighten:0,wave_a:.001,wave_scale:1.157,wave_smoothing:.63,modwavealphastart:.71,modwavealphaend:1.3,warpscale:16.016,zoomexp:11.56276,fshader:1,zoom:1.05971,warp:.13126,wave_r:.65,wave_g:.65,wave_b:.65,ob_size:0,ob_a:1,ib_size:0,mv_x:64,mv_y:48,mv_l:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:14,num_inst:512,rad:.1026,tex_ang:.62832,r2:1,g2:0,a2:1,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;a.r_border=0;a.g_border=0;a.b_border=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.01*a.bass;a.ma-=3.1415*above(a.treb,1)*.01*a.treb;a.mx+=.0002*Math.cos(a.ma);a.my+=.0002*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.rad=div(a.bass+a.treb,30);a.a=above(a.bass+a.mid+a.treb,.8);a.r=div(Math.floor(randint(100)),100);a.g=div(Math.floor(randint(100)),\\n100);a.b=div(Math.floor(randint(100)),100);a.r2=div(Math.floor(randint(100)),100);a.g2=div(Math.floor(randint(100)),100);a.b2=div(Math.floor(randint(100)),100);a.r_border=div(Math.floor(randint(100)),100);a.g_border=div(Math.floor(randint(100)),100);a.b_border=div(Math.floor(randint(100)),100);\"},{baseVals:{enabled:1,sides:23,num_inst:1024,rad:.10262,ang:.43982,tex_ang:.62832,a:.5,r2:1,g2:0,a2:.5,border_a:0},init_eqs_str:\"a.ma=0;a.mx=0;a.my=0;a.r_border=0;a.g_border=0;a.b_border=0;\",frame_eqs_str:\"a.ma+=3.1415*above(a.bass,1)*.05*a.bass;a.ma-=3.1415*above(a.mid,1)*.05*a.mid;a.mx+=.0001*Math.cos(a.ma);a.my+=.0001*Math.sin(a.ma);a.mx=.00001<Math.abs(above(a.mx,.9))?.9-a.mx:a.mx;a.my=.00001<Math.abs(above(a.my,.9))?.9-a.my:a.my;a.mx=.00001<Math.abs(below(a.mx,.1))?.9+a.mx:a.mx;a.my=.00001<Math.abs(below(a.my,.1))?.9+a.my:a.my;a.x=a.mx;a.y=a.my;a.rad=div(a.bass+a.treb,25);a.a=above(a.bass+a.mid+a.treb,.1);a.r=div(Math.floor(randint(100)),100);a.g=div(Math.floor(randint(100)),\\n100);a.b=div(Math.floor(randint(100)),100);a.r2=div(Math.floor(randint(100)),100);a.g2=div(Math.floor(randint(100)),100);a.b2=div(Math.floor(randint(100)),100);a.r_border=div(Math.floor(randint(100)),100);a.g_border=div(Math.floor(randint(100)),100);a.b_border=div(Math.floor(randint(100)),100);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.y3=0;a.y1=0;a.xx=0;a.q12=0;a.x1=0;a.vx3=0;a.q6=0;a.dt=0;a.q1=0;a.q5=0;a.q9=0;a.d1=0;a.si1=0;a.vx4=0;a.grav=0;a.x3=0;a.d2=0;a.q11=0;a.q10=0;a.xx2=0;a.q4=0;a.yy1=0;a.vy4=0;a.dir=0;a.bounce=0;a.x4=0;a.r=0;a.x2=0;a.vy2=0;a.y2=0;a.q2=0;a.m1=0;a.spring=0;a.si2=0;a.vx2=0;a.q3=0;a.resist=0;a.yy=0;a.y4=0;a.q7=0;a.vy3=0;a.xx1=0;a.b1=0;a.q8=0;\",frame_eqs_str:\"a.xx1=.9*a.xx1+.01*a.bass;a.xx2=.9*a.xx2+.01*a.treb;a.yy1=.94*a.yy1+.0075*(a.treb+a.bass);a.x1=.5+2*(a.xx1-a.xx2);a.y1=.4+a.yy1;a.x1=Math.max(0,Math.min(1,a.x1));a.y1=Math.max(0,Math.min(1,a.y1));a.spring=10;a.grav=.5;a.resist=1;a.bounce=.75;a.dt=.0005*div(60,a.fps);a.vx2=a.vx2*(1-a.resist*a.dt)+a.dt*(a.x1+a.x3-2*a.x2)*a.spring;a.vy2=a.vy2*(1-a.resist*a.dt)+a.dt*((a.y1+a.y3-2*a.y2)*a.spring-a.grav);a.vx3=a.vx3*(1-a.resist*a.dt)+a.dt*(a.x2+a.x4-2*a.x3)*a.spring;a.vy3=a.vy3*(1-\\na.resist*a.dt)+a.dt*((a.y2+a.y4-2*a.y3)*a.spring-a.grav);a.vx4=a.vx4*(1-a.resist*a.dt)+a.dt*(a.x3-a.x4)*a.spring;a.vy4=a.vy4*(1-a.resist*a.dt)+a.dt*((a.y3-a.y4)*a.spring-a.grav);a.x2+=a.vx2;a.y2+=a.vy2;a.x3+=a.vx3;a.y3+=a.vy3;a.x4+=a.vx4;a.y4+=a.vy4;a.vx2=.00001<Math.abs(above(a.x2,0))?a.vx2:Math.abs(a.vx2)*a.bounce;a.vx2=.00001<Math.abs(below(a.x2,1))?a.vx2:-Math.abs(a.vx2)*a.bounce;a.vx3=.00001<Math.abs(above(a.x3,0))?a.vx3:Math.abs(a.vx3)*a.bounce;a.vx3=.00001<Math.abs(below(a.x3,1))?a.vx3:-Math.abs(a.vx3)*\\na.bounce;a.vx4=.00001<Math.abs(above(a.x4,0))?a.vx4:Math.abs(a.vx4)*a.bounce;a.vx4=.00001<Math.abs(below(a.x4,1))?a.vx4:-Math.abs(a.vx4)*a.bounce;a.vy2=.00001<Math.abs(above(a.y2,0))?a.vy2:Math.abs(a.vy2)*a.bounce;a.vy2=.00001<Math.abs(below(a.y2,1))?a.vy2:-Math.abs(a.vy2)*a.bounce;a.vy3=.00001<Math.abs(above(a.y3,0))?a.vy3:Math.abs(a.vy3)*a.bounce;a.vy3=.00001<Math.abs(below(a.y3,1))?a.vy3:-Math.abs(a.vy3)*a.bounce;a.vy4=.00001<Math.abs(above(a.y4,0))?a.vy4:Math.abs(a.vy4)*a.bounce;a.vy4=.00001<\\nMath.abs(below(a.y4,1))?a.vy4:-Math.abs(a.vy4)*a.bounce;a.q1=a.x1;a.q2=a.x2;a.q3=a.x3;a.q4=a.x4;a.q5=a.y1;a.q6=a.y2;a.q7=a.y3;a.q8=a.y4;a.q9=div(1,a.aspectx);a.q10=div(1,a.aspecty);a.zoom=1;a.r=.96*a.r+(a.x1-.5);a.rot=.1*a.r;a.q12=Math.atan2(a.vx4,a.vy4);a.q11=sqrt(a.vx4*a.vx4+a.vy4*a.vy4);a.zoom=1.001;a.rot=0;a.warp=.2;a.wave_a=0;\",pixel_eqs_str:\"a.dir=-a.q12+Math.asin(1);a.b1=.1;a.m1=25*a.q11;a.xx=a.q4;a.yy=1-a.q8;a.x1=a.xx-Math.sin(a.dir)*a.b1;a.y1=a.yy-Math.cos(a.dir)*a.b1;a.x2=a.xx+Math.sin(a.dir)*a.b1;a.y2=a.yy+Math.cos(a.dir)*a.b1;a.d1=sqrt((a.x1-a.x)*(a.x1-a.x)+(a.y1-a.y)*(a.y1-a.y))-2*a.b1;a.d2=sqrt((a.x2-a.x)*(a.x2-a.x)+(a.y2-a.y)*(a.y2-a.y))-2*a.b1;a.si1=sigmoid(-a.d1,1E3);a.si2=sigmoid(-a.d2,1E3);a.dx=2*(a.si1*Math.sin(a.y1-a.y)*a.m1*a.d1-a.si2*Math.sin(a.y2-a.y)*a.m1*a.d2);a.dy=2*(-a.si1*Math.sin(a.x1-a.x)*\\na.m1*a.d1+a.si2*Math.sin(a.x2-a.x)*a.m1*a.d2);\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = mix (uv_orig, uv, vec2(0.3, 0.3));\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 3.0);\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = dot (((\\n    (texture (sampler_blur1, (tmpvar_1 + (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale1)\\n   + bias1) - (\\n    (texture (sampler_blur1, (tmpvar_1 - (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale1)\\n   + bias1)), vec3(0.32, 0.49, 0.29));\\n  tmpvar_3.y = dot (((\\n    (texture (sampler_blur1, (tmpvar_1 + (vec2(0.0, 1.0) * tmpvar_2))).xyz * scale1)\\n   + bias1) - (\\n    (texture (sampler_blur1, (tmpvar_1 - (vec2(0.0, 1.0) * tmpvar_2))).xyz * scale1)\\n   + bias1)), vec3(0.32, 0.49, 0.29));\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = (texture (sampler_fc_main, (tmpvar_1 + (\\n    (tmpvar_3 * texsize.zw)\\n   * 9.0))) - 0.01).xyz;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret3_2;\\n  vec3 ret_3;\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (((uv - 0.5) * vec2(-1.0, 1.0)) + 0.5);\\n  vec3 tmpvar_5;\\n  tmpvar_5 = abs(((texture (sampler_main, uv).xyz * \\n    clamp ((((\\n      (texture (sampler_blur2, uv).xyz * scale2)\\n     + bias2) * 2.8) - 0.13), 0.0, 1.0)\\n  ) - (texture (sampler_main, tmpvar_4).xyz * \\n    clamp ((((\\n      (texture (sampler_blur2, tmpvar_4).xyz * scale2)\\n     + bias2) * 2.8) - 0.13), 0.0, 1.0)\\n  )));\\n  ret3_2 = (tmpvar_5 * sqrt(tmpvar_5));\\n  ret3_2 = (ret3_2 * vec3(0.9, 1.6, 2.3));\\n  ret3_2 = (ret3_2 * 3.0);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = pow (ret3_2, (1.0 - ret3_2));\\n  ret3_2 = tmpvar_6;\\n  uv_1 = (uv * 2.0);\\n  vec2 tmpvar_7;\\n  tmpvar_7 = floor((fract(\\n    (uv_1 * 0.5)\\n  ) * 2.0));\\n  uv_1 = ((fract(uv_1) * (1.0 - tmpvar_7)) + (tmpvar_7 * fract(\\n    (1.0 - uv_1)\\n  )));\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = rad;\\n  tmpvar_8.y = uv_1.y;\\n  uv_1 = tmpvar_8;\\n  vec2 tmpvar_9;\\n  tmpvar_9 = ((0.5 - tmpvar_8.yx) + 0.5);\\n  ret_3 = (texture (sampler_main, tmpvar_8.yx).xyz * clamp ((\\n    (((texture (sampler_blur2, tmpvar_8.yx).xyz * scale2) + bias2) * 2.8)\\n   - 0.13), 0.0, 1.0));\\n  vec3 tmpvar_10;\\n  tmpvar_10 = mix (ret_3, (texture (sampler_main, tmpvar_9).xyz * clamp (\\n    ((((texture (sampler_blur2, tmpvar_9).xyz * scale2) + bias2) * 2.8) - 0.13)\\n  , 0.0, 1.0)), vec3(0.5, 0.5, 0.5));\\n  ret_3 = (tmpvar_10 * tmpvar_10);\\n  ret_3 = (ret_3 * vec3(0.9, 1.6, 2.3));\\n  ret_3 = (ret_3 * 3.0);\\n  ret_3 = (max (tmpvar_6, (0.8 * vec3(\\n    (0.5 * dot (ret_3, vec3(0.32, 0.49, 0.29)))\\n  ))) - (roam_sin.xyz * roam_cos.zxy));\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = ret_3;\\n  ret = tmpvar_11.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:0,gammaadj:1.35,decay:1,echo_zoom:2.144269,echo_alpha:.31,echo_orient:3,wave_mode:7,wave_brighten:0,wrap:0,wave_a:4.1,wave_scale:5.552,wave_smoothing:.504,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoom:.999514,cx:-1,warp:.72142,sy:.980296,wave_g:0,wave_b:0,ob_size:.5,ob_r:1,ib_size:.5,ib_r:1,ib_g:0,ib_b:0,mv_x:64,mv_y:48,mv_l:.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:1,sides:5,textured:1,rad:.98608,tex_ang:3.14159,tex_zoom:.999794,g:1,b:1,r2:1,b2:1,a2:1,border_a:0},init_eqs_str:\"\",frame_eqs_str:\"a.ang=Math.sin(div(a.time,65));\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.bl=0;a.tic=0;a.swi=0;a.q6=0;a.it=0;a.q1=0;a.q5=0;a.bvb=0;a.itar=0;a.mid_avg=0;a.tin=0;a.bass_avg=0;a.vav=0;a.rate=0;a.bd=0;a.q4=0;a.cha=0;a.ra=0;a.treb_avg=0;a.ul=0;a.db=0;a.gv=0;a.q2=0;a.iter=0;a.q3=0;a.vm=0;a.cma=0;a.cm=0;a.rb=0;\",frame_eqs_str:\"a.bl=3.8;a.ul=7.9;a.rate=11.9;a.cha=.01;a.gv=.00001<Math.abs(above(a.gv,a.bl))?.00001<Math.abs(below(a.gv,a.ul))?.00001<Math.abs(above(a.fps,a.rate))?a.gv+a.cha:a.gv-a.cha:a.ul-.1:a.bl+.1;a.monitor=a.gv;a.wave_a=0;a.tic=Math.min(a.time-a.tin,1);a.tin=a.time;a.ra=10;a.treb_avg=a.tic*(a.treb_avg*(div(1,a.tic)-a.ra)+a.ra*a.treb);a.mid_avg=a.tic*(a.mid_avg*(div(1,a.tic)-a.ra)+a.ra*a.mid);a.bass_avg=a.tic*(a.bass_avg*(div(1,a.tic)-a.ra)+a.ra*a.bass);a.rb=1;a.vav=a.tic*(a.vav*(div(1,\\na.tic)-a.rb)+a.rb*(a.bass+a.treb+a.mid)*.33333);a.q1=a.treb_avg;a.q2=a.mid_avg;a.q3=a.bass_avg;a.db=a.bass-a.bass_avg;a.it=(a.it+a.tic)*below(a.it,1);a.rb=.5*div(1,a.tic);a.bvb=a.tic*(a.bass*a.rb+(div(1,a.tic)-a.rb)*a.bvb);a.bd=a.bass-a.bvb;a.vm=a.vm-a.tic+a.swi;a.swi=above(a.bd-a.vm,0);a.q4=1-a.swi;a.cm=.00001<Math.abs(above(a.iter,30)+equal(a.time,0))?randint(3)+1:a.cm;a.iter=(a.iter+a.tic)*(1-above(a.iter,30));a.q5=.00001<Math.abs(equal(a.cm,0))?3:a.cm;a.cma=.00001<Math.abs(above(a.itar,5)+equal(a.time,\\n0))?Math.floor(5*a.vav):a.cma;a.itar=(a.itar+a.tic)*(1-above(a.itar,5));a.q6=Math.floor(5*a.vav);a.decay=.97;a.zoom=1.01;a.sx=1;a.sy=1;\",pixel_eqs_str:\"a.warp=a.bass;\",warp:\" shader_body { \\n  vec3 ret_1;\\n  ret_1 = ((texture (sampler_main, uv_orig).xyz * vec3(0.97, 1.0, 0.97)) - vec3(0.03, 0.0, 0.03));\\n  vec4 tmpvar_2;\\n  tmpvar_2 = texture (sampler_blur1, uv_orig);\\n  ret_1.z = (ret_1.z + ((\\n    (tmpvar_2.xyz * scale1)\\n   + bias1).z * 0.45));\\n  ret_1.x = (ret_1.x + ((\\n    ((tmpvar_2.xyz * scale1) + bias1)\\n  .z * 0.05) + (\\n    ((texture (sampler_blur3, uv_orig).xyz * scale3) + bias3)\\n  .z * 0.05)));\\n  ret_1.z = (ret_1.z - ret_1.x);\\n  ret_1.y = clamp (texture (sampler_pw_main, uv_orig).y, 0.0, 1.0);\\n  ret_1 = (ret_1 * 0.98);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ret_1;\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret_1;\\n  vec3 tmpvar_2;\\n  tmpvar_2.z = 0.0;\\n  tmpvar_2.xy = texsize.zw;\\n  vec3 tmpvar_3;\\n  tmpvar_3 = (tmpvar_2 * 2.5);\\n  ret_1 = (texture (sampler_main, uv).xyz * 0.5);\\n  ret_1 = (ret_1 + (vec3(3.4, 2.38, 1.02) * (\\n    dot (((texture (sampler_blur1, (uv + tmpvar_3.xz)).xyz * scale1) + bias1), vec3(0.32, 0.49, 0.29))\\n   - \\n    dot (((texture (sampler_blur1, (uv - tmpvar_3.xz)).xyz * scale1) + bias1), vec3(0.32, 0.49, 0.29))\\n  )));\\n  ret_1 = (ret_1 + (vec3(0.68, 1.7, 2.38) * (\\n    dot (((texture (sampler_blur1, (uv + tmpvar_3.zy)).xyz * scale1) + bias1), vec3(0.32, 0.49, 0.29))\\n   - \\n    dot (((texture (sampler_blur1, (uv - tmpvar_3.zy)).xyz * scale1) + bias1), vec3(0.32, 0.49, 0.29))\\n  )));\\n  ret_1 = (ret_1 * 1.5);\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = ret_1;\\n  ret = tmpvar_4.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:2.05,decay:.99,echo_zoom:1.008,echo_alpha:.5,echo_orient:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.625,wave_scale:1.187,wave_smoothing:0,modwavealphastart:.71,modwavealphaend:1.3,warpanimspeed:1.459,warpscale:2.007,fshader:.19,zoom:.9999,warp:.01,sx:.9999,wave_r:.5,wave_g:.5,wave_b:.5,ob_r:1,ob_g:1,ob_b:1,ib_size:.26,mv_x:64,mv_y:48,mv_l:.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:.5},shapes:[{baseVals:{enabled:1,sides:9,thickoutline:1,textured:1,rad:.12566,ang:3.39292,tex_ang:.3768,tex_zoom:.32473,g:1,b:1,r2:1,b2:1,a2:1,border_r:.03,border_g:.67,border_b:.79,border_a:1},init_eqs_str:\"a.q1=0;a.q2=0;a.q3=0;\",frame_eqs_str:\"a.x+=.13*Math.sin(.9*a.time);a.y+=.16*Math.sin(.5*a.time);a.border_r=a.q1;a.border_b=a.q2;a.border_g=a.q3;\"},{baseVals:{enabled:1,sides:3,thickoutline:1,rad:.12572,a2:1,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.q1=0;a.q2=0;a.q3=0;\",frame_eqs_str:\"a.rad=a.rad-.2+.2*a.bass_att;a.r=a.r+.25*Math.sin(1.1*a.time)+.2*Math.sin(.25*a.time);a.g=a.g+.25*Math.cos(1.5*a.time)+.22*Math.cos(.24*a.time);a.b=a.b+.25*Math.sin(.6*a.time)+.27*Math.cos(.7*a.time);a.r2=1-Math.abs(a.r);a.g2=1-Math.abs(a.g);a.b2=1-Math.abs(a.b);a.ang+=3*Math.abs(Math.tan(1*a.time));a.x=a.x+.14*Math.cos(a.time)+.2*Math.sin(.42*a.time);a.y=a.y+.16*Math.sin(1.2*a.time)+.15*Math.sin(.8*a.time)+.21*Math.cos(.45*a.time);a.border_r=a.q1;a.border_b=a.q2;a.border_g=\\na.q3;\"},{baseVals:{enabled:1,ang:.03,r:.21,g:.44,b:.23,r2:.18,b2:.11,a2:1,border_r:.15,border_g:.4,border_b:.48,border_a:1},init_eqs_str:\"a.q1=0;a.q2=0;a.q3=0;\",frame_eqs_str:\"a.ang=2.4*a.time;a.x=.5+.22*Math.cos(3.3*a.time)+.14*Math.cos(1.2*a.time);a.y=.5+.26*Math.sin(3.1*a.time)+.13*Math.sin(1.7*a.time);a.r=.5+.5*Math.sin(1.013*a.time+5);a.g=.5+.5*Math.sin(1.063*a.time+2);a.b=.5+.5*Math.sin(1.054*a.time+1);a.r2=.5+.5*Math.sin(1.085*a.time+3);a.g2=.5+.5*Math.sin(1.056*a.time+1);a.b2=.5+.5*Math.sin(1.038*a.time+4);a.border_r=a.q1;a.border_b=a.q2;a.border_g=a.q3;\"},{baseVals:{enabled:1,sides:5,x:.51,y:.49,rad:.09986,ang:.06283,a2:1,border_r:.46,border_g:.28,border_b:.54,border_a:1},init_eqs_str:\"a.q4=0;a.q1=0;a.q2=0;a.q3=0;\",frame_eqs_str:\"a.x=.5+.07*Math.cos(.5*a.q4)+.31*Math.sin(3.5*a.time);a.y=.5+.07*Math.sin(.5*a.q4)+.31*Math.cos(3.5*a.time);a.r=.5+.5*Math.sin(1.013*a.time+2);a.g=.5+.5*Math.sin(.863*a.time+3);a.b=.5+.5*Math.sin(1.054*a.time+1);a.r2=.5+.5*Math.sin(1.185*a.time+3);a.g2=.5+.5*Math.sin(1.356*a.time+2);a.b2=.5+.5*Math.sin(.738*a.time+4);a.border_r=a.q1;a.border_b=a.q2;a.border_g=a.q3;\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.index2=0;a.xk=0;a.kiss=0;a.sw=0;a.yk=0;a.index=0;a.q22=0;a.q21=0;a.q29=0;a.q6=0;a.dt=0;a.y0=0;a.q1=0;a.dec_med=0;a.q5=0;a.index3=0;a.q9=0;a.x0=0;a.ax=0;a.rott=0;a.is_beat=0;a.q23=0;a.k1=0;a.q24=0;a.vx=0;a.dec_slow=0;a.q10=0;a.vy=0;a.q4=0;a.k2=0;a.q26=0;a.ay=0;a.p2=0;a.avg=0;a.beat=0;a.vol=0;a.p1=0;a.peak=0;a.q2=0;a.q27=0;a.q3=0;a.t0=0;a.m=0;a.q7=0;a.q28=0;a.v2=0;a.q20=0;a.q8=0;a.vol=0;a.p1=0;a.vx=.2;a.vy=-.1;a.kx=0;a.ky=0;\",frame_eqs_str:\"a.dec_med=pow(.96,div(30,a.fps));a.dec_slow=pow(.999,div(30,a.fps));a.beat=Math.max(Math.max(a.bass,a.mid),a.treb);a.avg=a.avg*a.dec_slow+a.beat*(1-a.dec_slow);a.is_beat=above(a.beat,.5+a.avg+a.peak)*above(a.time,a.t0+.2);a.t0=a.is_beat*a.time+(1-a.is_beat)*a.t0;a.peak=a.is_beat*a.beat+(1-a.is_beat)*a.peak*a.dec_med;a.index=mod(a.index+a.is_beat,8);a.index2=mod(a.index2+a.is_beat*bnot(a.index),2);a.index3=mod(a.index3+a.is_beat*bnot(a.index)*bnot(a.index2),2);a.q20=a.avg;a.q21=\\na.beat;a.q22=a.peak;a.q23=a.index;a.q24=a.is_beat;a.vol=a.bass_att+a.treb_att;a.v2=a.v2*a.dec_med+a.vol*(1-a.dec_med);a.q26=Math.max(Math.atan(a.vol-a.v2),0);a.q27=a.index+1;a.sw=a.sw*a.dec_med+(1-a.dec_med)*mod(a.index2,2);a.q28=a.sw;a.kiss=a.kiss*a.dec_med+(1-a.dec_med)*bnot(a.index2)*below(a.index,4);a.q29=a.kiss;a.k1=a.is_beat*bnot(a.index);a.k2=a.is_beat*bnot(a.index);a.p1=a.k1*(a.p1+1)+(1-a.k1)*a.p1;a.p2=a.dec_med*a.p2+(1-a.dec_med)*a.p1;a.rott=div(3.1416*a.p2,2);a.monitor=a.k1;a.q1=Math.cos(a.rott);\\na.q2=Math.sin(a.rott);a.q3=-a.q2;a.q4=a.q1;a.q5=Math.cos(div(a.time,4));a.q6=-Math.sin(div(a.time,4));a.q7=-a.q6;a.q8=a.q5;a.zoom=1;a.rot=-0;a.dt=div(3,a.fps);a.m=1;a.x0=0;a.y0=0;a.ax=div(-(a.xk-a.x0),a.m)+div(sign(a.vx+.001)*a.dt*a.bass,40);a.ay=div(-(a.yk-a.y0),a.m)+div(sign(a.vy+.001)*a.dt*a.treb,40);a.monitor=a.index3;a.vx=a.vx*a.dec_slow+a.ax*a.dt;a.vy=a.vy*a.dec_slow+a.ay*a.dt;a.xk+=a.vx*a.dt;a.yk+=a.vy*a.dt;a.q9=a.xk;a.q10=a.yk;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = ((uv * texsize.xy) * 0.08);\\n  vec3 tmpvar_2;\\n  tmpvar_2 = (texture (sampler_main, (uv - (\\n    ((sin(tmpvar_1) / cos(tmpvar_1)) * texsize.zw)\\n   * 3.0))).xyz + (vec3(dot (texture (sampler_noise_lq, \\n    ((((texsize.xy * texsize_noise_lq.zw).x * uv) * 0.02) + (0.1 * rand_frame).xy)\\n  ), vec4(0.32, 0.49, 0.29, 0.0))) / 30.0));\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = ((mix (tmpvar_2, \\n    (1.0 - tmpvar_2.zyx)\\n  , vec3(0.01, 0.01, 0.01)) - 0.03) - (0.2 * pow (\\n    (1.0 - rad)\\n  , 18.0)));\\n  ret = tmpvar_3.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = cos(((uv.y * texsize.y) / 2.0));\\n  tmpvar_2.y = sin(((uv.x * texsize.x) / 2.0));\\n  uv_1 = (uv + ((2.0 * texsize.zw) * tmpvar_2));\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = (1.4 * pow ((\\n    clamp (((texture (sampler_blur1, uv_1).xyz * scale1) + bias1), 0.0, 1.0)\\n   * \\n    (texture (sampler_pc_main, uv_1).xyz - ((texture (sampler_blur3, uv_1).xyz * scale3) + bias3))\\n  ), vec3(0.5, 0.5, 0.5)));\\n  ret = tmpvar_3.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:4,gammaadj:1.98,echo_zoom:2.448,echo_alpha:.5,wave_thick:1,wrap:0,wave_a:3.645,wave_scale:1.951,wave_smoothing:.5,wave_mystery:-.5,warpscale:2.853,zoomexp:2.1,zoom:1.025,warp:1.29077,wave_g:0,wave_b:0,ob_size:0,ob_a:1,ib_size:0,ib_r:0,ib_g:0,ib_b:0,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:100,rad:.13518,g2:0,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.q8=0;\",frame_eqs_str:\"a.x=.3+.05*Math.sin(.89*a.q8);a.y=.4-.05*Math.cos(.77*a.q8);a.r=.25+.25*Math.sin(.7679*a.time);a.g=.25+.25*Math.sin(.8079*a.time);a.b=.25+.25*Math.sin(.7339*a.time);a.r2=.25+.25*Math.sin(.6979*a.time);a.g2=.25+.25*Math.sin(.849*a.time);a.b2=.25+.25*Math.sin(.8079*a.time);\"},{baseVals:{enabled:1,sides:100,rad:.06623,g2:0,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.q8=0;\",frame_eqs_str:\"a.x=.3-.05*Math.sin(.7089*a.q8);a.y=.4+.05*Math.cos(.5077*a.q8);a.r=.25+.25*Math.sin(.6479*a.time);a.g=.25+.25*Math.sin(.5079*a.time);a.b=.25+.25*Math.sin(.9339*a.time);a.r2=.25+.25*Math.sin(.779*a.time);a.g2=.25+.25*Math.sin(.707*a.time);a.b2=.25+.25*Math.sin(.747*a.time);\"},{baseVals:{enabled:1,sides:100,rad:.03646,g2:0,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.q8=0;\",frame_eqs_str:\"a.x=.3+.05*Math.sin(.679*a.q8);a.y=.4-.05*Math.cos(.877*a.q8);a.r=.25+.25*Math.sin(.5679*a.time);a.g=.25+.25*Math.sin(.4079*a.time);a.b=.25+.25*Math.sin(1.1339*a.time);a.r2=.25+.25*Math.sin(.9979*a.time);a.g2=.25+.25*Math.sin(.891*a.time);a.b2=.25+.25*Math.sin(.713*a.time);\"},{baseVals:{enabled:1,sides:100,rad:.0122,g2:0,a2:1,border_r:0,border_g:0,border_b:0,border_a:1},init_eqs_str:\"a.q8=0;\",frame_eqs_str:\"a.x=.3+.05*Math.sin(.916*a.q8);a.y=.4-.05*Math.cos(.977*a.q8);a.r=.25+.25*Math.sin(1.1679*a.time);a.g=.25+.25*Math.sin(1.18079*a.time);a.b=.25+.25*Math.sin(1.17339*a.time);a.r2=.25+.25*Math.sin(1.16979*a.time);a.g2=.25+.25*Math.sin(1.1849*a.time);a.b2=.25+.25*Math.sin(1.81079*a.time);\"}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.myrad=0;a.q25=0;a.q12=0;a.q18=0;a.q22=0;a.q21=0;a.vt=0;a.q13=0;a.q15=0;a.q29=0;a.q6=0;a.q1=0;a.myx=0;a.q5=0;a.vb=0;a.q9=0;a.myy=0;a.oldq8=0;a.q31=0;a.q23=0;a.q24=0;a.q11=0;a.q10=0;a.q4=0;a.q16=0;a.mybass=0;a.q26=0;a.rd=0;a.q19=0;a.q17=0;a.q2=0;a.q27=0;a.q14=0;a.q3=0;a.vvm=0;a.q32=0;a.vvb=0;a.q7=0;a.q28=0;a.vm=0;a.q30=0;a.q20=0;a.vvt=0;a.q8=0;\",frame_eqs_str:\"a.vb=.95*a.vb+(1-a.vb)*pow(a.bass_att,2)*.02;a.vvb=.95*a.vvb+(1-a.vvb)*a.vb*.01;a.vm=.95*a.vm+(1-a.vm)*pow(a.mid_att,2)*.02;a.vvm=.95*a.vvm+(1-a.vvm)*a.vm*.01;a.vt=.95*a.vt+(1-a.vt)*pow(a.treb_att,2)*.02;a.vvt=.95*a.vvt+(1-a.vvt)*a.vt*.01;a.vvb=Math.min(1,Math.max(0,a.vvb));a.vvm=Math.min(1,Math.max(0,a.vvm));a.vvt=Math.min(1,Math.max(0,a.vvt));a.q1=2*a.vvb;a.q2=2*a.vvm;a.q3=2*a.vvt;a.q4=5*(a.q1+a.q2+a.q3);a.q5=5*(a.q1+a.q2+a.q3);a.q6=5*(a.q1+a.q2+a.q3);a.q7=5*(a.q1+a.q2+a.q3);\\na.q8=5*(a.q1+a.q2+a.q3);a.q9=5*(a.q1+a.q2+a.q3);a.q10=5*(a.q1+a.q2+a.q3);a.q11=5*(a.q1+a.q2+a.q3);a.q12=5*(a.q1+a.q2+a.q3);a.q13=5*(a.q1+a.q2+a.q3);a.q14=5*(a.q1+a.q2+a.q3);a.q15=5*(a.q1+a.q2+a.q3);a.q16=5*(a.q1+a.q2+a.q3);a.q17=5*(a.q1+a.q2+a.q3);a.q18=5*(a.q1+a.q2+a.q3);a.q19=5*(a.q1+a.q2+a.q3);a.q20=5*(a.q1+a.q2+a.q3);a.q21=5*(a.q1+a.q2+a.q3);a.q22=5*(a.q1+a.q2+a.q3);a.q23=5*(a.q1+a.q2+a.q3);a.q24=5*(a.q1+a.q2+a.q3);a.q25=5*(a.q1+a.q2+a.q3);a.q26=5*(a.q1+a.q2+a.q3);a.q27=5*(a.q1+a.q2+a.q3);a.q28=\\n5*(a.q1+a.q2+a.q3);a.q29=5*(a.q1+a.q2+a.q3);a.q30=5*(a.q1+a.q2+a.q3);a.q31=5*(a.q1+a.q2+a.q3);a.q32=5*(a.q1+a.q2+a.q3);a.warp=0;a.rot=0;a.cx=.5;a.cy=.5;a.q1=.5+.1*Math.sin(a.time);a.q2=.5-.1*Math.cos(a.time);a.wave_a=0;a.decay=.95;a.q1=.5+.1*Math.sin(a.q8);a.q2=.5;a.q8=a.oldq8+.003*div(pow(1+1.2*a.bass+.4*a.bass_att+.1*a.treb+.1*a.treb_att+.1*a.mid+.1*a.mid_att,6),a.fps);a.oldq8=a.q8;a.mybass+=.01*(a.bass+a.bass_att);a.zoom=1.09;a.q1=.5+0*Math.sin(.12*a.q8);a.q2=.5-0*Math.cos(.177*a.q8);\",pixel_eqs_str:\"a.myx=1.1*(a.x-a.q1);a.myy=1.1*(a.y-a.q2);a.myrad=a.myx*a.myx+a.myy*a.myy;a.dx=(.5+.02*Math.sin(a.q8))*div(a.myy,a.myrad+1);a.dy=-(.5+.02*Math.sin(.897*a.q8))*div(a.myx,a.myrad+1);a.rd=a.bass*a.rad;a.rot=div(a.rd,10);a.sy=1.02+div(a.rad,10);a.sx=a.sy-a.myrad;\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = ((uv_orig - 0.5) * vec2(1.81, 1.81));\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = ((tmpvar_1.x * tmpvar_1.x) - (tmpvar_1.y * tmpvar_1.y));\\n  tmpvar_2.y = ((2.0 * tmpvar_1.x) * tmpvar_1.y);\\n  vec4 tmpvar_3;\\n  tmpvar_3.w = 1.0;\\n  tmpvar_3.xyz = (texture (sampler_fc_main, (tmpvar_2 + vec2(0.448, 0.701))) - 0.004).xyz;\\n  ret = tmpvar_3.xyz;\\n }\",comp:\"vec3 xlat_mutableneu;\\nvec3 xlat_mutableret1;\\n shader_body { \\n  vec2 uv_1;\\n  float inten_2;\\n  float dist_3;\\n  vec2 uv2_4;\\n  uv_1 = (uv - 0.5);\\n  uv_1 = (uv_1 * aspect.xy);\\n  float tmpvar_5;\\n  tmpvar_5 = (time / 2.0);\\n  dist_3 = (1.0 - fract(tmpvar_5));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 8.0);\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = q1;\\n  tmpvar_6.y = q2;\\n  vec2 tmpvar_7;\\n  tmpvar_7 = fract(((\\n    ((3.0 * uv_1) * dist_3)\\n   + 0.5) + (tmpvar_6 * 0.05)));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_7).xyz - ((texture (sampler_blur1, \\n    (tmpvar_7 + 0.003)\\n  ).xyz * scale1) + bias1));\\n  xlat_mutableret1 = max (vec3(0.0, 0.0, 0.0), (xlat_mutableneu * inten_2));\\n  uv2_4.x = ((uv_1.x * -0.4990803) - (uv_1.y * 0.8665558));\\n  uv2_4.y = ((uv_1.x * 0.8665558) + (uv_1.y * -0.4990803));\\n  dist_3 = (1.0 - fract((0.3333333 + tmpvar_5)));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 8.0);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = q1;\\n  tmpvar_8.y = q2;\\n  vec2 tmpvar_9;\\n  tmpvar_9 = fract(((\\n    ((3.0 * uv2_4) * dist_3)\\n   + 0.5) + (tmpvar_8 * 0.05)));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_9).xyz - ((texture (sampler_blur1, \\n    (tmpvar_9 + 0.003)\\n  ).xyz * scale1) + bias1));\\n  xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * inten_2));\\n  uv2_4.x = ((uv_1.x * -0.5018377) - (uv_1.y * -0.8649619));\\n  uv2_4.y = ((uv_1.x * -0.8649619) + (uv_1.y * -0.5018377));\\n  dist_3 = (1.0 - fract((0.6666667 + tmpvar_5)));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 8.0);\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = q1;\\n  tmpvar_10.y = q2;\\n  vec2 tmpvar_11;\\n  tmpvar_11 = fract(((\\n    ((3.0 * uv2_4) * dist_3)\\n   + 0.5) + (tmpvar_10 * 0.05)));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_11).xyz - ((texture (sampler_blur1, \\n    (tmpvar_11 + 0.003)\\n  ).xyz * scale1) + bias1));\\n  xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * inten_2));\\n  uv2_4.x = ((uv_1.x * 0.9999949) - (uv_1.y * -0.003185092));\\n  uv2_4.y = ((uv_1.x * -0.003185092) + (uv_1.y * 0.9999949));\\n  dist_3 = (1.0 - fract((1.0 + tmpvar_5)));\\n  inten_2 = ((sqrt(dist_3) * (1.0 - dist_3)) * 8.0);\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = q1;\\n  tmpvar_12.y = q2;\\n  vec2 tmpvar_13;\\n  tmpvar_13 = fract(((\\n    ((3.0 * uv2_4) * dist_3)\\n   + 0.5) + (tmpvar_12 * 0.05)));\\n  xlat_mutableneu = (texture (sampler_main, tmpvar_13).xyz - ((texture (sampler_blur1, \\n    (tmpvar_13 + 0.003)\\n  ).xyz * scale1) + bias1));\\n  xlat_mutableret1 = max (xlat_mutableret1, (xlat_mutableneu * inten_2));\\n  vec4 tmpvar_14;\\n  tmpvar_14.w = 1.0;\\n  tmpvar_14.xyz = (xlat_mutableret1 * 4.0);\\n  ret = tmpvar_14.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:5,gammaadj:1,decay:1,echo_zoom:1,echo_orient:1,wave_thick:1,wave_brighten:0,wrap:0,brighten:1,wave_a:.401,wave_scale:3.177,wave_smoothing:0,wave_mystery:-.4,modwavealphastart:1,modwavealphaend:1,warpanimspeed:2.289,warpscale:5.472,zoomexp:.01,zoom:.9901,warp:1.8566,ob_size:.005,ob_a:1,ib_size:0,ib_r:1,ib_g:0,ib_b:0,ib_a:1,mv_x:64,mv_y:48,mv_l:0,mv_b:0,mv_a:0},shapes:[{baseVals:{enabled:1,sides:12,additive:1,num_inst:512,y:.55,rad:.034,tex_zoom:.7874,g:.45,g2:0,border_a:0},init_eqs_str:\"a.my_z=0;a.d=0;a.y3=0;a.z2=0;a.y1=0;a.w=0;a.w2=0;a.t1=0;a.x1=0;a.rnd2=0;a.zoom=0;a.p=0;a.q1=0;a.q5=0;a.z3=0;a.w3=0;a.t3=0;a.my_x=0;a.x3=0;a.wv=0;a.my_y=0;a.q4=0;a.t=0;a.w1=0;a.i=0;a.x2=0;a.t2=0;a.l=0;a.y2=0;a.rnd4=0;a.wh=0;a.q2=0;a.z1=0;a.rnd3=0;a.rnd1=0;a.q3=0;a.t4=0;a.started=0;a.t1=.412;a.t2=.4563;a.t3=.6452;a.t4=.2565;\",frame_eqs_str:\"a.rnd1=.00001<Math.abs(equal(a.instance,0))?a.t1:a.rnd1;a.rnd2=.00001<Math.abs(equal(a.instance,0))?a.t2:a.rnd2;a.rnd3=.00001<Math.abs(equal(a.instance,0))?a.t3:a.rnd3;a.rnd4=.00001<Math.abs(equal(a.instance,0))?a.t4:a.rnd4;a.rnd1=4*a.rnd1*(1-a.rnd1);a.rnd2=4*a.rnd2*(1-a.rnd2);a.rnd3=4*a.rnd3*(1-a.rnd3);a.rnd4=4*a.rnd4*(1-a.rnd4);a.t=.6;a.t=a.rnd1+a.time*a.t-Math.floor(a.rnd1+a.time*a.t);a.t+=.1*a.rnd2;a.wh=a.rnd4*Math.asin(1)*4;a.wv=.25+.1*a.rnd3;a.d=1.4;a.zoom=1;a.l=1;a.w1=\\na.q3;a.w2=a.q4;a.w3=a.q5;a.i=a.instance;a.my_x=a.t*Math.cos(a.wh)*Math.sin(a.wv)*a.l;a.my_y=(-.5+(a.t-.75)*(a.t-.75))*Math.cos(a.wv)*a.l;a.my_z=a.t*Math.sin(a.wh)*Math.sin(a.wv)*a.l;a.x1=Math.cos(a.w1)*a.my_x+Math.sin(a.w1)*a.my_y;a.y1=-Math.sin(a.w1)*a.my_x+Math.cos(a.w1)*a.my_y;a.z1=a.my_z;a.x2=Math.cos(a.w2)*a.x1+Math.sin(a.w2)*a.z1;a.z2=-Math.sin(a.w2)*a.x1+Math.cos(a.w2)*a.z1;a.y2=a.y1;a.y3=Math.cos(a.w3)*a.y2+Math.sin(a.w3)*a.z2;a.z3=-Math.sin(a.w3)*a.y2+Math.cos(a.w3)*a.z2;a.x3=a.x2;a.l=sqrt(a.x3*\\na.x3+a.y3*a.y3);a.w=Math.atan2(a.x3,a.y3);a.p=Math.tan(Math.asin(1)+Math.atan2(a.d+a.z3,a.l));a.d=sqrt(a.x3*a.x3+a.y3*a.y3+(a.z3+a.d)*(a.z3+a.d));a.rad=div(a.rad,a.d);a.my_x=a.zoom*Math.sin(a.w)*a.p;a.my_y=a.zoom*Math.cos(a.w)*a.p;a.x=.5+a.my_x;a.y=.5+a.my_y;a.x=.5+div(a.x-.5,a.q2);a.y=.5+div(a.y-.5,a.q1);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.q1=0;a.q2=0;a.b=0;a.m=0;a.t=0;a.q3=0;a.q4=0;a.q5=0;\",frame_eqs_str:\"a.wave_a=0;a.q1=a.aspectx;a.q2=a.aspecty;a.b+=a.bass*a.bass*.85;a.m+=a.mid*a.mid*.85;a.t+=a.treb*a.treb*.85;a.q3=.012*a.b;a.q4=.012*a.m;a.q5=.012*a.t;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 my_uv_1;\\n  vec3 ret_2;\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (vec2(1280.0, 1024.0) * texsize.zw);\\n  float tmpvar_4;\\n  vec2 tmpvar_5;\\n  tmpvar_5 = (uv + vec2(0.005, 0.0));\\n  vec2 tmpvar_6;\\n  tmpvar_6 = (uv - vec2(0.005, 0.0));\\n  tmpvar_4 = (((\\n    (texture (sampler_blur2, tmpvar_5).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_6).xyz * scale2)\\n   + bias2)).x * tmpvar_3.x);\\n  float tmpvar_7;\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (uv + vec2(0.0, 0.005));\\n  vec2 tmpvar_9;\\n  tmpvar_9 = (uv - vec2(0.0, 0.005));\\n  tmpvar_7 = (((\\n    (texture (sampler_blur2, tmpvar_8).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_9).xyz * scale2)\\n   + bias2)).x * tmpvar_3.y);\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_4;\\n  tmpvar_10.y = tmpvar_7;\\n  vec2 tmpvar_11;\\n  tmpvar_11.x = (((\\n    (texture (sampler_blur2, tmpvar_5).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_6).xyz * scale2)\\n   + bias2)).x * tmpvar_3.x);\\n  tmpvar_11.y = (((\\n    (texture (sampler_blur2, tmpvar_8).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, tmpvar_9).xyz * scale2)\\n   + bias2)).x * tmpvar_3.y);\\n  ret_2.x = texture (sampler_fw_main, ((uv - (tmpvar_10 * 0.01)) + (tmpvar_11 * 0.003))).x;\\n  vec4 tmpvar_12;\\n  tmpvar_12 = texture (sampler_blur3, uv);\\n  ret_2.x = (ret_2.x + ((ret_2.x - \\n    ((tmpvar_12.xyz * scale3) + bias3)\\n  .x) * 0.1));\\n  ret_2.x = (ret_2.x + 0.004);\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = tmpvar_7;\\n  tmpvar_13.y = -(tmpvar_4);\\n  my_uv_1 = (uv + ((tmpvar_13 * 0.05) * (1.2 - \\n    ((tmpvar_12.xyz * scale3) + bias3)\\n  .y)));\\n  ret_2.z = texture (sampler_fw_main, my_uv_1).z;\\n  vec2 x_14;\\n  x_14 = (my_uv_1 - uv);\\n  ret_2.z = (ret_2.z + ((\\n    ((ret_2.z - ((texture (sampler_blur1, uv).xyz * scale1) + bias1).z) * sqrt(dot (x_14, x_14)))\\n   * 180.0) / sqrt(\\n    dot (tmpvar_3, tmpvar_3)\\n  )));\\n  ret_2.z = (ret_2.z * 0.8);\\n  ret_2.z = (ret_2.z + 0.004);\\n  vec2 tmpvar_15;\\n  tmpvar_15.x = -(tmpvar_7);\\n  tmpvar_15.y = tmpvar_4;\\n  my_uv_1 = (tmpvar_15 * 0.045);\\n  vec2 tmpvar_16;\\n  tmpvar_16.x = (((\\n    (texture (sampler_blur2, (uv + vec2(0.01, 0.0))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (uv - vec2(0.01, 0.0))).xyz * scale2)\\n   + bias2)).y * tmpvar_3.x);\\n  tmpvar_16.y = (((\\n    (texture (sampler_blur2, (uv + vec2(0.0, 0.01))).xyz * scale2)\\n   + bias2) - (\\n    (texture (sampler_blur2, (uv - vec2(0.0, 0.01))).xyz * scale2)\\n   + bias2)).y * tmpvar_3.y);\\n  my_uv_1 = (my_uv_1 + (uv - (tmpvar_16 * 0.03)));\\n  ret_2.y = texture (sampler_fw_main, my_uv_1).y;\\n  ret_2.y = (ret_2.y + ((\\n    (ret_2.y - ((texture (sampler_blur3, my_uv_1).xyz * scale3) + bias3).y)\\n   * 0.1) + 0.01));\\n  vec4 tmpvar_17;\\n  tmpvar_17.w = 1.0;\\n  tmpvar_17.xyz = ret_2;\\n  ret = tmpvar_17.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv1_1;\\n  vec3 tmpvar_2;\\n  tmpvar_2 = texture (sampler_main, uv).xyz;\\n  vec2 tmpvar_3;\\n  tmpvar_3.y = 0.0;\\n  tmpvar_3.x = texsize.z;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = 0.0;\\n  tmpvar_4.y = texsize.w;\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (texture (sampler_main, (uv - tmpvar_3)).xyz - texture (sampler_main, (uv + tmpvar_3)).xyz).x;\\n  tmpvar_5.y = (texture (sampler_main, (uv - tmpvar_4)).xyz - texture (sampler_main, (uv + tmpvar_4)).xyz).x;\\n  uv1_1 = ((0.3 * cos(\\n    (((uv - 0.5) * 2.0) + 1.7)\\n  )) - (2.0 * tmpvar_5));\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ((-(tmpvar_2) / 4.0) + ((6.0 * vec3(\\n    clamp ((0.03 / sqrt(dot (uv1_1, uv1_1))), 0.0, 1.0)\\n  )) * (-0.08 + tmpvar_2)));\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:2,decay:.99,wave_brighten:0,wave_a:1,wave_scale:.01,wave_mystery:-.2,warpanimspeed:3.434,warpscale:1.295,zoom:1.025,warp:.11284,wave_r:0,wave_g:0,wave_b:0,ob_size:.005,ob_b:1,ob_a:1,mv_x:64,mv_y:48,mv_l:5,mv_g:0,mv_b:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.d=0;a.cx1=0;a.y3=0;a.y1=0;a.cy1=0;a.q25=0;a.q12=0;a.q18=0;a.x1=0;a.q22=0;a.q21=0;a.vt=0;a.q13=0;a.q15=0;a.q29=0;a.q6=0;a.q1=0;a.q5=0;a.vb=0;a.q9=0;a.x3=0;a.q31=0;a.q23=0;a.q24=0;a.q11=0;a.q10=0;a.q4=0;a.dir=0;a.q16=0;a.q26=0;a.x2=0;a.q19=0;a.q17=0;a.y2=0;a.q2=0;a.q27=0;a.q14=0;a.q3=0;a.vvm=0;a.q32=0;a.vvb=0;a.q7=0;a.q28=0;a.vm=0;a.q30=0;a.q20=0;a.vvt=0;a.q8=0;\",frame_eqs_str:\"a.vb=.95*a.vb+(1-a.vb)*pow(a.bass_att,2)*.02;a.vvb=.95*a.vvb+(1-a.vvb)*a.vb*.01;a.vm=.95*a.vm+(1-a.vm)*pow(a.mid_att,2)*.02;a.vvm=.95*a.vvm+(1-a.vvm)*a.vm*.01;a.vt=.95*a.vt+(1-a.vt)*pow(a.treb_att,2)*.02;a.vvt=.95*a.vvt+(1-a.vvt)*a.vt*.01;a.vvb=Math.min(1,Math.max(0,a.vvb));a.vvm=Math.min(1,Math.max(0,a.vvm));a.vvt=Math.min(1,Math.max(0,a.vvt));a.q1=10*(a.vvb+a.vvm+a.vvt);a.q2=10*(a.vvb+a.vvm+a.vvt);a.q3=10*(a.vvb+a.vvm+a.vvt);a.q4=10*(a.vvb+a.vvm+a.vvt);a.q5=10*(a.vvb+a.vvm+\\na.vvt);a.q6=10*(a.vvb+a.vvm+a.vvt);a.q7=10*(a.vvb+a.vvm+a.vvt);a.q8=10*(a.vvb+a.vvm+a.vvt);a.q9=10*(a.vvb+a.vvm+a.vvt);a.q10=10*(a.vvb+a.vvm+a.vvt);a.q11=10*(a.vvb+a.vvm+a.vvt);a.q12=10*(a.vvb+a.vvm+a.vvt);a.q13=10*(a.vvb+a.vvm+a.vvt);a.q14=10*(a.vvb+a.vvm+a.vvt);a.q15=10*(a.vvb+a.vvm+a.vvt);a.q16=10*(a.vvb+a.vvm+a.vvt);a.q17=10*(a.vvb+a.vvm+a.vvt);a.q18=10*(a.vvb+a.vvm+a.vvt);a.q19=10*(a.vvb+a.vvm+a.vvt);a.q20=10*(a.vvb+a.vvm+a.vvt);a.q21=10*(a.vvb+a.vvm+a.vvt);a.q22=10*(a.vvb+a.vvm+a.vvt);a.q23=\\n10*(a.vvb+a.vvm+a.vvt);a.q24=10*(a.vvb+a.vvm+a.vvt);a.q25=10*(a.vvb+a.vvm+a.vvt);a.q26=10*(a.vvb+a.vvm+a.vvt);a.q27=10*(a.vvb+a.vvm+a.vvt);a.q28=10*(a.vvb+a.vvm+a.vvt);a.q29=10*(a.vvb+a.vvm+a.vvt);a.q30=10*(a.vvb+a.vvm+a.vvt);a.q31=10*(a.vvb+a.vvm+a.vvt);a.q32=10*(a.vvb+a.vvm+a.vvt);a.zoom=.995;a.wave_a=0;a.mv_g=.45+.3*Math.sin(1.33*a.time)+.25*Math.sin(a.treb);a.mv_r=.45+.3*Math.sin(1.13*a.time)+.0825*(a.bass+a.treb+a.mid);a.mv_b=.45+.3*Math.sin(1.23*a.time)+.25*Math.sin(a.bass);a.mv_dx=.1*Math.sin(.1*\\na.time);a.mv_dy=.13*Math.cos(.084*a.time);a.mv_x=64-Math.floor(32*(Math.sin(1.5*a.time)+1));a.mv_y=48-Math.floor(22*(Math.cos(1.5*a.time)+1));a.monitor=a.mv_y;\",pixel_eqs_str:\"a.cx1=.5+.2*Math.sin(.618*a.time);a.cy1=.5+.2*Math.cos(1.618*a.time);a.dir=a.bass;a.d=sqrt((a.x-a.cx1)*(a.x-a.cx1)+(a.y-a.cy1)*(a.y-a.cy1));a.x1=.00001<Math.abs(above(a.d,.3))?0:.05*Math.sin(a.y-a.cy1)*a.dir;a.y1=.00001<Math.abs(above(a.d,.3))?0:.05*-Math.sin(a.x-a.cx1)*a.dir;a.cx1=.5+.3*Math.sin(2.618*a.time);a.cy1=.5+.3*Math.cos(3.14*a.time);a.dir=2*-a.mid;a.d=sqrt((a.x-a.cx1)*(a.x-a.cx1)+(a.y-a.cy1)*(a.y-a.cy1));a.x2=.00001<Math.abs(above(a.d,.2))?0:.05*Math.sin(a.y-a.cy1)*\\na.dir;a.y2=.00001<Math.abs(above(a.d,.2))?0:.05*-Math.sin(a.x-a.cx1)*a.dir;a.cx1=.5+.4*Math.sin(2.618*-a.time);a.cy1=.5+.4*Math.cos(1.14*-a.time);a.dir=3*a.treb;a.d=sqrt((a.x-a.cx1)*(a.x-a.cx1)+(a.y-a.cy1)*(a.y-a.cy1));a.x3=.00001<Math.abs(above(a.d,.1))?0:.05*Math.sin(a.y-a.cy1)*a.dir;a.y3=.00001<Math.abs(above(a.d,.1))?0:.05*-Math.sin(a.x-a.cx1)*a.dir;a.dx=a.dx+a.x1+a.x2+a.x3;a.dy=a.dy+a.y1+a.y2+a.y3;\",warp:\" shader_body { \\n  vec2 tmpvar_1;\\n  tmpvar_1 = mix (uv_orig, uv, vec2(0.3, 0.3));\\n  vec2 tmpvar_2;\\n  tmpvar_2 = (texsize.zw * 3.0);\\n  vec2 tmpvar_3;\\n  tmpvar_3.x = dot (((\\n    (texture (sampler_blur1, (tmpvar_1 + (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale1)\\n   + bias1) - (\\n    (texture (sampler_blur1, (tmpvar_1 - (vec2(1.0, 0.0) * tmpvar_2))).xyz * scale1)\\n   + bias1)), vec3(0.32, 0.49, 0.29));\\n  tmpvar_3.y = dot (((\\n    (texture (sampler_blur1, (tmpvar_1 + (vec2(0.0, 1.0) * tmpvar_2))).xyz * scale1)\\n   + bias1) - (\\n    (texture (sampler_blur1, (tmpvar_1 - (vec2(0.0, 1.0) * tmpvar_2))).xyz * scale1)\\n   + bias1)), vec3(0.32, 0.49, 0.29));\\n  vec4 tmpvar_4;\\n  tmpvar_4.w = 1.0;\\n  tmpvar_4.xyz = (texture (sampler_fc_main, (tmpvar_1 + (\\n    (tmpvar_3 * texsize.zw)\\n   * 9.0))) - 0.01).xyz;\\n  ret = tmpvar_4.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv_1;\\n  vec3 ret_2;\\n  uv_1 = (0.5 + ((uv - 0.5) * 0.98));\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (texsize.zw * 4.0);\\n  vec3 tmpvar_4;\\n  tmpvar_4 = (((texture (sampler_blur1, \\n    (uv_1 + (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_1 - (vec2(1.0, 0.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (((texture (sampler_blur1, \\n    (uv_1 + (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1) - ((texture (sampler_blur1, \\n    (uv_1 - (vec2(0.0, 1.0) * tmpvar_3))\\n  ).xyz * scale1) + bias1));\\n  vec3 tmpvar_6;\\n  tmpvar_6.z = 0.0;\\n  tmpvar_6.x = dot (tmpvar_4, vec3(0.32, 0.49, 0.29));\\n  tmpvar_6.y = dot (tmpvar_5, vec3(0.32, 0.49, 0.29));\\n  vec4 tmpvar_7;\\n  tmpvar_7 = texture (sampler_noisevol_hq, ((vec3(0.05, 0.05, 0.0) * (\\n    ((uv_1.xyy + (tmpvar_6 * 0.5)) * texsize.xyy)\\n   * texsize_noisevol_hq.zww)) + (vec3(0.0, 0.0, 0.2) * time)));\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = dot (tmpvar_4, vec3(0.32, 0.49, 0.29));\\n  tmpvar_8.y = dot (tmpvar_5, vec3(0.32, 0.49, 0.29));\\n  uv_1 = (uv_1 - (tmpvar_8 * 0.04));\\n  ret_2 = (abs((\\n    ((texture (sampler_main, uv_1).xyz + ((texture (sampler_blur1, uv_1).xyz * scale1) + bias1)) - ((texture (sampler_blur2, uv_1).xyz * scale2) + bias2))\\n   - \\n    ((texture (sampler_blur3, uv_1).xyz * scale3) + bias3)\\n  )) * (dot (tmpvar_7, vec4(0.32, 0.49, 0.29, 0.0)) * 3.0));\\n  vec3 tmpvar_9;\\n  tmpvar_9 = pow (ret_2, vec3(0.5, 0.5, 0.5));\\n  ret_2 = tmpvar_9;\\n  vec4 tmpvar_10;\\n  tmpvar_10.w = 1.0;\\n  tmpvar_10.xyz = tmpvar_9;\\n  ret = tmpvar_10.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,echo_zoom:1,wave_mode:1,wave_thick:1,wrap:0,invert:1,wave_scale:.5,wave_smoothing:.45,warpanimspeed:2.217,warpscale:100,zoomexp:100,zoom:1.01,warp:1.25946,wave_r:0,wave_g:0,wave_b:0,ob_r:1,ob_g:1,ob_b:1,ob_a:1,ib_r:1,ib_g:1,ib_b:1,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.q1=0;\",frame_eqs_str:\"a.q1=.0003*pow(1.2+1*a.bass+.4*a.bass_att+.1*a.treb+.1*a.treb_att+.1*a.mid+.1*a.mid_att,6);a.monitor=a.q1;a.wave_r+=.5*Math.sin(1.13*a.time);a.wave_g+=.5*Math.sin(1.23*a.time);a.wave_b+=.5*Math.sin(1.33*a.time);a.ob_r+=Math.sin(2.26*a.time);a.ob_g+=Math.sin(2.46*a.time);a.ob_b+=Math.sin(2.66*a.time);\",pixel_eqs_str:\"a.zoom+=.125*Math.sin(a.q1);a.rot+=div(.25*Math.sin(100*a.fps)*a.q1,2);a.zoom-=.05*Math.sin(a.rad);a.rot+=.05*Math.sin(5*a.fps);\",warp:\" shader_body { \\n  vec3 ret_1;\\n  vec2 tmpvar_2;\\n  tmpvar_2 = fract(uv);\\n  vec2 tmpvar_3;\\n  tmpvar_3 = (((uv_orig * texsize.xy) * texsize_noise_lq.zw) + rand_frame.xy);\\n  vec2 tmpvar_4;\\n  tmpvar_4 = (texsize.zw * 12.0);\\n  vec3 tmpvar_5;\\n  tmpvar_5 = (((2.0 * \\n    ((texture (sampler_blur3, (uv_orig + (vec2(1.0, 0.0) * tmpvar_4))).xyz * scale3) + bias3)\\n  ) - (2.0 * \\n    ((texture (sampler_blur3, (uv_orig - (vec2(1.0, 0.0) * tmpvar_4))).xyz * scale3) + bias3)\\n  )) * 0.5);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = (((2.0 * \\n    ((texture (sampler_blur3, (uv_orig + (vec2(0.0, 1.0) * tmpvar_4))).xyz * scale3) + bias3)\\n  ) - (2.0 * \\n    ((texture (sampler_blur3, (uv_orig - (vec2(0.0, 1.0) * tmpvar_4))).xyz * scale3) + bias3)\\n  )) * 0.5);\\n  ret_1.x = ((texture (sampler_fc_main, tmpvar_2).x - (\\n    (((texture (sampler_blur3, tmpvar_2).xyz * scale3) + bias3) - texture (sampler_fc_main, tmpvar_2).xyz)\\n  .x * 0.1)) - 0.035);\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_5.x;\\n  tmpvar_7.y = tmpvar_6.x;\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_5.y;\\n  tmpvar_8.y = tmpvar_6.y;\\n  ret_1.y = (((texture (sampler_fc_main, \\n    (((uv_orig + (\\n      ((texture (sampler_noise_lq, tmpvar_3).xy - 0.5) * texsize.zw)\\n     * 4.0)) - ((tmpvar_7 * texsize.zw) * 4.0)) + ((tmpvar_8 * texsize.zw) * 8.0))\\n  ).y + \\n    ((texture (sampler_noise_lq, tmpvar_3).xyz - 0.5) * 0.1)\\n  ) - 0.012) + (texture (sampler_pc_main, uv_orig).z * 0.2)).x;\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_6.x;\\n  tmpvar_9.y = -(tmpvar_5.x);\\n  vec2 tmpvar_10;\\n  tmpvar_10 = ((uv_orig + (\\n    ((texture (sampler_noise_lq, tmpvar_3).xy - 0.5) * texsize.zw)\\n   * 2.0)) + ((tmpvar_9 * texsize.zw) * 64.0));\\n  ret_1.z = (((\\n    (texture (sampler_fc_main, tmpvar_10).z + ((texture (sampler_fc_main, tmpvar_10).z - (\\n      (texture (sampler_blur2, tmpvar_10).xyz * scale2)\\n     + bias2).z) * 0.2))\\n   + \\n    (texture (sampler_noise_lq, tmpvar_3).xyz * 0.1)\\n  ) - (\\n    (texture (sampler_blur3, uv_orig).xyz * scale3)\\n   + bias3).x) - (clamp (\\n    (1.0 - ((texture (sampler_blur2, uv_orig).xyz * scale2) + bias2).x)\\n  , 0.0, 1.0) * 0.04)).x;\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = ret_1;\\n  ret = tmpvar_11.xyz;\\n }\",comp:\"vec2 xlat_mutabled;\\nvec3 xlat_mutabledx;\\nvec3 xlat_mutabledy;\\n shader_body { \\n  vec3 ret_1;\\n  xlat_mutabled = (texsize.zw * 1.5);\\n  xlat_mutabledx = (texture (sampler_main, (uv_orig + (vec2(1.0, 0.0) * xlat_mutabled))).xyz - texture (sampler_main, (uv_orig - (vec2(1.0, 0.0) * xlat_mutabled))).xyz);\\n  xlat_mutabledy = (texture (sampler_main, (uv_orig + (vec2(0.0, 1.0) * xlat_mutabled))).xyz - texture (sampler_main, (uv_orig - (vec2(0.0, 1.0) * xlat_mutabled))).xyz);\\n  vec2 tmpvar_2;\\n  tmpvar_2.x = xlat_mutabledx.y;\\n  tmpvar_2.y = xlat_mutabledy.y;\\n  vec2 x_3;\\n  x_3 = (tmpvar_2 * 8.0);\\n  ret_1 = (((texture (sampler_main, uv).x * \\n    (1.0 - sqrt(dot (x_3, x_3)))\\n  ) * pow (hue_shader, vec3(6.0, 6.0, 6.0))) * 1.4);\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = xlat_mutabledx.z;\\n  tmpvar_4.y = xlat_mutabledy.z;\\n  vec2 x_5;\\n  x_5 = (tmpvar_4 * 4.0);\\n  vec3 tmpvar_6;\\n  tmpvar_6 = mix (ret_1, vec3(1.0, 1.0, 1.0), vec3(sqrt(dot (x_5, x_5))));\\n  ret_1 = tmpvar_6;\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = tmpvar_6;\\n  ret = tmpvar_7.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,gammaadj:1.3,decay:1,echo_zoom:1.75,echo_alpha:.15,echo_orient:3,wave_mode:1,wave_dots:1,darken:1,wave_scale:.5,wave_smoothing:.9,warp:.01,mv_l:5},shapes:[{baseVals:{enabled:1,sides:100,border_a:0},init_eqs_str:\"a.q1=0;\",frame_eqs_str:\"a.r+=Math.sin(.339*a.time);a.g+=Math.sin(.369*a.time);a.b+=Math.sin(.399*a.time);a.r2+=Math.sin(.113*a.time);a.g2+=Math.sin(.123*a.time);a.b2+=Math.sin(.133*a.time);a.rad=div(a.q1,3);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"a.q1=0;\",frame_eqs_str:\"a.q1=.0003*pow(1+1.2*a.bass+.4*a.bass_att+.1*a.treb+.1*a.treb_att+.1*a.mid+.1*a.mid_att,6);a.mv_a=a.q1;a.mv_x+=Math.sin(a.time);a.mv_y+=Math.cos(a.time);a.mv_dx+=1.25*Math.sin(8*a.fps);a.mv_dy+=1.35*Math.sin(8*a.fps);a.mv_r+=Math.sin(.565*a.time);a.mv_g+=Math.sin(.615*a.time);a.mv_b+=Math.sin(.665*a.time);a.wave_r+=.5*Math.sin(1.13*a.time);a.wave_g+=.5*Math.sin(1.23*a.time);a.wave_b+=.5*Math.sin(1.33*a.time);\",pixel_eqs_str:\"a.zoom+=.0125*a.q1;a.rot+=.025*Math.sin(10*a.fps)*a.q1;a.warp=0;\",warp:\" shader_body { \\n  vec2 my_uv_1;\\n  vec3 ret_2;\\n  vec3 tmpvar_3;\\n  tmpvar_3 = ((640.0 * texsize.z) * ((2.0 * \\n    ((texture (sampler_blur2, (uv + vec2(0.01, 0.0))).xyz * scale2) + bias2)\\n  ) - (2.0 * \\n    ((texture (sampler_blur2, (uv - vec2(0.01, 0.0))).xyz * scale2) + bias2)\\n  )));\\n  vec3 tmpvar_4;\\n  tmpvar_4 = ((512.0 * texsize.w) * ((2.0 * \\n    ((texture (sampler_blur2, (uv + vec2(0.0, 0.01))).xyz * scale2) + bias2)\\n  ) - (2.0 * \\n    ((texture (sampler_blur2, (uv - vec2(0.0, 0.01))).xyz * scale2) + bias2)\\n  )));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = tmpvar_3.y;\\n  tmpvar_5.y = tmpvar_4.y;\\n  vec2 tmpvar_6;\\n  tmpvar_6.x = tmpvar_3.x;\\n  tmpvar_6.y = tmpvar_4.x;\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = tmpvar_4.y;\\n  tmpvar_7.y = -(tmpvar_3.y);\\n  vec2 tmpvar_8;\\n  tmpvar_8 = (uv - ((\\n    ((tmpvar_5 * 0.3) + (tmpvar_6 * 0.1))\\n   + \\n    (tmpvar_7 * 0.01)\\n  ) * 0.01));\\n  ret_2.x = texture (sampler_fw_main, (tmpvar_8 - floor(tmpvar_8))).x;\\n  ret_2.x = (ret_2.x + ((\\n    (2.0 * ret_2.x)\\n   - \\n    (2.0 * ((texture (sampler_blur1, tmpvar_8).xyz * scale1) + bias1).x)\\n  ) * 0.25));\\n  vec2 tmpvar_9;\\n  tmpvar_9.x = tmpvar_3.y;\\n  tmpvar_9.y = tmpvar_4.y;\\n  vec2 tmpvar_10;\\n  tmpvar_10.x = tmpvar_4.x;\\n  tmpvar_10.y = -(tmpvar_3.y);\\n  my_uv_1 = ((uv - (tmpvar_9 * 0.01)) + (tmpvar_10 * 0.001));\\n  ret_2.y = texture (sampler_fw_main, (my_uv_1 - floor(my_uv_1))).y;\\n  ret_2.y = (ret_2.y + ((\\n    ((2.0 * ret_2.y) - (2.0 * ((texture (sampler_blur3, my_uv_1).xyz * scale3) + bias3).y))\\n   * 0.025) + 0.01));\\n  vec4 tmpvar_11;\\n  tmpvar_11.w = 1.0;\\n  tmpvar_11.xyz = ret_2;\\n  ret = tmpvar_11.xyz;\\n }\",comp:\"vec2 xlat_mutablefactorA;\\n shader_body { \\n  vec2 uv_1;\\n  vec2 dz_2;\\n  vec3 dy_3;\\n  vec3 dx_4;\\n  vec2 d_5;\\n  vec3 ret_6;\\n  xlat_mutablefactorA = (uv - vec2(0.5, 0.5));\\n  vec2 tmpvar_7;\\n  tmpvar_7.x = -((xlat_mutablefactorA.y * -1024.0));\\n  tmpvar_7.y = (xlat_mutablefactorA.x * -1024.0);\\n  vec2 tmpvar_8;\\n  tmpvar_8.x = tmpvar_7.x;\\n  tmpvar_8.y = -(tmpvar_7.y);\\n  uv_1 = (vec2(-100.0, 100.0) * (tmpvar_8 / (\\n    (tmpvar_7.x * tmpvar_7.x)\\n   + \\n    (tmpvar_7.y * tmpvar_7.y)\\n  )).yx);\\n  uv_1 = (0.5 + ((\\n    (1.0 - abs(((\\n      fract((mix ((0.5 + \\n        (((0.5 + (\\n          (uv - 0.5)\\n         * vec2(1.1, 0.81))) - 0.5) * 2.0)\\n      ), (uv_1 + 0.5), vec2(0.5, 0.5)) * 0.5))\\n     * 2.0) - 1.0)))\\n   - 0.5) * 0.98));\\n  vec2 tmpvar_9;\\n  vec2 tmpvar_10;\\n  tmpvar_10 = (vec2(1.0, 0.0) * texsize.zw);\\n  tmpvar_9.x = (texture (sampler_main, (uv_1 + tmpvar_10)).xyz - texture (sampler_main, (uv_1 - tmpvar_10)).xyz).y;\\n  vec2 tmpvar_11;\\n  tmpvar_11 = (vec2(0.0, 1.0) * texsize.zw);\\n  tmpvar_9.y = (texture (sampler_main, (uv_1 + tmpvar_11)).xyz - texture (sampler_main, (uv_1 - tmpvar_11)).xyz).y;\\n  d_5 = (texsize.zw * 2.0);\\n  dx_4 = (((2.0 * \\n    ((texture (sampler_blur1, (uv_1 + (vec2(1.0, 0.0) * d_5))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_1 - (vec2(1.0, 0.0) * d_5))).xyz * scale1) + bias1)\\n  )) * 0.5);\\n  dy_3 = (((2.0 * \\n    ((texture (sampler_blur1, (uv_1 + (vec2(0.0, 1.0) * d_5))).xyz * scale1) + bias1)\\n  ) - (2.0 * \\n    ((texture (sampler_blur1, (uv_1 - (vec2(0.0, 1.0) * d_5))).xyz * scale1) + bias1)\\n  )) * 0.5);\\n  vec2 tmpvar_12;\\n  tmpvar_12.x = dx_4.y;\\n  tmpvar_12.y = dy_3.y;\\n  dz_2 = ((tmpvar_9 * 3.0) + tmpvar_12);\\n  ret_6 = (vec3(((\\n    pow ((sqrt(dot (dz_2, dz_2)) * 0.8), 0.7)\\n   + \\n    (((texture (sampler_blur2, uv_1).xyz * scale2) + bias2).y * 0.4)\\n  ) - 0.1)) * vec3(0.3, 0.5, 0.7));\\n  vec2 tmpvar_13;\\n  tmpvar_13.x = dx_4.x;\\n  tmpvar_13.y = dy_3.x;\\n  vec3 tmpvar_14;\\n  tmpvar_14 = mix (mix (ret_6, vec3(0.2, 0.1, 0.0), vec3((texture (sampler_main, \\n    (uv_1 + ((tmpvar_13 * texsize.zw) * 18.0))\\n  ).x * 6.0))), vec3(1.0, 1.0, 1.0), texture (sampler_main, uv_1).zzz);\\n  ret_6 = tmpvar_14;\\n  vec4 tmpvar_15;\\n  tmpvar_15.w = 1.0;\\n  tmpvar_15.xyz = tmpvar_14;\\n  ret = tmpvar_15.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,wave_mode:2,wrap:0,wave_a:.001,wave_scale:5.819,wave_mystery:-.38,wave_r:.5,wave_g:.5,wave_b:.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1,thick:1},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"a.y=a.sample;a.x=.003*(a.value1+a.value2);a.a=.1*(a.value1+a.value2);a.r=.5+.3*Math.sin(10*a.sample+a.time);a.g=.5+.3*Math.cos(10*a.sample-1.334*a.time);a.b=.5+.3*Math.sin(10*a.sample+.998*a.time);\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"\",frame_eqs_str:\"a.warp=0;a.wave_r=a.wave_r+.4*Math.sin(.333*a.time)+.2*a.bass_att;a.wave_g=a.wave_g+.4*Math.sin(.555*a.time)+.2*a.treb_att;a.wave_b=a.wave_b+.4*Math.sin(.444*a.time)+.2*a.mid_att;\",pixel_eqs_str:\"\",pixel_eqs:\"\",warp:\" shader_body { \\n  vec2 muv_1;\\n  vec3 ret_2;\\n  float tmpvar_3;\\n  tmpvar_3 = (2.0 * bass_att);\\n  muv_1.x = (uv.x - ((\\n    ((0.01 * cos((\\n      (uv.x * (5.0 + tmpvar_3))\\n     + time))) + (0.01 * cos((\\n      (uv.y * (5.0 + tmpvar_3))\\n     + time))))\\n   * 0.5) * treb_att));\\n  float tmpvar_4;\\n  tmpvar_4 = (2.0 * mid_att);\\n  muv_1.y = (uv.y + ((\\n    ((0.01 * sin((\\n      (uv.x * (5.0 + tmpvar_4))\\n     + time))) - (0.01 * cos((\\n      (uv.y * (5.0 + tmpvar_4))\\n     + time))))\\n   * 0.5) * bass_att));\\n  vec3 tmpvar_5;\\n  tmpvar_5 = ((texture (sampler_blur2, muv_1).xyz * scale2) + bias2);\\n  vec4 tmpvar_6;\\n  tmpvar_6 = texture (sampler_pw_main, muv_1);\\n  ret_2.x = (tmpvar_6.x + (tmpvar_5.x * (bass_att * 0.05)));\\n  ret_2.y = (tmpvar_6.y + (tmpvar_5.y * (treb_att * 0.05)));\\n  ret_2.z = (tmpvar_6.z + (tmpvar_5.z * (mid_att * 0.05)));\\n  if ((ret_2.x > 0.9)) {\\n    ret_2.x = 0.0;\\n  };\\n  if ((ret_2.y > 0.9)) {\\n    ret_2.y = 0.0;\\n  };\\n  if ((ret_2.z > 0.9)) {\\n    ret_2.z = 0.0;\\n  };\\n  vec4 tmpvar_7;\\n  tmpvar_7.w = 1.0;\\n  tmpvar_7.xyz = ret_2;\\n  ret = tmpvar_7.xyz;\\n }\",comp:\" shader_body { \\n  vec3 ret1_1;\\n  vec2 uv1_2;\\n  vec3 ret_3;\\n  vec4 tmpvar_4;\\n  tmpvar_4 = texture (sampler_main, uv);\\n  ret_3 = (tmpvar_4.xyz * (0.6 + (0.3 * \\n    sin(((uv.x * 10.0) + time))\\n  )));\\n  vec2 tmpvar_5;\\n  tmpvar_5.x = (texture (sampler_main, (uv - vec2(0.001, 0.0))).xyz - texture (sampler_main, (uv + vec2(0.001, 0.0))).xyz).x;\\n  tmpvar_5.y = (texture (sampler_main, (uv - vec2(0.0, 0.001))).xyz - texture (sampler_main, (uv + vec2(0.0, 0.001))).xyz).x;\\n  uv1_2 = ((0.5 * cos(\\n    (((uv - 0.5) * 1.5) + 1.6)\\n  )) - (3.0 * tmpvar_5));\\n  ret1_1 = ((0.3 * dot (tmpvar_4.xyz, vec3(0.32, 0.49, 0.29))) + ((\\n    clamp ((0.01 / sqrt(dot (uv1_2, uv1_2))), 0.0, 1.0)\\n   * \\n    mix (vec3(dot (((texture (sampler_blur2, uv).xyz * scale2) + bias2), vec3(0.32, 0.49, 0.29))), ret_3, pow (ret_3, vec3((0.05 + (mid_att * 0.03)))))\\n  ) * (\\n    (4.0 + bass)\\n   + \\n    (mid + treb_att)\\n  )));\\n  ret_3 = ret1_1;\\n  vec4 tmpvar_6;\\n  tmpvar_6.w = 1.0;\\n  tmpvar_6.xyz = ret1_1;\\n  ret = tmpvar_6.xyz;\\n }\"}},function(a,e){a.exports={baseVals:{rating:3,gammaadj:1,decay:.997,echo_zoom:.997,echo_orient:1,wave_thick:1,wave_brighten:0,darken:1,wave_a:.001,wave_scale:.01,wave_smoothing:.27,wave_mystery:-.38,modwavealphastart:.71,modwavealphaend:1.3,warpscale:1.331,zoom:.99951,warp:.01,ob_size:.5,ob_r:.01,ib_size:.26,ib_r:1,ib_g:1,ib_b:1,mv_x:64,mv_y:48,mv_l:.85,mv_r:.5,mv_g:.5,mv_b:.5,mv_a:0},shapes:[{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],waves:[{baseVals:{enabled:1},init_eqs_str:\"\",frame_eqs_str:\"\",point_eqs_str:\"a.x=.5+.2*a.bass*Math.sin(20*a.sample*a.time*a.treb);a.y=.5+.2*a.bass*Math.cos(20*a.sample*a.time*a.treb);a.r=1+.5*Math.sin(.1*a.sample+10*a.time*a.bass);a.g=1+.5*Math.sin(2*a.sample+50*a.time*a.treb);a.b=1+.5*Math.sin(5*a.sample+20*a.time*a.mid);a.a=a.r;\"},{baseVals:{enabled:0}},{baseVals:{enabled:0}},{baseVals:{enabled:0}}],init_eqs_str:\"\",frame_eqs_str:\"a.warp=0;a.decay=.92;\",pixel_eqs_str:\"a.zoom+=.03*a.bass_att*a.bass_att*a.rad;a.rot+=a.rad*bitand(-2.5,5*Math.cos(a.time))*.01;\",warp:\" shader_body { \\n  vec4 tmpvar_1;\\n  tmpvar_1.w = 1.0;\\n  tmpvar_1.xyz = texture (sampler_main, uv).xyz;\\n  ret = tmpvar_1.xyz;\\n }\",comp:\" shader_body { \\n  vec2 uv1_1;\\n  vec3 ret_2;\\n  vec3 tmpvar_3;\\n  tmpvar_3 = texture (sampler_main, uv).xyz;\\n  vec2 tmpvar_4;\\n  tmpvar_4.x = (texture (sampler_main, (uv - vec2(0.001, 0.0))).xyz - texture (sampler_main, (uv + vec2(0.001, 0.0))).xyz).x;\\n  tmpvar_4.y = (texture (sampler_main, (uv - vec2(0.0, 0.001))).xyz - texture (sampler_main, (uv + vec2(0.0, 0.001))).xyz).x;\\n  uv1_1 = ((0.5 * cos(\\n    (((uv - 0.5) * 1.5) + 1.6)\\n  )) - (3.0 * tmpvar_4));\\n  ret_2 = (0.8 * ((0.3 * \\n    dot (tmpvar_3, vec3(0.32, 0.49, 0.29))\\n  ) + (\\n    (clamp ((0.01 / sqrt(\\n      dot (uv1_1, uv1_1)\\n    )), 0.0, 1.0) * tmpvar_3)\\n   * \\n    ((4.0 + bass) + (mid + treb_att))\\n  )));\\n  ret_2 = (ret_2 * 0.77);\\n  vec4 tmpvar_5;\\n  tmpvar_5.w = 1.0;\\n  tmpvar_5.xyz = ret_2;\\n  ret = tmpvar_5.xyz;\\n }\"}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(a,e,t){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var r=_(t(6)),n=_(t(7));function _(a){return a&&a.__esModule?a:{default:a}}var s={};s[\"$$$ Royal - Mashup (197)\"]=t(35),s[\"$$$ Royal - Mashup (220)\"]=t(36),s[\"$$$ Royal - Mashup (431)\"]=t(37),s[\"_Aderrasi - Wanderer in Curved Space - mash0000 - faclempt kibitzing meshuggana schmaltz (Geiss color mix)\"]=t(38),s[\"_Geiss - Artifact 01\"]=t(39),s[\"_Geiss - Desert Rose 2\"]=t(40),s[\"_Geiss - untitled\"]=t(41),s._Mig_049=t(42),s._Mig_085=t(43),s[\"_Rovastar + Geiss - Hurricane Nightmare (Posterize Mix)\"]=t(44),s[\"Aderrasi + Geiss - Airhandler (Kali Mix) - Canvas Mix\"]=t(45),s[\"Aderrasi - Potion of Spirits\"]=t(20),s[\"Aderrasi - Songflower (Moss Posy)\"]=t(21),s[\"Aderrasi - Storm of the Eye (Thunder) - mash0000 - quasi pseudo meta concentrics\"]=t(46),s[\"An AdamFX n Martin Infusion 2 flexi - Why The Sky Looks Diffrent Today - AdamFx n Martin Infusion - Tack Tile Disfunction B\"]=t(47),s[\"cope + martin - mother-of-pearl\"]=t(48),s[\"Cope - The Neverending Explosion of Red Liquid Fire\"]=t(49),s[\"Eo.S. + Phat - cubetrace - v2\"]=t(22),s[\"Eo.S. + Zylot - skylight (Stained Glass Majesty mix)\"]=t(23),s[\"Eo.S. - glowsticks v2 05 and proton lights (+Krash′s beat code) _Phat_remix02b\"]=t(24),s[\"fiShbRaiN + Flexi - witchcraft 2.0\"]=t(50),s[\"flexi + amandio c - organic [random mashup]\"]=t(51),s[\"flexi + amandio c - organic12-3d-2.milk\"]=t(52),s[\"Flexi + amandio c - piercing 05 - Kopie (2) - Kopie\"]=t(53),s[\"flexi + fishbrain - neon mindblob grafitti\"]=t(54),s[\"flexi + geiss - pogo cubes vs. tokamak vs. game of life [stahls jelly 4.5 finish]\"]=t(55),s[\"Flexi + Martin - astral projection\"]=t(56),s[\"Flexi + Martin - cascading decay swing\"]=t(57),s[\"Flexi + stahlregen - jelly showoff parade\"]=t(58),s[\"Flexi - alien fish pond\"]=t(59),s[\"Flexi - area 51\"]=t(60),s[\"flexi - bouncing balls [double mindblob neon mix]\"]=t(61),s[\"Flexi - infused with the spiral\"]=t(62),s[\"Flexi - mindblob [shiny mix]\"]=t(63),s[\"Flexi - mindblob mix\"]=t(64),s[\"flexi - mom, why the sky looks different today\"]=t(65),s[\"flexi - patternton, district of media, capitol of the united abstractions of fractopia\"]=t(66),s[\"Flexi - predator-prey-spirals\"]=t(67),s[\"Flexi - smashing fractals [acid etching mix]\"]=t(68),s[\"flexi - swing out on the spiral\"]=t(69),s[\"Flexi - truly soft piece of software - this is generic texturing (Jelly) \"]=t(70),s[\"flexi - what is the matrix\"]=t(71),s[\"Flexi, fishbrain, Geiss + Martin - tokamak witchery\"]=t(72),s[\"Flexi, martin + geiss - dedicated to the sherwin maxawow\"]=t(73),s[\"Fumbling_Foo & Flexi, Martin, Orb, Unchained - Star Nova v7b\"]=t(74),s[\"Geiss + Flexi + Martin - disconnected\"]=t(75),s[\"Geiss - Cauldron - painterly 2 (saturation remix)\"]=t(76),s[\"Geiss - Reaction Diffusion 2\"]=t(77),s[\"Geiss - Spiral Artifact\"]=t(78),s[\"Geiss - Thumb Drum\"]=t(79),s[\"Geiss, Flexi + Stahlregen - Thumbdrum Tokamak [crossfiring aftermath jelly mashup]\"]=t(80),s[\"Goody - The Wild Vort\"]=t(81),s[\"high-altitude basket unraveling - singh grooves nitrogen argon nz+\"]=t(82),s[\"Idiot - Star Of Annon\"]=t(25),s[\"Krash + Illusion - Spiral Movement\"]=t(26),s[\"martin + flexi - diamond cutter [prismaticvortex.com] - camille - i wish i wish i wish i was constrained\"]=t(83),s[\"Martin - acid wiring\"]=t(84),s[\"martin - angel flight\"]=t(85),s[\"martin - another kind of groove\"]=t(86),s[\"martin - bombyx mori\"]=t(87),s[\"martin - castle in the air\"]=t(88),s[\"martin - chain breaker\"]=t(89),s[\"Martin - charisma\"]=t(90),s[\"martin - disco mix 4\"]=t(91),s[\"martin - extreme heat\"]=t(92),s[\"martin - frosty caves 2\"]=t(93),s[\"martin - fruit machine\"]=t(94),s[\"martin - ghost city\"]=t(95),s[\"martin - glass corridor\"]=t(96),s[\"martin - infinity (2010 update)\"]=t(27),s[\"Martin - liquid arrows\"]=t(97),s[\"martin - mandelbox explorer - high speed demo version\"]=t(98),s[\"martin - mucus cervix\"]=t(99),s[\"Martin - QBikal - Surface Turbulence IIb\"]=t(100),s[\"martin - reflections on black tiles\"]=t(101),s[\"martin - stormy sea (2010 update)\"]=t(102),s[\"martin - The Bridge of Khazad-Dum\"]=t(103),s[\"martin - witchcraft reloaded\"]=t(104),s[\"martin [shadow harlequins shape code] - fata morgana\"]=t(105),s[\"martin, flexi, fishbrain + sto - enterstate [random mashup]\"]=t(106),s[\"Milk Artist At our Best - FED - SlowFast Ft AdamFX n Martin - HD CosmoFX\"]=t(107),s[\"ORB - Waaa\"]=t(108),s[\"Phat+fiShbRaiN+Eo.S_Mandala_Chasers_remix\"]=t(28),s[\"Rovastar + Loadus + Geiss - FractalDrop (Triple Mix)\"]=t(109),s[\"Rovastar - Oozing Resistance\"]=t(29),s[\"sawtooth grin roam\"]=t(110),s[\"shifter - dark tides bdrv mix 2\"]=t(111),s[\"suksma - heretical crosscut playpen\"]=t(112),s[\"suksma - Rovastar - Sunflower Passion (Enlightment Mix)_Phat_edit + flexi und martin shaders - circumflex in character classes in regular expression\"]=t(113),s[\"suksma - uninitialized variabowl (hydroponic chronic)\"]=t(114),s[\"suksma - vector exp 1 - couldn′t not\"]=t(115),s[\"TonyMilkdrop - Leonardo Da Vinci's Balloon [Flexi - merry-go-round + techstyle]\"]=t(116),s[\"TonyMilkdrop - Magellan's Nebula [Flexi - you enter first + multiverse]\"]=t(117),s[\"Unchained & Rovastar - Wormhole Pillars (Hall of Shadows mix)\"]=t(30),s[\"Unchained - Rewop\"]=t(31),s[\"Unchained - Unified Drag 2\"]=t(32),s[\"yin - 191 - Temporal singularities\"]=t(33),s[\"Zylot - Paint Spill (Music Reactive Paint Mix)\"]=t(118),s[\"Zylot - Star Ornament\"]=t(34),s[\"Zylot - True Visionary (Final Mix)\"]=t(119);var v=function(){function a(){(0,r.default)(this,a)}return(0,n.default)(a,null,[{key:\"getPresets\",value:function(){return s}}]),a}();e.default=v,a.exports=v}])});\n\n/***/ }),\n\n/***/ 6900:\n/***/ ((module) => {\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_562__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_562__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__nested_webpack_require_562__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__nested_webpack_require_562__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__nested_webpack_require_562__.d = function(exports, name, getter) {\n/******/ \t\tif(!__nested_webpack_require_562__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__nested_webpack_require_562__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__nested_webpack_require_562__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __nested_webpack_require_562__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__nested_webpack_require_562__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_562__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__nested_webpack_require_562__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__nested_webpack_require_562__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__nested_webpack_require_562__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__nested_webpack_require_562__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __nested_webpack_require_562__(__nested_webpack_require_562__.s = \"./src/index.js\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./node_modules/ecma-proposal-math-extensions/reference-implementation/index.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/ecma-proposal-math-extensions/reference-implementation/index.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n{\n  const defineMath = (name, assignment) => {\n    var configurable = typeof assignment === \"function\" ? true : false;\n    var writable = typeof assignment === \"function\" ? true : false;\n    var enumerable = typeof assignment === \"function\" ? true : false;\n\n    Object.defineProperty(Math, name, {\n      configurable: configurable,\n      enumerable: enumerable,\n      writable: writable,\n      value: assignment\n    });\n  };\n\n  defineMath(\"DEG_PER_RAD\", Math.PI / 180);\n  defineMath(\"RAD_PER_DEG\", 180 / Math.PI);\n\n  const f32A = new Float32Array(1);\n\n  defineMath(\"scale\", function scale(x, inLow, inHigh, outLow, outHigh) {\n    if (arguments.length === 0) {\n      return NaN;\n    }\n\n    if (Number.isNaN(x) ||\n        Number.isNaN(inLow) ||\n        Number.isNaN(inHigh) ||\n        Number.isNaN(outLow) ||\n        Number.isNaN(outHigh)) {\n      return NaN;\n    }\n\n    if (x === Infinity ||\n        x === -Infinity) {\n      return x;\n    }\n\n    return (x - inLow) * (outHigh - outLow) /\n      (inHigh - inLow) + outLow;\n  });\n\n  defineMath(\"fscale\", function fscale(x, inLow, inHigh, outLow, outHigh) {\n    f32A[0] = Math.scale(x, inLow, inHigh, outLow, outHigh);\n    return f32A[0];\n  });\n\n  defineMath(\"clamp\", function clamp(x, lower, upper) {\n    return Math.min(upper, Math.max(lower, x));\n  });\n\n  defineMath(\"radians\", function radians(degrees) {\n    return degrees * Math.DEG_PER_RAD;\n  });\n\n  defineMath(\"degrees\", function degrees(radians) {\n    return radians * Math.RAD_PER_DEG;\n  });\n}\n\n\n/***/ }),\n\n/***/ \"./src/audio/audioLevels.js\":\n/*!**********************************!*\\\n  !*** ./src/audio/audioLevels.js ***!\n  \\**********************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_6213__) {\n\n\"use strict\";\n__nested_webpack_require_6213__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_6213__.d(__nested_webpack_exports__, \"default\", function() { return AudioLevels; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar AudioLevels =\n/*#__PURE__*/\nfunction () {\n  function AudioLevels(audio) {\n    _classCallCheck(this, AudioLevels);\n\n    this.audio = audio;\n    var sampleRate;\n\n    if (this.audio.audioContext) {\n      sampleRate = this.audio.audioContext.sampleRate;\n    } else {\n      sampleRate = 44100;\n    }\n\n    var bucketHz = sampleRate / this.audio.fftSize;\n    var bassLow = Math.clamp(Math.round(20 / bucketHz) - 1, 0, this.audio.numSamps - 1);\n    var bassHigh = Math.clamp(Math.round(320 / bucketHz) - 1, 0, this.audio.numSamps - 1);\n    var midHigh = Math.clamp(Math.round(2800 / bucketHz) - 1, 0, this.audio.numSamps - 1);\n    var trebHigh = Math.clamp(Math.round(11025 / bucketHz) - 1, 0, this.audio.numSamps - 1);\n    this.starts = [bassLow, bassHigh, midHigh];\n    this.stops = [bassHigh, midHigh, trebHigh];\n    this.val = new Float32Array(3);\n    this.imm = new Float32Array(3);\n    this.att = new Float32Array(3);\n    this.avg = new Float32Array(3);\n    this.longAvg = new Float32Array(3);\n    this.att.fill(1);\n    this.avg.fill(1);\n    this.longAvg.fill(1);\n  }\n  /* eslint-disable camelcase */\n\n\n  _createClass(AudioLevels, [{\n    key: \"updateAudioLevels\",\n    value: function updateAudioLevels(fps, frame) {\n      if (this.audio.freqArray.length > 0) {\n        var effectiveFPS = fps;\n\n        if (!AudioLevels.isFiniteNumber(effectiveFPS) || effectiveFPS < 15) {\n          effectiveFPS = 15;\n        } else if (effectiveFPS > 144) {\n          effectiveFPS = 144;\n        } // Clear for next loop\n\n\n        this.imm.fill(0);\n\n        for (var i = 0; i < 3; i++) {\n          for (var j = this.starts[i]; j < this.stops[i]; j++) {\n            this.imm[i] += this.audio.freqArray[j];\n          }\n        }\n\n        for (var _i = 0; _i < 3; _i++) {\n          var rate = void 0;\n\n          if (this.imm[_i] > this.avg[_i]) {\n            rate = 0.2;\n          } else {\n            rate = 0.5;\n          }\n\n          rate = AudioLevels.adjustRateToFPS(rate, 30.0, effectiveFPS);\n          this.avg[_i] = this.avg[_i] * rate + this.imm[_i] * (1 - rate);\n\n          if (frame < 50) {\n            rate = 0.9;\n          } else {\n            rate = 0.992;\n          }\n\n          rate = AudioLevels.adjustRateToFPS(rate, 30.0, effectiveFPS);\n          this.longAvg[_i] = this.longAvg[_i] * rate + this.imm[_i] * (1 - rate);\n\n          if (this.longAvg[_i] < 0.001) {\n            this.val[_i] = 1.0;\n            this.att[_i] = 1.0;\n          } else {\n            this.val[_i] = this.imm[_i] / this.longAvg[_i];\n            this.att[_i] = this.avg[_i] / this.longAvg[_i];\n          }\n        }\n      }\n    }\n  }, {\n    key: \"bass\",\n    get: function get() {\n      return this.val[0];\n    }\n  }, {\n    key: \"bass_att\",\n    get: function get() {\n      return this.att[0];\n    }\n  }, {\n    key: \"mid\",\n    get: function get() {\n      return this.val[1];\n    }\n  }, {\n    key: \"mid_att\",\n    get: function get() {\n      return this.att[1];\n    }\n  }, {\n    key: \"treb\",\n    get: function get() {\n      return this.val[2];\n    }\n  }, {\n    key: \"treb_att\",\n    get: function get() {\n      return this.att[2];\n    }\n    /* eslint-enable camelcase */\n\n  }], [{\n    key: \"isFiniteNumber\",\n    value: function isFiniteNumber(num) {\n      return Number.isFinite(num) && !Number.isNaN(num);\n    }\n  }, {\n    key: \"adjustRateToFPS\",\n    value: function adjustRateToFPS(rate, baseFPS, FPS) {\n      return Math.pow(rate, baseFPS / FPS);\n    }\n  }]);\n\n  return AudioLevels;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/audio/audioProcessor.js\":\n/*!*************************************!*\\\n  !*** ./src/audio/audioProcessor.js ***!\n  \\*************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_10826__) {\n\n\"use strict\";\n__nested_webpack_require_10826__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_10826__.d(__nested_webpack_exports__, \"default\", function() { return AudioProcessor; });\n/* harmony import */ var _fft__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_10826__(/*! ./fft */ \"./src/audio/fft.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar AudioProcessor =\n/*#__PURE__*/\nfunction () {\n  function AudioProcessor(context) {\n    _classCallCheck(this, AudioProcessor);\n\n    this.numSamps = 512;\n    this.fftSize = this.numSamps * 2;\n    this.fft = new _fft__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this.fftSize, 512, true);\n\n    if (context) {\n      this.audioContext = context;\n      this.audible = context.createDelay();\n      this.analyser = context.createAnalyser();\n      this.analyser.smoothingTimeConstant = 0.0;\n      this.analyser.fftSize = this.fftSize;\n      this.audible.connect(this.analyser); // Split channels\n\n      this.analyserL = context.createAnalyser();\n      this.analyserL.smoothingTimeConstant = 0.0;\n      this.analyserL.fftSize = this.fftSize;\n      this.analyserR = context.createAnalyser();\n      this.analyserR.smoothingTimeConstant = 0.0;\n      this.analyserR.fftSize = this.fftSize;\n      this.splitter = context.createChannelSplitter(2);\n      this.audible.connect(this.splitter);\n      this.splitter.connect(this.analyserL, 0);\n      this.splitter.connect(this.analyserR, 1);\n    } // Initialised once as typed arrays\n    // Used for webaudio API raw (time domain) samples. 0 -> 255\n\n\n    this.timeByteArray = new Uint8Array(this.fftSize);\n    this.timeByteArrayL = new Uint8Array(this.fftSize);\n    this.timeByteArrayR = new Uint8Array(this.fftSize); // Signed raw samples shifted to -128 -> 127\n\n    this.timeArray = new Int8Array(this.fftSize);\n    this.timeByteArraySignedL = new Int8Array(this.fftSize);\n    this.timeByteArraySignedR = new Int8Array(this.fftSize); // Temporary array for smoothing\n\n    this.tempTimeArrayL = new Int8Array(this.fftSize);\n    this.tempTimeArrayR = new Int8Array(this.fftSize); // Undersampled from this.fftSize to this.numSamps\n\n    this.timeArrayL = new Int8Array(this.numSamps);\n    this.timeArrayR = new Int8Array(this.numSamps);\n  }\n\n  _createClass(AudioProcessor, [{\n    key: \"sampleAudio\",\n    value: function sampleAudio() {\n      this.analyser.getByteTimeDomainData(this.timeByteArray);\n      this.analyserL.getByteTimeDomainData(this.timeByteArrayL);\n      this.analyserR.getByteTimeDomainData(this.timeByteArrayR);\n      this.processAudio();\n    }\n  }, {\n    key: \"updateAudio\",\n    value: function updateAudio(timeByteArray, timeByteArrayL, timeByteArrayR) {\n      this.timeByteArray.set(timeByteArray);\n      this.timeByteArrayL.set(timeByteArrayL);\n      this.timeByteArrayR.set(timeByteArrayR);\n      this.processAudio();\n    }\n    /* eslint-disable no-bitwise */\n\n  }, {\n    key: \"processAudio\",\n    value: function processAudio() {\n      for (var i = 0, j = 0, lastIdx = 0; i < this.fftSize; i++) {\n        // Shift Unsigned to Signed about 0\n        this.timeArray[i] = this.timeByteArray[i] - 128;\n        this.timeByteArraySignedL[i] = this.timeByteArrayL[i] - 128;\n        this.timeByteArraySignedR[i] = this.timeByteArrayR[i] - 128;\n        this.tempTimeArrayL[i] = 0.5 * (this.timeByteArraySignedL[i] + this.timeByteArraySignedL[lastIdx]);\n        this.tempTimeArrayR[i] = 0.5 * (this.timeByteArraySignedR[i] + this.timeByteArraySignedR[lastIdx]); // Undersampled\n\n        if (i % 2 === 0) {\n          this.timeArrayL[j] = this.tempTimeArrayL[i];\n          this.timeArrayR[j] = this.tempTimeArrayR[i];\n          j += 1;\n        }\n\n        lastIdx = i;\n      } // Use full width samples for the FFT\n\n\n      this.freqArray = this.fft.timeToFrequencyDomain(this.timeArray);\n      this.freqArrayL = this.fft.timeToFrequencyDomain(this.timeByteArraySignedL);\n      this.freqArrayR = this.fft.timeToFrequencyDomain(this.timeByteArraySignedR);\n    }\n  }, {\n    key: \"connectAudio\",\n    value: function connectAudio(audionode) {\n      audionode.connect(this.audible);\n    }\n  }, {\n    key: \"disconnectAudio\",\n    value: function disconnectAudio(audionode) {\n      audionode.disconnect(this.audible);\n    }\n    /* eslint-enable no-bitwise */\n\n  }]);\n\n  return AudioProcessor;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/audio/fft.js\":\n/*!**************************!*\\\n  !*** ./src/audio/fft.js ***!\n  \\**************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_15981__) {\n\n\"use strict\";\n__nested_webpack_require_15981__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_15981__.d(__nested_webpack_exports__, \"default\", function() { return FFT; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar FFT =\n/*#__PURE__*/\nfunction () {\n  function FFT(samplesIn, samplesOut) {\n    var equalize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    _classCallCheck(this, FFT);\n\n    this.samplesIn = samplesIn;\n    this.samplesOut = samplesOut;\n    this.equalize = equalize;\n    this.NFREQ = samplesOut * 2;\n\n    if (this.equalize) {\n      this.initEqualizeTable();\n    }\n\n    this.initBitRevTable();\n    this.initCosSinTable();\n  }\n\n  _createClass(FFT, [{\n    key: \"initEqualizeTable\",\n    value: function initEqualizeTable() {\n      this.equalizeArr = new Float32Array(this.samplesOut);\n      var invHalfNFREQ = 1.0 / this.samplesOut;\n\n      for (var i = 0; i < this.samplesOut; i++) {\n        this.equalizeArr[i] = -0.02 * Math.log((this.samplesOut - i) * invHalfNFREQ);\n      }\n    }\n    /* eslint-disable no-bitwise */\n\n  }, {\n    key: \"initBitRevTable\",\n    value: function initBitRevTable() {\n      this.bitrevtable = new Uint16Array(this.NFREQ);\n\n      for (var i = 0; i < this.NFREQ; i++) {\n        this.bitrevtable[i] = i;\n      }\n\n      var j = 0;\n\n      for (var _i = 0; _i < this.NFREQ; _i++) {\n        if (j > _i) {\n          var temp = this.bitrevtable[_i];\n          this.bitrevtable[_i] = this.bitrevtable[j];\n          this.bitrevtable[j] = temp;\n        }\n\n        var m = this.NFREQ >> 1;\n\n        while (m >= 1 && j >= m) {\n          j -= m;\n          m >>= 1;\n        }\n\n        j += m;\n      }\n    }\n  }, {\n    key: \"initCosSinTable\",\n    value: function initCosSinTable() {\n      var dftsize = 2;\n      var tabsize = 0;\n\n      while (dftsize <= this.NFREQ) {\n        tabsize += 1;\n        dftsize <<= 1;\n      }\n\n      this.cossintable = [new Float32Array(tabsize), new Float32Array(tabsize)];\n      dftsize = 2;\n      var i = 0;\n\n      while (dftsize <= this.NFREQ) {\n        var theta = -2.0 * Math.PI / dftsize;\n        this.cossintable[0][i] = Math.cos(theta);\n        this.cossintable[1][i] = Math.sin(theta);\n        i += 1;\n        dftsize <<= 1;\n      }\n    }\n  }, {\n    key: \"timeToFrequencyDomain\",\n    value: function timeToFrequencyDomain(waveDataIn) {\n      var real = new Float32Array(this.NFREQ);\n      var imag = new Float32Array(this.NFREQ);\n\n      for (var i = 0; i < this.NFREQ; i++) {\n        var idx = this.bitrevtable[i];\n\n        if (idx < this.samplesIn) {\n          real[i] = waveDataIn[idx];\n        } else {\n          real[i] = 0;\n        }\n\n        imag[i] = 0;\n      }\n\n      var dftsize = 2;\n      var t = 0;\n\n      while (dftsize <= this.NFREQ) {\n        var wpr = this.cossintable[0][t];\n        var wpi = this.cossintable[1][t];\n        var wr = 1.0;\n        var wi = 0.0;\n        var hdftsize = dftsize >> 1;\n\n        for (var m = 0; m < hdftsize; m++) {\n          for (var _i2 = m; _i2 < this.NFREQ; _i2 += dftsize) {\n            var j = _i2 + hdftsize;\n            var tempr = wr * real[j] - wi * imag[j];\n            var tempi = wr * imag[j] + wi * real[j];\n            real[j] = real[_i2] - tempr;\n            imag[j] = imag[_i2] - tempi;\n            real[_i2] += tempr;\n            imag[_i2] += tempi;\n          }\n\n          var wtemp = wr;\n          wr = wtemp * wpr - wi * wpi;\n          wi = wi * wpr + wtemp * wpi;\n        }\n\n        dftsize <<= 1;\n        t += 1;\n      }\n\n      var spectralDataOut = new Float32Array(this.samplesOut);\n\n      if (this.equalize) {\n        for (var _i3 = 0; _i3 < this.samplesOut; _i3++) {\n          spectralDataOut[_i3] = this.equalizeArr[_i3] * Math.sqrt(real[_i3] * real[_i3] + imag[_i3] * imag[_i3]);\n        }\n      } else {\n        for (var _i4 = 0; _i4 < this.samplesOut; _i4++) {\n          spectralDataOut[_i4] = Math.sqrt(real[_i4] * real[_i4] + imag[_i4] * imag[_i4]);\n        }\n      }\n\n      return spectralDataOut;\n    }\n    /* eslint-enable no-bitwise */\n\n  }]);\n\n  return FFT;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/blankPreset.js\":\n/*!****************************!*\\\n  !*** ./src/blankPreset.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n  'use strict;';\n\n  var pmap = {\n    baseVals: {\n      gammaadj: 1.25,\n      wave_g: 0.5,\n      mv_x: 12.0,\n      warpscale: 1.0,\n      brighten: 0.0,\n      mv_y: 9.0,\n      wave_scale: 1.0,\n      echo_alpha: 0.0,\n      additivewave: 0.0,\n      sx: 1.0,\n      sy: 1.0,\n      warp: 0.01,\n      red_blue: 0.0,\n      wave_mode: 0.0,\n      wave_brighten: 0.0,\n      wrap: 0.0,\n      zoomexp: 1.0,\n      fshader: 0.0,\n      wave_r: 0.5,\n      echo_zoom: 1.0,\n      wave_smoothing: 0.75,\n      warpanimspeed: 1.0,\n      wave_dots: 0.0,\n      wave_x: 0.5,\n      wave_y: 0.5,\n      zoom: 1.0,\n      solarize: 0.0,\n      modwavealphabyvolume: 0.0,\n      dx: 0.0,\n      cx: 0.5,\n      dy: 0.0,\n      darken_center: 0.0,\n      cy: 0.5,\n      invert: 0.0,\n      bmotionvectorson: 0.0,\n      rot: 0.0,\n      modwavealphaend: 0.95,\n      wave_mystery: -0.2,\n      decay: 0.9,\n      wave_a: 1.0,\n      wave_b: 0.5,\n      rating: 5.0,\n      modwavealphastart: 0.75,\n      darken: 0.0,\n      echo_orient: 0.0,\n      ib_r: 0.5,\n      ib_g: 0.5,\n      ib_b: 0.5,\n      ib_a: 0.0,\n      ib_size: 0.0,\n      ob_r: 0.5,\n      ob_g: 0.5,\n      ob_b: 0.5,\n      ob_a: 0.0,\n      ob_size: 0.0,\n      mv_dx: 0.0,\n      mv_dy: 0.0,\n      mv_a: 0.0,\n      mv_r: 0.5,\n      mv_g: 0.5,\n      mv_b: 0.5,\n      mv_l: 0.0\n    },\n    init_eqs: function init_eqs() {\n      var m = {};\n      return m;\n    },\n    frame_eqs: function frame_eqs(m) {\n      m.rkeys = ['warp'];\n      m.zoom = 1.01 + 0.02 * m.treb_att;\n      m.warp = 0.15 + 0.25 * m.bass_att;\n      return m;\n    },\n    pixel_eqs: function pixel_eqs(m) {\n      m.warp = m.warp + m.rad * 0.15;\n      return m;\n    },\n    waves: [{\n      baseVals: {\n        a: 1.0,\n        enabled: 0.0,\n        b: 1.0,\n        g: 1.0,\n        scaling: 1.0,\n        samples: 512.0,\n        additive: 0.0,\n        usedots: 0.0,\n        spectrum: 0.0,\n        r: 1.0,\n        smoothing: 0.5,\n        thick: 0.0,\n        sep: 0.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      },\n      point_eqs: ''\n    }, {\n      baseVals: {\n        a: 1.0,\n        enabled: 0.0,\n        b: 1.0,\n        g: 1.0,\n        scaling: 1.0,\n        samples: 512.0,\n        additive: 0.0,\n        usedots: 0.0,\n        spectrum: 0.0,\n        r: 1.0,\n        smoothing: 0.5,\n        thick: 0.0,\n        sep: 0.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      },\n      point_eqs: ''\n    }, {\n      baseVals: {\n        a: 1.0,\n        enabled: 0.0,\n        b: 1.0,\n        g: 1.0,\n        scaling: 1.0,\n        samples: 512.0,\n        additive: 0.0,\n        usedots: 0.0,\n        spectrum: 0.0,\n        r: 1.0,\n        smoothing: 0.5,\n        thick: 0.0,\n        sep: 0.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      },\n      point_eqs: ''\n    }, {\n      baseVals: {\n        a: 1.0,\n        enabled: 0.0,\n        b: 1.0,\n        g: 1.0,\n        scaling: 1.0,\n        samples: 512.0,\n        additive: 0.0,\n        usedots: 0.0,\n        spectrum: 0.0,\n        r: 1.0,\n        smoothing: 0.5,\n        thick: 0.0,\n        sep: 0.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      },\n      point_eqs: ''\n    }],\n    shapes: [{\n      baseVals: {\n        r2: 0.0,\n        a: 1.0,\n        enabled: 0.0,\n        b: 0.0,\n        tex_ang: 0.0,\n        thickoutline: 0.0,\n        g: 0.0,\n        textured: 0.0,\n        g2: 1.0,\n        tex_zoom: 1.0,\n        additive: 0.0,\n        border_a: 0.1,\n        border_b: 1.0,\n        b2: 0.0,\n        a2: 0.0,\n        r: 1.0,\n        border_g: 1.0,\n        rad: 0.1,\n        x: 0.5,\n        y: 0.5,\n        ang: 0.0,\n        sides: 4.0,\n        border_r: 1.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      }\n    }, {\n      baseVals: {\n        r2: 0.0,\n        a: 1.0,\n        enabled: 0.0,\n        b: 0.0,\n        tex_ang: 0.0,\n        thickoutline: 0.0,\n        g: 0.0,\n        textured: 0.0,\n        g2: 1.0,\n        tex_zoom: 1.0,\n        additive: 0.0,\n        border_a: 0.1,\n        border_b: 1.0,\n        b2: 0.0,\n        a2: 0.0,\n        r: 1.0,\n        border_g: 1.0,\n        rad: 0.1,\n        x: 0.5,\n        y: 0.5,\n        ang: 0.0,\n        sides: 4.0,\n        border_r: 1.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      }\n    }, {\n      baseVals: {\n        r2: 0.0,\n        a: 1.0,\n        enabled: 0.0,\n        b: 0.0,\n        tex_ang: 0.0,\n        thickoutline: 0.0,\n        g: 0.0,\n        textured: 0.0,\n        g2: 1.0,\n        tex_zoom: 1.0,\n        additive: 0.0,\n        border_a: 0.1,\n        border_b: 1.0,\n        b2: 0.0,\n        a2: 0.0,\n        r: 1.0,\n        border_g: 1.0,\n        rad: 0.1,\n        x: 0.5,\n        y: 0.5,\n        ang: 0.0,\n        sides: 4.0,\n        border_r: 1.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      }\n    }, {\n      baseVals: {\n        r2: 0.0,\n        a: 1.0,\n        enabled: 0.0,\n        b: 0.0,\n        tex_ang: 0.0,\n        thickoutline: 0.0,\n        g: 0.0,\n        textured: 0.0,\n        g2: 1.0,\n        tex_zoom: 1.0,\n        additive: 0.0,\n        border_a: 0.1,\n        border_b: 1.0,\n        b2: 0.0,\n        a2: 0.0,\n        r: 1.0,\n        border_g: 1.0,\n        rad: 0.1,\n        x: 0.5,\n        y: 0.5,\n        ang: 0.0,\n        sides: 4.0,\n        border_r: 1.0\n      },\n      init_eqs: function init_eqs(m) {\n        m.rkeys = [];\n        return m;\n      },\n      frame_eqs: function frame_eqs(m) {\n        return m;\n      }\n    }],\n    warp: 'shader_body {\\nret = texture2D(sampler_main, uv).rgb;\\nret -= 0.004;\\n}\\n',\n    comp: 'shader_body {\\nret = texture2D(sampler_main, uv).rgb;\\nret *= hue_shader;\\n}\\n'\n  };\n  return pmap;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n/* eslint-enable */\n\n/***/ }),\n\n/***/ \"./src/equations/presetEquationRunner.js\":\n/*!***********************************************!*\\\n  !*** ./src/equations/presetEquationRunner.js ***!\n  \\***********************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_27890__) {\n\n\"use strict\";\n__nested_webpack_require_27890__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_27890__.d(__nested_webpack_exports__, \"default\", function() { return PresetEquationRunner; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_27890__(/*! ../utils */ \"./src/utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar PresetEquationRunner =\n/*#__PURE__*/\nfunction () {\n  function PresetEquationRunner(preset, globalVars, opts) {\n    _classCallCheck(this, PresetEquationRunner);\n\n    this.preset = preset;\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.mesh_width = opts.mesh_width;\n    this.mesh_height = opts.mesh_height;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.qs = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].range(1, 33).map(function (x) {\n      return \"q\".concat(x);\n    });\n    this.ts = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].range(1, 9).map(function (x) {\n      return \"t\".concat(x);\n    });\n    this.regs = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].range(100).map(function (x) {\n      if (x < 10) {\n        return \"reg0\".concat(x);\n      }\n\n      return \"reg\".concat(x);\n    });\n    this.initializeEquations(globalVars);\n  }\n\n  _createClass(PresetEquationRunner, [{\n    key: \"initializeEquations\",\n    value: function initializeEquations(globalVars) {\n      this.runVertEQs = this.preset.pixel_eqs !== '';\n      this.mdVSQInit = null;\n      this.mdVSRegs = null;\n      this.mdVSFrame = null;\n      this.mdVSUserKeys = null;\n      this.mdVSFrameMap = null;\n      this.mdVSShapes = null;\n      this.mdVSUserKeysShapes = null;\n      this.mdVSFrameMapShapes = null;\n      this.mdVSWaves = null;\n      this.mdVSUserKeysWaves = null;\n      this.mdVSFrameMapWaves = null;\n      this.mdVSQAfterFrame = null;\n      this.gmegabuf = new Array(1048576).fill(0);\n      var mdVSBase = {\n        frame: globalVars.frame,\n        time: globalVars.time,\n        fps: globalVars.fps,\n        bass: globalVars.bass,\n        bass_att: globalVars.bass_att,\n        mid: globalVars.mid,\n        mid_att: globalVars.mid_att,\n        treb: globalVars.treb,\n        treb_att: globalVars.treb_att,\n        meshx: this.mesh_width,\n        meshy: this.mesh_height,\n        aspectx: this.invAspectx,\n        aspecty: this.invAspecty,\n        pixelsx: this.texsizeX,\n        pixelsy: this.texsizeY,\n        gmegabuf: this.gmegabuf\n      };\n      this.mdVS = Object.assign({}, this.preset.baseVals, mdVSBase);\n      this.mdVS.megabuf = new Array(1048576).fill(0);\n      this.mdVS.rand_start = new Float32Array([Math.random(), Math.random(), Math.random(), Math.random()]);\n      this.mdVS.rand_preset = new Float32Array([Math.random(), Math.random(), Math.random(), Math.random()]);\n      var nonUserKeys = this.qs.concat(this.regs, Object.keys(this.mdVS));\n      var mdVSAfterInit = this.preset.init_eqs(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cloneVars(this.mdVS)); // qs need to be initialized to there init values every frame\n\n      this.mdVSQInit = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSAfterInit, this.qs);\n      this.mdVSRegs = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSAfterInit, this.regs);\n      var initUserVars = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSAfterInit, Object.keys(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].omit(mdVSAfterInit, nonUserKeys)));\n      initUserVars.megabuf = mdVSAfterInit.megabuf;\n      initUserVars.gmegabuf = mdVSAfterInit.gmegabuf;\n      this.mdVSFrame = this.preset.frame_eqs(Object.assign({}, this.mdVS, this.mdVSQInit, this.mdVSRegs, initUserVars)); // user vars need to be copied between frames\n\n      this.mdVSUserKeys = Object.keys(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].omit(this.mdVSFrame, nonUserKeys)); // Determine vars to carry over between frames\n\n      this.mdVSFrameMap = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(this.mdVSFrame, this.mdVSUserKeys); // qs for shapes\n\n      this.mdVSQAfterFrame = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(this.mdVSFrame, this.qs);\n      this.mdVSRegs = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(this.mdVSFrame, this.regs);\n      this.mdVSWaves = [];\n      this.mdVSTWaveInits = [];\n      this.mdVSUserKeysWaves = [];\n      this.mdVSFrameMapWaves = [];\n\n      if (this.preset.waves && this.preset.waves.length > 0) {\n        for (var i = 0; i < this.preset.waves.length; i++) {\n          var wave = this.preset.waves[i];\n          var baseVals = wave.baseVals;\n\n          if (baseVals.enabled !== 0) {\n            var mdVSWave = Object.assign({}, baseVals, mdVSBase);\n            var nonUserWaveKeys = this.qs.concat(this.ts, this.regs, Object.keys(mdVSWave));\n            Object.assign(mdVSWave, this.mdVSQAfterFrame, this.mdVSRegs);\n            mdVSWave.megabuf = new Array(1048576).fill(0);\n\n            if (wave.init_eqs) {\n              mdVSWave = wave.init_eqs(mdVSWave);\n              this.mdVSRegs = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSWave, this.regs); // base vals need to be reset\n\n              Object.assign(mdVSWave, baseVals);\n            }\n\n            this.mdVSWaves.push(mdVSWave);\n            this.mdVSTWaveInits.push(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSWave, this.ts));\n            this.mdVSUserKeysWaves.push(Object.keys(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].omit(mdVSWave, nonUserWaveKeys)));\n            this.mdVSFrameMapWaves.push(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSWave, this.mdVSUserKeysWaves[i]));\n          } else {\n            this.mdVSWaves.push({});\n            this.mdVSTWaveInits.push({});\n            this.mdVSUserKeysWaves.push([]);\n            this.mdVSFrameMapWaves.push({});\n          }\n        }\n      }\n\n      this.mdVSShapes = [];\n      this.mdVSTShapeInits = [];\n      this.mdVSUserKeysShapes = [];\n      this.mdVSFrameMapShapes = [];\n\n      if (this.preset.shapes && this.preset.shapes.length > 0) {\n        for (var _i = 0; _i < this.preset.shapes.length; _i++) {\n          var shape = this.preset.shapes[_i];\n          var _baseVals = shape.baseVals;\n\n          if (_baseVals.enabled !== 0) {\n            var mdVSShape = Object.assign({}, _baseVals, mdVSBase);\n            var nonUserShapeKeys = this.qs.concat(this.ts, this.regs, Object.keys(mdVSShape));\n            Object.assign(mdVSShape, this.mdVSQAfterFrame, this.mdVSRegs);\n            mdVSShape.megabuf = new Array(1048576).fill(0);\n\n            if (shape.init_eqs) {\n              mdVSShape = shape.init_eqs(mdVSShape);\n              this.mdVSRegs = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSShape, this.regs); // base vals need to be reset\n\n              Object.assign(mdVSShape, _baseVals);\n            }\n\n            this.mdVSShapes.push(mdVSShape);\n            this.mdVSTShapeInits.push(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSShape, this.ts));\n            this.mdVSUserKeysShapes.push(Object.keys(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].omit(mdVSShape, nonUserShapeKeys)));\n            this.mdVSFrameMapShapes.push(_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSShape, this.mdVSUserKeysShapes[_i]));\n          } else {\n            this.mdVSShapes.push({});\n            this.mdVSTShapeInits.push({});\n            this.mdVSUserKeysShapes.push([]);\n            this.mdVSFrameMapShapes.push({});\n          }\n        }\n      }\n    }\n  }, {\n    key: \"updatePreset\",\n    value: function updatePreset(preset, globalVars) {\n      this.preset = preset;\n      this.initializeEquations(globalVars);\n    }\n  }, {\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.mesh_width = opts.mesh_width;\n      this.mesh_height = opts.mesh_height;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n    }\n  }, {\n    key: \"runFrameEquations\",\n    value: function runFrameEquations(globalVars) {\n      this.mdVSFrame = Object.assign({}, this.mdVS, this.mdVSQInit, this.mdVSFrameMap, globalVars);\n      this.mdVSFrame = this.preset.frame_eqs(this.mdVSFrame);\n      this.mdVSFrameMap = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(this.mdVSFrame, this.mdVSUserKeys);\n      this.mdVSQAfterFrame = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(this.mdVSFrame, this.qs);\n    }\n  }]);\n\n  return PresetEquationRunner;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/image/imageTextures.js\":\n/*!************************************!*\\\n  !*** ./src/image/imageTextures.js ***!\n  \\************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_37423__) {\n\n\"use strict\";\n__nested_webpack_require_37423__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_37423__.d(__nested_webpack_exports__, \"default\", function() { return ImageTextures; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar ImageTextures =\n/*#__PURE__*/\nfunction () {\n  function ImageTextures(gl) {\n    var _this = this;\n\n    _classCallCheck(this, ImageTextures);\n\n    this.gl = gl;\n    this.anisoExt = this.gl.getExtension('EXT_texture_filter_anisotropic') || this.gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || this.gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n    this.samplers = {};\n    /* eslint-disable max-len */\n\n    this.clouds2Image = new Image();\n\n    this.clouds2Image.onload = function () {\n      _this.samplers.clouds2 = _this.gl.createTexture();\n\n      _this.bindTexture(_this.samplers.clouds2, _this.clouds2Image, 128, 128);\n    };\n\n    this.clouds2Image.src = 'data:image/jpeg;base64,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';\n    this.emptyImage = new Image();\n\n    this.emptyImage.onload = function () {\n      _this.samplers.empty = _this.gl.createTexture();\n\n      _this.bindTexture(_this.samplers.empty, _this.emptyImage, 1, 1);\n    };\n\n    this.emptyImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n    /* eslint-enable max-len */\n  }\n\n  _createClass(ImageTextures, [{\n    key: \"bindTexture\",\n    value: function bindTexture(texture, data, width, height) {\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);\n      this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, width, height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.REPEAT);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.REPEAT);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n\n      if (this.anisoExt) {\n        var max = this.gl.getParameter(this.anisoExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n        this.gl.texParameterf(this.gl.TEXTURE_2D, this.anisoExt.TEXTURE_MAX_ANISOTROPY_EXT, max);\n      }\n    }\n  }, {\n    key: \"loadExtraImages\",\n    value: function loadExtraImages(imageData) {\n      var _this2 = this;\n\n      Object.keys(imageData).forEach(function (imageName) {\n        var _imageData$imageName = imageData[imageName],\n            data = _imageData$imageName.data,\n            width = _imageData$imageName.width,\n            height = _imageData$imageName.height;\n\n        if (!_this2.samplers[imageName]) {\n          var image = new Image();\n\n          image.onload = function () {\n            _this2.samplers[imageName] = _this2.gl.createTexture();\n\n            _this2.bindTexture(_this2.samplers[imageName], image, width, height);\n          };\n\n          image.src = data;\n        }\n      });\n    }\n  }, {\n    key: \"getTexture\",\n    value: function getTexture(sampler) {\n      var tex = this.samplers[sampler];\n\n      if (tex) {\n        return tex;\n      }\n\n      return this.samplers.clouds2;\n    }\n  }]);\n\n  return ImageTextures;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/index.js\":\n/*!**********************!*\\\n  !*** ./src/index.js ***!\n  \\**********************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_56291__) {\n\n\"use strict\";\n__nested_webpack_require_56291__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_56291__.d(__nested_webpack_exports__, \"default\", function() { return Butterchurn; });\n/* harmony import */ var ecma_proposal_math_extensions__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_56291__(/*! ecma-proposal-math-extensions */ \"./node_modules/ecma-proposal-math-extensions/reference-implementation/index.js\");\n/* harmony import */ var ecma_proposal_math_extensions__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_56291__.n(ecma_proposal_math_extensions__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _presetBase__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_56291__(/*! ./presetBase */ \"./src/presetBase.js\");\n/* harmony import */ var _presetBase__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_56291__.n(_presetBase__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _visualizer__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_56291__(/*! ./visualizer */ \"./src/visualizer.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar Butterchurn =\n/*#__PURE__*/\nfunction () {\n  function Butterchurn() {\n    _classCallCheck(this, Butterchurn);\n  }\n\n  _createClass(Butterchurn, null, [{\n    key: \"createVisualizer\",\n    value: function createVisualizer(context, canvas, opts) {\n      return new _visualizer__WEBPACK_IMPORTED_MODULE_2__[\"default\"](context, canvas, opts);\n    }\n  }]);\n\n  return Butterchurn;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/noise/noise.js\":\n/*!****************************!*\\\n  !*** ./src/noise/noise.js ***!\n  \\****************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_58627__) {\n\n\"use strict\";\n__nested_webpack_require_58627__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_58627__.d(__nested_webpack_exports__, \"default\", function() { return Noise; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Noise =\n/*#__PURE__*/\nfunction () {\n  function Noise(gl) {\n    _classCallCheck(this, Noise);\n\n    this.gl = gl;\n    this.anisoExt = this.gl.getExtension('EXT_texture_filter_anisotropic') || this.gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || this.gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n    this.noiseTexLQ = this.gl.createTexture();\n    this.noiseTexLQLite = this.gl.createTexture();\n    this.noiseTexMQ = this.gl.createTexture();\n    this.noiseTexHQ = this.gl.createTexture();\n    this.noiseTexVolLQ = this.gl.createTexture();\n    this.noiseTexVolHQ = this.gl.createTexture();\n    this.nTexArrLQ = Noise.createNoiseTex(256, 1);\n    this.nTexArrLQLite = Noise.createNoiseTex(32, 1);\n    this.nTexArrMQ = Noise.createNoiseTex(256, 4);\n    this.nTexArrHQ = Noise.createNoiseTex(256, 8);\n    this.nTexArrVolLQ = Noise.createNoiseVolTex(32, 1);\n    this.nTexArrVolHQ = Noise.createNoiseVolTex(32, 4);\n    this.bindTexture(this.noiseTexLQ, this.nTexArrLQ, 256, 256);\n    this.bindTexture(this.noiseTexLQLite, this.nTexArrLQLite, 32, 32);\n    this.bindTexture(this.noiseTexMQ, this.nTexArrMQ, 256, 256);\n    this.bindTexture(this.noiseTexHQ, this.nTexArrHQ, 256, 256);\n    this.bindTexture3D(this.noiseTexVolLQ, this.nTexArrVolLQ, 32, 32, 32);\n    this.bindTexture3D(this.noiseTexVolHQ, this.nTexArrVolHQ, 32, 32, 32);\n    this.noiseTexPointLQ = this.gl.createSampler();\n    gl.samplerParameteri(this.noiseTexPointLQ, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST);\n    gl.samplerParameteri(this.noiseTexPointLQ, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.samplerParameteri(this.noiseTexPointLQ, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.noiseTexPointLQ, gl.TEXTURE_WRAP_T, gl.REPEAT);\n  }\n\n  _createClass(Noise, [{\n    key: \"bindTexture\",\n    value: function bindTexture(texture, data, width, height) {\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);\n      this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, width, height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.REPEAT);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.REPEAT);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n\n      if (this.anisoExt) {\n        var max = this.gl.getParameter(this.anisoExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n        this.gl.texParameterf(this.gl.TEXTURE_2D, this.anisoExt.TEXTURE_MAX_ANISOTROPY_EXT, max);\n      }\n    }\n  }, {\n    key: \"bindTexture3D\",\n    value: function bindTexture3D(texture, data, width, height, depth) {\n      this.gl.bindTexture(this.gl.TEXTURE_3D, texture);\n      this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);\n      this.gl.texImage3D(this.gl.TEXTURE_3D, 0, this.gl.RGBA, width, height, depth, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n      this.gl.generateMipmap(this.gl.TEXTURE_3D);\n      this.gl.texParameteri(this.gl.TEXTURE_3D, this.gl.TEXTURE_WRAP_S, this.gl.REPEAT);\n      this.gl.texParameteri(this.gl.TEXTURE_3D, this.gl.TEXTURE_WRAP_T, this.gl.REPEAT);\n      this.gl.texParameteri(this.gl.TEXTURE_3D, this.gl.TEXTURE_WRAP_R, this.gl.REPEAT);\n      this.gl.texParameteri(this.gl.TEXTURE_3D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);\n      this.gl.texParameteri(this.gl.TEXTURE_3D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n\n      if (this.anisoExt) {\n        var max = this.gl.getParameter(this.anisoExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n        this.gl.texParameterf(this.gl.TEXTURE_3D, this.anisoExt.TEXTURE_MAX_ANISOTROPY_EXT, max);\n      }\n    }\n  }], [{\n    key: \"fCubicInterpolate\",\n    value: function fCubicInterpolate(y0, y1, y2, y3, t) {\n      var t2 = t * t;\n      var t3 = t * t2;\n      var a0 = y3 - y2 - y0 + y1;\n      var a1 = y0 - y1 - a0;\n      var a2 = y2 - y0;\n      var a3 = y1;\n      return a0 * t3 + a1 * t2 + a2 * t + a3;\n    }\n  }, {\n    key: \"dwCubicInterpolate\",\n    value: function dwCubicInterpolate(y0, y1, y2, y3, t) {\n      var ret = [];\n\n      for (var i = 0; i < 4; i++) {\n        var f = Noise.fCubicInterpolate(y0[i] / 255.0, y1[i] / 255.0, y2[i] / 255.0, y3[i] / 255.0, t);\n        f = Math.clamp(f, 0, 1);\n        ret[i] = f * 255;\n      }\n\n      return ret;\n    }\n  }, {\n    key: \"createNoiseVolTex\",\n    value: function createNoiseVolTex(noiseSize, zoom) {\n      var nsize = noiseSize * noiseSize * noiseSize;\n      var texArr = new Uint8Array(nsize * 4);\n      var texRange = zoom > 1 ? 216 : 256;\n      var halfTexRange = texRange * 0.5;\n\n      for (var i = 0; i < nsize; i++) {\n        texArr[i * 4 + 0] = Math.floor(Math.random() * texRange + halfTexRange);\n        texArr[i * 4 + 1] = Math.floor(Math.random() * texRange + halfTexRange);\n        texArr[i * 4 + 2] = Math.floor(Math.random() * texRange + halfTexRange);\n        texArr[i * 4 + 3] = Math.floor(Math.random() * texRange + halfTexRange);\n      }\n\n      var wordsPerSlice = noiseSize * noiseSize;\n      var wordsPerLine = noiseSize;\n\n      if (zoom > 1) {\n        for (var z = 0; z < noiseSize; z += zoom) {\n          for (var y = 0; y < noiseSize; y += zoom) {\n            for (var x = 0; x < noiseSize; x++) {\n              if (x % zoom !== 0) {\n                var baseX = Math.floor(x / zoom) * zoom + noiseSize;\n                var baseY = z * wordsPerSlice + y * wordsPerLine;\n                var y0 = [];\n                var y1 = [];\n                var y2 = [];\n                var y3 = [];\n\n                for (var _i = 0; _i < 4; _i++) {\n                  y0[_i] = texArr[baseY * 4 + (baseX - zoom) % noiseSize * 4 + _i];\n                  y1[_i] = texArr[baseY * 4 + baseX % noiseSize * 4 + _i];\n                  y2[_i] = texArr[baseY * 4 + (baseX + zoom) % noiseSize * 4 + _i];\n                  y3[_i] = texArr[baseY * 4 + (baseX + zoom * 2) % noiseSize * 4 + _i];\n                }\n\n                var t = x % zoom / zoom;\n                var result = Noise.dwCubicInterpolate(y0, y1, y2, y3, t);\n\n                for (var _i2 = 0; _i2 < 4; _i2++) {\n                  var offset = x * 4 + _i2;\n                  texArr[z * wordsPerSlice * 4 + y * wordsPerLine * 4 + offset] = result[_i2];\n                }\n              }\n            }\n          }\n        }\n\n        for (var _z = 0; _z < noiseSize; _z += zoom) {\n          for (var _x = 0; _x < noiseSize; _x++) {\n            for (var _y = 0; _y < noiseSize; _y++) {\n              if (_y % zoom !== 0) {\n                var _baseY = Math.floor(_y / zoom) * zoom + noiseSize;\n\n                var baseZ = _z * wordsPerSlice;\n                var _y2 = [];\n                var _y3 = [];\n                var _y4 = [];\n                var _y5 = [];\n\n                for (var _i3 = 0; _i3 < 4; _i3++) {\n                  var _offset = _x * 4 + baseZ * 4 + _i3;\n\n                  _y2[_i3] = texArr[(_baseY - zoom) % noiseSize * wordsPerLine * 4 + _offset];\n                  _y3[_i3] = texArr[_baseY % noiseSize * wordsPerLine * 4 + _offset];\n                  _y4[_i3] = texArr[(_baseY + zoom) % noiseSize * wordsPerLine * 4 + _offset];\n                  _y5[_i3] = texArr[(_baseY + zoom * 2) % noiseSize * wordsPerLine * 4 + _offset];\n                }\n\n                var _t = _y % zoom / zoom;\n\n                var _result = Noise.dwCubicInterpolate(_y2, _y3, _y4, _y5, _t);\n\n                for (var _i4 = 0; _i4 < 4; _i4++) {\n                  var _offset2 = _x * 4 + baseZ * 4 + _i4;\n\n                  texArr[_y * wordsPerLine * 4 + _offset2] = _result[_i4];\n                }\n              }\n            }\n          }\n        }\n\n        for (var _x2 = 0; _x2 < noiseSize; _x2++) {\n          for (var _y6 = 0; _y6 < noiseSize; _y6++) {\n            for (var _z2 = 0; _z2 < noiseSize; _z2++) {\n              if (_z2 % zoom !== 0) {\n                var _baseY2 = _y6 * wordsPerLine;\n\n                var _baseZ = Math.floor(_z2 / zoom) * zoom + noiseSize;\n\n                var _y7 = [];\n                var _y8 = [];\n                var _y9 = [];\n                var _y10 = [];\n\n                for (var _i5 = 0; _i5 < 4; _i5++) {\n                  var _offset3 = _x2 * 4 + _baseY2 * 4 + _i5;\n\n                  _y7[_i5] = texArr[(_baseZ - zoom) % noiseSize * wordsPerSlice * 4 + _offset3];\n                  _y8[_i5] = texArr[_baseZ % noiseSize * wordsPerSlice * 4 + _offset3];\n                  _y9[_i5] = texArr[(_baseZ + zoom) % noiseSize * wordsPerSlice * 4 + _offset3];\n                  _y10[_i5] = texArr[(_baseZ + zoom * 2) % noiseSize * wordsPerSlice * 4 + _offset3];\n                }\n\n                var _t2 = _y6 % zoom / zoom;\n\n                var _result2 = Noise.dwCubicInterpolate(_y7, _y8, _y9, _y10, _t2);\n\n                for (var _i6 = 0; _i6 < 4; _i6++) {\n                  var _offset4 = _x2 * 4 + _baseY2 * 4 + _i6;\n\n                  texArr[_z2 * wordsPerSlice * 4 + _offset4] = _result2[_i6];\n                }\n              }\n            }\n          }\n        }\n      }\n\n      return texArr;\n    }\n  }, {\n    key: \"createNoiseTex\",\n    value: function createNoiseTex(noiseSize, zoom) {\n      var nsize = noiseSize * noiseSize;\n      var texArr = new Uint8Array(nsize * 4);\n      var texRange = zoom > 1 ? 216 : 256;\n      var halfTexRange = texRange * 0.5;\n\n      for (var i = 0; i < nsize; i++) {\n        texArr[i * 4 + 0] = Math.floor(Math.random() * texRange + halfTexRange);\n        texArr[i * 4 + 1] = Math.floor(Math.random() * texRange + halfTexRange);\n        texArr[i * 4 + 2] = Math.floor(Math.random() * texRange + halfTexRange);\n        texArr[i * 4 + 3] = Math.floor(Math.random() * texRange + halfTexRange);\n      }\n\n      if (zoom > 1) {\n        for (var y = 0; y < noiseSize; y += zoom) {\n          for (var x = 0; x < noiseSize; x++) {\n            if (x % zoom !== 0) {\n              var baseX = Math.floor(x / zoom) * zoom + noiseSize;\n              var baseY = y * noiseSize;\n              var y0 = [];\n              var y1 = [];\n              var y2 = [];\n              var y3 = [];\n\n              for (var z = 0; z < 4; z++) {\n                y0[z] = texArr[baseY * 4 + (baseX - zoom) % noiseSize * 4 + z];\n                y1[z] = texArr[baseY * 4 + baseX % noiseSize * 4 + z];\n                y2[z] = texArr[baseY * 4 + (baseX + zoom) % noiseSize * 4 + z];\n                y3[z] = texArr[baseY * 4 + (baseX + zoom * 2) % noiseSize * 4 + z];\n              }\n\n              var t = x % zoom / zoom;\n              var result = Noise.dwCubicInterpolate(y0, y1, y2, y3, t);\n\n              for (var _z3 = 0; _z3 < 4; _z3++) {\n                texArr[y * noiseSize * 4 + x * 4 + _z3] = result[_z3];\n              }\n            }\n          }\n        }\n\n        for (var _x3 = 0; _x3 < noiseSize; _x3++) {\n          for (var _y11 = 0; _y11 < noiseSize; _y11++) {\n            if (_y11 % zoom !== 0) {\n              var _baseY3 = Math.floor(_y11 / zoom) * zoom + noiseSize;\n\n              var _y12 = [];\n              var _y13 = [];\n              var _y14 = [];\n              var _y15 = [];\n\n              for (var _z4 = 0; _z4 < 4; _z4++) {\n                _y12[_z4] = texArr[(_baseY3 - zoom) % noiseSize * noiseSize * 4 + _x3 * 4 + _z4];\n                _y13[_z4] = texArr[_baseY3 % noiseSize * noiseSize * 4 + _x3 * 4 + _z4];\n                _y14[_z4] = texArr[(_baseY3 + zoom) % noiseSize * noiseSize * 4 + _x3 * 4 + _z4];\n                _y15[_z4] = texArr[(_baseY3 + zoom * 2) % noiseSize * noiseSize * 4 + _x3 * 4 + _z4];\n              }\n\n              var _t3 = _y11 % zoom / zoom;\n\n              var _result3 = Noise.dwCubicInterpolate(_y12, _y13, _y14, _y15, _t3);\n\n              for (var _z5 = 0; _z5 < 4; _z5++) {\n                texArr[_y11 * noiseSize * 4 + _x3 * 4 + _z5] = _result3[_z5];\n              }\n            }\n          }\n        }\n      }\n\n      return texArr;\n    }\n  }]);\n\n  return Noise;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/presetBase.js\":\n/*!***************************!*\\\n  !*** ./src/presetBase.js ***!\n  \\***************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\n/* eslint-disable */\nvar EPSILON = 0.00001;\n\nwindow.sqr = function sqr(x) {\n  return x * x;\n};\n\nwindow.sqrt = function sqrt(x) {\n  return Math.sqrt(Math.abs(x));\n};\n\nwindow.log10 = function log10(val) {\n  return Math.log(val) * Math.LOG10E;\n};\n\nwindow.sign = function sign(x) {\n  return x > 0 ? 1 : x < 0 ? -1 : 0;\n};\n\nwindow.rand = function rand(x) {\n  var xf = Math.floor(x);\n\n  if (xf < 1) {\n    return Math.random();\n  }\n\n  return Math.random() * xf;\n};\n\nwindow.randint = function randint(x) {\n  return Math.floor(rand(x));\n};\n\nwindow.bnot = function bnot(x) {\n  return Math.abs(x) < EPSILON ? 1 : 0;\n};\n\nfunction isFiniteNumber(num) {\n  return isFinite(num) && !isNaN(num);\n}\n\nwindow.pow = function pow(x, y) {\n  var z = Math.pow(x, y);\n\n  if (!isFiniteNumber(z)) {\n    // mostly from complex results\n    return 0;\n  }\n\n  return z;\n};\n\nwindow.div = function div(x, y) {\n  if (y === 0) {\n    return 0;\n  }\n\n  return x / y;\n};\n\nwindow.mod = function mod(x, y) {\n  if (y === 0) {\n    return 0;\n  }\n\n  var z = Math.floor(x) % Math.floor(y);\n  return z;\n};\n\nwindow.bitor = function bitor(x, y) {\n  var z = Math.floor(x) | Math.floor(y);\n  return z;\n};\n\nwindow.bitand = function bitand(x, y) {\n  var z = Math.floor(x) & Math.floor(y);\n  return z;\n};\n\nwindow.sigmoid = function sigmoid(x, y) {\n  var t = 1 + Math.exp(-x * y);\n  return Math.abs(t) > EPSILON ? 1.0 / t : 0;\n};\n\nwindow.bor = function bor(x, y) {\n  return Math.abs(x) > EPSILON || Math.abs(y) > EPSILON ? 1 : 0;\n};\n\nwindow.band = function band(x, y) {\n  return Math.abs(x) > EPSILON && Math.abs(y) > EPSILON ? 1 : 0;\n};\n\nwindow.equal = function equal(x, y) {\n  return Math.abs(x - y) < EPSILON ? 1 : 0;\n};\n\nwindow.above = function above(x, y) {\n  return x > y ? 1 : 0;\n};\n\nwindow.below = function below(x, y) {\n  return x < y ? 1 : 0;\n};\n\nwindow.ifcond = function ifcond(x, y, z) {\n  return Math.abs(x) > EPSILON ? y : z;\n};\n\nwindow.memcpy = function memcpy(megabuf, dst, src, len) {\n  var destOffset = dst;\n  var srcOffset = src;\n  var copyLen = len;\n\n  if (srcOffset < 0) {\n    copyLen += srcOffset;\n    destOffset -= srcOffset;\n    srcOffset = 0;\n  }\n\n  if (destOffset < 0) {\n    copyLen += destOffset;\n    srcOffset -= destOffset;\n    destOffset = 0;\n  }\n\n  if (copyLen > 0) {\n    megabuf.copyWithin(destOffset, srcOffset, copyLen);\n  }\n\n  return dst;\n};\n/* eslint-enable */\n\n/***/ }),\n\n/***/ \"./src/rendering/blendPattern.js\":\n/*!***************************************!*\\\n  !*** ./src/rendering/blendPattern.js ***!\n  \\***************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_74347__) {\n\n\"use strict\";\n__nested_webpack_require_74347__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_74347__.d(__nested_webpack_exports__, \"default\", function() { return BlendPattern; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar BlendPattern =\n/*#__PURE__*/\nfunction () {\n  function BlendPattern(opts) {\n    _classCallCheck(this, BlendPattern);\n\n    this.mesh_width = opts.mesh_width;\n    this.mesh_height = opts.mesh_height;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.vertInfoA = new Float32Array((this.mesh_width + 1) * (this.mesh_height + 1));\n    this.vertInfoC = new Float32Array((this.mesh_width + 1) * (this.mesh_height + 1));\n    this.createBlendPattern();\n  }\n\n  _createClass(BlendPattern, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      var oldMeshWidth = this.mesh_width;\n      var oldMeshHeight = this.mesh_height;\n      this.mesh_width = opts.mesh_width;\n      this.mesh_height = opts.mesh_height;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n\n      if (this.mesh_width !== oldMeshWidth || this.mesh_height !== oldMeshHeight) {\n        this.vertInfoA = BlendPattern.resizeMatrixValues(this.vertInfoA, oldMeshWidth, oldMeshHeight, this.mesh_width, this.mesh_height);\n        this.vertInfoC = BlendPattern.resizeMatrixValues(this.vertInfoC, oldMeshWidth, oldMeshHeight, this.mesh_width, this.mesh_height);\n      }\n    }\n  }, {\n    key: \"genPlasma\",\n    value: function genPlasma(x0, x1, y0, y1, dt) {\n      var midx = Math.floor((x0 + x1) / 2);\n      var midy = Math.floor((y0 + y1) / 2);\n      var t00 = this.vertInfoC[y0 * (this.mesh_width + 1) + x0];\n      var t01 = this.vertInfoC[y0 * (this.mesh_width + 1) + x1];\n      var t10 = this.vertInfoC[y1 * (this.mesh_width + 1) + x0];\n      var t11 = this.vertInfoC[y1 * (this.mesh_width + 1) + x1];\n\n      if (y1 - y0 >= 2) {\n        if (x0 === 0) {\n          this.vertInfoC[midy * (this.mesh_width + 1) + x0] = 0.5 * (t00 + t10) + (Math.random() * 2 - 1) * dt * this.aspecty;\n        }\n\n        this.vertInfoC[midy * (this.mesh_width + 1) + x1] = 0.5 * (t01 + t11) + (Math.random() * 2 - 1) * dt * this.aspecty;\n      }\n\n      if (x1 - x0 >= 2) {\n        if (y0 === 0) {\n          this.vertInfoC[y0 * (this.mesh_width + 1) + midx] = 0.5 * (t00 + t01) + (Math.random() * 2 - 1) * dt * this.aspectx;\n        }\n\n        this.vertInfoC[y1 * (this.mesh_width + 1) + midx] = 0.5 * (t10 + t11) + (Math.random() * 2 - 1) * dt * this.aspectx;\n      }\n\n      if (y1 - y0 >= 2 && x1 - x0 >= 2) {\n        t00 = this.vertInfoC[midy * (this.mesh_width + 1) + x0];\n        t01 = this.vertInfoC[midy * (this.mesh_width + 1) + x1];\n        t10 = this.vertInfoC[y0 * (this.mesh_width + 1) + midx];\n        t11 = this.vertInfoC[y1 * (this.mesh_width + 1) + midx];\n        this.vertInfoC[midy * (this.mesh_width + 1) + midx] = 0.25 * (t10 + t11 + t00 + t01) + (Math.random() * 2 - 1) * dt;\n        this.genPlasma(x0, midx, y0, midy, dt * 0.5);\n        this.genPlasma(midx, x1, y0, midy, dt * 0.5);\n        this.genPlasma(x0, midx, midy, y1, dt * 0.5);\n        this.genPlasma(midx, x1, midy, y1, dt * 0.5);\n      }\n    }\n  }, {\n    key: \"createBlendPattern\",\n    value: function createBlendPattern() {\n      var mixType = 1 + Math.floor(Math.random() * 3);\n\n      if (mixType === 0) {\n        // not currently used\n        var nVert = 0;\n\n        for (var y = 0; y <= this.mesh_height; y++) {\n          for (var x = 0; x <= this.mesh_width; x++) {\n            this.vertInfoA[nVert] = 1;\n            this.vertInfoC[nVert] = 0;\n            nVert += 1;\n          }\n        }\n      } else if (mixType === 1) {\n        var ang = Math.random() * 6.28;\n        var vx = Math.cos(ang);\n        var vy = Math.sin(ang);\n        var band = 0.1 + 0.2 * Math.random();\n        var invBand = 1.0 / band;\n        var _nVert = 0;\n\n        for (var _y = 0; _y <= this.mesh_height; _y++) {\n          var fy = _y / this.mesh_height * this.aspecty;\n\n          for (var _x = 0; _x <= this.mesh_width; _x++) {\n            var fx = _x / this.mesh_width * this.aspectx;\n            var t = (fx - 0.5) * vx + (fy - 0.5) * vy + 0.5;\n            t = (t - 0.5) / Math.sqrt(2) + 0.5;\n            this.vertInfoA[_nVert] = invBand * (1 + band);\n            this.vertInfoC[_nVert] = -invBand + invBand * t;\n            _nVert += 1;\n          }\n        }\n      } else if (mixType === 2) {\n        var _band = 0.12 + 0.13 * Math.random();\n\n        var _invBand = 1.0 / _band;\n\n        this.vertInfoC[0] = Math.random();\n        this.vertInfoC[this.mesh_width] = Math.random();\n        this.vertInfoC[this.mesh_height * (this.mesh_width + 1)] = Math.random();\n        this.vertInfoC[this.mesh_height * (this.mesh_width + 1) + this.mesh_width] = Math.random();\n        this.genPlasma(0, this.mesh_width, 0, this.mesh_height, 0.25);\n        var minc = this.vertInfoC[0];\n        var maxc = this.vertInfoC[0];\n        var _nVert2 = 0;\n\n        for (var _y2 = 0; _y2 <= this.mesh_height; _y2++) {\n          for (var _x2 = 0; _x2 <= this.mesh_width; _x2++) {\n            if (minc > this.vertInfoC[_nVert2]) {\n              minc = this.vertInfoC[_nVert2];\n            }\n\n            if (maxc < this.vertInfoC[_nVert2]) {\n              maxc = this.vertInfoC[_nVert2];\n            }\n\n            _nVert2 += 1;\n          }\n        }\n\n        var mult = 1.0 / (maxc - minc);\n        _nVert2 = 0;\n\n        for (var _y3 = 0; _y3 <= this.mesh_height; _y3++) {\n          for (var _x3 = 0; _x3 <= this.mesh_width; _x3++) {\n            var _t = (this.vertInfoC[_nVert2] - minc) * mult;\n\n            this.vertInfoA[_nVert2] = _invBand * (1 + _band);\n            this.vertInfoC[_nVert2] = -_invBand + _invBand * _t;\n            _nVert2 += 1;\n          }\n        }\n      } else if (mixType === 3) {\n        var _band2 = 0.02 + 0.14 * Math.random() + 0.34 * Math.random();\n\n        var _invBand2 = 1.0 / _band2;\n\n        var dir = Math.floor(Math.random() * 2) * 2 - 1;\n        var _nVert3 = 0;\n\n        for (var _y4 = 0; _y4 <= this.mesh_height; _y4++) {\n          var dy = (_y4 / this.mesh_height - 0.5) * this.aspecty;\n\n          for (var _x4 = 0; _x4 <= this.mesh_width; _x4++) {\n            var dx = (_x4 / this.mesh_width - 0.5) * this.aspectx;\n\n            var _t2 = Math.sqrt(dx * dx + dy * dy) * 1.41421;\n\n            if (dir === -1) {\n              _t2 = 1 - _t2;\n            }\n\n            this.vertInfoA[_nVert3] = _invBand2 * (1 + _band2);\n            this.vertInfoC[_nVert3] = -_invBand2 + _invBand2 * _t2;\n            _nVert3 += 1;\n          }\n        }\n      }\n    }\n  }], [{\n    key: \"resizeMatrixValues\",\n    value: function resizeMatrixValues(oldMat, oldWidth, oldHeight, newWidth, newHeight) {\n      var newMat = new Float32Array((newWidth + 1) * (newHeight + 1));\n      var nVert = 0;\n\n      for (var j = 0; j < newHeight + 1; j++) {\n        for (var i = 0; i < newWidth + 1; i++) {\n          var x = i / newHeight;\n          var y = j / newWidth;\n          x *= oldWidth + 1;\n          y *= oldHeight + 1;\n          x = Math.clamp(x, 0, oldWidth - 1);\n          y = Math.clamp(y, 0, oldHeight - 1);\n          var nx = Math.floor(x);\n          var ny = Math.floor(y);\n          var dx = x - nx;\n          var dy = y - ny;\n          var val00 = oldMat[ny * (oldWidth + 1) + nx];\n          var val01 = oldMat[ny * (oldWidth + 1) + (nx + 1)];\n          var val10 = oldMat[(ny + 1) * (oldWidth + 1) + nx];\n          var val11 = oldMat[(ny + 1) * (oldWidth + 1) + (nx + 1)];\n          newMat[nVert] = val00 * (1 - dx) * (1 - dy) + val01 * dx * (1 - dy) + val10 * (1 - dx) * dy + val11 * dx * dy;\n          nVert += 1;\n        }\n      }\n\n      return newMat;\n    }\n  }]);\n\n  return BlendPattern;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/motionVectors/motionVectors.js\":\n/*!******************************************************!*\\\n  !*** ./src/rendering/motionVectors/motionVectors.js ***!\n  \\******************************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_83033__) {\n\n\"use strict\";\n__nested_webpack_require_83033__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_83033__.d(__nested_webpack_exports__, \"default\", function() { return MotionVectors; });\n/* harmony import */ var _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_83033__(/*! ../shaders/shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar MotionVectors =\n/*#__PURE__*/\nfunction () {\n  function MotionVectors(gl, opts) {\n    _classCallCheck(this, MotionVectors);\n\n    this.gl = gl;\n    this.maxX = 64;\n    this.maxY = 48;\n    this.positions = new Float32Array(this.maxX * this.maxY * 2 * 3);\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.mesh_width = opts.mesh_width;\n    this.mesh_height = opts.mesh_height;\n    this.positionVertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n  }\n\n  _createClass(MotionVectors, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.mesh_width = opts.mesh_width;\n      this.mesh_height = opts.mesh_height;\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      in vec3 aPos;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aPos, 1.0);\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      out vec4 fragColor;\\n                                      uniform vec4 u_color;\\n                                      void main(void) {\\n                                        fragColor = u_color;\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.aPosLoc = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.colorLoc = this.gl.getUniformLocation(this.shaderProgram, 'u_color');\n    }\n  }, {\n    key: \"getMotionDir\",\n    value: function getMotionDir(warpUVs, fx, fy) {\n      var y0 = Math.floor(fy * this.mesh_height);\n      var dy = fy * this.mesh_height - y0;\n      var x0 = Math.floor(fx * this.mesh_width);\n      var dx = fx * this.mesh_width - x0;\n      var x1 = x0 + 1;\n      var y1 = y0 + 1;\n      var gridX1 = this.mesh_width + 1;\n      var fx2;\n      var fy2;\n      fx2 = warpUVs[(y0 * gridX1 + x0) * 2 + 0] * (1 - dx) * (1 - dy);\n      fy2 = warpUVs[(y0 * gridX1 + x0) * 2 + 1] * (1 - dx) * (1 - dy);\n      fx2 += warpUVs[(y0 * gridX1 + x1) * 2 + 0] * dx * (1 - dy);\n      fy2 += warpUVs[(y0 * gridX1 + x1) * 2 + 1] * dx * (1 - dy);\n      fx2 += warpUVs[(y1 * gridX1 + x0) * 2 + 0] * (1 - dx) * dy;\n      fy2 += warpUVs[(y1 * gridX1 + x0) * 2 + 1] * (1 - dx) * dy;\n      fx2 += warpUVs[(y1 * gridX1 + x1) * 2 + 0] * dx * dy;\n      fy2 += warpUVs[(y1 * gridX1 + x1) * 2 + 1] * dx * dy;\n      return [fx2, 1.0 - fy2];\n    }\n  }, {\n    key: \"generateMotionVectors\",\n    value: function generateMotionVectors(mdVSFrame, warpUVs) {\n      var mvA = mdVSFrame.mv_a;\n      var nX = Math.floor(mdVSFrame.mv_x);\n      var nY = Math.floor(mdVSFrame.mv_y);\n\n      if (mvA > 0.001 && nX > 0 && nY > 0) {\n        var dx = mdVSFrame.mv_x - nX;\n        var dy = mdVSFrame.mv_y - nY;\n\n        if (nX > this.maxX) {\n          nX = this.maxX;\n          dx = 0;\n        }\n\n        if (nY > this.maxY) {\n          nY = this.maxY;\n          dy = 0;\n        }\n\n        var dx2 = mdVSFrame.mv_dx;\n        var dy2 = mdVSFrame.mv_dy;\n        var lenMult = mdVSFrame.mv_l;\n        var minLen = 1.0 / this.texsizeX;\n        this.numVecVerts = 0;\n\n        for (var j = 0; j < nY; j++) {\n          var fy = (j + 0.25) / (nY + dy + 0.25 - 1.0);\n          fy -= dy2;\n\n          if (fy > 0.0001 && fy < 0.9999) {\n            for (var i = 0; i < nX; i++) {\n              var fx = (i + 0.25) / (nX + dx + 0.25 - 1.0);\n              fx += dx2;\n\n              if (fx > 0.0001 && fx < 0.9999) {\n                var fx2arr = this.getMotionDir(warpUVs, fx, fy);\n                var fx2 = fx2arr[0];\n                var fy2 = fx2arr[1];\n                var dxi = fx2 - fx;\n                var dyi = fy2 - fy;\n                dxi *= lenMult;\n                dyi *= lenMult;\n                var fdist = Math.sqrt(dxi * dxi + dyi * dyi);\n\n                if (fdist < minLen && fdist > 0.00000001) {\n                  fdist = minLen / fdist;\n                  dxi *= fdist;\n                  dyi *= fdist;\n                } else {\n                  dxi = minLen;\n                  dxi = minLen;\n                }\n\n                fx2 = fx + dxi;\n                fy2 = fy + dyi;\n                var vx1 = 2.0 * fx - 1.0;\n                var vy1 = 2.0 * fy - 1.0;\n                var vx2 = 2.0 * fx2 - 1.0;\n                var vy2 = 2.0 * fy2 - 1.0;\n                this.positions[this.numVecVerts * 3 + 0] = vx1;\n                this.positions[this.numVecVerts * 3 + 1] = vy1;\n                this.positions[this.numVecVerts * 3 + 2] = 0;\n                this.positions[(this.numVecVerts + 1) * 3 + 0] = vx2;\n                this.positions[(this.numVecVerts + 1) * 3 + 1] = vy2;\n                this.positions[(this.numVecVerts + 1) * 3 + 2] = 0;\n                this.numVecVerts += 2;\n              }\n            }\n          }\n        }\n\n        if (this.numVecVerts > 0) {\n          this.color = [mdVSFrame.mv_r, mdVSFrame.mv_g, mdVSFrame.mv_b, mvA];\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }, {\n    key: \"drawMotionVectors\",\n    value: function drawMotionVectors(mdVSFrame, warpUVs) {\n      if (this.generateMotionVectors(mdVSFrame, warpUVs)) {\n        this.gl.useProgram(this.shaderProgram);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.STATIC_DRAW);\n        this.gl.vertexAttribPointer(this.aPosLoc, 3, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aPosLoc);\n        this.gl.uniform4fv(this.colorLoc, this.color);\n        this.gl.lineWidth(1);\n        this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n        this.gl.drawArrays(this.gl.LINES, 0, this.numVecVerts);\n      }\n    }\n  }]);\n\n  return MotionVectors;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/renderer.js\":\n/*!***********************************!*\\\n  !*** ./src/rendering/renderer.js ***!\n  \\***********************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_91017__) {\n\n\"use strict\";\n__nested_webpack_require_91017__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_91017__.d(__nested_webpack_exports__, \"default\", function() { return Renderer; });\n/* harmony import */ var _audio_audioLevels__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_91017__(/*! ../audio/audioLevels */ \"./src/audio/audioLevels.js\");\n/* harmony import */ var _blankPreset__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_91017__(/*! ../blankPreset */ \"./src/blankPreset.js\");\n/* harmony import */ var _blankPreset__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_91017__.n(_blankPreset__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _equations_presetEquationRunner__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_91017__(/*! ../equations/presetEquationRunner */ \"./src/equations/presetEquationRunner.js\");\n/* harmony import */ var _waves_basicWaveform__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_91017__(/*! ./waves/basicWaveform */ \"./src/rendering/waves/basicWaveform.js\");\n/* harmony import */ var _waves_customWaveform__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_91017__(/*! ./waves/customWaveform */ \"./src/rendering/waves/customWaveform.js\");\n/* harmony import */ var _shapes_customShape__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_91017__(/*! ./shapes/customShape */ \"./src/rendering/shapes/customShape.js\");\n/* harmony import */ var _sprites_border__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_91017__(/*! ./sprites/border */ \"./src/rendering/sprites/border.js\");\n/* harmony import */ var _sprites_darkenCenter__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_91017__(/*! ./sprites/darkenCenter */ \"./src/rendering/sprites/darkenCenter.js\");\n/* harmony import */ var _motionVectors_motionVectors__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_91017__(/*! ./motionVectors/motionVectors */ \"./src/rendering/motionVectors/motionVectors.js\");\n/* harmony import */ var _shaders_warp__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_91017__(/*! ./shaders/warp */ \"./src/rendering/shaders/warp.js\");\n/* harmony import */ var _shaders_comp__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_91017__(/*! ./shaders/comp */ \"./src/rendering/shaders/comp.js\");\n/* harmony import */ var _shaders_output__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_91017__(/*! ./shaders/output */ \"./src/rendering/shaders/output.js\");\n/* harmony import */ var _shaders_resample__WEBPACK_IMPORTED_MODULE_12__ = __nested_webpack_require_91017__(/*! ./shaders/resample */ \"./src/rendering/shaders/resample.js\");\n/* harmony import */ var _shaders_blur_blur__WEBPACK_IMPORTED_MODULE_13__ = __nested_webpack_require_91017__(/*! ./shaders/blur/blur */ \"./src/rendering/shaders/blur/blur.js\");\n/* harmony import */ var _noise_noise__WEBPACK_IMPORTED_MODULE_14__ = __nested_webpack_require_91017__(/*! ../noise/noise */ \"./src/noise/noise.js\");\n/* harmony import */ var _image_imageTextures__WEBPACK_IMPORTED_MODULE_15__ = __nested_webpack_require_91017__(/*! ../image/imageTextures */ \"./src/image/imageTextures.js\");\n/* harmony import */ var _text_titleText__WEBPACK_IMPORTED_MODULE_16__ = __nested_webpack_require_91017__(/*! ./text/titleText */ \"./src/rendering/text/titleText.js\");\n/* harmony import */ var _blendPattern__WEBPACK_IMPORTED_MODULE_17__ = __nested_webpack_require_91017__(/*! ./blendPattern */ \"./src/rendering/blendPattern.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_18__ = __nested_webpack_require_91017__(/*! ../utils */ \"./src/utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar Renderer =\n/*#__PURE__*/\nfunction () {\n  function Renderer(gl, audio, opts) {\n    _classCallCheck(this, Renderer);\n\n    this.gl = gl;\n    this.audio = audio;\n    this.frameNum = 0;\n    this.fps = 30;\n    this.time = 0;\n    this.presetTime = 0;\n    this.lastTime = performance.now();\n    this.timeHist = [0];\n    this.timeHistMax = 120;\n    this.blending = false;\n    this.blendStartTime = 0;\n    this.blendProgress = 0;\n    this.blendDuration = 0;\n    this.width = opts.width || 1200;\n    this.height = opts.height || 900;\n    this.mesh_width = opts.meshWidth || 48;\n    this.mesh_height = opts.meshHeight || 36;\n    this.pixelRatio = opts.pixelRatio || window.devicePixelRatio || 1;\n    this.textureRatio = opts.textureRatio || 1;\n    this.outputFXAA = opts.outputFXAA || false;\n    this.texsizeX = this.width * this.pixelRatio * this.textureRatio;\n    this.texsizeY = this.height * this.pixelRatio * this.textureRatio;\n    this.aspectx = this.texsizeY > this.texsizeX ? this.texsizeX / this.texsizeY : 1;\n    this.aspecty = this.texsizeX > this.texsizeY ? this.texsizeY / this.texsizeX : 1;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.qs = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].range(1, 33).map(function (x) {\n      return \"q\".concat(x);\n    });\n    this.ts = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].range(1, 9).map(function (x) {\n      return \"t\".concat(x);\n    });\n    this.regs = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].range(0, 100).map(function (x) {\n      if (x < 10) {\n        return \"reg0\".concat(x);\n      }\n\n      return \"reg\".concat(x);\n    });\n    this.blurRatios = [[0.5, 0.25], [0.125, 0.125], [0.0625, 0.0625]];\n    this.audioLevels = new _audio_audioLevels__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this.audio);\n    this.prevFrameBuffer = this.gl.createFramebuffer();\n    this.targetFrameBuffer = this.gl.createFramebuffer();\n    this.prevTexture = this.gl.createTexture();\n    this.targetTexture = this.gl.createTexture();\n    this.compFrameBuffer = this.gl.createFramebuffer();\n    this.compTexture = this.gl.createTexture();\n    this.anisoExt = this.gl.getExtension('EXT_texture_filter_anisotropic') || this.gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || this.gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n    this.bindFrameBufferTexture(this.prevFrameBuffer, this.prevTexture);\n    this.bindFrameBufferTexture(this.targetFrameBuffer, this.targetTexture);\n    this.bindFrameBufferTexture(this.compFrameBuffer, this.compTexture);\n    var params = {\n      pixelRatio: this.pixelRatio,\n      textureRatio: this.textureRatio,\n      texsizeX: this.texsizeX,\n      texsizeY: this.texsizeY,\n      mesh_width: this.mesh_width,\n      mesh_height: this.mesh_height,\n      aspectx: this.aspectx,\n      aspecty: this.aspecty\n    };\n    this.noise = new _noise_noise__WEBPACK_IMPORTED_MODULE_14__[\"default\"](gl);\n    this.image = new _image_imageTextures__WEBPACK_IMPORTED_MODULE_15__[\"default\"](gl);\n    this.warpShader = new _shaders_warp__WEBPACK_IMPORTED_MODULE_9__[\"default\"](gl, this.noise, this.image, params);\n    this.compShader = new _shaders_comp__WEBPACK_IMPORTED_MODULE_10__[\"default\"](gl, this.noise, this.image, params);\n    this.outputShader = new _shaders_output__WEBPACK_IMPORTED_MODULE_11__[\"default\"](gl, params);\n    this.prevWarpShader = new _shaders_warp__WEBPACK_IMPORTED_MODULE_9__[\"default\"](gl, this.noise, this.image, params);\n    this.prevCompShader = new _shaders_comp__WEBPACK_IMPORTED_MODULE_10__[\"default\"](gl, this.noise, this.image, params);\n    this.numBlurPasses = 0;\n    this.blurShader1 = new _shaders_blur_blur__WEBPACK_IMPORTED_MODULE_13__[\"default\"](0, this.blurRatios, gl, params);\n    this.blurShader2 = new _shaders_blur_blur__WEBPACK_IMPORTED_MODULE_13__[\"default\"](1, this.blurRatios, gl, params);\n    this.blurShader3 = new _shaders_blur_blur__WEBPACK_IMPORTED_MODULE_13__[\"default\"](2, this.blurRatios, gl, params);\n    this.blurTexture1 = this.blurShader1.blurVerticalTexture;\n    this.blurTexture2 = this.blurShader2.blurVerticalTexture;\n    this.blurTexture3 = this.blurShader3.blurVerticalTexture;\n    this.basicWaveform = new _waves_basicWaveform__WEBPACK_IMPORTED_MODULE_3__[\"default\"](gl, params);\n    this.customWaveforms = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].range(4).map(function (i) {\n      return new _waves_customWaveform__WEBPACK_IMPORTED_MODULE_4__[\"default\"](i, gl, params);\n    });\n    this.customShapes = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].range(4).map(function (i) {\n      return new _shapes_customShape__WEBPACK_IMPORTED_MODULE_5__[\"default\"](i, gl, params);\n    });\n    this.prevCustomWaveforms = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].range(4).map(function (i) {\n      return new _waves_customWaveform__WEBPACK_IMPORTED_MODULE_4__[\"default\"](i, gl, params);\n    });\n    this.prevCustomShapes = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].range(4).map(function (i) {\n      return new _shapes_customShape__WEBPACK_IMPORTED_MODULE_5__[\"default\"](i, gl, params);\n    });\n    this.darkenCenter = new _sprites_darkenCenter__WEBPACK_IMPORTED_MODULE_7__[\"default\"](gl, params);\n    this.innerBorder = new _sprites_border__WEBPACK_IMPORTED_MODULE_6__[\"default\"](gl, params);\n    this.outerBorder = new _sprites_border__WEBPACK_IMPORTED_MODULE_6__[\"default\"](gl, params);\n    this.motionVectors = new _motionVectors_motionVectors__WEBPACK_IMPORTED_MODULE_8__[\"default\"](gl, params);\n    this.titleText = new _text_titleText__WEBPACK_IMPORTED_MODULE_16__[\"default\"](gl, params);\n    this.blendPattern = new _blendPattern__WEBPACK_IMPORTED_MODULE_17__[\"default\"](params);\n    this.resampleShader = new _shaders_resample__WEBPACK_IMPORTED_MODULE_12__[\"default\"](gl);\n    this.supertext = {\n      startTime: -1\n    };\n    this.warpUVs = new Float32Array((this.mesh_width + 1) * (this.mesh_height + 1) * 2);\n    this.warpColor = new Float32Array((this.mesh_width + 1) * (this.mesh_height + 1) * 4);\n    this.gl.clearColor(0, 0, 0, 1);\n    this.blankPreset = _blankPreset__WEBPACK_IMPORTED_MODULE_1___default.a;\n    var globalVars = {\n      frame: 0,\n      time: 0,\n      fps: 45,\n      bass: 1,\n      bass_att: 1,\n      mid: 1,\n      mid_att: 1,\n      treb: 1,\n      treb_att: 1\n    };\n    this.preset = _blankPreset__WEBPACK_IMPORTED_MODULE_1___default.a;\n    this.prevPreset = this.preset;\n    this.presetEquationRunner = new _equations_presetEquationRunner__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.preset, globalVars, params);\n    this.prevPresetEquationRunner = new _equations_presetEquationRunner__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.prevPreset, globalVars, params);\n    this.regVars = this.presetEquationRunner.mdVSRegs;\n  }\n\n  _createClass(Renderer, [{\n    key: \"loadPreset\",\n    value: function loadPreset(preset, blendTime) {\n      this.blendPattern.createBlendPattern();\n      this.blending = true;\n      this.blendStartTime = this.time;\n      this.blendDuration = blendTime;\n      this.blendProgress = 0;\n      this.prevPresetEquationRunner = this.presetEquationRunner;\n      this.prevPreset = this.preset;\n      this.preset = preset;\n      this.preset.baseVals.old_wave_mode = this.prevPreset.baseVals.wave_mode;\n      this.presetTime = this.time;\n      var globalVars = {\n        frame: this.frameNum,\n        time: this.time,\n        fps: this.fps,\n        bass: this.audioLevels.bass,\n        bass_att: this.audioLevels.bass_att,\n        mid: this.audioLevels.mid,\n        mid_att: this.audioLevels.mid_att,\n        treb: this.audioLevels.treb,\n        treb_att: this.audioLevels.treb_att\n      };\n      var params = {\n        pixelRatio: this.pixelRatio,\n        textureRatio: this.textureRatio,\n        texsizeX: this.texsizeX,\n        texsizeY: this.texsizeY,\n        mesh_width: this.mesh_width,\n        mesh_height: this.mesh_height,\n        aspectx: this.aspectx,\n        aspecty: this.aspecty\n      };\n      this.presetEquationRunner = new _equations_presetEquationRunner__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.preset, globalVars, params);\n      this.regVars = this.presetEquationRunner.mdVSRegs;\n      var tmpWarpShader = this.prevWarpShader;\n      this.prevWarpShader = this.warpShader;\n      this.warpShader = tmpWarpShader;\n      var tmpCompShader = this.prevCompShader;\n      this.prevCompShader = this.compShader;\n      this.compShader = tmpCompShader;\n      var warpText = this.preset.warp.trim();\n      var compText = this.preset.comp.trim();\n      this.warpShader.updateShader(warpText);\n      this.compShader.updateShader(compText);\n\n      if (warpText.length === 0) {\n        this.numBlurPasses = 0;\n      } else {\n        this.numBlurPasses = Renderer.getHighestBlur(warpText);\n      }\n\n      if (compText.length !== 0) {\n        this.numBlurPasses = Math.max(this.numBlurPasses, Renderer.getHighestBlur(compText));\n      }\n    }\n  }, {\n    key: \"loadExtraImages\",\n    value: function loadExtraImages(imageData) {\n      this.image.loadExtraImages(imageData);\n    }\n  }, {\n    key: \"setRendererSize\",\n    value: function setRendererSize(width, height, opts) {\n      var oldTexsizeX = this.texsizeX;\n      var oldTexsizeY = this.texsizeY;\n      this.width = width;\n      this.height = height;\n      this.mesh_width = opts.meshWidth || this.mesh_width;\n      this.mesh_height = opts.meshHeight || this.mesh_height;\n      this.pixelRatio = opts.pixelRatio || this.pixelRatio;\n      this.textureRatio = opts.textureRatio || this.textureRatio;\n      this.texsizeX = width * this.pixelRatio * this.textureRatio;\n      this.texsizeY = height * this.pixelRatio * this.textureRatio;\n      this.aspectx = this.texsizeY > this.texsizeX ? this.texsizeX / this.texsizeY : 1;\n      this.aspecty = this.texsizeX > this.texsizeY ? this.texsizeY / this.texsizeX : 1;\n\n      if (this.texsizeX !== oldTexsizeX || this.texsizeY !== oldTexsizeY) {\n        // copy target texture, because we flip prev/target at start of render\n        var targetTextureNew = this.gl.createTexture();\n        this.bindFrameBufferTexture(this.targetFrameBuffer, targetTextureNew);\n        this.bindFrambufferAndSetViewport(this.targetFrameBuffer, this.texsizeX, this.texsizeY);\n        this.resampleShader.renderQuadTexture(this.targetTexture);\n        this.targetTexture = targetTextureNew;\n        this.bindFrameBufferTexture(this.prevFrameBuffer, this.prevTexture);\n        this.bindFrameBufferTexture(this.compFrameBuffer, this.compTexture);\n      }\n\n      this.updateGlobals(); // rerender current frame at new size\n\n      if (this.frameNum > 0) {\n        this.renderToScreen();\n      }\n    }\n  }, {\n    key: \"setInternalMeshSize\",\n    value: function setInternalMeshSize(width, height) {\n      this.mesh_width = width;\n      this.mesh_height = height;\n      this.updateGlobals();\n    }\n  }, {\n    key: \"setOutputAA\",\n    value: function setOutputAA(useAA) {\n      this.outputFXAA = useAA;\n    }\n  }, {\n    key: \"updateGlobals\",\n    value: function updateGlobals() {\n      var params = {\n        pixelRatio: this.pixelRatio,\n        textureRatio: this.textureRatio,\n        texsizeX: this.texsizeX,\n        texsizeY: this.texsizeY,\n        mesh_width: this.mesh_width,\n        mesh_height: this.mesh_height,\n        aspectx: this.aspectx,\n        aspecty: this.aspecty\n      };\n      this.presetEquationRunner.updateGlobals(params);\n      this.prevPresetEquationRunner.updateGlobals(params);\n      this.warpShader.updateGlobals(params);\n      this.prevWarpShader.updateGlobals(params);\n      this.compShader.updateGlobals(params);\n      this.prevCompShader.updateGlobals(params);\n      this.outputShader.updateGlobals(params);\n      this.blurShader1.updateGlobals(params);\n      this.blurShader2.updateGlobals(params);\n      this.blurShader3.updateGlobals(params);\n      this.basicWaveform.updateGlobals(params);\n      this.customWaveforms.forEach(function (wave) {\n        return wave.updateGlobals(params);\n      });\n      this.customShapes.forEach(function (shape) {\n        return shape.updateGlobals(params);\n      });\n      this.prevCustomWaveforms.forEach(function (wave) {\n        return wave.updateGlobals(params);\n      });\n      this.prevCustomShapes.forEach(function (shape) {\n        return shape.updateGlobals(params);\n      });\n      this.darkenCenter.updateGlobals(params);\n      this.innerBorder.updateGlobals(params);\n      this.outerBorder.updateGlobals(params);\n      this.motionVectors.updateGlobals(params);\n      this.titleText.updateGlobals(params);\n      this.blendPattern.updateGlobals(params);\n      this.warpUVs = new Float32Array((this.mesh_width + 1) * (this.mesh_height + 1) * 2);\n      this.warpColor = new Float32Array((this.mesh_width + 1) * (this.mesh_height + 1) * 4);\n    }\n  }, {\n    key: \"calcTimeAndFPS\",\n    value: function calcTimeAndFPS(elapsedTime) {\n      var elapsed;\n\n      if (elapsedTime) {\n        elapsed = elapsedTime;\n      } else {\n        var newTime = performance.now();\n        elapsed = (newTime - this.lastTime) / 1000.0;\n\n        if (elapsed > 1.0 || elapsed < 0.0 || this.frame < 2) {\n          elapsed = 1.0 / 30.0;\n        }\n\n        this.lastTime = newTime;\n      }\n\n      this.time += 1.0 / this.fps;\n\n      if (this.blending) {\n        this.blendProgress = (this.time - this.blendStartTime) / this.blendDuration;\n\n        if (this.blendProgress > 1.0) {\n          this.blending = false;\n        }\n      }\n\n      var newHistTime = this.timeHist[this.timeHist.length - 1] + elapsed;\n      this.timeHist.push(newHistTime);\n\n      if (this.timeHist.length > this.timeHistMax) {\n        this.timeHist.shift();\n      }\n\n      var newFPS = this.timeHist.length / (newHistTime - this.timeHist[0]);\n\n      if (Math.abs(newFPS - this.fps) > 3.0 && this.frame > this.timeHistMax) {\n        this.fps = newFPS;\n      } else {\n        var damping = 0.93;\n        this.fps = damping * this.fps + (1.0 - damping) * newFPS;\n      }\n    }\n  }, {\n    key: \"runPixelEquations\",\n    value: function runPixelEquations(preset, mdVSFrame, runVertEQs, blending) {\n      var gridX = this.mesh_width;\n      var gridZ = this.mesh_height;\n      var gridX1 = gridX + 1;\n      var gridZ1 = gridZ + 1;\n      var warpTimeV = this.time * mdVSFrame.warpanimspeed;\n      var warpScaleInv = 1.0 / mdVSFrame.warpscale;\n      var warpf0 = 11.68 + 4.0 * Math.cos(warpTimeV * 1.413 + 10);\n      var warpf1 = 8.77 + 3.0 * Math.cos(warpTimeV * 1.113 + 7);\n      var warpf2 = 10.54 + 3.0 * Math.cos(warpTimeV * 1.233 + 3);\n      var warpf3 = 11.49 + 4.0 * Math.cos(warpTimeV * 0.933 + 5);\n      var texelOffsetX = 0.0 / this.texsizeX;\n      var texelOffsetY = 0.0 / this.texsizeY;\n      var aspectx = this.aspectx;\n      var aspecty = this.aspecty;\n      var mdVSVertex = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].cloneVars(mdVSFrame);\n      var offset = 0;\n      var offsetColor = 0;\n\n      for (var iz = 0; iz < gridZ1; iz++) {\n        for (var ix = 0; ix < gridX1; ix++) {\n          var x = ix / gridX * 2.0 - 1.0;\n          var y = iz / gridZ * 2.0 - 1.0;\n          var rad = Math.sqrt(x * x * aspectx * aspectx + y * y * aspecty * aspecty);\n\n          if (runVertEQs) {\n            var ang = void 0;\n\n            if (iz === gridZ / 2 && ix === gridX / 2) {\n              ang = 0;\n            } else {\n              ang = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].atan2(y * aspecty, x * aspectx);\n            }\n\n            mdVSVertex.x = x * 0.5 * aspectx + 0.5;\n            mdVSVertex.y = y * -0.5 * aspecty + 0.5;\n            mdVSVertex.rad = rad;\n            mdVSVertex.ang = ang;\n            mdVSVertex.zoom = mdVSFrame.zoom;\n            mdVSVertex.zoomexp = mdVSFrame.zoomexp;\n            mdVSVertex.rot = mdVSFrame.rot;\n            mdVSVertex.warp = mdVSFrame.warp;\n            mdVSVertex.cx = mdVSFrame.cx;\n            mdVSVertex.cy = mdVSFrame.cy;\n            mdVSVertex.dx = mdVSFrame.dx;\n            mdVSVertex.dy = mdVSFrame.dy;\n            mdVSVertex.sx = mdVSFrame.sx;\n            mdVSVertex.sy = mdVSFrame.sy;\n            mdVSVertex = preset.pixel_eqs(mdVSVertex);\n          }\n\n          var warp = mdVSVertex.warp;\n          var zoom = mdVSVertex.zoom;\n          var zoomExp = mdVSVertex.zoomexp;\n          var cx = mdVSVertex.cx;\n          var cy = mdVSVertex.cy;\n          var sx = mdVSVertex.sx;\n          var sy = mdVSVertex.sy;\n          var dx = mdVSVertex.dx;\n          var dy = mdVSVertex.dy;\n          var rot = mdVSVertex.rot;\n          var zoom2V = Math.pow(zoom, Math.pow(zoomExp, rad * 2.0 - 1.0));\n          var zoom2Inv = 1.0 / zoom2V;\n          var u = x * 0.5 * aspectx * zoom2Inv + 0.5;\n          var v = -y * 0.5 * aspecty * zoom2Inv + 0.5;\n          u = (u - cx) / sx + cx;\n          v = (v - cy) / sy + cy;\n\n          if (warp !== 0) {\n            u += warp * 0.0035 * Math.sin(warpTimeV * 0.333 + warpScaleInv * (x * warpf0 - y * warpf3));\n            v += warp * 0.0035 * Math.cos(warpTimeV * 0.375 - warpScaleInv * (x * warpf2 + y * warpf1));\n            u += warp * 0.0035 * Math.cos(warpTimeV * 0.753 - warpScaleInv * (x * warpf1 - y * warpf2));\n            v += warp * 0.0035 * Math.sin(warpTimeV * 0.825 + warpScaleInv * (x * warpf0 + y * warpf3));\n          }\n\n          var u2 = u - cx;\n          var v2 = v - cy;\n          var cosRot = Math.cos(rot);\n          var sinRot = Math.sin(rot);\n          u = u2 * cosRot - v2 * sinRot + cx;\n          v = u2 * sinRot + v2 * cosRot + cy;\n          u -= dx;\n          v -= dy;\n          u = (u - 0.5) / aspectx + 0.5;\n          v = (v - 0.5) / aspecty + 0.5;\n          u += texelOffsetX;\n          v += texelOffsetY;\n\n          if (!blending) {\n            this.warpUVs[offset] = u;\n            this.warpUVs[offset + 1] = v;\n            this.warpColor[offsetColor + 0] = 1;\n            this.warpColor[offsetColor + 1] = 1;\n            this.warpColor[offsetColor + 2] = 1;\n            this.warpColor[offsetColor + 3] = 1;\n          } else {\n            var mix2 = this.blendPattern.vertInfoA[offset / 2] * this.blendProgress + this.blendPattern.vertInfoC[offset / 2];\n            mix2 = Math.clamp(mix2, 0, 1);\n            this.warpUVs[offset] = this.warpUVs[offset] * mix2 + u * (1 - mix2);\n            this.warpUVs[offset + 1] = this.warpUVs[offset + 1] * mix2 + v * (1 - mix2);\n            this.warpColor[offsetColor + 0] = 1;\n            this.warpColor[offsetColor + 1] = 1;\n            this.warpColor[offsetColor + 2] = 1;\n            this.warpColor[offsetColor + 3] = mix2;\n          }\n\n          offset += 2;\n          offsetColor += 4;\n        }\n      }\n\n      this.mdVSVertex = mdVSVertex;\n    }\n  }, {\n    key: \"bindFrambufferAndSetViewport\",\n    value: function bindFrambufferAndSetViewport(fb, width, height) {\n      this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, fb);\n      this.gl.viewport(0, 0, width, height);\n    }\n  }, {\n    key: \"bindFrameBufferTexture\",\n    value: function bindFrameBufferTexture(targetFrameBuffer, targetTexture) {\n      this.gl.bindTexture(this.gl.TEXTURE_2D, targetTexture);\n      this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);\n      this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.texsizeX, this.texsizeY, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, new Uint8Array(this.texsizeX * this.texsizeY * 4));\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n\n      if (this.anisoExt) {\n        var max = this.gl.getParameter(this.anisoExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n        this.gl.texParameterf(this.gl.TEXTURE_2D, this.anisoExt.TEXTURE_MAX_ANISOTROPY_EXT, max);\n      }\n\n      this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, targetFrameBuffer);\n      this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, targetTexture, 0);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this = this;\n\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          audioLevels = _ref.audioLevels,\n          elapsedTime = _ref.elapsedTime;\n\n      this.calcTimeAndFPS(elapsedTime);\n      this.frameNum += 1;\n\n      if (audioLevels) {\n        this.audio.updateAudio(audioLevels.timeByteArray, audioLevels.timeByteArrayL, audioLevels.timeByteArrayR);\n      } else {\n        this.audio.sampleAudio();\n      }\n\n      this.audioLevels.updateAudioLevels(this.fps, this.frameNum);\n      var globalVars = {\n        frame: this.frameNum,\n        time: this.time,\n        fps: this.fps,\n        bass: this.audioLevels.bass,\n        bass_att: this.audioLevels.bass_att,\n        mid: this.audioLevels.mid,\n        mid_att: this.audioLevels.mid_att,\n        treb: this.audioLevels.treb,\n        treb_att: this.audioLevels.treb_att,\n        meshx: this.mesh_width,\n        meshy: this.mesh_height,\n        aspectx: this.invAspectx,\n        aspecty: this.invAspecty,\n        pixelsx: this.texsizeX,\n        pixelsy: this.texsizeY\n      };\n      var prevGlobalVars = Object.assign({}, globalVars);\n      prevGlobalVars.gmegabuf = this.prevPresetEquationRunner.gmegabuf;\n      globalVars.gmegabuf = this.presetEquationRunner.gmegabuf;\n      Object.assign(globalVars, this.regVars);\n      this.presetEquationRunner.runFrameEquations(globalVars);\n      var mdVSFrame = this.presetEquationRunner.mdVSFrame;\n      this.runPixelEquations(this.presetEquationRunner.preset, mdVSFrame, this.presetEquationRunner.runVertEQs, false);\n      Object.assign(this.regVars, _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].pick(this.mdVSVertex, this.regs));\n      Object.assign(globalVars, this.regVars);\n      var mdVSFrameMixed;\n\n      if (this.blending) {\n        this.prevPresetEquationRunner.runFrameEquations(prevGlobalVars);\n        this.runPixelEquations(this.prevPresetEquationRunner.preset, this.prevPresetEquationRunner.mdVSFrame, this.prevPresetEquationRunner.runVertEQs, true);\n        mdVSFrameMixed = Renderer.mixFrameEquations(this.blendProgress, mdVSFrame, this.prevPresetEquationRunner.mdVSFrame);\n      } else {\n        mdVSFrameMixed = mdVSFrame;\n      }\n\n      var swapTexture = this.targetTexture;\n      this.targetTexture = this.prevTexture;\n      this.prevTexture = swapTexture;\n      var swapFrameBuffer = this.targetFrameBuffer;\n      this.targetFrameBuffer = this.prevFrameBuffer;\n      this.prevFrameBuffer = swapFrameBuffer;\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.prevTexture);\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.bindFrambufferAndSetViewport(this.targetFrameBuffer, this.texsizeX, this.texsizeY);\n      this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n      this.gl.enable(this.gl.BLEND);\n      this.gl.blendEquation(this.gl.FUNC_ADD);\n      this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\n      var _Renderer$getBlurValu = Renderer.getBlurValues(mdVSFrameMixed),\n          blurMins = _Renderer$getBlurValu.blurMins,\n          blurMaxs = _Renderer$getBlurValu.blurMaxs;\n\n      if (!this.blending) {\n        this.warpShader.renderQuadTexture(false, this.prevTexture, this.blurTexture1, this.blurTexture2, this.blurTexture3, blurMins, blurMaxs, mdVSFrame, this.warpUVs, this.warpColor);\n      } else {\n        this.prevWarpShader.renderQuadTexture(false, this.prevTexture, this.blurTexture1, this.blurTexture2, this.blurTexture3, blurMins, blurMaxs, this.prevPresetEquationRunner.mdVSFrame, this.warpUVs, this.warpColor);\n        this.warpShader.renderQuadTexture(true, this.prevTexture, this.blurTexture1, this.blurTexture2, this.blurTexture3, blurMins, blurMaxs, mdVSFrameMixed, this.warpUVs, this.warpColor);\n      }\n\n      if (this.numBlurPasses > 0) {\n        this.blurShader1.renderBlurTexture(this.targetTexture, mdVSFrame, blurMins, blurMaxs);\n\n        if (this.numBlurPasses > 1) {\n          this.blurShader2.renderBlurTexture(this.blurTexture1, mdVSFrame, blurMins, blurMaxs);\n\n          if (this.numBlurPasses > 2) {\n            this.blurShader3.renderBlurTexture(this.blurTexture2, mdVSFrame, blurMins, blurMaxs);\n          }\n        } // rebind target texture framebuffer\n\n\n        this.bindFrambufferAndSetViewport(this.targetFrameBuffer, this.texsizeX, this.texsizeY);\n      }\n\n      this.motionVectors.drawMotionVectors(mdVSFrameMixed, this.warpUVs);\n\n      if (this.preset.shapes && this.preset.shapes.length > 0) {\n        this.customShapes.forEach(function (shape, i) {\n          shape.drawCustomShape(_this.blending ? _this.blendProgress : 1, globalVars, _this.presetEquationRunner, _this.preset.shapes[i], _this.prevTexture);\n        });\n      }\n\n      if (this.preset.waves && this.preset.waves.length > 0) {\n        this.customWaveforms.forEach(function (waveform, i) {\n          waveform.drawCustomWaveform(_this.blending ? _this.blendProgress : 1, _this.audio.timeArrayL, _this.audio.timeArrayR, _this.audio.freqArrayL, _this.audio.freqArrayR, globalVars, _this.presetEquationRunner, _this.preset.waves[i]);\n        });\n      }\n\n      if (this.blending) {\n        if (this.prevPreset.shapes && this.prevPreset.shapes.length > 0) {\n          this.prevCustomShapes.forEach(function (shape, i) {\n            shape.drawCustomShape(1.0 - _this.blendProgress, prevGlobalVars, _this.prevPresetEquationRunner, _this.prevPreset.shapes[i], _this.prevTexture);\n          });\n        }\n\n        if (this.prevPreset.waves && this.prevPreset.waves.length > 0) {\n          this.prevCustomWaveforms.forEach(function (waveform, i) {\n            waveform.drawCustomWaveform(1.0 - _this.blendProgress, _this.audio.timeArrayL, _this.audio.timeArrayR, _this.audio.freqArrayL, _this.audio.freqArrayR, prevGlobalVars, _this.prevPresetEquationRunner, _this.prevPreset.waves[i]);\n          });\n        }\n      }\n\n      this.basicWaveform.drawBasicWaveform(this.blending, this.blendProgress, this.audio.timeArrayL, this.audio.timeArrayR, mdVSFrameMixed);\n      this.darkenCenter.drawDarkenCenter(mdVSFrameMixed);\n      var outerColor = [mdVSFrameMixed.ob_r, mdVSFrameMixed.ob_g, mdVSFrameMixed.ob_b, mdVSFrameMixed.ob_a];\n      this.outerBorder.drawBorder(outerColor, mdVSFrameMixed.ob_size, 0);\n      var innerColor = [mdVSFrameMixed.ib_r, mdVSFrameMixed.ib_g, mdVSFrameMixed.ib_b, mdVSFrameMixed.ib_a];\n      this.innerBorder.drawBorder(innerColor, mdVSFrameMixed.ib_size, mdVSFrameMixed.ob_size);\n\n      if (this.supertext.startTime >= 0) {\n        var progress = (this.time - this.supertext.startTime) / this.supertext.duration;\n\n        if (progress >= 1) {\n          this.titleText.renderTitle(progress, true, globalVars);\n        }\n      } // Store variables in case we need to rerender\n\n\n      this.globalVars = globalVars;\n      this.mdVSFrame = mdVSFrame;\n      this.mdVSFrameMixed = mdVSFrameMixed;\n      this.renderToScreen();\n    }\n  }, {\n    key: \"renderToScreen\",\n    value: function renderToScreen() {\n      if (this.outputFXAA) {\n        this.bindFrambufferAndSetViewport(this.compFrameBuffer, this.texsizeX, this.texsizeY);\n      } else {\n        this.bindFrambufferAndSetViewport(null, this.width, this.height);\n      }\n\n      this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n      this.gl.enable(this.gl.BLEND);\n      this.gl.blendEquation(this.gl.FUNC_ADD);\n      this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\n      var _Renderer$getBlurValu2 = Renderer.getBlurValues(this.mdVSFrameMixed),\n          blurMins = _Renderer$getBlurValu2.blurMins,\n          blurMaxs = _Renderer$getBlurValu2.blurMaxs;\n\n      if (!this.blending) {\n        this.compShader.renderQuadTexture(false, this.targetTexture, this.blurTexture1, this.blurTexture2, this.blurTexture3, blurMins, blurMaxs, this.mdVSFrame, this.warpColor);\n      } else {\n        this.prevCompShader.renderQuadTexture(false, this.targetTexture, this.blurTexture1, this.blurTexture2, this.blurTexture3, blurMins, blurMaxs, this.prevPresetEquationRunner.mdVSFrame, this.warpColor);\n        this.compShader.renderQuadTexture(true, this.targetTexture, this.blurTexture1, this.blurTexture2, this.blurTexture3, blurMins, blurMaxs, this.mdVSFrameMixed, this.warpColor);\n      }\n\n      if (this.supertext.startTime >= 0) {\n        var progress = (this.time - this.supertext.startTime) / this.supertext.duration;\n        this.titleText.renderTitle(progress, false, this.globalVars);\n\n        if (progress >= 1) {\n          this.supertext.startTime = -1;\n        }\n      }\n\n      if (this.outputFXAA) {\n        this.gl.bindTexture(this.gl.TEXTURE_2D, this.compTexture);\n        this.gl.generateMipmap(this.gl.TEXTURE_2D);\n        this.bindFrambufferAndSetViewport(null, this.width, this.height);\n        this.outputShader.renderQuadTexture(this.compTexture);\n      }\n    }\n  }, {\n    key: \"launchSongTitleAnim\",\n    value: function launchSongTitleAnim(text) {\n      this.supertext = {\n        startTime: this.time,\n        duration: 1.7\n      };\n      this.titleText.generateTitleTexture(text);\n    }\n  }, {\n    key: \"toDataURL\",\n    value: function toDataURL() {\n      var _this2 = this;\n\n      var data = new Uint8Array(this.texsizeX * this.texsizeY * 4);\n      var compFrameBuffer = this.gl.createFramebuffer();\n      var compTexture = this.gl.createTexture();\n      this.bindFrameBufferTexture(compFrameBuffer, compTexture);\n\n      var _Renderer$getBlurValu3 = Renderer.getBlurValues(this.mdVSFrameMixed),\n          blurMins = _Renderer$getBlurValu3.blurMins,\n          blurMaxs = _Renderer$getBlurValu3.blurMaxs;\n\n      this.compShader.renderQuadTexture(false, this.targetTexture, this.blurTexture1, this.blurTexture2, this.blurTexture3, blurMins, blurMaxs, this.mdVSFrame, this.warpColor);\n      this.gl.readPixels(0, 0, this.texsizeX, this.texsizeY, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data); // flip data\n\n      Array.from({\n        length: this.texsizeY\n      }, function (val, i) {\n        return data.slice(i * _this2.texsizeX * 4, (i + 1) * _this2.texsizeX * 4);\n      }).forEach(function (val, i) {\n        return data.set(val, (_this2.texsizeY - i - 1) * _this2.texsizeX * 4);\n      });\n      var canvas = document.createElement('canvas');\n      canvas.width = this.texsizeX;\n      canvas.height = this.texsizeY;\n      var context = canvas.getContext('2d');\n      var imageData = context.createImageData(this.texsizeX, this.texsizeY);\n      imageData.data.set(data);\n      context.putImageData(imageData, 0, 0);\n      this.gl.deleteTexture(compTexture);\n      this.gl.deleteFramebuffer(compFrameBuffer);\n      return canvas.toDataURL();\n    }\n  }, {\n    key: \"warpBufferToDataURL\",\n    value: function warpBufferToDataURL() {\n      var data = new Uint8Array(this.texsizeX * this.texsizeY * 4);\n      this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.targetFrameBuffer);\n      this.gl.readPixels(0, 0, this.texsizeX, this.texsizeY, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n      var canvas = document.createElement('canvas');\n      canvas.width = this.texsizeX;\n      canvas.height = this.texsizeY;\n      var context = canvas.getContext('2d');\n      var imageData = context.createImageData(this.texsizeX, this.texsizeY);\n      imageData.data.set(data);\n      context.putImageData(imageData, 0, 0);\n      return canvas.toDataURL();\n    }\n  }], [{\n    key: \"getHighestBlur\",\n    value: function getHighestBlur(t) {\n      if (/sampler_blur3/.test(t)) {\n        return 3;\n      } else if (/sampler_blur2/.test(t)) {\n        return 2;\n      } else if (/sampler_blur1/.test(t)) {\n        return 1;\n      }\n\n      return 0;\n    }\n  }, {\n    key: \"mixFrameEquations\",\n    value: function mixFrameEquations(blendProgress, mdVSFrame, mdVSFramePrev) {\n      var mix = 0.5 - 0.5 * Math.cos(blendProgress * Math.PI);\n      var mix2 = 1 - mix;\n      var snapPoint = 0.5;\n      var mixedFrame = _utils__WEBPACK_IMPORTED_MODULE_18__[\"default\"].cloneVars(mdVSFrame);\n      mixedFrame.decay = mix * mdVSFrame.decay + mix2 * mdVSFramePrev.decay;\n      mixedFrame.wave_a = mix * mdVSFrame.wave_a + mix2 * mdVSFramePrev.wave_a;\n      mixedFrame.wave_r = mix * mdVSFrame.wave_r + mix2 * mdVSFramePrev.wave_r;\n      mixedFrame.wave_g = mix * mdVSFrame.wave_g + mix2 * mdVSFramePrev.wave_g;\n      mixedFrame.wave_b = mix * mdVSFrame.wave_b + mix2 * mdVSFramePrev.wave_b;\n      mixedFrame.wave_x = mix * mdVSFrame.wave_x + mix2 * mdVSFramePrev.wave_x;\n      mixedFrame.wave_y = mix * mdVSFrame.wave_y + mix2 * mdVSFramePrev.wave_y;\n      mixedFrame.wave_mystery = mix * mdVSFrame.wave_mystery + mix2 * mdVSFramePrev.wave_mystery;\n      mixedFrame.ob_size = mix * mdVSFrame.ob_size + mix2 * mdVSFramePrev.ob_size;\n      mixedFrame.ob_r = mix * mdVSFrame.ob_r + mix2 * mdVSFramePrev.ob_r;\n      mixedFrame.ob_g = mix * mdVSFrame.ob_g + mix2 * mdVSFramePrev.ob_g;\n      mixedFrame.ob_b = mix * mdVSFrame.ob_b + mix2 * mdVSFramePrev.ob_b;\n      mixedFrame.ob_a = mix * mdVSFrame.ob_a + mix2 * mdVSFramePrev.ob_a;\n      mixedFrame.ib_size = mix * mdVSFrame.ib_size + mix2 * mdVSFramePrev.ib_size;\n      mixedFrame.ib_r = mix * mdVSFrame.ib_r + mix2 * mdVSFramePrev.ib_r;\n      mixedFrame.ib_g = mix * mdVSFrame.ib_g + mix2 * mdVSFramePrev.ib_g;\n      mixedFrame.ib_b = mix * mdVSFrame.ib_b + mix2 * mdVSFramePrev.ib_b;\n      mixedFrame.ib_a = mix * mdVSFrame.ib_a + mix2 * mdVSFramePrev.ib_a;\n      mixedFrame.mv_x = mix * mdVSFrame.mv_x + mix2 * mdVSFramePrev.mv_x;\n      mixedFrame.mv_y = mix * mdVSFrame.mv_y + mix2 * mdVSFramePrev.mv_y;\n      mixedFrame.mv_dx = mix * mdVSFrame.mv_dx + mix2 * mdVSFramePrev.mv_dx;\n      mixedFrame.mv_dy = mix * mdVSFrame.mv_dy + mix2 * mdVSFramePrev.mv_dy;\n      mixedFrame.mv_l = mix * mdVSFrame.mv_l + mix2 * mdVSFramePrev.mv_l;\n      mixedFrame.mv_r = mix * mdVSFrame.mv_r + mix2 * mdVSFramePrev.mv_r;\n      mixedFrame.mv_g = mix * mdVSFrame.mv_g + mix2 * mdVSFramePrev.mv_g;\n      mixedFrame.mv_b = mix * mdVSFrame.mv_b + mix2 * mdVSFramePrev.mv_b;\n      mixedFrame.mv_a = mix * mdVSFrame.mv_a + mix2 * mdVSFramePrev.mv_a;\n      mixedFrame.echo_zoom = mix * mdVSFrame.echo_zoom + mix2 * mdVSFramePrev.echo_zoom;\n      mixedFrame.echo_alpha = mix * mdVSFrame.echo_alpha + mix2 * mdVSFramePrev.echo_alpha;\n      mixedFrame.echo_orient = mix * mdVSFrame.echo_orient + mix2 * mdVSFramePrev.echo_orient;\n      mixedFrame.wave_dots = mix < snapPoint ? mdVSFramePrev.wave_dots : mdVSFrame.wave_dots;\n      mixedFrame.wave_thick = mix < snapPoint ? mdVSFramePrev.wave_thick : mdVSFrame.wave_thick;\n      mixedFrame.additivewave = mix < snapPoint ? mdVSFramePrev.additivewave : mdVSFrame.additivewave;\n      mixedFrame.wave_brighten = mix < snapPoint ? mdVSFramePrev.wave_brighten : mdVSFrame.wave_brighten;\n      mixedFrame.darken_center = mix < snapPoint ? mdVSFramePrev.darken_center : mdVSFrame.darken_center;\n      mixedFrame.gammaadj = mix < snapPoint ? mdVSFramePrev.gammaadj : mdVSFrame.gammaadj;\n      mixedFrame.wrap = mix < snapPoint ? mdVSFramePrev.wrap : mdVSFrame.wrap;\n      mixedFrame.invert = mix < snapPoint ? mdVSFramePrev.invert : mdVSFrame.invert;\n      mixedFrame.brighten = mix < snapPoint ? mdVSFramePrev.brighten : mdVSFrame.brighten;\n      mixedFrame.darken = mix < snapPoint ? mdVSFramePrev.darken : mdVSFrame.darken;\n      mixedFrame.solarize = mix < snapPoint ? mdVSFramePrev.brighten : mdVSFrame.solarize;\n      mixedFrame.b1n = mix * mdVSFrame.b1n + mix2 * mdVSFramePrev.b1n;\n      mixedFrame.b2n = mix * mdVSFrame.b2n + mix2 * mdVSFramePrev.b2n;\n      mixedFrame.b3n = mix * mdVSFrame.b3n + mix2 * mdVSFramePrev.b3n;\n      mixedFrame.b1x = mix * mdVSFrame.b1x + mix2 * mdVSFramePrev.b1x;\n      mixedFrame.b2x = mix * mdVSFrame.b2x + mix2 * mdVSFramePrev.b2x;\n      mixedFrame.b3x = mix * mdVSFrame.b3x + mix2 * mdVSFramePrev.b3x;\n      mixedFrame.b1ed = mix * mdVSFrame.b1ed + mix2 * mdVSFramePrev.b1ed;\n      return mixedFrame;\n    }\n  }, {\n    key: \"getBlurValues\",\n    value: function getBlurValues(mdVSFrame) {\n      var blurMin1 = mdVSFrame.b1n;\n      var blurMin2 = mdVSFrame.b2n;\n      var blurMin3 = mdVSFrame.b3n;\n      var blurMax1 = mdVSFrame.b1x;\n      var blurMax2 = mdVSFrame.b2x;\n      var blurMax3 = mdVSFrame.b3x;\n      var fMinDist = 0.1;\n\n      if (blurMax1 - blurMin1 < fMinDist) {\n        var avg = (blurMin1 + blurMax1) * 0.5;\n        blurMin1 = avg - fMinDist * 0.5;\n        blurMax1 = avg - fMinDist * 0.5;\n      }\n\n      blurMax2 = Math.min(blurMax1, blurMax2);\n      blurMin2 = Math.max(blurMin1, blurMin2);\n\n      if (blurMax2 - blurMin2 < fMinDist) {\n        var _avg = (blurMin2 + blurMax2) * 0.5;\n\n        blurMin2 = _avg - fMinDist * 0.5;\n        blurMax2 = _avg - fMinDist * 0.5;\n      }\n\n      blurMax3 = Math.min(blurMax2, blurMax3);\n      blurMin3 = Math.max(blurMin2, blurMin3);\n\n      if (blurMax3 - blurMin3 < fMinDist) {\n        var _avg2 = (blurMin3 + blurMax3) * 0.5;\n\n        blurMin3 = _avg2 - fMinDist * 0.5;\n        blurMax3 = _avg2 - fMinDist * 0.5;\n      }\n\n      return {\n        blurMins: [blurMin1, blurMin2, blurMin3],\n        blurMaxs: [blurMax1, blurMax2, blurMax3]\n      };\n    }\n  }]);\n\n  return Renderer;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/blur/blur.js\":\n/*!********************************************!*\\\n  !*** ./src/rendering/shaders/blur/blur.js ***!\n  \\********************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_132485__) {\n\n\"use strict\";\n__nested_webpack_require_132485__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_132485__.d(__nested_webpack_exports__, \"default\", function() { return BlurShader; });\n/* harmony import */ var _blurVertical__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_132485__(/*! ./blurVertical */ \"./src/rendering/shaders/blur/blurVertical.js\");\n/* harmony import */ var _blurHorizontal__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_132485__(/*! ./blurHorizontal */ \"./src/rendering/shaders/blur/blurHorizontal.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar BlurShader =\n/*#__PURE__*/\nfunction () {\n  function BlurShader(blurLevel, blurRatios, gl) {\n    var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n    _classCallCheck(this, BlurShader);\n\n    this.blurLevel = blurLevel;\n    this.blurRatios = blurRatios;\n    this.gl = gl;\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.anisoExt = this.gl.getExtension('EXT_texture_filter_anisotropic') || this.gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || this.gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n    this.blurHorizontalFrameBuffer = this.gl.createFramebuffer();\n    this.blurVerticalFrameBuffer = this.gl.createFramebuffer();\n    this.blurHorizontalTexture = this.gl.createTexture();\n    this.blurVerticalTexture = this.gl.createTexture();\n    this.setupFrameBufferTextures();\n    this.blurHorizontal = new _blurHorizontal__WEBPACK_IMPORTED_MODULE_1__[\"default\"](gl, this.blurLevel, opts);\n    this.blurVertical = new _blurVertical__WEBPACK_IMPORTED_MODULE_0__[\"default\"](gl, this.blurLevel, opts);\n  }\n\n  _createClass(BlurShader, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.setupFrameBufferTextures();\n    }\n  }, {\n    key: \"getTextureSize\",\n    value: function getTextureSize(sizeRatio) {\n      var sizeX = Math.max(this.texsizeX * sizeRatio, 16);\n      sizeX = Math.floor((sizeX + 3) / 16) * 16;\n      var sizeY = Math.max(this.texsizeY * sizeRatio, 16);\n      sizeY = Math.floor((sizeY + 3) / 4) * 4;\n      return [sizeX, sizeY];\n    }\n  }, {\n    key: \"setupFrameBufferTextures\",\n    value: function setupFrameBufferTextures() {\n      var srcBlurRatios = this.blurLevel > 0 ? this.blurRatios[this.blurLevel - 1] : [1, 1];\n      var dstBlurRatios = this.blurRatios[this.blurLevel];\n      var srcTexsizeHorizontal = this.getTextureSize(srcBlurRatios[1]);\n      var dstTexsizeHorizontal = this.getTextureSize(dstBlurRatios[0]);\n      this.bindFrameBufferTexture(this.blurHorizontalFrameBuffer, this.blurHorizontalTexture, dstTexsizeHorizontal);\n      var srcTexsizeVertical = dstTexsizeHorizontal;\n      var dstTexsizeVertical = this.getTextureSize(dstBlurRatios[1]);\n      this.bindFrameBufferTexture(this.blurVerticalFrameBuffer, this.blurVerticalTexture, dstTexsizeVertical);\n      this.horizontalTexsizes = [srcTexsizeHorizontal, dstTexsizeHorizontal];\n      this.verticalTexsizes = [srcTexsizeVertical, dstTexsizeVertical];\n    }\n  }, {\n    key: \"bindFrambufferAndSetViewport\",\n    value: function bindFrambufferAndSetViewport(fb, texsize) {\n      this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, fb);\n      this.gl.viewport(0, 0, texsize[0], texsize[1]);\n    }\n  }, {\n    key: \"bindFrameBufferTexture\",\n    value: function bindFrameBufferTexture(targetFrameBuffer, targetTexture, texsize) {\n      this.gl.bindTexture(this.gl.TEXTURE_2D, targetTexture);\n      this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, 1);\n      this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, texsize[0], texsize[1], 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, new Uint8Array(texsize[0] * texsize[1] * 4));\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n\n      if (this.anisoExt) {\n        var max = this.gl.getParameter(this.anisoExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n        this.gl.texParameterf(this.gl.TEXTURE_2D, this.anisoExt.TEXTURE_MAX_ANISOTROPY_EXT, max);\n      }\n\n      this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, targetFrameBuffer);\n      this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, targetTexture, 0);\n    }\n  }, {\n    key: \"renderBlurTexture\",\n    value: function renderBlurTexture(prevTexture, mdVSFrame, blurMins, blurMaxs) {\n      this.bindFrambufferAndSetViewport(this.blurHorizontalFrameBuffer, this.horizontalTexsizes[1]);\n      this.blurHorizontal.renderQuadTexture(prevTexture, mdVSFrame, blurMins, blurMaxs, this.horizontalTexsizes[0]);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.blurHorizontalTexture);\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.bindFrambufferAndSetViewport(this.blurVerticalFrameBuffer, this.verticalTexsizes[1]);\n      this.blurVertical.renderQuadTexture(this.blurHorizontalTexture, mdVSFrame, this.verticalTexsizes[0]);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.blurVerticalTexture);\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n    }\n  }]);\n\n  return BlurShader;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/blur/blurHorizontal.js\":\n/*!******************************************************!*\\\n  !*** ./src/rendering/shaders/blur/blurHorizontal.js ***!\n  \\******************************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_138912__) {\n\n\"use strict\";\n__nested_webpack_require_138912__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_138912__.d(__nested_webpack_exports__, \"default\", function() { return BlurHorizontal; });\n/* harmony import */ var _shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_138912__(/*! ../shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar BlurHorizontal =\n/*#__PURE__*/\nfunction () {\n  function BlurHorizontal(gl, blurLevel) {\n    _classCallCheck(this, BlurHorizontal);\n\n    this.gl = gl;\n    this.blurLevel = blurLevel;\n    var w = [4.0, 3.8, 3.5, 2.9, 1.9, 1.2, 0.7, 0.3];\n    var w1H = w[0] + w[1];\n    var w2H = w[2] + w[3];\n    var w3H = w[4] + w[5];\n    var w4H = w[6] + w[7];\n    var d1H = 0 + 2 * w[1] / w1H;\n    var d2H = 2 + 2 * w[3] / w2H;\n    var d3H = 4 + 2 * w[5] / w3H;\n    var d4H = 6 + 2 * w[7] / w4H;\n    this.ws = new Float32Array([w1H, w2H, w3H, w4H]);\n    this.ds = new Float32Array([d1H, d2H, d3H, d4H]);\n    this.wDiv = 0.5 / (w1H + w2H + w3H + w4H);\n    this.positions = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);\n    this.vertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n  }\n\n  _createClass(BlurHorizontal, [{\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      const vec2 halfmad = vec2(0.5);\\n                                      in vec2 aPos;\\n                                      out vec2 uv;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aPos, 0.0, 1.0);\\n                                        uv = aPos * halfmad + halfmad;\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n       precision \".concat(this.floatPrecision, \" float;\\n       precision highp int;\\n       precision mediump sampler2D;\\n\\n       in vec2 uv;\\n       out vec4 fragColor;\\n       uniform sampler2D uTexture;\\n       uniform vec4 texsize;\\n       uniform float scale;\\n       uniform float bias;\\n       uniform vec4 ws;\\n       uniform vec4 ds;\\n       uniform float wdiv;\\n\\n       void main(void) {\\n         float w1 = ws[0];\\n         float w2 = ws[1];\\n         float w3 = ws[2];\\n         float w4 = ws[3];\\n         float d1 = ds[0];\\n         float d2 = ds[1];\\n         float d3 = ds[2];\\n         float d4 = ds[3];\\n\\n         vec2 uv2 = uv.xy;\\n\\n         vec3 blur =\\n           ( texture(uTexture, uv2 + vec2( d1 * texsize.z,0.0) ).xyz\\n           + texture(uTexture, uv2 + vec2(-d1 * texsize.z,0.0) ).xyz) * w1 +\\n           ( texture(uTexture, uv2 + vec2( d2 * texsize.z,0.0) ).xyz\\n           + texture(uTexture, uv2 + vec2(-d2 * texsize.z,0.0) ).xyz) * w2 +\\n           ( texture(uTexture, uv2 + vec2( d3 * texsize.z,0.0) ).xyz\\n           + texture(uTexture, uv2 + vec2(-d3 * texsize.z,0.0) ).xyz) * w3 +\\n           ( texture(uTexture, uv2 + vec2( d4 * texsize.z,0.0) ).xyz\\n           + texture(uTexture, uv2 + vec2(-d4 * texsize.z,0.0) ).xyz) * w4;\\n\\n         blur.xyz *= wdiv;\\n         blur.xyz = blur.xyz * scale + bias;\\n\\n         fragColor = vec4(blur, 1.0);\\n       }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTexture');\n      this.texsizeLocation = this.gl.getUniformLocation(this.shaderProgram, 'texsize');\n      this.scaleLoc = this.gl.getUniformLocation(this.shaderProgram, 'scale');\n      this.biasLoc = this.gl.getUniformLocation(this.shaderProgram, 'bias');\n      this.wsLoc = this.gl.getUniformLocation(this.shaderProgram, 'ws');\n      this.dsLocation = this.gl.getUniformLocation(this.shaderProgram, 'ds');\n      this.wdivLoc = this.gl.getUniformLocation(this.shaderProgram, 'wdiv');\n    }\n  }, {\n    key: \"getScaleAndBias\",\n    value: function getScaleAndBias(blurMins, blurMaxs) {\n      var scale = [1, 1, 1];\n      var bias = [0, 0, 0];\n      var tempMin;\n      var tempMax;\n      scale[0] = 1.0 / (blurMaxs[0] - blurMins[0]);\n      bias[0] = -blurMins[0] * scale[0];\n      tempMin = (blurMins[1] - blurMins[0]) / (blurMaxs[0] - blurMins[0]);\n      tempMax = (blurMaxs[1] - blurMins[0]) / (blurMaxs[0] - blurMins[0]);\n      scale[1] = 1.0 / (tempMax - tempMin);\n      bias[1] = -tempMin * scale[1];\n      tempMin = (blurMins[2] - blurMins[1]) / (blurMaxs[1] - blurMins[1]);\n      tempMax = (blurMaxs[2] - blurMins[1]) / (blurMaxs[1] - blurMins[1]);\n      scale[2] = 1.0 / (tempMax - tempMin);\n      bias[2] = -tempMin * scale[2];\n      return {\n        scale: scale[this.blurLevel],\n        bias: bias[this.blurLevel]\n      };\n    }\n  }, {\n    key: \"renderQuadTexture\",\n    value: function renderQuadTexture(texture, mdVSFrame, blurMins, blurMaxs, srcTexsize) {\n      this.gl.useProgram(this.shaderProgram);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.positionLocation, 2, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.positionLocation);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.uniform1i(this.textureLoc, 0);\n\n      var _this$getScaleAndBias = this.getScaleAndBias(blurMins, blurMaxs),\n          scale = _this$getScaleAndBias.scale,\n          bias = _this$getScaleAndBias.bias;\n\n      this.gl.uniform4fv(this.texsizeLocation, [srcTexsize[0], srcTexsize[1], 1.0 / srcTexsize[0], 1.0 / srcTexsize[1]]);\n      this.gl.uniform1f(this.scaleLoc, scale);\n      this.gl.uniform1f(this.biasLoc, bias);\n      this.gl.uniform4fv(this.wsLoc, this.ws);\n      this.gl.uniform4fv(this.dsLocation, this.ds);\n      this.gl.uniform1f(this.wdivLoc, this.wDiv);\n      this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n    }\n  }]);\n\n  return BlurHorizontal;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/blur/blurVertical.js\":\n/*!****************************************************!*\\\n  !*** ./src/rendering/shaders/blur/blurVertical.js ***!\n  \\****************************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_146480__) {\n\n\"use strict\";\n__nested_webpack_require_146480__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_146480__.d(__nested_webpack_exports__, \"default\", function() { return BlurVertical; });\n/* harmony import */ var _shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_146480__(/*! ../shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar BlurVertical =\n/*#__PURE__*/\nfunction () {\n  function BlurVertical(gl, blurLevel) {\n    _classCallCheck(this, BlurVertical);\n\n    this.gl = gl;\n    this.blurLevel = blurLevel;\n    var w = [4.0, 3.8, 3.5, 2.9, 1.9, 1.2, 0.7, 0.3];\n    var w1V = w[0] + w[1] + w[2] + w[3];\n    var w2V = w[4] + w[5] + w[6] + w[7];\n    var d1V = 0 + 2 * ((w[2] + w[3]) / w1V);\n    var d2V = 2 + 2 * ((w[6] + w[7]) / w2V);\n    this.wds = new Float32Array([w1V, w2V, d1V, d2V]);\n    this.wDiv = 1.0 / ((w1V + w2V) * 2);\n    this.positions = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);\n    this.vertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n  }\n\n  _createClass(BlurVertical, [{\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      const vec2 halfmad = vec2(0.5);\\n                                      in vec2 aPos;\\n                                      out vec2 uv;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aPos, 0.0, 1.0);\\n                                        uv = aPos * halfmad + halfmad;\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n       precision \".concat(this.floatPrecision, \" float;\\n       precision highp int;\\n       precision mediump sampler2D;\\n\\n       in vec2 uv;\\n       out vec4 fragColor;\\n       uniform sampler2D uTexture;\\n       uniform vec4 texsize;\\n       uniform float ed1;\\n       uniform float ed2;\\n       uniform float ed3;\\n       uniform vec4 wds;\\n       uniform float wdiv;\\n\\n       void main(void) {\\n         float w1 = wds[0];\\n         float w2 = wds[1];\\n         float d1 = wds[2];\\n         float d2 = wds[3];\\n\\n         vec2 uv2 = uv.xy;\\n\\n         vec3 blur =\\n           ( texture(uTexture, uv2 + vec2(0.0, d1 * texsize.w) ).xyz\\n           + texture(uTexture, uv2 + vec2(0.0,-d1 * texsize.w) ).xyz) * w1 +\\n           ( texture(uTexture, uv2 + vec2(0.0, d2 * texsize.w) ).xyz\\n           + texture(uTexture, uv2 + vec2(0.0,-d2 * texsize.w) ).xyz) * w2;\\n\\n         blur.xyz *= wdiv;\\n\\n         float t = min(min(uv.x, uv.y), 1.0 - max(uv.x, uv.y));\\n         t = sqrt(t);\\n         t = ed1 + ed2 * clamp(t * ed3, 0.0, 1.0);\\n         blur.xyz *= t;\\n\\n         fragColor = vec4(blur, 1.0);\\n       }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTexture');\n      this.texsizeLocation = this.gl.getUniformLocation(this.shaderProgram, 'texsize');\n      this.ed1Loc = this.gl.getUniformLocation(this.shaderProgram, 'ed1');\n      this.ed2Loc = this.gl.getUniformLocation(this.shaderProgram, 'ed2');\n      this.ed3Loc = this.gl.getUniformLocation(this.shaderProgram, 'ed3');\n      this.wdsLocation = this.gl.getUniformLocation(this.shaderProgram, 'wds');\n      this.wdivLoc = this.gl.getUniformLocation(this.shaderProgram, 'wdiv');\n    }\n  }, {\n    key: \"renderQuadTexture\",\n    value: function renderQuadTexture(texture, mdVSFrame, srcTexsize) {\n      this.gl.useProgram(this.shaderProgram);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.positionLocation, 2, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.positionLocation);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.uniform1i(this.textureLoc, 0);\n      var b1ed = this.blurLevel === 0 ? mdVSFrame.b1ed : 0.0;\n      this.gl.uniform4fv(this.texsizeLocation, [srcTexsize[0], srcTexsize[1], 1.0 / srcTexsize[0], 1.0 / srcTexsize[1]]);\n      this.gl.uniform1f(this.ed1Loc, 1.0 - b1ed);\n      this.gl.uniform1f(this.ed2Loc, b1ed);\n      this.gl.uniform1f(this.ed3Loc, 5.0);\n      this.gl.uniform4fv(this.wdsLocation, this.wds);\n      this.gl.uniform1f(this.wdivLoc, this.wDiv);\n      this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n    }\n  }]);\n\n  return BlurVertical;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/comp.js\":\n/*!***************************************!*\\\n  !*** ./src/rendering/shaders/comp.js ***!\n  \\***************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_152594__) {\n\n\"use strict\";\n__nested_webpack_require_152594__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_152594__.d(__nested_webpack_exports__, \"default\", function() { return CompShader; });\n/* harmony import */ var _shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_152594__(/*! ./shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar CompShader =\n/*#__PURE__*/\nfunction () {\n  function CompShader(gl, noise, image) {\n    var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n    _classCallCheck(this, CompShader);\n\n    this.gl = gl;\n    this.noise = noise;\n    this.image = image;\n    this.mesh_width = opts.mesh_width;\n    this.mesh_height = opts.mesh_height;\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.compWidth = 32;\n    this.compHeight = 24;\n    this.buildPositions();\n    this.indexBuf = gl.createBuffer();\n    this.positionVertexBuf = this.gl.createBuffer();\n    this.compColorVertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n    this.mainSampler = this.gl.createSampler();\n    this.mainSamplerFW = this.gl.createSampler();\n    this.mainSamplerFC = this.gl.createSampler();\n    this.mainSamplerPW = this.gl.createSampler();\n    this.mainSamplerPC = this.gl.createSampler();\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_WRAP_T, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_WRAP_T, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_WRAP_T, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n  } // based on https://github.com/mrdoob/three.js/blob/master/src/geometries/PlaneGeometry.js\n\n\n  _createClass(CompShader, [{\n    key: \"buildPositions\",\n    value: function buildPositions() {\n      var width = 2;\n      var height = 2;\n      var widthHalf = width / 2;\n      var heightHalf = height / 2;\n      var gridX = this.compWidth;\n      var gridY = this.compHeight;\n      var gridX1 = gridX + 1;\n      var gridY1 = gridY + 1;\n      var segmentWidth = width / gridX;\n      var segmentHeight = height / gridY;\n      var vertices = [];\n\n      for (var iy = 0; iy < gridY1; iy++) {\n        var y = iy * segmentHeight - heightHalf;\n\n        for (var ix = 0; ix < gridX1; ix++) {\n          var x = ix * segmentWidth - widthHalf;\n          vertices.push(x, -y, 0);\n        }\n      }\n\n      var indices = [];\n\n      for (var _iy = 0; _iy < gridY; _iy++) {\n        for (var _ix = 0; _ix < gridX; _ix++) {\n          var a = _ix + gridX1 * _iy;\n          var b = _ix + gridX1 * (_iy + 1);\n          var c = _ix + 1 + gridX1 * (_iy + 1);\n          var d = _ix + 1 + gridX1 * _iy;\n          indices.push(a, b, d);\n          indices.push(b, c, d);\n        }\n      }\n\n      this.vertices = new Float32Array(vertices);\n      this.indices = new Uint16Array(indices);\n    }\n  }, {\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.mesh_width = opts.mesh_width;\n      this.mesh_height = opts.mesh_height;\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n      this.buildPositions();\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      var shaderText = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      var fragShaderText;\n      var fragShaderHeaderText;\n\n      if (shaderText.length === 0) {\n        fragShaderText = \"float orient_horiz = mod(echo_orientation, 2.0);\\n                        float orient_x = (orient_horiz != 0.0) ? -1.0 : 1.0;\\n                        float orient_y = (echo_orientation >= 2.0) ? -1.0 : 1.0;\\n                        vec2 uv_echo = ((uv - 0.5) *\\n                                        (1.0 / echo_zoom) *\\n                                        vec2(orient_x, orient_y)) + 0.5;\\n\\n                        ret = mix(texture(sampler_main, uv).rgb,\\n                                  texture(sampler_main, uv_echo).rgb,\\n                                  echo_alpha);\\n\\n                        ret *= gammaAdj;\\n\\n                        if(fShader >= 1.0) {\\n                          ret *= hue_shader;\\n                        } else if(fShader > 0.001) {\\n                          ret *= (1.0 - fShader) + (fShader * hue_shader);\\n                        }\\n\\n                        if(brighten != 0) ret = sqrt(ret);\\n                        if(darken != 0) ret = ret*ret;\\n                        if(solarize != 0) ret = ret * (1.0 - ret) * 4.0;\\n                        if(invert != 0) ret = 1.0 - ret;\";\n        fragShaderHeaderText = '';\n      } else {\n        var shaderParts = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getShaderParts(shaderText);\n        fragShaderHeaderText = shaderParts[0];\n        fragShaderText = shaderParts[1];\n      }\n\n      fragShaderText = fragShaderText.replace(/texture2D/g, 'texture');\n      fragShaderText = fragShaderText.replace(/texture3D/g, 'texture');\n      this.userTextures = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getUserSamplers(fragShaderHeaderText);\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      const vec2 halfmad = vec2(0.5);\\n                                      in vec2 aPos;\\n                                      in vec4 aCompColor;\\n                                      out vec2 vUv;\\n                                      out vec4 vColor;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aPos, 0.0, 1.0);\\n                                        vUv = aPos * halfmad + halfmad;\\n                                        vColor = aCompColor;\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      precision mediump sampler3D;\\n\\n                                      vec3 lum(vec3 v){\\n                                          return vec3(dot(v, vec3(0.32,0.49,0.29)));\\n                                      }\\n\\n                                      in vec2 vUv;\\n                                      in vec4 vColor;\\n                                      out vec4 fragColor;\\n                                      uniform sampler2D sampler_main;\\n                                      uniform sampler2D sampler_fw_main;\\n                                      uniform sampler2D sampler_fc_main;\\n                                      uniform sampler2D sampler_pw_main;\\n                                      uniform sampler2D sampler_pc_main;\\n                                      uniform sampler2D sampler_blur1;\\n                                      uniform sampler2D sampler_blur2;\\n                                      uniform sampler2D sampler_blur3;\\n                                      uniform sampler2D sampler_noise_lq;\\n                                      uniform sampler2D sampler_noise_lq_lite;\\n                                      uniform sampler2D sampler_noise_mq;\\n                                      uniform sampler2D sampler_noise_hq;\\n                                      uniform sampler2D sampler_pw_noise_lq;\\n                                      uniform sampler3D sampler_noisevol_lq;\\n                                      uniform sampler3D sampler_noisevol_hq;\\n\\n                                      uniform float time;\\n                                      uniform float gammaAdj;\\n                                      uniform float echo_zoom;\\n                                      uniform float echo_alpha;\\n                                      uniform float echo_orientation;\\n                                      uniform int invert;\\n                                      uniform int brighten;\\n                                      uniform int darken;\\n                                      uniform int solarize;\\n                                      uniform vec2 resolution;\\n                                      uniform vec4 aspect;\\n                                      uniform vec4 texsize;\\n                                      uniform vec4 texsize_noise_lq;\\n                                      uniform vec4 texsize_noise_mq;\\n                                      uniform vec4 texsize_noise_hq;\\n                                      uniform vec4 texsize_noise_lq_lite;\\n                                      uniform vec4 texsize_noisevol_lq;\\n                                      uniform vec4 texsize_noisevol_hq;\\n\\n                                      uniform float bass;\\n                                      uniform float mid;\\n                                      uniform float treb;\\n                                      uniform float vol;\\n                                      uniform float bass_att;\\n                                      uniform float mid_att;\\n                                      uniform float treb_att;\\n                                      uniform float vol_att;\\n\\n                                      uniform float frame;\\n                                      uniform float fps;\\n\\n                                      uniform vec4 _qa;\\n                                      uniform vec4 _qb;\\n                                      uniform vec4 _qc;\\n                                      uniform vec4 _qd;\\n                                      uniform vec4 _qe;\\n                                      uniform vec4 _qf;\\n                                      uniform vec4 _qg;\\n                                      uniform vec4 _qh;\\n\\n                                      #define q1 _qa.x\\n                                      #define q2 _qa.y\\n                                      #define q3 _qa.z\\n                                      #define q4 _qa.w\\n                                      #define q5 _qb.x\\n                                      #define q6 _qb.y\\n                                      #define q7 _qb.z\\n                                      #define q8 _qb.w\\n                                      #define q9 _qc.x\\n                                      #define q10 _qc.y\\n                                      #define q11 _qc.z\\n                                      #define q12 _qc.w\\n                                      #define q13 _qd.x\\n                                      #define q14 _qd.y\\n                                      #define q15 _qd.z\\n                                      #define q16 _qd.w\\n                                      #define q17 _qe.x\\n                                      #define q18 _qe.y\\n                                      #define q19 _qe.z\\n                                      #define q20 _qe.w\\n                                      #define q21 _qf.x\\n                                      #define q22 _qf.y\\n                                      #define q23 _qf.z\\n                                      #define q24 _qf.w\\n                                      #define q25 _qg.x\\n                                      #define q26 _qg.y\\n                                      #define q27 _qg.z\\n                                      #define q28 _qg.w\\n                                      #define q29 _qh.x\\n                                      #define q30 _qh.y\\n                                      #define q31 _qh.z\\n                                      #define q32 _qh.w\\n\\n                                      uniform vec4 slow_roam_cos;\\n                                      uniform vec4 roam_cos;\\n                                      uniform vec4 slow_roam_sin;\\n                                      uniform vec4 roam_sin;\\n\\n                                      uniform float blur1_min;\\n                                      uniform float blur1_max;\\n                                      uniform float blur2_min;\\n                                      uniform float blur2_max;\\n                                      uniform float blur3_min;\\n                                      uniform float blur3_max;\\n\\n                                      uniform float scale1;\\n                                      uniform float scale2;\\n                                      uniform float scale3;\\n                                      uniform float bias1;\\n                                      uniform float bias2;\\n                                      uniform float bias3;\\n\\n                                      uniform vec4 rand_frame;\\n                                      uniform vec4 rand_preset;\\n\\n                                      uniform float fShader;\\n\\n                                      float PI = \").concat(Math.PI, \";\\n\\n                                      \").concat(fragShaderHeaderText, \"\\n\\n                                      void main(void) {\\n                                        vec3 ret;\\n                                        vec2 uv = vUv;\\n                                        vec2 uv_orig = vUv;\\n                                        uv.y = 1.0 - uv.y;\\n                                        uv_orig.y = 1.0 - uv_orig.y;\\n                                        float rad = length(uv - 0.5);\\n                                        float ang = atan(uv.x - 0.5, uv.y - 0.5);\\n                                        vec3 hue_shader = vColor.rgb;\\n\\n                                        \").concat(fragShaderText, \"\\n\\n                                        fragColor = vec4(ret, vColor.a);\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.compColorLocation = this.gl.getAttribLocation(this.shaderProgram, 'aCompColor');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_main');\n      this.textureFWLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_fw_main');\n      this.textureFCLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_fc_main');\n      this.texturePWLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_pw_main');\n      this.texturePCLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_pc_main');\n      this.blurTexture1Loc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_blur1');\n      this.blurTexture2Loc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_blur2');\n      this.blurTexture3Loc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_blur3');\n      this.noiseLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_lq');\n      this.noiseMQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_mq');\n      this.noiseHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_hq');\n      this.noiseLQLiteLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_lq_lite');\n      this.noisePointLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_pw_noise_lq');\n      this.noiseVolLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noisevol_lq');\n      this.noiseVolHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noisevol_hq');\n      this.timeLoc = this.gl.getUniformLocation(this.shaderProgram, 'time');\n      this.gammaAdjLoc = this.gl.getUniformLocation(this.shaderProgram, 'gammaAdj');\n      this.echoZoomLoc = this.gl.getUniformLocation(this.shaderProgram, 'echo_zoom');\n      this.echoAlphaLoc = this.gl.getUniformLocation(this.shaderProgram, 'echo_alpha');\n      this.echoOrientationLoc = this.gl.getUniformLocation(this.shaderProgram, 'echo_orientation');\n      this.invertLoc = this.gl.getUniformLocation(this.shaderProgram, 'invert');\n      this.brightenLoc = this.gl.getUniformLocation(this.shaderProgram, 'brighten');\n      this.darkenLoc = this.gl.getUniformLocation(this.shaderProgram, 'darken');\n      this.solarizeLoc = this.gl.getUniformLocation(this.shaderProgram, 'solarize');\n      this.texsizeLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize');\n      this.texsizeNoiseLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_lq');\n      this.texsizeNoiseMQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_mq');\n      this.texsizeNoiseHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_hq');\n      this.texsizeNoiseLQLiteLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_lq_lite');\n      this.texsizeNoiseVolLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noisevol_lq');\n      this.texsizeNoiseVolHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noisevol_hq');\n      this.resolutionLoc = this.gl.getUniformLocation(this.shaderProgram, 'resolution');\n      this.aspectLoc = this.gl.getUniformLocation(this.shaderProgram, 'aspect');\n      this.bassLoc = this.gl.getUniformLocation(this.shaderProgram, 'bass');\n      this.midLoc = this.gl.getUniformLocation(this.shaderProgram, 'mid');\n      this.trebLoc = this.gl.getUniformLocation(this.shaderProgram, 'treb');\n      this.volLoc = this.gl.getUniformLocation(this.shaderProgram, 'vol');\n      this.bassAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'bass_att');\n      this.midAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'mid_att');\n      this.trebAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'treb_att');\n      this.volAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'vol_att');\n      this.frameLoc = this.gl.getUniformLocation(this.shaderProgram, 'frame');\n      this.fpsLoc = this.gl.getUniformLocation(this.shaderProgram, 'fps');\n      this.blur1MinLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur1_min');\n      this.blur1MaxLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur1_max');\n      this.blur2MinLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur2_min');\n      this.blur2MaxLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur2_max');\n      this.blur3MinLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur3_min');\n      this.blur3MaxLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur3_max');\n      this.scale1Loc = this.gl.getUniformLocation(this.shaderProgram, 'scale1');\n      this.scale2Loc = this.gl.getUniformLocation(this.shaderProgram, 'scale2');\n      this.scale3Loc = this.gl.getUniformLocation(this.shaderProgram, 'scale3');\n      this.bias1Loc = this.gl.getUniformLocation(this.shaderProgram, 'bias1');\n      this.bias2Loc = this.gl.getUniformLocation(this.shaderProgram, 'bias2');\n      this.bias3Loc = this.gl.getUniformLocation(this.shaderProgram, 'bias3');\n      this.randPresetLoc = this.gl.getUniformLocation(this.shaderProgram, 'rand_preset');\n      this.randFrameLoc = this.gl.getUniformLocation(this.shaderProgram, 'rand_frame');\n      this.fShaderLoc = this.gl.getUniformLocation(this.shaderProgram, 'fShader');\n      this.qaLoc = this.gl.getUniformLocation(this.shaderProgram, '_qa');\n      this.qbLoc = this.gl.getUniformLocation(this.shaderProgram, '_qb');\n      this.qcLoc = this.gl.getUniformLocation(this.shaderProgram, '_qc');\n      this.qdLoc = this.gl.getUniformLocation(this.shaderProgram, '_qd');\n      this.qeLoc = this.gl.getUniformLocation(this.shaderProgram, '_qe');\n      this.qfLoc = this.gl.getUniformLocation(this.shaderProgram, '_qf');\n      this.qgLoc = this.gl.getUniformLocation(this.shaderProgram, '_qg');\n      this.qhLoc = this.gl.getUniformLocation(this.shaderProgram, '_qh');\n      this.slowRoamCosLoc = this.gl.getUniformLocation(this.shaderProgram, 'slow_roam_cos');\n      this.roamCosLoc = this.gl.getUniformLocation(this.shaderProgram, 'roam_cos');\n      this.slowRoamSinLoc = this.gl.getUniformLocation(this.shaderProgram, 'slow_roam_sin');\n      this.roamSinLoc = this.gl.getUniformLocation(this.shaderProgram, 'roam_sin');\n\n      for (var i = 0; i < this.userTextures.length; i++) {\n        var userTexture = this.userTextures[i];\n        userTexture.textureLoc = this.gl.getUniformLocation(this.shaderProgram, \"sampler_\".concat(userTexture.sampler));\n      }\n    }\n  }, {\n    key: \"updateShader\",\n    value: function updateShader(shaderText) {\n      this.createShader(shaderText);\n    }\n  }, {\n    key: \"bindBlurVals\",\n    value: function bindBlurVals(blurMins, blurMaxs) {\n      var blurMin1 = blurMins[0];\n      var blurMin2 = blurMins[1];\n      var blurMin3 = blurMins[2];\n      var blurMax1 = blurMaxs[0];\n      var blurMax2 = blurMaxs[1];\n      var blurMax3 = blurMaxs[2];\n      var scale1 = blurMax1 - blurMin1;\n      var bias1 = blurMin1;\n      var scale2 = blurMax2 - blurMin2;\n      var bias2 = blurMin2;\n      var scale3 = blurMax3 - blurMin3;\n      var bias3 = blurMin3;\n      this.gl.uniform1f(this.blur1MinLoc, blurMin1);\n      this.gl.uniform1f(this.blur1MaxLoc, blurMax1);\n      this.gl.uniform1f(this.blur2MinLoc, blurMin2);\n      this.gl.uniform1f(this.blur2MaxLoc, blurMax2);\n      this.gl.uniform1f(this.blur3MinLoc, blurMin3);\n      this.gl.uniform1f(this.blur3MaxLoc, blurMax3);\n      this.gl.uniform1f(this.scale1Loc, scale1);\n      this.gl.uniform1f(this.scale2Loc, scale2);\n      this.gl.uniform1f(this.scale3Loc, scale3);\n      this.gl.uniform1f(this.bias1Loc, bias1);\n      this.gl.uniform1f(this.bias2Loc, bias2);\n      this.gl.uniform1f(this.bias3Loc, bias3);\n    }\n  }, {\n    key: \"generateCompColors\",\n    value: function generateCompColors(blending, mdVSFrame, warpColor) {\n      var hueBase = CompShader.generateHueBase(mdVSFrame);\n      var gridX1 = this.compWidth + 1;\n      var gridY1 = this.compHeight + 1;\n      var compColor = new Float32Array(gridX1 * gridY1 * 4);\n      var offsetColor = 0;\n\n      for (var j = 0; j < gridY1; j++) {\n        for (var i = 0; i < gridX1; i++) {\n          var x = i / this.compWidth;\n          var y = j / this.compHeight;\n          var col = [1, 1, 1];\n\n          for (var c = 0; c < 3; c++) {\n            col[c] = hueBase[0 + c] * x * y + hueBase[3 + c] * (1 - x) * y + hueBase[6 + c] * x * (1 - y) + hueBase[9 + c] * (1 - x) * (1 - y);\n          }\n\n          var alpha = 1;\n\n          if (blending) {\n            x *= this.mesh_width + 1;\n            y *= this.mesh_height + 1;\n            x = Math.clamp(x, 0, this.mesh_width - 1);\n            y = Math.clamp(y, 0, this.mesh_height - 1);\n            var nx = Math.floor(x);\n            var ny = Math.floor(y);\n            var dx = x - nx;\n            var dy = y - ny;\n            var alpha00 = warpColor[(ny * (this.mesh_width + 1) + nx) * 4 + 3];\n            var alpha01 = warpColor[(ny * (this.mesh_width + 1) + (nx + 1)) * 4 + 3];\n            var alpha10 = warpColor[((ny + 1) * (this.mesh_width + 1) + nx) * 4 + 3];\n            var alpha11 = warpColor[((ny + 1) * (this.mesh_width + 1) + (nx + 1)) * 4 + 3];\n            alpha = alpha00 * (1 - dx) * (1 - dy) + alpha01 * dx * (1 - dy) + alpha10 * (1 - dx) * dy + alpha11 * dx * dy;\n          }\n\n          compColor[offsetColor + 0] = col[0];\n          compColor[offsetColor + 1] = col[1];\n          compColor[offsetColor + 2] = col[2];\n          compColor[offsetColor + 3] = alpha;\n          offsetColor += 4;\n        }\n      }\n\n      return compColor;\n    }\n  }, {\n    key: \"renderQuadTexture\",\n    value: function renderQuadTexture(blending, texture, blurTexture1, blurTexture2, blurTexture3, blurMins, blurMaxs, mdVSFrame, warpColor) {\n      var compColors = this.generateCompColors(blending, mdVSFrame, warpColor);\n      this.gl.useProgram(this.shaderProgram);\n      this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.indexBuf);\n      this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, this.indices, this.gl.STATIC_DRAW);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertices, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.positionLocation, 3, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.positionLocation);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.compColorVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, compColors, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.compColorLocation, 4, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.compColorLocation);\n      var wrapping = mdVSFrame.wrap !== 0 ? this.gl.REPEAT : this.gl.CLAMP_TO_EDGE;\n      this.gl.samplerParameteri(this.mainSampler, this.gl.TEXTURE_WRAP_S, wrapping);\n      this.gl.samplerParameteri(this.mainSampler, this.gl.TEXTURE_WRAP_T, wrapping);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(0, this.mainSampler);\n      this.gl.uniform1i(this.textureLoc, 0);\n      this.gl.activeTexture(this.gl.TEXTURE1);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(1, this.mainSamplerFW);\n      this.gl.uniform1i(this.textureFWLoc, 1);\n      this.gl.activeTexture(this.gl.TEXTURE2);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(2, this.mainSamplerFC);\n      this.gl.uniform1i(this.textureFCLoc, 2);\n      this.gl.activeTexture(this.gl.TEXTURE3);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(3, this.mainSamplerPW);\n      this.gl.uniform1i(this.texturePWLoc, 3);\n      this.gl.activeTexture(this.gl.TEXTURE4);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(4, this.mainSamplerPC);\n      this.gl.uniform1i(this.texturePCLoc, 4);\n      this.gl.activeTexture(this.gl.TEXTURE5);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, blurTexture1);\n      this.gl.uniform1i(this.blurTexture1Loc, 5);\n      this.gl.activeTexture(this.gl.TEXTURE6);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, blurTexture2);\n      this.gl.uniform1i(this.blurTexture2Loc, 6);\n      this.gl.activeTexture(this.gl.TEXTURE7);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, blurTexture3);\n      this.gl.uniform1i(this.blurTexture3Loc, 7);\n      this.gl.activeTexture(this.gl.TEXTURE8);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexLQ);\n      this.gl.uniform1i(this.noiseLQLoc, 8);\n      this.gl.activeTexture(this.gl.TEXTURE9);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexMQ);\n      this.gl.uniform1i(this.noiseMQLoc, 9);\n      this.gl.activeTexture(this.gl.TEXTURE10);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexHQ);\n      this.gl.uniform1i(this.noiseHQLoc, 10);\n      this.gl.activeTexture(this.gl.TEXTURE11);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexLQLite);\n      this.gl.uniform1i(this.noiseLQLiteLoc, 11);\n      this.gl.activeTexture(this.gl.TEXTURE12);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexLQ);\n      this.gl.bindSampler(12, this.noise.noiseTexPointLQ);\n      this.gl.uniform1i(this.noisePointLQLoc, 12);\n      this.gl.activeTexture(this.gl.TEXTURE13);\n      this.gl.bindTexture(this.gl.TEXTURE_3D, this.noise.noiseTexVolLQ);\n      this.gl.uniform1i(this.noiseVolLQLoc, 13);\n      this.gl.activeTexture(this.gl.TEXTURE14);\n      this.gl.bindTexture(this.gl.TEXTURE_3D, this.noise.noiseTexVolHQ);\n      this.gl.uniform1i(this.noiseVolHQLoc, 14);\n\n      for (var i = 0; i < this.userTextures.length; i++) {\n        var userTexture = this.userTextures[i];\n        this.gl.activeTexture(this.gl.TEXTURE15 + i);\n        this.gl.bindTexture(this.gl.TEXTURE_2D, this.image.getTexture(userTexture.sampler));\n        this.gl.uniform1i(userTexture.textureLoc, 15 + i);\n      }\n\n      this.gl.uniform1f(this.timeLoc, mdVSFrame.time);\n      this.gl.uniform1f(this.gammaAdjLoc, mdVSFrame.gammaadj);\n      this.gl.uniform1f(this.echoZoomLoc, mdVSFrame.echo_zoom);\n      this.gl.uniform1f(this.echoAlphaLoc, mdVSFrame.echo_alpha);\n      this.gl.uniform1f(this.echoOrientationLoc, mdVSFrame.echo_orient);\n      this.gl.uniform1i(this.invertLoc, mdVSFrame.invert);\n      this.gl.uniform1i(this.brightenLoc, mdVSFrame.brighten);\n      this.gl.uniform1i(this.darkenLoc, mdVSFrame.darken);\n      this.gl.uniform1i(this.solarizeLoc, mdVSFrame.solarize);\n      this.gl.uniform2fv(this.resolutionLoc, [this.texsizeX, this.texsizeY]);\n      this.gl.uniform4fv(this.aspectLoc, [this.aspectx, this.aspecty, this.invAspectx, this.invAspecty]);\n      this.gl.uniform4fv(this.texsizeLoc, new Float32Array([this.texsizeX, this.texsizeY, 1.0 / this.texsizeX, 1.0 / this.texsizeY]));\n      this.gl.uniform4fv(this.texsizeNoiseLQLoc, [256, 256, 1 / 256, 1 / 256]);\n      this.gl.uniform4fv(this.texsizeNoiseMQLoc, [256, 256, 1 / 256, 1 / 256]);\n      this.gl.uniform4fv(this.texsizeNoiseHQLoc, [256, 256, 1 / 256, 1 / 256]);\n      this.gl.uniform4fv(this.texsizeNoiseLQLiteLoc, [32, 32, 1 / 32, 1 / 32]);\n      this.gl.uniform4fv(this.texsizeNoiseVolLQLoc, [32, 32, 1 / 32, 1 / 32]);\n      this.gl.uniform4fv(this.texsizeNoiseVolHQLoc, [32, 32, 1 / 32, 1 / 32]);\n      this.gl.uniform1f(this.bassLoc, mdVSFrame.bass);\n      this.gl.uniform1f(this.midLoc, mdVSFrame.mid);\n      this.gl.uniform1f(this.trebLoc, mdVSFrame.treb);\n      this.gl.uniform1f(this.volLoc, (mdVSFrame.bass + mdVSFrame.mid + mdVSFrame.treb) / 3);\n      this.gl.uniform1f(this.bassAttLoc, mdVSFrame.bass_att);\n      this.gl.uniform1f(this.midAttLoc, mdVSFrame.mid_att);\n      this.gl.uniform1f(this.trebAttLoc, mdVSFrame.treb_att);\n      this.gl.uniform1f(this.volAttLoc, (mdVSFrame.bass_att + mdVSFrame.mid_att + mdVSFrame.treb_att) / 3);\n      this.gl.uniform1f(this.frameLoc, mdVSFrame.frame);\n      this.gl.uniform1f(this.fpsLoc, mdVSFrame.fps);\n      this.gl.uniform4fv(this.randPresetLoc, mdVSFrame.rand_preset);\n      this.gl.uniform4fv(this.randFrameLoc, new Float32Array([Math.random(), Math.random(), Math.random(), Math.random()]));\n      this.gl.uniform1f(this.fShaderLoc, mdVSFrame.fshader);\n      this.gl.uniform4fv(this.qaLoc, new Float32Array([mdVSFrame.q1 || 0, mdVSFrame.q2 || 0, mdVSFrame.q3 || 0, mdVSFrame.q4 || 0]));\n      this.gl.uniform4fv(this.qbLoc, new Float32Array([mdVSFrame.q5 || 0, mdVSFrame.q6 || 0, mdVSFrame.q7 || 0, mdVSFrame.q8 || 0]));\n      this.gl.uniform4fv(this.qcLoc, new Float32Array([mdVSFrame.q9 || 0, mdVSFrame.q10 || 0, mdVSFrame.q11 || 0, mdVSFrame.q12 || 0]));\n      this.gl.uniform4fv(this.qdLoc, new Float32Array([mdVSFrame.q13 || 0, mdVSFrame.q14 || 0, mdVSFrame.q15 || 0, mdVSFrame.q16 || 0]));\n      this.gl.uniform4fv(this.qeLoc, new Float32Array([mdVSFrame.q17 || 0, mdVSFrame.q18 || 0, mdVSFrame.q19 || 0, mdVSFrame.q20 || 0]));\n      this.gl.uniform4fv(this.qfLoc, new Float32Array([mdVSFrame.q21 || 0, mdVSFrame.q22 || 0, mdVSFrame.q23 || 0, mdVSFrame.q24 || 0]));\n      this.gl.uniform4fv(this.qgLoc, new Float32Array([mdVSFrame.q25 || 0, mdVSFrame.q26 || 0, mdVSFrame.q27 || 0, mdVSFrame.q28 || 0]));\n      this.gl.uniform4fv(this.qhLoc, new Float32Array([mdVSFrame.q29 || 0, mdVSFrame.q30 || 0, mdVSFrame.q31 || 0, mdVSFrame.q32 || 0]));\n      this.gl.uniform4fv(this.slowRoamCosLoc, [0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.005), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.008), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.013), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.022)]);\n      this.gl.uniform4fv(this.roamCosLoc, [0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.3), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 1.3), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 5.0), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 20.0)]);\n      this.gl.uniform4fv(this.slowRoamSinLoc, [0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.005), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.008), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.013), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.022)]);\n      this.gl.uniform4fv(this.roamSinLoc, [0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.3), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 1.3), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 5.0), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 20.0)]);\n      this.bindBlurVals(blurMins, blurMaxs);\n\n      if (blending) {\n        this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      } else {\n        this.gl.disable(this.gl.BLEND);\n      }\n\n      this.gl.drawElements(this.gl.TRIANGLES, this.indices.length, this.gl.UNSIGNED_SHORT, 0);\n\n      if (!blending) {\n        this.gl.enable(this.gl.BLEND);\n      }\n    }\n  }], [{\n    key: \"generateHueBase\",\n    value: function generateHueBase(mdVSFrame) {\n      var hueBase = new Float32Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);\n      /* eslint-disable max-len */\n\n      for (var i = 0; i < 4; i++) {\n        hueBase[i * 3 + 0] = 0.6 + 0.3 * Math.sin(mdVSFrame.time * 30.0 * 0.0143 + 3 + i * 21 + mdVSFrame.rand_start[3]);\n        hueBase[i * 3 + 1] = 0.6 + 0.3 * Math.sin(mdVSFrame.time * 30.0 * 0.0107 + 1 + i * 13 + mdVSFrame.rand_start[1]);\n        hueBase[i * 3 + 2] = 0.6 + 0.3 * Math.sin(mdVSFrame.time * 30.0 * 0.0129 + 6 + i * 9 + mdVSFrame.rand_start[2]);\n        var maxshade = Math.max(hueBase[i * 3], hueBase[i * 3 + 1], hueBase[i * 3 + 2]);\n\n        for (var k = 0; k < 3; k++) {\n          hueBase[i * 3 + k] = hueBase[i * 3 + k] / maxshade;\n          hueBase[i * 3 + k] = 0.5 + 0.5 * hueBase[i * 3 + k];\n        }\n      }\n      /* eslint-enable max-len */\n\n\n      return hueBase;\n    }\n  }]);\n\n  return CompShader;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/output.js\":\n/*!*****************************************!*\\\n  !*** ./src/rendering/shaders/output.js ***!\n  \\*****************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_189015__) {\n\n\"use strict\";\n__nested_webpack_require_189015__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_189015__.d(__nested_webpack_exports__, \"default\", function() { return OutputShader; });\n/* harmony import */ var _shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_189015__(/*! ./shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar OutputShader =\n/*#__PURE__*/\nfunction () {\n  function OutputShader(gl, opts) {\n    _classCallCheck(this, OutputShader);\n\n    this.gl = gl;\n    this.textureRatio = opts.textureRatio;\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.positions = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);\n    this.vertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n\n    if (this.useFXAA()) {\n      this.createFXAAShader();\n    } else {\n      this.createShader();\n    }\n  }\n\n  _createClass(OutputShader, [{\n    key: \"useFXAA\",\n    value: function useFXAA() {\n      return this.textureRatio <= 1;\n    }\n  }, {\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.textureRatio = opts.textureRatio;\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.gl.deleteProgram(this.shaderProgram);\n\n      if (this.useFXAA()) {\n        this.createFXAAShader();\n      } else {\n        this.createShader();\n      }\n    } // based on https://github.com/mattdesl/glsl-fxaa\n\n  }, {\n    key: \"createFXAAShader\",\n    value: function createFXAAShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n       const vec2 halfmad = vec2(0.5);\\n       in vec2 aPos;\\n       out vec2 v_rgbM;\\n       out vec2 v_rgbNW;\\n       out vec2 v_rgbNE;\\n       out vec2 v_rgbSW;\\n       out vec2 v_rgbSE;\\n       uniform vec4 texsize;\\n       void main(void) {\\n         gl_Position = vec4(aPos, 0.0, 1.0);\\n\\n         v_rgbM = aPos * halfmad + halfmad;\\n         v_rgbNW = v_rgbM + (vec2(-1.0, -1.0) * texsize.zx);\\n         v_rgbNE = v_rgbM + (vec2(1.0, -1.0) * texsize.zx);\\n         v_rgbSW = v_rgbM + (vec2(-1.0, 1.0) * texsize.zx);\\n         v_rgbSE = v_rgbM + (vec2(1.0, 1.0) * texsize.zx);\\n       }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n       precision \".concat(this.floatPrecision, \" float;\\n       precision highp int;\\n       precision mediump sampler2D;\\n\\n       in vec2 v_rgbM;\\n       in vec2 v_rgbNW;\\n       in vec2 v_rgbNE;\\n       in vec2 v_rgbSW;\\n       in vec2 v_rgbSE;\\n       out vec4 fragColor;\\n       uniform vec4 texsize;\\n       uniform sampler2D uTexture;\\n\\n       #ifndef FXAA_REDUCE_MIN\\n         #define FXAA_REDUCE_MIN   (1.0/ 128.0)\\n       #endif\\n       #ifndef FXAA_REDUCE_MUL\\n         #define FXAA_REDUCE_MUL   (1.0 / 8.0)\\n       #endif\\n       #ifndef FXAA_SPAN_MAX\\n         #define FXAA_SPAN_MAX     8.0\\n       #endif\\n\\n       void main(void) {\\n         vec4 color;\\n         vec3 rgbNW = textureLod(uTexture, v_rgbNW, 0.0).xyz;\\n         vec3 rgbNE = textureLod(uTexture, v_rgbNE, 0.0).xyz;\\n         vec3 rgbSW = textureLod(uTexture, v_rgbSW, 0.0).xyz;\\n         vec3 rgbSE = textureLod(uTexture, v_rgbSE, 0.0).xyz;\\n         vec3 rgbM  = textureLod(uTexture, v_rgbM, 0.0).xyz;\\n         vec3 luma = vec3(0.299, 0.587, 0.114);\\n         float lumaNW = dot(rgbNW, luma);\\n         float lumaNE = dot(rgbNE, luma);\\n         float lumaSW = dot(rgbSW, luma);\\n         float lumaSE = dot(rgbSE, luma);\\n         float lumaM  = dot(rgbM,  luma);\\n         float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\\n         float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\\n\\n         mediump vec2 dir;\\n         dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\\n         dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\\n\\n         float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *\\n                               (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\n\\n         float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\n         dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),\\n                   max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\\n                   dir * rcpDirMin)) * texsize.zw;\\n\\n         vec3 rgbA = 0.5 * (\\n             textureLod(uTexture, v_rgbM + dir * (1.0 / 3.0 - 0.5), 0.0).xyz +\\n             textureLod(uTexture, v_rgbM + dir * (2.0 / 3.0 - 0.5), 0.0).xyz);\\n         vec3 rgbB = rgbA * 0.5 + 0.25 * (\\n             textureLod(uTexture, v_rgbM + dir * -0.5, 0.0).xyz +\\n             textureLod(uTexture, v_rgbM + dir * 0.5, 0.0).xyz);\\n\\n         float lumaB = dot(rgbB, luma);\\n         if ((lumaB < lumaMin) || (lumaB > lumaMax))\\n           color = vec4(rgbA, 1.0);\\n         else\\n           color = vec4(rgbB, 1.0);\\n\\n         fragColor = color;\\n       }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTexture');\n      this.texsizeLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize');\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n       const vec2 halfmad = vec2(0.5);\\n       in vec2 aPos;\\n       out vec2 uv;\\n       void main(void) {\\n         gl_Position = vec4(aPos, 0.0, 1.0);\\n         uv = aPos * halfmad + halfmad;\\n       }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n       precision \".concat(this.floatPrecision, \" float;\\n       precision highp int;\\n       precision mediump sampler2D;\\n\\n       in vec2 uv;\\n       out vec4 fragColor;\\n       uniform sampler2D uTexture;\\n\\n       void main(void) {\\n         fragColor = vec4(texture(uTexture, uv).rgb, 1.0);\\n       }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTexture');\n    }\n  }, {\n    key: \"renderQuadTexture\",\n    value: function renderQuadTexture(texture) {\n      this.gl.useProgram(this.shaderProgram);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.positionLocation, 2, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.positionLocation);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.uniform1i(this.textureLoc, 0);\n\n      if (this.useFXAA()) {\n        this.gl.uniform4fv(this.texsizeLoc, new Float32Array([this.texsizeX, this.texsizeY, 1.0 / this.texsizeX, 1.0 / this.texsizeY]));\n      }\n\n      this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n    }\n  }]);\n\n  return OutputShader;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/resample.js\":\n/*!*******************************************!*\\\n  !*** ./src/rendering/shaders/resample.js ***!\n  \\*******************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_197774__) {\n\n\"use strict\";\n__nested_webpack_require_197774__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_197774__.d(__nested_webpack_exports__, \"default\", function() { return ResampleShader; });\n/* harmony import */ var _shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_197774__(/*! ./shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar ResampleShader =\n/*#__PURE__*/\nfunction () {\n  function ResampleShader(gl) {\n    _classCallCheck(this, ResampleShader);\n\n    this.gl = gl;\n    this.positions = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);\n    this.vertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n  }\n\n  _createClass(ResampleShader, [{\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n       const vec2 halfmad = vec2(0.5);\\n       in vec2 aPos;\\n       out vec2 uv;\\n       void main(void) {\\n         gl_Position = vec4(aPos, 0.0, 1.0);\\n         uv = aPos * halfmad + halfmad;\\n       }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n       precision \".concat(this.floatPrecision, \" float;\\n       precision highp int;\\n       precision mediump sampler2D;\\n\\n       in vec2 uv;\\n       out vec4 fragColor;\\n       uniform sampler2D uTexture;\\n\\n       void main(void) {\\n         fragColor = vec4(texture(uTexture, uv).rgb, 1.0);\\n       }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTexture');\n    }\n  }, {\n    key: \"renderQuadTexture\",\n    value: function renderQuadTexture(texture) {\n      this.gl.useProgram(this.shaderProgram);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.positionLocation, 2, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.positionLocation);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.gl.uniform1i(this.textureLoc, 0);\n      this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n    }\n  }]);\n\n  return ResampleShader;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/shaderUtils.js\":\n/*!**********************************************!*\\\n  !*** ./src/rendering/shaders/shaderUtils.js ***!\n  \\**********************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_201669__) {\n\n\"use strict\";\n__nested_webpack_require_201669__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_201669__.d(__nested_webpack_exports__, \"default\", function() { return ShaderUtils; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar lineMatcher = /uniform sampler2D sampler_(?:.+?);/g;\nvar samplerMatcher = /uniform sampler2D sampler_(.+?);/;\n\nvar ShaderUtils =\n/*#__PURE__*/\nfunction () {\n  function ShaderUtils() {\n    _classCallCheck(this, ShaderUtils);\n  }\n\n  _createClass(ShaderUtils, null, [{\n    key: \"getShaderParts\",\n    value: function getShaderParts(t) {\n      var sbIndex = t.indexOf('shader_body');\n\n      if (t && sbIndex > -1) {\n        var beforeShaderBody = t.substring(0, sbIndex);\n        var afterShaderBody = t.substring(sbIndex);\n        var firstCurly = afterShaderBody.indexOf('{');\n        var lastCurly = afterShaderBody.lastIndexOf('}');\n        var shaderBody = afterShaderBody.substring(firstCurly + 1, lastCurly);\n        return [beforeShaderBody, shaderBody];\n      }\n\n      return ['', t];\n    }\n  }, {\n    key: \"getFragmentFloatPrecision\",\n    value: function getFragmentFloatPrecision(gl) {\n      if (gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) {\n        return 'highp';\n      } else if (gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) {\n        return 'mediump';\n      }\n\n      return 'lowp';\n    }\n  }, {\n    key: \"getUserSamplers\",\n    value: function getUserSamplers(text) {\n      var samplers = [];\n      var lineMatches = text.match(lineMatcher);\n\n      if (lineMatches && lineMatches.length > 0) {\n        for (var i = 0; i < lineMatches.length; i++) {\n          var samplerMatches = lineMatches[i].match(samplerMatcher);\n\n          if (samplerMatches && samplerMatches.length > 0) {\n            var sampler = samplerMatches[1];\n            samplers.push({\n              sampler: sampler\n            });\n          }\n        }\n      }\n\n      return samplers;\n    }\n  }]);\n\n  return ShaderUtils;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shaders/warp.js\":\n/*!***************************************!*\\\n  !*** ./src/rendering/shaders/warp.js ***!\n  \\***************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_204608__) {\n\n\"use strict\";\n__nested_webpack_require_204608__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_204608__.d(__nested_webpack_exports__, \"default\", function() { return WarpShader; });\n/* harmony import */ var _shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_204608__(/*! ./shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar WarpShader =\n/*#__PURE__*/\nfunction () {\n  function WarpShader(gl, noise, image) {\n    var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n    _classCallCheck(this, WarpShader);\n\n    this.gl = gl;\n    this.noise = noise;\n    this.image = image;\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.mesh_width = opts.mesh_width;\n    this.mesh_height = opts.mesh_height;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.buildPositions();\n    this.indexBuf = gl.createBuffer();\n    this.positionVertexBuf = this.gl.createBuffer();\n    this.warpUvVertexBuf = this.gl.createBuffer();\n    this.warpColorVertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n    this.mainSampler = this.gl.createSampler();\n    this.mainSamplerFW = this.gl.createSampler();\n    this.mainSamplerFC = this.gl.createSampler();\n    this.mainSamplerPW = this.gl.createSampler();\n    this.mainSamplerPC = this.gl.createSampler();\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_WRAP_T, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerFW, gl.TEXTURE_WRAP_T, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.samplerParameteri(this.mainSamplerFC, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerPW, gl.TEXTURE_WRAP_T, gl.REPEAT);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.samplerParameteri(this.mainSamplerPC, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n  } // based on https://github.com/mrdoob/three.js/blob/master/src/geometries/PlaneGeometry.js\n\n\n  _createClass(WarpShader, [{\n    key: \"buildPositions\",\n    value: function buildPositions() {\n      var width = 2;\n      var height = 2;\n      var widthHalf = width / 2;\n      var heightHalf = height / 2;\n      var gridX = this.mesh_width;\n      var gridY = this.mesh_height;\n      var gridX1 = gridX + 1;\n      var gridY1 = gridY + 1;\n      var segmentWidth = width / gridX;\n      var segmentHeight = height / gridY;\n      var vertices = [];\n\n      for (var iy = 0; iy < gridY1; iy++) {\n        var y = iy * segmentHeight - heightHalf;\n\n        for (var ix = 0; ix < gridX1; ix++) {\n          var x = ix * segmentWidth - widthHalf;\n          vertices.push(x, -y, 0);\n        }\n      }\n\n      var indices = [];\n\n      for (var _iy = 0; _iy < gridY; _iy++) {\n        for (var _ix = 0; _ix < gridX; _ix++) {\n          var a = _ix + gridX1 * _iy;\n          var b = _ix + gridX1 * (_iy + 1);\n          var c = _ix + 1 + gridX1 * (_iy + 1);\n          var d = _ix + 1 + gridX1 * _iy;\n          indices.push(a, b, d);\n          indices.push(b, c, d);\n        }\n      }\n\n      this.vertices = new Float32Array(vertices);\n      this.indices = new Uint16Array(indices);\n    }\n  }, {\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.mesh_width = opts.mesh_width;\n      this.mesh_height = opts.mesh_height;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n      this.buildPositions();\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      var shaderText = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      var fragShaderText;\n      var fragShaderHeaderText;\n\n      if (shaderText.length === 0) {\n        fragShaderText = 'ret = texture(sampler_main, uv).rgb * decay;';\n        fragShaderHeaderText = '';\n      } else {\n        var shaderParts = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getShaderParts(shaderText);\n        fragShaderHeaderText = shaderParts[0];\n        fragShaderText = shaderParts[1];\n      }\n\n      fragShaderText = fragShaderText.replace(/texture2D/g, 'texture');\n      fragShaderText = fragShaderText.replace(/texture3D/g, 'texture');\n      this.userTextures = _shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getUserSamplers(fragShaderHeaderText);\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      const vec2 halfmad = vec2(0.5);\\n                                      in vec2 aPos;\\n                                      in vec2 aWarpUv;\\n                                      in vec4 aWarpColor;\\n                                      out vec2 uv;\\n                                      out vec2 uv_orig;\\n                                      out vec4 vColor;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aPos, 0.0, 1.0);\\n                                        uv_orig = aPos * halfmad + halfmad;\\n                                        uv = aWarpUv;\\n                                        vColor = aWarpColor;\\n                                      }\"));\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      precision mediump sampler3D;\\n\\n                                      in vec2 uv;\\n                                      in vec2 uv_orig;\\n                                      in vec4 vColor;\\n                                      out vec4 fragColor;\\n                                      uniform sampler2D sampler_main;\\n                                      uniform sampler2D sampler_fw_main;\\n                                      uniform sampler2D sampler_fc_main;\\n                                      uniform sampler2D sampler_pw_main;\\n                                      uniform sampler2D sampler_pc_main;\\n                                      uniform sampler2D sampler_blur1;\\n                                      uniform sampler2D sampler_blur2;\\n                                      uniform sampler2D sampler_blur3;\\n                                      uniform sampler2D sampler_noise_lq;\\n                                      uniform sampler2D sampler_noise_lq_lite;\\n                                      uniform sampler2D sampler_noise_mq;\\n                                      uniform sampler2D sampler_noise_hq;\\n                                      uniform sampler2D sampler_pw_noise_lq;\\n                                      uniform sampler3D sampler_noisevol_lq;\\n                                      uniform sampler3D sampler_noisevol_hq;\\n                                      uniform float time;\\n                                      uniform float decay;\\n                                      uniform vec2 resolution;\\n                                      uniform vec4 aspect;\\n                                      uniform vec4 texsize;\\n                                      uniform vec4 texsize_noise_lq;\\n                                      uniform vec4 texsize_noise_mq;\\n                                      uniform vec4 texsize_noise_hq;\\n                                      uniform vec4 texsize_noise_lq_lite;\\n                                      uniform vec4 texsize_noisevol_lq;\\n                                      uniform vec4 texsize_noisevol_hq;\\n\\n                                      uniform float bass;\\n                                      uniform float mid;\\n                                      uniform float treb;\\n                                      uniform float vol;\\n                                      uniform float bass_att;\\n                                      uniform float mid_att;\\n                                      uniform float treb_att;\\n                                      uniform float vol_att;\\n\\n                                      uniform float frame;\\n                                      uniform float fps;\\n\\n                                      uniform vec4 _qa;\\n                                      uniform vec4 _qb;\\n                                      uniform vec4 _qc;\\n                                      uniform vec4 _qd;\\n                                      uniform vec4 _qe;\\n                                      uniform vec4 _qf;\\n                                      uniform vec4 _qg;\\n                                      uniform vec4 _qh;\\n\\n                                      #define q1 _qa.x\\n                                      #define q2 _qa.y\\n                                      #define q3 _qa.z\\n                                      #define q4 _qa.w\\n                                      #define q5 _qb.x\\n                                      #define q6 _qb.y\\n                                      #define q7 _qb.z\\n                                      #define q8 _qb.w\\n                                      #define q9 _qc.x\\n                                      #define q10 _qc.y\\n                                      #define q11 _qc.z\\n                                      #define q12 _qc.w\\n                                      #define q13 _qd.x\\n                                      #define q14 _qd.y\\n                                      #define q15 _qd.z\\n                                      #define q16 _qd.w\\n                                      #define q17 _qe.x\\n                                      #define q18 _qe.y\\n                                      #define q19 _qe.z\\n                                      #define q20 _qe.w\\n                                      #define q21 _qf.x\\n                                      #define q22 _qf.y\\n                                      #define q23 _qf.z\\n                                      #define q24 _qf.w\\n                                      #define q25 _qg.x\\n                                      #define q26 _qg.y\\n                                      #define q27 _qg.z\\n                                      #define q28 _qg.w\\n                                      #define q29 _qh.x\\n                                      #define q30 _qh.y\\n                                      #define q31 _qh.z\\n                                      #define q32 _qh.w\\n\\n                                      uniform vec4 slow_roam_cos;\\n                                      uniform vec4 roam_cos;\\n                                      uniform vec4 slow_roam_sin;\\n                                      uniform vec4 roam_sin;\\n\\n                                      uniform float blur1_min;\\n                                      uniform float blur1_max;\\n                                      uniform float blur2_min;\\n                                      uniform float blur2_max;\\n                                      uniform float blur3_min;\\n                                      uniform float blur3_max;\\n\\n                                      uniform float scale1;\\n                                      uniform float scale2;\\n                                      uniform float scale3;\\n                                      uniform float bias1;\\n                                      uniform float bias2;\\n                                      uniform float bias3;\\n\\n                                      uniform vec4 rand_frame;\\n                                      uniform vec4 rand_preset;\\n\\n                                      float PI = \").concat(Math.PI, \";\\n\\n                                      \").concat(fragShaderHeaderText, \"\\n\\n                                      void main(void) {\\n                                        vec3 ret;\\n                                        float rad = length(uv_orig - 0.5);\\n                                        float ang = atan(uv_orig.x - 0.5, uv_orig.y - 0.5);\\n\\n                                        \").concat(fragShaderText, \"\\n\\n                                        fragColor = vec4(ret, 1.0) * vColor;\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.warpUvLocation = this.gl.getAttribLocation(this.shaderProgram, 'aWarpUv');\n      this.warpColorLocation = this.gl.getAttribLocation(this.shaderProgram, 'aWarpColor');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_main');\n      this.textureFWLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_fw_main');\n      this.textureFCLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_fc_main');\n      this.texturePWLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_pw_main');\n      this.texturePCLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_pc_main');\n      this.blurTexture1Loc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_blur1');\n      this.blurTexture2Loc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_blur2');\n      this.blurTexture3Loc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_blur3');\n      this.noiseLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_lq');\n      this.noiseMQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_mq');\n      this.noiseHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_hq');\n      this.noiseLQLiteLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noise_lq_lite');\n      this.noisePointLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_pw_noise_lq');\n      this.noiseVolLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noisevol_lq');\n      this.noiseVolHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'sampler_noisevol_hq');\n      this.decayLoc = this.gl.getUniformLocation(this.shaderProgram, 'decay');\n      this.texsizeLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize');\n      this.texsizeNoiseLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_lq');\n      this.texsizeNoiseMQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_mq');\n      this.texsizeNoiseHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_hq');\n      this.texsizeNoiseLQLiteLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noise_lq_lite');\n      this.texsizeNoiseVolLQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noisevol_lq');\n      this.texsizeNoiseVolHQLoc = this.gl.getUniformLocation(this.shaderProgram, 'texsize_noisevol_hq');\n      this.resolutionLoc = this.gl.getUniformLocation(this.shaderProgram, 'resolution');\n      this.aspectLoc = this.gl.getUniformLocation(this.shaderProgram, 'aspect');\n      this.bassLoc = this.gl.getUniformLocation(this.shaderProgram, 'bass');\n      this.midLoc = this.gl.getUniformLocation(this.shaderProgram, 'mid');\n      this.trebLoc = this.gl.getUniformLocation(this.shaderProgram, 'treb');\n      this.volLoc = this.gl.getUniformLocation(this.shaderProgram, 'vol');\n      this.bassAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'bass_att');\n      this.midAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'mid_att');\n      this.trebAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'treb_att');\n      this.volAttLoc = this.gl.getUniformLocation(this.shaderProgram, 'vol_att');\n      this.timeLoc = this.gl.getUniformLocation(this.shaderProgram, 'time');\n      this.frameLoc = this.gl.getUniformLocation(this.shaderProgram, 'frame');\n      this.fpsLoc = this.gl.getUniformLocation(this.shaderProgram, 'fps');\n      this.blur1MinLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur1_min');\n      this.blur1MaxLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur1_max');\n      this.blur2MinLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur2_min');\n      this.blur2MaxLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur2_max');\n      this.blur3MinLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur3_min');\n      this.blur3MaxLoc = this.gl.getUniformLocation(this.shaderProgram, 'blur3_max');\n      this.scale1Loc = this.gl.getUniformLocation(this.shaderProgram, 'scale1');\n      this.scale2Loc = this.gl.getUniformLocation(this.shaderProgram, 'scale2');\n      this.scale3Loc = this.gl.getUniformLocation(this.shaderProgram, 'scale3');\n      this.bias1Loc = this.gl.getUniformLocation(this.shaderProgram, 'bias1');\n      this.bias2Loc = this.gl.getUniformLocation(this.shaderProgram, 'bias2');\n      this.bias3Loc = this.gl.getUniformLocation(this.shaderProgram, 'bias3');\n      this.randPresetLoc = this.gl.getUniformLocation(this.shaderProgram, 'rand_preset');\n      this.randFrameLoc = this.gl.getUniformLocation(this.shaderProgram, 'rand_frame');\n      this.qaLoc = this.gl.getUniformLocation(this.shaderProgram, '_qa');\n      this.qbLoc = this.gl.getUniformLocation(this.shaderProgram, '_qb');\n      this.qcLoc = this.gl.getUniformLocation(this.shaderProgram, '_qc');\n      this.qdLoc = this.gl.getUniformLocation(this.shaderProgram, '_qd');\n      this.qeLoc = this.gl.getUniformLocation(this.shaderProgram, '_qe');\n      this.qfLoc = this.gl.getUniformLocation(this.shaderProgram, '_qf');\n      this.qgLoc = this.gl.getUniformLocation(this.shaderProgram, '_qg');\n      this.qhLoc = this.gl.getUniformLocation(this.shaderProgram, '_qh');\n      this.slowRoamCosLoc = this.gl.getUniformLocation(this.shaderProgram, 'slow_roam_cos');\n      this.roamCosLoc = this.gl.getUniformLocation(this.shaderProgram, 'roam_cos');\n      this.slowRoamSinLoc = this.gl.getUniformLocation(this.shaderProgram, 'slow_roam_sin');\n      this.roamSinLoc = this.gl.getUniformLocation(this.shaderProgram, 'roam_sin');\n\n      for (var i = 0; i < this.userTextures.length; i++) {\n        var userTexture = this.userTextures[i];\n        userTexture.textureLoc = this.gl.getUniformLocation(this.shaderProgram, \"sampler_\".concat(userTexture.sampler));\n      }\n    }\n  }, {\n    key: \"updateShader\",\n    value: function updateShader(shaderText) {\n      this.createShader(shaderText);\n    }\n  }, {\n    key: \"bindBlurVals\",\n    value: function bindBlurVals(blurMins, blurMaxs) {\n      var blurMin1 = blurMins[0];\n      var blurMin2 = blurMins[1];\n      var blurMin3 = blurMins[2];\n      var blurMax1 = blurMaxs[0];\n      var blurMax2 = blurMaxs[1];\n      var blurMax3 = blurMaxs[2];\n      var scale1 = blurMax1 - blurMin1;\n      var bias1 = blurMin1;\n      var scale2 = blurMax2 - blurMin2;\n      var bias2 = blurMin2;\n      var scale3 = blurMax3 - blurMin3;\n      var bias3 = blurMin3;\n      this.gl.uniform1f(this.blur1MinLoc, blurMin1);\n      this.gl.uniform1f(this.blur1MaxLoc, blurMax1);\n      this.gl.uniform1f(this.blur2MinLoc, blurMin2);\n      this.gl.uniform1f(this.blur2MaxLoc, blurMax2);\n      this.gl.uniform1f(this.blur3MinLoc, blurMin3);\n      this.gl.uniform1f(this.blur3MaxLoc, blurMax3);\n      this.gl.uniform1f(this.scale1Loc, scale1);\n      this.gl.uniform1f(this.scale2Loc, scale2);\n      this.gl.uniform1f(this.scale3Loc, scale3);\n      this.gl.uniform1f(this.bias1Loc, bias1);\n      this.gl.uniform1f(this.bias2Loc, bias2);\n      this.gl.uniform1f(this.bias3Loc, bias3);\n    }\n  }, {\n    key: \"renderQuadTexture\",\n    value: function renderQuadTexture(blending, texture, blurTexture1, blurTexture2, blurTexture3, blurMins, blurMaxs, mdVSFrame, warpUVs, warpColor) {\n      this.gl.useProgram(this.shaderProgram);\n      this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.indexBuf);\n      this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, this.indices, this.gl.STATIC_DRAW);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertices, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.positionLocation, 3, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.positionLocation);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.warpUvVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, warpUVs, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.warpUvLocation, 2, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.warpUvLocation);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.warpColorVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, warpColor, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.warpColorLocation, 4, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.warpColorLocation);\n      var wrapping = mdVSFrame.wrap !== 0 ? this.gl.REPEAT : this.gl.CLAMP_TO_EDGE;\n      this.gl.samplerParameteri(this.mainSampler, this.gl.TEXTURE_WRAP_S, wrapping);\n      this.gl.samplerParameteri(this.mainSampler, this.gl.TEXTURE_WRAP_T, wrapping);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(0, this.mainSampler);\n      this.gl.uniform1i(this.textureLoc, 0);\n      this.gl.activeTexture(this.gl.TEXTURE1);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(1, this.mainSamplerFW);\n      this.gl.uniform1i(this.textureFWLoc, 1);\n      this.gl.activeTexture(this.gl.TEXTURE2);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(2, this.mainSamplerFC);\n      this.gl.uniform1i(this.textureFCLoc, 2);\n      this.gl.activeTexture(this.gl.TEXTURE3);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(3, this.mainSamplerPW);\n      this.gl.uniform1i(this.texturePWLoc, 3);\n      this.gl.activeTexture(this.gl.TEXTURE4);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n      this.gl.bindSampler(4, this.mainSamplerPC);\n      this.gl.uniform1i(this.texturePCLoc, 4);\n      this.gl.activeTexture(this.gl.TEXTURE5);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, blurTexture1);\n      this.gl.uniform1i(this.blurTexture1Loc, 5);\n      this.gl.activeTexture(this.gl.TEXTURE6);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, blurTexture2);\n      this.gl.uniform1i(this.blurTexture2Loc, 6);\n      this.gl.activeTexture(this.gl.TEXTURE7);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, blurTexture3);\n      this.gl.uniform1i(this.blurTexture3Loc, 7);\n      this.gl.activeTexture(this.gl.TEXTURE8);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexLQ);\n      this.gl.uniform1i(this.noiseLQLoc, 8);\n      this.gl.activeTexture(this.gl.TEXTURE9);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexMQ);\n      this.gl.uniform1i(this.noiseMQLoc, 9);\n      this.gl.activeTexture(this.gl.TEXTURE10);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexHQ);\n      this.gl.uniform1i(this.noiseHQLoc, 10);\n      this.gl.activeTexture(this.gl.TEXTURE11);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexLQLite);\n      this.gl.uniform1i(this.noiseLQLiteLoc, 11);\n      this.gl.activeTexture(this.gl.TEXTURE12);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.noise.noiseTexLQ);\n      this.gl.bindSampler(12, this.noise.noiseTexPointLQ);\n      this.gl.uniform1i(this.noisePointLQLoc, 12);\n      this.gl.activeTexture(this.gl.TEXTURE13);\n      this.gl.bindTexture(this.gl.TEXTURE_3D, this.noise.noiseTexVolLQ);\n      this.gl.uniform1i(this.noiseVolLQLoc, 13);\n      this.gl.activeTexture(this.gl.TEXTURE14);\n      this.gl.bindTexture(this.gl.TEXTURE_3D, this.noise.noiseTexVolHQ);\n      this.gl.uniform1i(this.noiseVolHQLoc, 14);\n\n      for (var i = 0; i < this.userTextures.length; i++) {\n        var userTexture = this.userTextures[i];\n        this.gl.activeTexture(this.gl.TEXTURE15 + i);\n        this.gl.bindTexture(this.gl.TEXTURE_2D, this.image.getTexture(userTexture.sampler));\n        this.gl.uniform1i(userTexture.textureLoc, 15 + i);\n      }\n\n      this.gl.uniform1f(this.decayLoc, mdVSFrame.decay);\n      this.gl.uniform2fv(this.resolutionLoc, [this.texsizeX, this.texsizeY]);\n      this.gl.uniform4fv(this.aspectLoc, [this.aspectx, this.aspecty, this.invAspectx, this.invAspecty]);\n      this.gl.uniform4fv(this.texsizeLoc, [this.texsizeX, this.texsizeY, 1.0 / this.texsizeX, 1.0 / this.texsizeY]);\n      this.gl.uniform4fv(this.texsizeNoiseLQLoc, [256, 256, 1 / 256, 1 / 256]);\n      this.gl.uniform4fv(this.texsizeNoiseMQLoc, [256, 256, 1 / 256, 1 / 256]);\n      this.gl.uniform4fv(this.texsizeNoiseHQLoc, [256, 256, 1 / 256, 1 / 256]);\n      this.gl.uniform4fv(this.texsizeNoiseLQLiteLoc, [32, 32, 1 / 32, 1 / 32]);\n      this.gl.uniform4fv(this.texsizeNoiseVolLQLoc, [32, 32, 1 / 32, 1 / 32]);\n      this.gl.uniform4fv(this.texsizeNoiseVolHQLoc, [32, 32, 1 / 32, 1 / 32]);\n      this.gl.uniform1f(this.bassLoc, mdVSFrame.bass);\n      this.gl.uniform1f(this.midLoc, mdVSFrame.mid);\n      this.gl.uniform1f(this.trebLoc, mdVSFrame.treb);\n      this.gl.uniform1f(this.volLoc, (mdVSFrame.bass + mdVSFrame.mid + mdVSFrame.treb) / 3);\n      this.gl.uniform1f(this.bassAttLoc, mdVSFrame.bass_att);\n      this.gl.uniform1f(this.midAttLoc, mdVSFrame.mid_att);\n      this.gl.uniform1f(this.trebAttLoc, mdVSFrame.treb_att);\n      this.gl.uniform1f(this.volAttLoc, (mdVSFrame.bass_att + mdVSFrame.mid_att + mdVSFrame.treb_att) / 3);\n      this.gl.uniform1f(this.timeLoc, mdVSFrame.time);\n      this.gl.uniform1f(this.frameLoc, mdVSFrame.frame);\n      this.gl.uniform1f(this.fpsLoc, mdVSFrame.fps);\n      this.gl.uniform4fv(this.randPresetLoc, mdVSFrame.rand_preset);\n      this.gl.uniform4fv(this.randFrameLoc, new Float32Array([Math.random(), Math.random(), Math.random(), Math.random()]));\n      this.gl.uniform4fv(this.qaLoc, new Float32Array([mdVSFrame.q1 || 0, mdVSFrame.q2 || 0, mdVSFrame.q3 || 0, mdVSFrame.q4 || 0]));\n      this.gl.uniform4fv(this.qbLoc, new Float32Array([mdVSFrame.q5 || 0, mdVSFrame.q6 || 0, mdVSFrame.q7 || 0, mdVSFrame.q8 || 0]));\n      this.gl.uniform4fv(this.qcLoc, new Float32Array([mdVSFrame.q9 || 0, mdVSFrame.q10 || 0, mdVSFrame.q11 || 0, mdVSFrame.q12 || 0]));\n      this.gl.uniform4fv(this.qdLoc, new Float32Array([mdVSFrame.q13 || 0, mdVSFrame.q14 || 0, mdVSFrame.q15 || 0, mdVSFrame.q16 || 0]));\n      this.gl.uniform4fv(this.qeLoc, new Float32Array([mdVSFrame.q17 || 0, mdVSFrame.q18 || 0, mdVSFrame.q19 || 0, mdVSFrame.q20 || 0]));\n      this.gl.uniform4fv(this.qfLoc, new Float32Array([mdVSFrame.q21 || 0, mdVSFrame.q22 || 0, mdVSFrame.q23 || 0, mdVSFrame.q24 || 0]));\n      this.gl.uniform4fv(this.qgLoc, new Float32Array([mdVSFrame.q25 || 0, mdVSFrame.q26 || 0, mdVSFrame.q27 || 0, mdVSFrame.q28 || 0]));\n      this.gl.uniform4fv(this.qhLoc, new Float32Array([mdVSFrame.q29 || 0, mdVSFrame.q30 || 0, mdVSFrame.q31 || 0, mdVSFrame.q32 || 0]));\n      this.gl.uniform4fv(this.slowRoamCosLoc, [0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.005), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.008), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.013), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.022)]);\n      this.gl.uniform4fv(this.roamCosLoc, [0.5 + 0.5 * Math.cos(mdVSFrame.time * 0.3), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 1.3), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 5.0), 0.5 + 0.5 * Math.cos(mdVSFrame.time * 20.0)]);\n      this.gl.uniform4fv(this.slowRoamSinLoc, [0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.005), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.008), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.013), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.022)]);\n      this.gl.uniform4fv(this.roamSinLoc, [0.5 + 0.5 * Math.sin(mdVSFrame.time * 0.3), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 1.3), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 5.0), 0.5 + 0.5 * Math.sin(mdVSFrame.time * 20.0)]);\n      this.bindBlurVals(blurMins, blurMaxs);\n\n      if (blending) {\n        this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      } else {\n        this.gl.disable(this.gl.BLEND);\n      }\n\n      this.gl.drawElements(this.gl.TRIANGLES, this.indices.length, this.gl.UNSIGNED_SHORT, 0);\n\n      if (!blending) {\n        this.gl.enable(this.gl.BLEND);\n      }\n    }\n  }]);\n\n  return WarpShader;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/shapes/customShape.js\":\n/*!*********************************************!*\\\n  !*** ./src/rendering/shapes/customShape.js ***!\n  \\*********************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_235589__) {\n\n\"use strict\";\n__nested_webpack_require_235589__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_235589__.d(__nested_webpack_exports__, \"default\", function() { return CustomShape; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_235589__(/*! ../../utils */ \"./src/utils.js\");\n/* harmony import */ var _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_235589__(/*! ../shaders/shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar CustomShape =\n/*#__PURE__*/\nfunction () {\n  function CustomShape(index, gl, opts) {\n    _classCallCheck(this, CustomShape);\n\n    this.index = index;\n    this.gl = gl;\n    var maxSides = 101;\n    this.positions = new Float32Array((maxSides + 2) * 3);\n    this.colors = new Float32Array((maxSides + 2) * 4);\n    this.uvs = new Float32Array((maxSides + 2) * 2);\n    this.borderPositions = new Float32Array((maxSides + 1) * 3);\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.mesh_width = opts.mesh_width;\n    this.mesh_height = opts.mesh_height;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.positionVertexBuf = this.gl.createBuffer();\n    this.colorVertexBuf = this.gl.createBuffer();\n    this.uvVertexBuf = this.gl.createBuffer();\n    this.borderPositionVertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n    this.createBorderShader();\n    this.mainSampler = this.gl.createSampler();\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_WRAP_S, gl.REPEAT);\n    gl.samplerParameteri(this.mainSampler, gl.TEXTURE_WRAP_T, gl.REPEAT);\n  }\n\n  _createClass(CustomShape, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.mesh_width = opts.mesh_width;\n      this.mesh_height = opts.mesh_height;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      in vec3 aPos;\\n                                      in vec4 aColor;\\n                                      in vec2 aUv;\\n                                      out vec4 vColor;\\n                                      out vec2 vUv;\\n                                      void main(void) {\\n                                        vColor = aColor;\\n                                        vUv = aUv;\\n                                        gl_Position = vec4(aPos, 1.0);\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      uniform sampler2D uTexture;\\n                                      uniform float uTextured;\\n                                      in vec4 vColor;\\n                                      in vec2 vUv;\\n                                      out vec4 fragColor;\\n                                      void main(void) {\\n                                        if (uTextured != 0.0) {\\n                                          fragColor = texture(uTexture, vUv) * vColor;\\n                                        } else {\\n                                          fragColor = vColor;\\n                                        }\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.aPosLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.aColorLocation = this.gl.getAttribLocation(this.shaderProgram, 'aColor');\n      this.aUvLocation = this.gl.getAttribLocation(this.shaderProgram, 'aUv');\n      this.texturedLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTextured');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTexture');\n    }\n  }, {\n    key: \"createBorderShader\",\n    value: function createBorderShader() {\n      this.borderShaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      in vec3 aBorderPos;\\n                                      uniform vec2 thickOffset;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aBorderPos +\\n                                                           vec3(thickOffset, 0.0), 1.0);\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      out vec4 fragColor;\\n                                      uniform vec4 uBorderColor;\\n                                      void main(void) {\\n                                        fragColor = uBorderColor;\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.borderShaderProgram, vertShader);\n      this.gl.attachShader(this.borderShaderProgram, fragShader);\n      this.gl.linkProgram(this.borderShaderProgram);\n      this.aBorderPosLoc = this.gl.getAttribLocation(this.borderShaderProgram, 'aBorderPos');\n      this.uBorderColorLoc = this.gl.getUniformLocation(this.borderShaderProgram, 'uBorderColor');\n      this.thickOffsetLoc = this.gl.getUniformLocation(this.shaderProgram, 'thickOffset');\n    }\n  }, {\n    key: \"drawCustomShape\",\n    value: function drawCustomShape(blendProgress, globalVars, presetEquationRunner, shapeEqs, prevTexture) {\n      if (shapeEqs.baseVals.enabled !== 0) {\n        this.setupShapeBuffers(presetEquationRunner.mdVSFrame);\n        var mdVSShape = Object.assign({}, presetEquationRunner.mdVSShapes[this.index], presetEquationRunner.mdVSFrameMapShapes[this.index], presetEquationRunner.mdVSQAfterFrame, presetEquationRunner.mdVSTShapeInits[this.index], globalVars);\n        var mdVSShapeBaseVals = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cloneVars(mdVSShape);\n        var numInst = Math.clamp(mdVSShape.num_inst, 1, 1024);\n\n        for (var j = 0; j < numInst; j++) {\n          mdVSShape.instance = j;\n          mdVSShape.x = mdVSShapeBaseVals.x;\n          mdVSShape.y = mdVSShapeBaseVals.y;\n          mdVSShape.rad = mdVSShapeBaseVals.rad;\n          mdVSShape.ang = mdVSShapeBaseVals.ang;\n          mdVSShape.r = mdVSShapeBaseVals.r;\n          mdVSShape.g = mdVSShapeBaseVals.g;\n          mdVSShape.b = mdVSShapeBaseVals.b;\n          mdVSShape.a = mdVSShapeBaseVals.a;\n          mdVSShape.r2 = mdVSShapeBaseVals.r2;\n          mdVSShape.g2 = mdVSShapeBaseVals.g2;\n          mdVSShape.b2 = mdVSShapeBaseVals.b2;\n          mdVSShape.a2 = mdVSShapeBaseVals.a2;\n          mdVSShape.border_r = mdVSShapeBaseVals.border_r;\n          mdVSShape.border_g = mdVSShapeBaseVals.border_g;\n          mdVSShape.border_b = mdVSShapeBaseVals.border_b;\n          mdVSShape.border_a = mdVSShapeBaseVals.border_a;\n          mdVSShape.thickoutline = mdVSShapeBaseVals.thickoutline;\n          mdVSShape.textured = mdVSShapeBaseVals.textured;\n          mdVSShape.tex_zoom = mdVSShapeBaseVals.tex_zoom;\n          mdVSShape.tex_ang = mdVSShapeBaseVals.tex_ang;\n          mdVSShape.additive = mdVSShapeBaseVals.additive;\n          var mdVSShapeFrame = shapeEqs.frame_eqs(mdVSShape);\n          var sides = mdVSShapeFrame.sides;\n          sides = Math.clamp(sides, 3, 100);\n          sides = Math.floor(sides);\n          var rad = mdVSShapeFrame.rad;\n          var ang = mdVSShapeFrame.ang;\n          var x = mdVSShapeFrame.x * 2 - 1;\n          var y = mdVSShapeFrame.y * -2 + 1;\n          var r = mdVSShapeFrame.r;\n          var g = mdVSShapeFrame.g;\n          var b = mdVSShapeFrame.b;\n          var a = mdVSShapeFrame.a;\n          var r2 = mdVSShapeFrame.r2;\n          var g2 = mdVSShapeFrame.g2;\n          var b2 = mdVSShapeFrame.b2;\n          var a2 = mdVSShapeFrame.a2;\n          var borderR = mdVSShapeFrame.border_r;\n          var borderG = mdVSShapeFrame.border_g;\n          var borderB = mdVSShapeFrame.border_b;\n          var borderA = mdVSShapeFrame.border_a;\n          this.borderColor = [borderR, borderG, borderB, borderA * blendProgress];\n          var thickoutline = mdVSShapeFrame.thickoutline;\n          var textured = mdVSShapeFrame.textured;\n          var texZoom = mdVSShapeFrame.tex_zoom;\n          var texAng = mdVSShapeFrame.tex_ang;\n          var additive = mdVSShapeFrame.additive;\n          var hasBorder = this.borderColor[3] > 0;\n          var isTextured = Math.abs(textured) >= 1;\n          var isBorderThick = Math.abs(thickoutline) >= 1;\n          var isAdditive = Math.abs(additive) >= 1;\n          this.positions[0] = x;\n          this.positions[1] = y;\n          this.positions[2] = 0;\n          this.colors[0] = r;\n          this.colors[1] = g;\n          this.colors[2] = b;\n          this.colors[3] = a * blendProgress;\n\n          if (isTextured) {\n            this.uvs[0] = 0.5;\n            this.uvs[1] = 0.5;\n          }\n\n          var quarterPi = Math.PI * 0.25;\n\n          for (var k = 1; k <= sides + 1; k++) {\n            var p = (k - 1) / sides;\n            var pTwoPi = p * 2 * Math.PI;\n            var angSum = pTwoPi + ang + quarterPi;\n            this.positions[k * 3 + 0] = x + rad * Math.cos(angSum) * this.aspecty;\n            this.positions[k * 3 + 1] = y + rad * Math.sin(angSum);\n            this.positions[k * 3 + 2] = 0;\n            this.colors[k * 4 + 0] = r2;\n            this.colors[k * 4 + 1] = g2;\n            this.colors[k * 4 + 2] = b2;\n            this.colors[k * 4 + 3] = a2 * blendProgress;\n\n            if (isTextured) {\n              var texAngSum = pTwoPi + texAng + quarterPi;\n              this.uvs[k * 2 + 0] = 0.5 + 0.5 * Math.cos(texAngSum) / texZoom * this.aspecty;\n              this.uvs[k * 2 + 1] = 0.5 + 0.5 * Math.sin(texAngSum) / texZoom;\n            }\n\n            if (hasBorder) {\n              this.borderPositions[(k - 1) * 3 + 0] = this.positions[k * 3 + 0];\n              this.borderPositions[(k - 1) * 3 + 1] = this.positions[k * 3 + 1];\n              this.borderPositions[(k - 1) * 3 + 2] = this.positions[k * 3 + 2];\n            }\n          }\n\n          this.mdVSShapeFrame = mdVSShapeFrame;\n          this.drawCustomShapeInstance(prevTexture, sides, isTextured, hasBorder, isBorderThick, isAdditive);\n        }\n\n        var mdVSUserKeysShape = presetEquationRunner.mdVSUserKeysShapes[this.index];\n        var mdVSNewFrameMapShape = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(this.mdVSShapeFrame, mdVSUserKeysShape); // eslint-disable-next-line no-param-reassign\n\n        presetEquationRunner.mdVSFrameMapShapes[this.index] = mdVSNewFrameMapShape;\n      }\n    }\n  }, {\n    key: \"setupShapeBuffers\",\n    value: function setupShapeBuffers(mdVSFrame) {\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.DYNAMIC_DRAW);\n      this.gl.vertexAttribPointer(this.aPosLocation, 3, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.aPosLocation);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.colorVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.colors, this.gl.DYNAMIC_DRAW);\n      this.gl.vertexAttribPointer(this.aColorLocation, 4, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.aColorLocation);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.uvVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.uvs, this.gl.DYNAMIC_DRAW);\n      this.gl.vertexAttribPointer(this.aUvLocation, 2, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.aUvLocation);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.borderPositionVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.borderPositions, this.gl.DYNAMIC_DRAW);\n      this.gl.vertexAttribPointer(this.aBorderPosLoc, 3, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.aBorderPosLoc);\n      var wrapping = mdVSFrame.wrap !== 0 ? this.gl.REPEAT : this.gl.CLAMP_TO_EDGE;\n      this.gl.samplerParameteri(this.mainSampler, this.gl.TEXTURE_WRAP_S, wrapping);\n      this.gl.samplerParameteri(this.mainSampler, this.gl.TEXTURE_WRAP_T, wrapping);\n    }\n  }, {\n    key: \"drawCustomShapeInstance\",\n    value: function drawCustomShapeInstance(prevTexture, sides, isTextured, hasBorder, isBorderThick, isAdditive) {\n      this.gl.useProgram(this.shaderProgram);\n      var updatedPositions = new Float32Array(this.positions.buffer, 0, (sides + 2) * 3);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n      this.gl.bufferSubData(this.gl.ARRAY_BUFFER, 0, updatedPositions);\n      this.gl.vertexAttribPointer(this.aPosLocation, 3, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.aPosLocation);\n      var updatedColors = new Float32Array(this.colors.buffer, 0, (sides + 2) * 4);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.colorVertexBuf);\n      this.gl.bufferSubData(this.gl.ARRAY_BUFFER, 0, updatedColors);\n      this.gl.vertexAttribPointer(this.aColorLocation, 4, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.aColorLocation);\n\n      if (isTextured) {\n        var updatedUvs = new Float32Array(this.uvs.buffer, 0, (sides + 2) * 2);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.uvVertexBuf);\n        this.gl.bufferSubData(this.gl.ARRAY_BUFFER, 0, updatedUvs);\n        this.gl.vertexAttribPointer(this.aUvLocation, 2, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aUvLocation);\n      }\n\n      this.gl.uniform1f(this.texturedLoc, isTextured ? 1 : 0);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, prevTexture);\n      this.gl.bindSampler(0, this.mainSampler);\n      this.gl.uniform1i(this.textureLoc, 0);\n\n      if (isAdditive) {\n        this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE);\n      } else {\n        this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      }\n\n      this.gl.drawArrays(this.gl.TRIANGLE_FAN, 0, sides + 2);\n\n      if (hasBorder) {\n        this.gl.useProgram(this.borderShaderProgram);\n        var updatedBorderPos = new Float32Array(this.borderPositions.buffer, 0, (sides + 1) * 3);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.borderPositionVertexBuf);\n        this.gl.bufferSubData(this.gl.ARRAY_BUFFER, 0, updatedBorderPos);\n        this.gl.vertexAttribPointer(this.aBorderPosLoc, 3, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aBorderPosLoc);\n        this.gl.uniform4fv(this.uBorderColorLoc, this.borderColor); // TODO: use drawArraysInstanced\n\n        var instances = isBorderThick ? 4 : 1;\n\n        for (var i = 0; i < instances; i++) {\n          var offset = 2;\n\n          if (i === 0) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [0, 0]);\n          } else if (i === 1) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [offset / this.texsizeX, 0]);\n          } else if (i === 2) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [0, offset / this.texsizeY]);\n          } else if (i === 3) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [offset / this.texsizeX, offset / this.texsizeY]);\n          }\n\n          this.gl.drawArrays(this.gl.LINE_STRIP, 0, sides + 1);\n        }\n      }\n    }\n  }]);\n\n  return CustomShape;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/sprites/border.js\":\n/*!*****************************************!*\\\n  !*** ./src/rendering/sprites/border.js ***!\n  \\*****************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_253283__) {\n\n\"use strict\";\n__nested_webpack_require_253283__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_253283__.d(__nested_webpack_exports__, \"default\", function() { return Border; });\n/* harmony import */ var _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_253283__(/*! ../shaders/shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar Border =\n/*#__PURE__*/\nfunction () {\n  function Border(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, Border);\n\n    this.gl = gl;\n    this.positions = new Float32Array(72);\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.floatPrecision = _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n    this.vertexBuf = this.gl.createBuffer();\n  }\n\n  _createClass(Border, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      in vec3 aPos;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aPos, 1.0);\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      out vec4 fragColor;\\n                                      uniform vec4 u_color;\\n                                      void main(void) {\\n                                        fragColor = u_color;\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.aPosLoc = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.colorLoc = this.gl.getUniformLocation(this.shaderProgram, 'u_color');\n    }\n  }, {\n    key: \"addTriangle\",\n    value: function addTriangle(offset, point1, point2, point3) {\n      this.positions[offset + 0] = point1[0];\n      this.positions[offset + 1] = point1[1];\n      this.positions[offset + 2] = point1[2];\n      this.positions[offset + 3] = point2[0];\n      this.positions[offset + 4] = point2[1];\n      this.positions[offset + 5] = point2[2];\n      this.positions[offset + 6] = point3[0];\n      this.positions[offset + 7] = point3[1];\n      this.positions[offset + 8] = point3[2];\n    } // based on https://github.com/mrdoob/three.js/blob/master/src/geometries/PlaneGeometry.js\n\n  }, {\n    key: \"generateBorder\",\n    value: function generateBorder(borderColor, borderSize, prevBorderSize) {\n      if (borderSize > 0 && borderColor[3] > 0) {\n        var width = 2;\n        var height = 2;\n        var widthHalf = width / 2;\n        var heightHalf = height / 2;\n        var prevBorderWidth = prevBorderSize / 2;\n        var borderWidth = borderSize / 2 + prevBorderWidth;\n        var prevBorderWidthWidth = prevBorderWidth * width;\n        var prevBorderWidthHeight = prevBorderWidth * height;\n        var borderWidthWidth = borderWidth * width;\n        var borderWidthHeight = borderWidth * height; // 1st side\n\n        var point1 = [-widthHalf + prevBorderWidthWidth, -heightHalf + borderWidthHeight, 0];\n        var point2 = [-widthHalf + prevBorderWidthWidth, heightHalf - borderWidthHeight, 0];\n        var point3 = [-widthHalf + borderWidthWidth, heightHalf - borderWidthHeight, 0];\n        var point4 = [-widthHalf + borderWidthWidth, -heightHalf + borderWidthHeight, 0];\n        this.addTriangle(0, point4, point2, point1);\n        this.addTriangle(9, point4, point3, point2); // 2nd side\n\n        point1 = [widthHalf - prevBorderWidthWidth, -heightHalf + borderWidthHeight, 0];\n        point2 = [widthHalf - prevBorderWidthWidth, heightHalf - borderWidthHeight, 0];\n        point3 = [widthHalf - borderWidthWidth, heightHalf - borderWidthHeight, 0];\n        point4 = [widthHalf - borderWidthWidth, -heightHalf + borderWidthHeight, 0];\n        this.addTriangle(18, point1, point2, point4);\n        this.addTriangle(27, point2, point3, point4); // Top\n\n        point1 = [-widthHalf + prevBorderWidthWidth, -heightHalf + prevBorderWidthHeight, 0];\n        point2 = [-widthHalf + prevBorderWidthWidth, borderWidthHeight - heightHalf, 0];\n        point3 = [widthHalf - prevBorderWidthWidth, borderWidthHeight - heightHalf, 0];\n        point4 = [widthHalf - prevBorderWidthWidth, -heightHalf + prevBorderWidthHeight, 0];\n        this.addTriangle(36, point4, point2, point1);\n        this.addTriangle(45, point4, point3, point2); // Bottom\n\n        point1 = [-widthHalf + prevBorderWidthWidth, heightHalf - prevBorderWidthHeight, 0];\n        point2 = [-widthHalf + prevBorderWidthWidth, heightHalf - borderWidthHeight, 0];\n        point3 = [widthHalf - prevBorderWidthWidth, heightHalf - borderWidthHeight, 0];\n        point4 = [widthHalf - prevBorderWidthWidth, heightHalf - prevBorderWidthHeight, 0];\n        this.addTriangle(54, point1, point2, point4);\n        this.addTriangle(63, point2, point3, point4);\n        return true;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"drawBorder\",\n    value: function drawBorder(borderColor, borderSize, prevBorderSize) {\n      if (this.generateBorder(borderColor, borderSize, prevBorderSize)) {\n        this.gl.useProgram(this.shaderProgram);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.STATIC_DRAW);\n        this.gl.vertexAttribPointer(this.aPosLoc, 3, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aPosLoc);\n        this.gl.uniform4fv(this.colorLoc, borderColor);\n        this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n        this.gl.drawArrays(this.gl.TRIANGLES, 0, this.positions.length / 3);\n      }\n    }\n  }]);\n\n  return Border;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/sprites/darkenCenter.js\":\n/*!***********************************************!*\\\n  !*** ./src/rendering/sprites/darkenCenter.js ***!\n  \\***********************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_260974__) {\n\n\"use strict\";\n__nested_webpack_require_260974__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_260974__.d(__nested_webpack_exports__, \"default\", function() { return CustomShape; });\n/* harmony import */ var _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_260974__(/*! ../shaders/shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar CustomShape =\n/*#__PURE__*/\nfunction () {\n  function CustomShape(gl, opts) {\n    _classCallCheck(this, CustomShape);\n\n    this.gl = gl;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.generatePositions();\n    this.colors = new Float32Array([0, 0, 0, 3 / 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n    this.positionVertexBuf = this.gl.createBuffer();\n    this.colorVertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n  }\n\n  _createClass(CustomShape, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n      this.generatePositions();\n    }\n  }, {\n    key: \"generatePositions\",\n    value: function generatePositions() {\n      var halfSize = 0.05;\n      this.positions = new Float32Array([0, 0, 0, -halfSize * this.aspecty, 0, 0, 0, -halfSize, 0, halfSize * this.aspecty, 0, 0, 0, halfSize, 0, -halfSize * this.aspecty, 0, 0]);\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      in vec3 aPos;\\n                                      in vec4 aColor;\\n                                      out vec4 vColor;\\n                                      void main(void) {\\n                                        vColor = aColor;\\n                                        gl_Position = vec4(aPos, 1.0);\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      in vec4 vColor;\\n                                      out vec4 fragColor;\\n                                      void main(void) {\\n                                        fragColor = vColor;\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.aPosLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.aColorLocation = this.gl.getAttribLocation(this.shaderProgram, 'aColor');\n    }\n  }, {\n    key: \"drawDarkenCenter\",\n    value: function drawDarkenCenter(mdVSFrame) {\n      if (mdVSFrame.darken_center !== 0) {\n        this.gl.useProgram(this.shaderProgram);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, this.positions, this.gl.STATIC_DRAW);\n        this.gl.vertexAttribPointer(this.aPosLocation, 3, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aPosLocation);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.colorVertexBuf);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, this.colors, this.gl.STATIC_DRAW);\n        this.gl.vertexAttribPointer(this.aColorLocation, 4, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aColorLocation);\n        this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n        this.gl.drawArrays(this.gl.TRIANGLE_FAN, 0, this.positions.length / 3);\n      }\n    }\n  }]);\n\n  return CustomShape;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/text/titleText.js\":\n/*!*****************************************!*\\\n  !*** ./src/rendering/text/titleText.js ***!\n  \\*****************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_266269__) {\n\n\"use strict\";\n__nested_webpack_require_266269__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_266269__.d(__nested_webpack_exports__, \"default\", function() { return TitleText; });\n/* harmony import */ var _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_266269__(/*! ../shaders/shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar TitleText =\n/*#__PURE__*/\nfunction () {\n  function TitleText(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, TitleText);\n\n    this.gl = gl;\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.buildPositions();\n    this.textTexture = this.gl.createTexture();\n    this.indexBuf = gl.createBuffer();\n    this.positionVertexBuf = this.gl.createBuffer();\n    this.vertexBuf = this.gl.createBuffer();\n    this.canvas = document.createElement('canvas');\n    this.canvas.width = this.texsizeX;\n    this.canvas.height = this.texsizeY;\n    this.context2D = this.canvas.getContext('2d');\n    this.floatPrecision = _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n  }\n\n  _createClass(TitleText, [{\n    key: \"generateTitleTexture\",\n    value: function generateTitleTexture(text) {\n      this.context2D.clearRect(0, 0, this.texsizeX, this.texsizeY);\n      this.fontSize = Math.floor(16 * (this.texsizeX / 256));\n      this.fontSize = Math.max(this.fontSize, 6);\n      this.context2D.font = \"italic \".concat(this.fontSize, \"px Times New Roman\");\n      var titleText = text;\n      var textLength = this.context2D.measureText(titleText).width;\n\n      if (textLength > this.texsizeX) {\n        var percentToKeep = 0.91 * (this.texsizeX / textLength);\n        titleText = \"\".concat(titleText.substring(0, Math.floor(titleText.length * percentToKeep)), \"...\");\n        textLength = this.context2D.measureText(titleText).width;\n      }\n\n      this.context2D.fillStyle = '#FFFFFF';\n      this.context2D.fillText(titleText, (this.texsizeX - textLength) / 2, this.texsizeY / 2);\n      var imageData = new Uint8Array(this.context2D.getImageData(0, 0, this.texsizeX, this.texsizeY).data.buffer);\n      this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, true);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.textTexture);\n      this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.texsizeX, this.texsizeY, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, imageData);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n      this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n      this.gl.generateMipmap(this.gl.TEXTURE_2D);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, null);\n    }\n  }, {\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n      this.canvas.width = this.texsizeX;\n      this.canvas.height = this.texsizeY;\n    } // based on https://github.com/mrdoob/three.js/blob/master/src/geometries/PlaneGeometry.js\n\n  }, {\n    key: \"buildPositions\",\n    value: function buildPositions() {\n      var width = 2;\n      var height = 2;\n      var widthHalf = width / 2;\n      var heightHalf = height / 2;\n      var gridX = 15;\n      var gridY = 7;\n      var gridX1 = gridX + 1;\n      var gridY1 = gridY + 1;\n      var segmentWidth = width / gridX;\n      var segmentHeight = height / gridY;\n      var vertices = [];\n\n      for (var iy = 0; iy < gridY1; iy++) {\n        var y = iy * segmentHeight - heightHalf;\n\n        for (var ix = 0; ix < gridX1; ix++) {\n          var x = ix * segmentWidth - widthHalf;\n          vertices.push(x, -y, 0);\n        }\n      }\n\n      var indices = [];\n\n      for (var _iy = 0; _iy < gridY; _iy++) {\n        for (var _ix = 0; _ix < gridX; _ix++) {\n          var a = _ix + gridX1 * _iy;\n          var b = _ix + gridX1 * (_iy + 1);\n          var c = _ix + 1 + gridX1 * (_iy + 1);\n          var d = _ix + 1 + gridX1 * _iy;\n          indices.push(a, b, d);\n          indices.push(b, c, d);\n        }\n      }\n\n      this.vertices = new Float32Array(vertices);\n      this.indices = new Uint16Array(indices);\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n       const vec2 halfmad = vec2(0.5);\\n       in vec2 aPos;\\n       in vec2 aUv;\\n       out vec2 uv_orig;\\n       out vec2 uv;\\n       void main(void) {\\n         gl_Position = vec4(aPos, 0.0, 1.0);\\n         uv_orig = aPos * halfmad + halfmad;\\n         uv = aUv;\\n       }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n       precision \".concat(this.floatPrecision, \" float;\\n       precision highp int;\\n       precision mediump sampler2D;\\n\\n       in vec2 uv_orig;\\n       in vec2 uv;\\n       out vec4 fragColor;\\n       uniform sampler2D uTexture;\\n       uniform float textColor;\\n\\n       void main(void) {\\n         fragColor = texture(uTexture, uv) * vec4(textColor);\\n       }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.positionLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.uvLocation = this.gl.getAttribLocation(this.shaderProgram, 'aUv');\n      this.textureLoc = this.gl.getUniformLocation(this.shaderProgram, 'uTexture');\n      this.textColorLoc = this.gl.getUniformLocation(this.shaderProgram, 'textColor');\n    }\n  }, {\n    key: \"generateUvs\",\n    value: function generateUvs(progress, flip, globalVars) {\n      var gridX = 15;\n      var gridY = 7;\n      var gridX1 = gridX + 1;\n      var gridY1 = gridY + 1;\n      var uvs = [];\n      var vertClip = 0.75;\n\n      for (var j = 0; j < gridY1; j++) {\n        for (var i = 0; i < gridX1; i++) {\n          var u = i / gridX;\n          var v = (j / gridY - 0.5) * vertClip + 0.5;\n          var x = u * 2.0 - 1.0;\n          var y = v * 2.0 - 1.0;\n\n          if (progress >= 1) {\n            y += 1.0 / this.texsizeY;\n          }\n\n          uvs.push(x, flip ? y : -y);\n        }\n      }\n\n      var rampedProgress = Math.max(0, 1 - progress * 1.5);\n      var t2 = Math.pow(rampedProgress, 1.8) * 1.3;\n\n      for (var _j = 0; _j < gridY1; _j++) {\n        for (var _i = 0; _i < gridX1; _i++) {\n          var idx = _j * gridX1 + _i;\n          uvs[idx] += t2 * 0.070 * Math.sin(globalVars.time * 0.31 + uvs[idx] * 0.39 - uvs[idx + 1] * 1.94);\n          uvs[idx] += t2 * 0.044 * Math.sin(globalVars.time * 0.81 - uvs[idx] * 1.91 + uvs[idx + 1] * 0.27);\n          uvs[idx] += t2 * 0.061 * Math.sin(globalVars.time * 1.31 + uvs[idx] * 0.61 + uvs[idx + 1] * 0.74);\n          uvs[idx + 1] += t2 * 0.061 * Math.sin(globalVars.time * 0.37 + uvs[idx] * 1.83 + uvs[idx + 1] * 0.69);\n          uvs[idx + 1] += t2 * 0.070 * Math.sin(globalVars.time * 0.67 + uvs[idx] * 0.42 - uvs[idx + 1] * 1.39);\n          uvs[idx + 1] += t2 * 0.087 * Math.sin(globalVars.time * 1.07 + uvs[idx] * 3.55 + uvs[idx + 1] * 0.89);\n        }\n      }\n\n      var scale = 1.01 / (Math.pow(progress, 0.21) + 0.01);\n\n      for (var _i2 = 0; _i2 < uvs.length / 2; _i2++) {\n        uvs[_i2 * 2] *= scale;\n        uvs[_i2 * 2 + 1] *= scale * this.invAspecty; // get back UVs\n\n        uvs[_i2 * 2] = (uvs[_i2 * 2] + 1) / 2.0;\n        uvs[_i2 * 2 + 1] = (uvs[_i2 * 2 + 1] + 1) / 2.0;\n      }\n\n      return new Float32Array(uvs);\n    }\n  }, {\n    key: \"renderTitle\",\n    value: function renderTitle(progress, flip, globalVars) {\n      this.gl.useProgram(this.shaderProgram);\n      var progressUvs = this.generateUvs(progress, flip, globalVars);\n      this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.indexBuf);\n      this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, this.indices, this.gl.STATIC_DRAW);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertices, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.positionLocation, 3, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.positionLocation);\n      this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n      this.gl.bufferData(this.gl.ARRAY_BUFFER, progressUvs, this.gl.STATIC_DRAW);\n      this.gl.vertexAttribPointer(this.uvLocation, 2, this.gl.FLOAT, false, 0, 0);\n      this.gl.enableVertexAttribArray(this.uvLocation);\n      this.gl.activeTexture(this.gl.TEXTURE0);\n      this.gl.bindTexture(this.gl.TEXTURE_2D, this.textTexture);\n      this.gl.uniform1i(this.textureLoc, 0);\n      this.gl.uniform1f(this.textColorLoc, Math.pow(progress, 0.3));\n      this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n      this.gl.drawElements(this.gl.TRIANGLES, this.indices.length, this.gl.UNSIGNED_SHORT, 0);\n    }\n  }]);\n\n  return TitleText;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/waves/basicWaveform.js\":\n/*!**********************************************!*\\\n  !*** ./src/rendering/waves/basicWaveform.js ***!\n  \\**********************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_276928__) {\n\n\"use strict\";\n__nested_webpack_require_276928__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_276928__.d(__nested_webpack_exports__, \"default\", function() { return BasicWaveform; });\n/* harmony import */ var _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_276928__(/*! ../shaders/shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\n/* harmony import */ var _waveUtils__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_276928__(/*! ./waveUtils */ \"./src/rendering/waves/waveUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar BasicWaveform =\n/*#__PURE__*/\nfunction () {\n  function BasicWaveform(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, BasicWaveform);\n\n    this.gl = gl;\n    var numAudioSamples = 512;\n    this.positions = new Float32Array(numAudioSamples * 3);\n    this.positions2 = new Float32Array(numAudioSamples * 3);\n    this.oldPositions = new Float32Array(numAudioSamples * 3);\n    this.oldPositions2 = new Float32Array(numAudioSamples * 3);\n    this.smoothedPositions = new Float32Array((numAudioSamples * 2 - 1) * 3);\n    this.smoothedPositions2 = new Float32Array((numAudioSamples * 2 - 1) * 3);\n    this.color = [0, 0, 0, 1];\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.floatPrecision = _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n    this.vertexBuf = this.gl.createBuffer();\n  }\n\n  _createClass(BasicWaveform, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      in vec3 aPos;\\n                                      uniform vec2 thickOffset;\\n                                      void main(void) {\\n                                        gl_Position = vec4(aPos + vec3(thickOffset, 0.0), 1.0);\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      out vec4 fragColor;\\n                                      uniform vec4 u_color;\\n                                      void main(void) {\\n                                        fragColor = u_color;\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.aPosLoc = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.colorLoc = this.gl.getUniformLocation(this.shaderProgram, 'u_color');\n      this.thickOffsetLoc = this.gl.getUniformLocation(this.shaderProgram, 'thickOffset');\n    }\n  }, {\n    key: \"generateWaveform\",\n    value: function generateWaveform(blending, blendProgress, timeArrayL, timeArrayR, mdVSFrame) {\n      var alpha = mdVSFrame.wave_a;\n      var vol = (mdVSFrame.bass + mdVSFrame.mid + mdVSFrame.treb) / 3.0;\n\n      if (vol > -0.01 && alpha > 0.001 && timeArrayL.length > 0) {\n        var waveL = BasicWaveform.processWaveform(timeArrayL, mdVSFrame);\n        var waveR = BasicWaveform.processWaveform(timeArrayR, mdVSFrame);\n        var newWaveMode = Math.floor(mdVSFrame.wave_mode) % 8;\n        var oldWaveMode = Math.floor(mdVSFrame.old_wave_mode) % 8;\n        var wavePosX = mdVSFrame.wave_x * 2.0 - 1.0;\n        var wavePosY = mdVSFrame.wave_y * 2.0 - 1.0;\n        this.numVert = 0;\n        this.oldNumVert = 0;\n        var its = blending && newWaveMode !== oldWaveMode ? 2 : 1;\n\n        for (var it = 0; it < its; it++) {\n          var waveMode = it === 0 ? newWaveMode : oldWaveMode;\n          var fWaveParam2 = mdVSFrame.wave_mystery;\n\n          if ((waveMode === 0 || waveMode === 1 || waveMode === 4) && (fWaveParam2 < -1 || fWaveParam2 > 1)) {\n            fWaveParam2 = fWaveParam2 * 0.5 + 0.5;\n            fWaveParam2 -= Math.floor(fWaveParam2);\n            fWaveParam2 = Math.abs(fWaveParam2);\n            fWaveParam2 = fWaveParam2 * 2 - 1;\n          }\n\n          var numVert = void 0;\n          var positions = void 0;\n          var positions2 = void 0;\n\n          if (it === 0) {\n            positions = this.positions;\n            positions2 = this.positions2;\n          } else {\n            positions = this.oldPositions;\n            positions2 = this.oldPositions2;\n          }\n\n          alpha = mdVSFrame.wave_a;\n\n          if (waveMode === 0) {\n            if (mdVSFrame.modwavealphabyvolume > 0) {\n              var alphaDiff = mdVSFrame.modwavealphaend - mdVSFrame.modwavealphastart;\n              alpha *= (vol - mdVSFrame.modwavealphastart) / alphaDiff;\n            }\n\n            alpha = Math.clamp(alpha, 0, 1);\n            numVert = Math.floor(waveL.length / 2) + 1;\n            var numVertInv = 1.0 / (numVert - 1);\n            var sampleOffset = Math.floor((waveL.length - numVert) / 2);\n\n            for (var i = 0; i < numVert - 1; i++) {\n              var rad = 0.5 + 0.4 * waveR[i + sampleOffset] + fWaveParam2;\n              var ang = i * numVertInv * 2 * Math.PI + mdVSFrame.time * 0.2;\n\n              if (i < numVert / 10) {\n                var _mix = i / (numVert * 0.1);\n\n                _mix = 0.5 - 0.5 * Math.cos(_mix * Math.PI);\n                var rad2 = 0.5 + 0.4 * waveR[i + numVert + sampleOffset] + fWaveParam2;\n                rad = (1.0 - _mix) * rad2 + rad * _mix;\n              }\n\n              positions[i * 3 + 0] = rad * Math.cos(ang) * this.aspecty + wavePosX;\n              positions[i * 3 + 1] = rad * Math.sin(ang) * this.aspectx + wavePosY;\n              positions[i * 3 + 2] = 0;\n            } // connect the loop\n\n\n            positions[(numVert - 1) * 3 + 0] = positions[0];\n            positions[(numVert - 1) * 3 + 1] = positions[1];\n            positions[(numVert - 1) * 3 + 2] = 0;\n          } else if (waveMode === 1) {\n            alpha *= 1.25;\n\n            if (mdVSFrame.modwavealphabyvolume > 0) {\n              var _alphaDiff = mdVSFrame.modwavealphaend - mdVSFrame.modwavealphastart;\n\n              alpha *= (vol - mdVSFrame.modwavealphastart) / _alphaDiff;\n            }\n\n            alpha = Math.clamp(alpha, 0, 1);\n            numVert = Math.floor(waveL.length / 2);\n\n            for (var _i = 0; _i < numVert; _i++) {\n              var _rad = 0.53 + 0.43 * waveR[_i] + fWaveParam2;\n\n              var _ang = waveL[_i + 32] * 0.5 * Math.PI + mdVSFrame.time * 2.3;\n\n              positions[_i * 3 + 0] = _rad * Math.cos(_ang) * this.aspecty + wavePosX;\n              positions[_i * 3 + 1] = _rad * Math.sin(_ang) * this.aspectx + wavePosY;\n              positions[_i * 3 + 2] = 0;\n            }\n          } else if (waveMode === 2) {\n            if (this.texsizeX < 1024) {\n              alpha *= 0.09;\n            } else if (this.texsizeX >= 1024 && this.texsizeX < 2048) {\n              alpha *= 0.11;\n            } else {\n              alpha *= 0.13;\n            }\n\n            if (mdVSFrame.modwavealphabyvolume > 0) {\n              var _alphaDiff2 = mdVSFrame.modwavealphaend - mdVSFrame.modwavealphastart;\n\n              alpha *= (vol - mdVSFrame.modwavealphastart) / _alphaDiff2;\n            }\n\n            alpha = Math.clamp(alpha, 0, 1);\n            numVert = waveL.length;\n\n            for (var _i2 = 0; _i2 < waveL.length; _i2++) {\n              positions[_i2 * 3 + 0] = waveR[_i2] * this.aspecty + wavePosX;\n              positions[_i2 * 3 + 1] = waveL[(_i2 + 32) % waveL.length] * this.aspectx + wavePosY;\n              positions[_i2 * 3 + 2] = 0;\n            }\n          } else if (waveMode === 3) {\n            if (this.texsizeX < 1024) {\n              alpha *= 0.15;\n            } else if (this.texsizeX >= 1024 && this.texsizeX < 2048) {\n              alpha *= 0.22;\n            } else {\n              alpha *= 0.33;\n            }\n\n            alpha *= 1.3;\n            alpha *= mdVSFrame.treb * mdVSFrame.treb; // should be treb_imm\n\n            if (mdVSFrame.modwavealphabyvolume > 0) {\n              var _alphaDiff3 = mdVSFrame.modwavealphaend - mdVSFrame.modwavealphastart;\n\n              alpha *= (vol - mdVSFrame.modwavealphastart) / _alphaDiff3;\n            }\n\n            alpha = Math.clamp(alpha, 0, 1);\n            numVert = waveL.length;\n\n            for (var _i3 = 0; _i3 < waveL.length; _i3++) {\n              positions[_i3 * 3 + 0] = waveR[_i3] * this.aspecty + wavePosX;\n              positions[_i3 * 3 + 1] = waveL[(_i3 + 32) % waveL.length] * this.aspectx + wavePosY;\n              positions[_i3 * 3 + 2] = 0;\n            }\n          } else if (waveMode === 4) {\n            if (mdVSFrame.modwavealphabyvolume > 0) {\n              var _alphaDiff4 = mdVSFrame.modwavealphaend - mdVSFrame.modwavealphastart;\n\n              alpha *= (vol - mdVSFrame.modwavealphastart) / _alphaDiff4;\n            }\n\n            alpha = Math.clamp(alpha, 0, 1);\n            numVert = waveL.length;\n\n            if (numVert > this.texsizeX / 3) {\n              numVert = Math.floor(this.texsizeX / 3);\n            }\n\n            var _numVertInv = 1.0 / numVert;\n\n            var _sampleOffset = Math.floor((waveL.length - numVert) / 2);\n\n            var w1 = 0.45 + 0.5 * (fWaveParam2 * 0.5 + 0.5);\n            var w2 = 1.0 - w1;\n\n            for (var _i4 = 0; _i4 < numVert; _i4++) {\n              var x = 2.0 * _i4 * _numVertInv + (wavePosX - 1) + waveR[(_i4 + 25 + _sampleOffset) % waveL.length] * 0.44;\n              var y = waveL[_i4 + _sampleOffset] * 0.47 + wavePosY; // momentum\n\n              if (_i4 > 1) {\n                x = x * w2 + w1 * (positions[(_i4 - 1) * 3 + 0] * 2.0 - positions[(_i4 - 2) * 3 + 0]);\n                y = y * w2 + w1 * (positions[(_i4 - 1) * 3 + 1] * 2.0 - positions[(_i4 - 2) * 3 + 1]);\n              }\n\n              positions[_i4 * 3 + 0] = x;\n              positions[_i4 * 3 + 1] = y;\n              positions[_i4 * 3 + 2] = 0;\n            }\n          } else if (waveMode === 5) {\n            if (this.texsizeX < 1024) {\n              alpha *= 0.09;\n            } else if (this.texsizeX >= 1024 && this.texsizeX < 2048) {\n              alpha *= 0.11;\n            } else {\n              alpha *= 0.13;\n            }\n\n            if (mdVSFrame.modwavealphabyvolume > 0) {\n              var _alphaDiff5 = mdVSFrame.modwavealphaend - mdVSFrame.modwavealphastart;\n\n              alpha *= (vol - mdVSFrame.modwavealphastart) / _alphaDiff5;\n            }\n\n            alpha = Math.clamp(alpha, 0, 1);\n            var cosRot = Math.cos(mdVSFrame.time * 0.3);\n            var sinRot = Math.sin(mdVSFrame.time * 0.3);\n            numVert = waveL.length;\n\n            for (var _i5 = 0; _i5 < waveL.length; _i5++) {\n              var ioff = (_i5 + 32) % waveL.length;\n              var x0 = waveR[_i5] * waveL[ioff] + waveL[_i5] * waveR[ioff];\n              var y0 = waveR[_i5] * waveR[_i5] - waveL[ioff] * waveL[ioff];\n              positions[_i5 * 3 + 0] = (x0 * cosRot - y0 * sinRot) * (this.aspecty + wavePosX);\n              positions[_i5 * 3 + 1] = (x0 * sinRot + y0 * cosRot) * (this.aspectx + wavePosY);\n              positions[_i5 * 3 + 2] = 0;\n            }\n          } else if (waveMode === 6 || waveMode === 7) {\n            if (mdVSFrame.modwavealphabyvolume > 0) {\n              var _alphaDiff6 = mdVSFrame.modwavealphaend - mdVSFrame.modwavealphastart;\n\n              alpha *= (vol - mdVSFrame.modwavealphastart) / _alphaDiff6;\n            }\n\n            alpha = Math.clamp(alpha, 0, 1);\n            numVert = Math.floor(waveL.length / 2);\n\n            if (numVert > this.texsizeX / 3) {\n              numVert = Math.floor(this.texsizeX / 3);\n            }\n\n            var _sampleOffset2 = Math.floor((waveL.length - numVert) / 2);\n\n            var _ang2 = Math.PI * 0.5 * fWaveParam2;\n\n            var dx = Math.cos(_ang2);\n            var dy = Math.sin(_ang2);\n            var edgex = [wavePosX * Math.cos(_ang2 + Math.PI * 0.5) - dx * 3.0, wavePosX * Math.cos(_ang2 + Math.PI * 0.5) + dx * 3.0];\n            var edgey = [wavePosX * Math.sin(_ang2 + Math.PI * 0.5) - dy * 3.0, wavePosX * Math.sin(_ang2 + Math.PI * 0.5) + dy * 3.0];\n\n            for (var _i6 = 0; _i6 < 2; _i6++) {\n              for (var j = 0; j < 4; j++) {\n                var t = void 0;\n                var bClip = false;\n\n                switch (j) {\n                  case 0:\n                    if (edgex[_i6] > 1.1) {\n                      t = (1.1 - edgex[1 - _i6]) / (edgex[_i6] - edgex[1 - _i6]);\n                      bClip = true;\n                    }\n\n                    break;\n\n                  case 1:\n                    if (edgex[_i6] < -1.1) {\n                      t = (-1.1 - edgex[1 - _i6]) / (edgex[_i6] - edgex[1 - _i6]);\n                      bClip = true;\n                    }\n\n                    break;\n\n                  case 2:\n                    if (edgey[_i6] > 1.1) {\n                      t = (1.1 - edgey[1 - _i6]) / (edgey[_i6] - edgey[1 - _i6]);\n                      bClip = true;\n                    }\n\n                    break;\n\n                  case 3:\n                    if (edgey[_i6] < -1.1) {\n                      t = (-1.1 - edgey[1 - _i6]) / (edgey[_i6] - edgey[1 - _i6]);\n                      bClip = true;\n                    }\n\n                    break;\n\n                  default:\n                }\n\n                if (bClip) {\n                  var dxi = edgex[_i6] - edgex[1 - _i6];\n                  var dyi = edgey[_i6] - edgey[1 - _i6];\n                  edgex[_i6] = edgex[1 - _i6] + dxi * t;\n                  edgey[_i6] = edgey[1 - _i6] + dyi * t;\n                }\n              }\n            }\n\n            dx = (edgex[1] - edgex[0]) / numVert;\n            dy = (edgey[1] - edgey[0]) / numVert;\n            var ang2 = Math.atan2(dy, dx);\n            var perpDx = Math.cos(ang2 + Math.PI * 0.5);\n            var perpDy = Math.sin(ang2 + Math.PI * 0.5);\n\n            if (waveMode === 6) {\n              for (var _i7 = 0; _i7 < numVert; _i7++) {\n                var sample = waveL[_i7 + _sampleOffset2];\n                positions[_i7 * 3 + 0] = edgex[0] + dx * _i7 + perpDx * 0.25 * sample;\n                positions[_i7 * 3 + 1] = edgey[0] + dy * _i7 + perpDy * 0.25 * sample;\n                positions[_i7 * 3 + 2] = 0;\n              }\n            } else if (waveMode === 7) {\n              var sep = Math.pow(wavePosY * 0.5 + 0.5, 2);\n\n              for (var _i8 = 0; _i8 < numVert; _i8++) {\n                var _sample = waveL[_i8 + _sampleOffset2];\n                positions[_i8 * 3 + 0] = edgex[0] + dx * _i8 + perpDx * (0.25 * _sample + sep);\n                positions[_i8 * 3 + 1] = edgey[0] + dy * _i8 + perpDy * (0.25 * _sample + sep);\n                positions[_i8 * 3 + 2] = 0;\n              }\n\n              for (var _i9 = 0; _i9 < numVert; _i9++) {\n                var _sample2 = waveR[_i9 + _sampleOffset2];\n                positions2[_i9 * 3 + 0] = edgex[0] + dx * _i9 + perpDx * (0.25 * _sample2 - sep);\n                positions2[_i9 * 3 + 1] = edgey[0] + dy * _i9 + perpDy * (0.25 * _sample2 - sep);\n                positions2[_i9 * 3 + 2] = 0;\n              }\n            }\n          }\n\n          if (it === 0) {\n            this.positions = positions;\n            this.positions2 = positions2;\n            this.numVert = numVert;\n            this.alpha = alpha;\n          } else {\n            this.oldPositions = positions;\n            this.oldPositions2 = positions2;\n            this.oldNumVert = numVert;\n            this.oldAlpha = alpha;\n          }\n        }\n\n        var mix = 0.5 - 0.5 * Math.cos(blendProgress * Math.PI);\n        var mix2 = 1 - mix;\n\n        if (this.oldNumVert > 0) {\n          alpha = mix * this.alpha + mix2 * this.oldAlpha;\n        }\n\n        var r = Math.clamp(mdVSFrame.wave_r, 0, 1);\n        var g = Math.clamp(mdVSFrame.wave_g, 0, 1);\n        var b = Math.clamp(mdVSFrame.wave_b, 0, 1);\n\n        if (mdVSFrame.wave_brighten !== 0) {\n          var maxc = Math.max(r, g, b);\n\n          if (maxc > 0.01) {\n            r /= maxc;\n            g /= maxc;\n            b /= maxc;\n          }\n        }\n\n        this.color = [r, g, b, alpha];\n\n        if (this.oldNumVert > 0) {\n          if (newWaveMode === 7) {\n            var m = (this.oldNumVert - 1) / (this.numVert * 2);\n\n            for (var _i10 = 0; _i10 < this.numVert; _i10++) {\n              var fIdx = _i10 * m;\n              var nIdx = Math.floor(fIdx);\n\n              var _t = fIdx - nIdx;\n\n              var _x = this.oldPositions[nIdx * 3 + 0] * (1 - _t) + this.oldPositions[(nIdx + 1) * 3 + 0] * _t;\n\n              var _y = this.oldPositions[nIdx * 3 + 1] * (1 - _t) + this.oldPositions[(nIdx + 1) * 3 + 1] * _t;\n\n              this.positions[_i10 * 3 + 0] = this.positions[_i10 * 3 + 0] * mix + _x * mix2;\n              this.positions[_i10 * 3 + 1] = this.positions[_i10 * 3 + 1] * mix + _y * mix2;\n              this.positions[_i10 * 3 + 2] = 0;\n            }\n\n            for (var _i11 = 0; _i11 < this.numVert; _i11++) {\n              var _fIdx = (_i11 + this.numVert) * m;\n\n              var _nIdx = Math.floor(_fIdx);\n\n              var _t2 = _fIdx - _nIdx;\n\n              var _x2 = this.oldPositions[_nIdx * 3 + 0] * (1 - _t2) + this.oldPositions[(_nIdx + 1) * 3 + 0] * _t2;\n\n              var _y2 = this.oldPositions[_nIdx * 3 + 1] * (1 - _t2) + this.oldPositions[(_nIdx + 1) * 3 + 1] * _t2;\n\n              this.positions2[_i11 * 3 + 0] = this.positions2[_i11 * 3 + 0] * mix + _x2 * mix2;\n              this.positions2[_i11 * 3 + 1] = this.positions2[_i11 * 3 + 1] * mix + _y2 * mix2;\n              this.positions2[_i11 * 3 + 2] = 0;\n            }\n          } else if (oldWaveMode === 7) {\n            var halfNumVert = this.numVert / 2;\n\n            var _m = (this.oldNumVert - 1) / halfNumVert;\n\n            for (var _i12 = 0; _i12 < halfNumVert; _i12++) {\n              var _fIdx2 = _i12 * _m;\n\n              var _nIdx2 = Math.floor(_fIdx2);\n\n              var _t3 = _fIdx2 - _nIdx2;\n\n              var _x3 = this.oldPositions[_nIdx2 * 3 + 0] * (1 - _t3) + this.oldPositions[(_nIdx2 + 1) * 3 + 0] * _t3;\n\n              var _y3 = this.oldPositions[_nIdx2 * 3 + 1] * (1 - _t3) + this.oldPositions[(_nIdx2 + 1) * 3 + 1] * _t3;\n\n              this.positions[_i12 * 3 + 0] = this.positions[_i12 * 3 + 0] * mix + _x3 * mix2;\n              this.positions[_i12 * 3 + 1] = this.positions[_i12 * 3 + 1] * mix + _y3 * mix2;\n              this.positions[_i12 * 3 + 2] = 0;\n            }\n\n            for (var _i13 = 0; _i13 < halfNumVert; _i13++) {\n              var _fIdx3 = _i13 * _m;\n\n              var _nIdx3 = Math.floor(_fIdx3);\n\n              var _t4 = _fIdx3 - _nIdx3;\n\n              var _x4 = this.oldPositions2[_nIdx3 * 3 + 0] * (1 - _t4) + this.oldPositions2[(_nIdx3 + 1) * 3 + 0] * _t4;\n\n              var _y4 = this.oldPositions2[_nIdx3 * 3 + 1] * (1 - _t4) + this.oldPositions2[(_nIdx3 + 1) * 3 + 1] * _t4;\n\n              this.positions2[_i13 * 3 + 0] = this.positions[(_i13 + halfNumVert) * 3 + 0] * mix + _x4 * mix2;\n              this.positions2[_i13 * 3 + 1] = this.positions[(_i13 + halfNumVert) * 3 + 1] * mix + _y4 * mix2;\n              this.positions2[_i13 * 3 + 2] = 0;\n            }\n          } else {\n            var _m2 = (this.oldNumVert - 1) / this.numVert;\n\n            for (var _i14 = 0; _i14 < this.numVert; _i14++) {\n              var _fIdx4 = _i14 * _m2;\n\n              var _nIdx4 = Math.floor(_fIdx4);\n\n              var _t5 = _fIdx4 - _nIdx4;\n\n              var _x5 = this.oldPositions[_nIdx4 * 3 + 0] * (1 - _t5) + this.oldPositions[(_nIdx4 + 1) * 3 + 0] * _t5;\n\n              var _y5 = this.oldPositions[_nIdx4 * 3 + 1] * (1 - _t5) + this.oldPositions[(_nIdx4 + 1) * 3 + 1] * _t5;\n\n              this.positions[_i14 * 3 + 0] = this.positions[_i14 * 3 + 0] * mix + _x5 * mix2;\n              this.positions[_i14 * 3 + 1] = this.positions[_i14 * 3 + 1] * mix + _y5 * mix2;\n              this.positions[_i14 * 3 + 2] = 0;\n            }\n          }\n        }\n\n        for (var _i15 = 0; _i15 < this.numVert; _i15++) {\n          this.positions[_i15 * 3 + 1] = -this.positions[_i15 * 3 + 1];\n        }\n\n        this.smoothedNumVert = this.numVert * 2 - 1;\n        _waveUtils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].smoothWave(this.positions, this.smoothedPositions, this.numVert);\n\n        if (newWaveMode === 7 || oldWaveMode === 7) {\n          for (var _i16 = 0; _i16 < this.numVert; _i16++) {\n            this.positions2[_i16 * 3 + 1] = -this.positions2[_i16 * 3 + 1];\n          }\n\n          _waveUtils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].smoothWave(this.positions2, this.smoothedPositions2, this.numVert);\n        }\n\n        return true;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"drawBasicWaveform\",\n    value: function drawBasicWaveform(blending, blendProgress, timeArrayL, timeArrayR, mdVSFrame) {\n      if (this.generateWaveform(blending, blendProgress, timeArrayL, timeArrayR, mdVSFrame)) {\n        this.gl.useProgram(this.shaderProgram);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, this.smoothedPositions, this.gl.STATIC_DRAW);\n        this.gl.vertexAttribPointer(this.aPosLoc, 3, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aPosLoc);\n        this.gl.uniform4fv(this.colorLoc, this.color);\n        var instances = 1;\n\n        if (mdVSFrame.wave_thick !== 0 || mdVSFrame.wave_dots !== 0) {\n          instances = 4;\n        }\n\n        if (mdVSFrame.additivewave !== 0) {\n          this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE);\n        } else {\n          this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n        }\n\n        var drawMode = mdVSFrame.wave_dots !== 0 ? this.gl.POINTS : this.gl.LINE_STRIP; // TODO: use drawArraysInstanced\n\n        for (var i = 0; i < instances; i++) {\n          var offset = 2;\n\n          if (i === 0) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [0, 0]);\n          } else if (i === 1) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [offset / this.texsizeX, 0]);\n          } else if (i === 2) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [0, offset / this.texsizeY]);\n          } else if (i === 3) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [offset / this.texsizeX, offset / this.texsizeY]);\n          }\n\n          this.gl.drawArrays(drawMode, 0, this.smoothedNumVert);\n        }\n\n        var waveMode = Math.floor(mdVSFrame.wave_mode) % 8;\n\n        if (waveMode === 7) {\n          this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuf);\n          this.gl.bufferData(this.gl.ARRAY_BUFFER, this.smoothedPositions2, this.gl.STATIC_DRAW);\n          this.gl.vertexAttribPointer(this.aPosLoc, 3, this.gl.FLOAT, false, 0, 0);\n          this.gl.enableVertexAttribArray(this.aPosLoc);\n\n          for (var _i17 = 0; _i17 < instances; _i17++) {\n            var _offset = 2;\n\n            if (_i17 === 0) {\n              this.gl.uniform2fv(this.thickOffsetLoc, [0, 0]);\n            } else if (_i17 === 1) {\n              this.gl.uniform2fv(this.thickOffsetLoc, [_offset / this.texsizeX, 0]);\n            } else if (_i17 === 2) {\n              this.gl.uniform2fv(this.thickOffsetLoc, [0, _offset / this.texsizeY]);\n            } else if (_i17 === 3) {\n              this.gl.uniform2fv(this.thickOffsetLoc, [_offset / this.texsizeX, _offset / this.texsizeY]);\n            }\n\n            this.gl.drawArrays(drawMode, 0, this.smoothedNumVert);\n          }\n        }\n      }\n    }\n  }], [{\n    key: \"processWaveform\",\n    value: function processWaveform(timeArray, mdVSFrame) {\n      var waveform = [];\n      var scale = mdVSFrame.wave_scale / 128.0;\n      var smooth = mdVSFrame.wave_smoothing;\n      var smooth2 = scale * (1.0 - smooth);\n      waveform.push(timeArray[0] * scale);\n\n      for (var i = 1; i < timeArray.length; i++) {\n        waveform.push(timeArray[i] * smooth2 + waveform[i - 1] * smooth);\n      }\n\n      return waveform;\n    }\n  }]);\n\n  return BasicWaveform;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/waves/customWaveform.js\":\n/*!***********************************************!*\\\n  !*** ./src/rendering/waves/customWaveform.js ***!\n  \\***********************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_302711__) {\n\n\"use strict\";\n__nested_webpack_require_302711__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_302711__.d(__nested_webpack_exports__, \"default\", function() { return CustomWaveform; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_302711__(/*! ../../utils */ \"./src/utils.js\");\n/* harmony import */ var _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_302711__(/*! ../shaders/shaderUtils */ \"./src/rendering/shaders/shaderUtils.js\");\n/* harmony import */ var _waveUtils__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_302711__(/*! ./waveUtils */ \"./src/rendering/waves/waveUtils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar CustomWaveform =\n/*#__PURE__*/\nfunction () {\n  function CustomWaveform(index, gl, opts) {\n    _classCallCheck(this, CustomWaveform);\n\n    this.index = index;\n    this.gl = gl;\n    var maxSamples = 512;\n    this.pointsData = [new Float32Array(maxSamples), new Float32Array(maxSamples)];\n    this.positions = new Float32Array(maxSamples * 3);\n    this.colors = new Float32Array(maxSamples * 4);\n    this.smoothedPositions = new Float32Array((maxSamples * 2 - 1) * 3);\n    this.smoothedColors = new Float32Array((maxSamples * 2 - 1) * 4);\n    this.texsizeX = opts.texsizeX;\n    this.texsizeY = opts.texsizeY;\n    this.mesh_width = opts.mesh_width;\n    this.mesh_height = opts.mesh_height;\n    this.aspectx = opts.aspectx;\n    this.aspecty = opts.aspecty;\n    this.invAspectx = 1.0 / this.aspectx;\n    this.invAspecty = 1.0 / this.aspecty;\n    this.positionVertexBuf = this.gl.createBuffer();\n    this.colorVertexBuf = this.gl.createBuffer();\n    this.floatPrecision = _shaders_shaderUtils__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getFragmentFloatPrecision(this.gl);\n    this.createShader();\n  }\n\n  _createClass(CustomWaveform, [{\n    key: \"updateGlobals\",\n    value: function updateGlobals(opts) {\n      this.texsizeX = opts.texsizeX;\n      this.texsizeY = opts.texsizeY;\n      this.mesh_width = opts.mesh_width;\n      this.mesh_height = opts.mesh_height;\n      this.aspectx = opts.aspectx;\n      this.aspecty = opts.aspecty;\n      this.invAspectx = 1.0 / this.aspectx;\n      this.invAspecty = 1.0 / this.aspecty;\n    }\n  }, {\n    key: \"createShader\",\n    value: function createShader() {\n      this.shaderProgram = this.gl.createProgram();\n      var vertShader = this.gl.createShader(this.gl.VERTEX_SHADER);\n      this.gl.shaderSource(vertShader, \"#version 300 es\\n                                      uniform float uSize;\\n                                      uniform vec2 thickOffset;\\n                                      in vec3 aPos;\\n                                      in vec4 aColor;\\n                                      out vec4 vColor;\\n                                      void main(void) {\\n                                        vColor = aColor;\\n                                        gl_PointSize = uSize;\\n                                        gl_Position = vec4(aPos + vec3(thickOffset, 0.0), 1.0);\\n                                      }\");\n      this.gl.compileShader(vertShader);\n      var fragShader = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n      this.gl.shaderSource(fragShader, \"#version 300 es\\n                                      precision \".concat(this.floatPrecision, \" float;\\n                                      precision highp int;\\n                                      precision mediump sampler2D;\\n                                      in vec4 vColor;\\n                                      out vec4 fragColor;\\n                                      void main(void) {\\n                                        fragColor = vColor;\\n                                      }\"));\n      this.gl.compileShader(fragShader);\n      this.gl.attachShader(this.shaderProgram, vertShader);\n      this.gl.attachShader(this.shaderProgram, fragShader);\n      this.gl.linkProgram(this.shaderProgram);\n      this.aPosLocation = this.gl.getAttribLocation(this.shaderProgram, 'aPos');\n      this.aColorLocation = this.gl.getAttribLocation(this.shaderProgram, 'aColor');\n      this.sizeLoc = this.gl.getUniformLocation(this.shaderProgram, 'uSize');\n      this.thickOffsetLoc = this.gl.getUniformLocation(this.shaderProgram, 'thickOffset');\n    }\n  }, {\n    key: \"generateWaveform\",\n    value: function generateWaveform(timeArrayL, timeArrayR, freqArrayL, freqArrayR, globalVars, presetEquationRunner, waveEqs, alphaMult) {\n      if (waveEqs.baseVals.enabled !== 0 && timeArrayL.length > 0) {\n        var mdVSWave = Object.assign({}, presetEquationRunner.mdVSWaves[this.index], presetEquationRunner.mdVSFrameMapWaves[this.index], presetEquationRunner.mdVSQAfterFrame, presetEquationRunner.mdVSTWaveInits[this.index], globalVars);\n        var mdVSWaveFrame = waveEqs.frame_eqs(mdVSWave);\n        var maxSamples = 512;\n\n        if (Object.prototype.hasOwnProperty.call(mdVSWaveFrame, 'samples')) {\n          this.samples = mdVSWaveFrame.samples;\n        } else {\n          this.samples = maxSamples;\n        }\n\n        if (this.samples > maxSamples) {\n          this.samples = maxSamples;\n        }\n\n        this.samples = Math.floor(this.samples);\n        var sep = Math.floor(mdVSWaveFrame.sep);\n        var scaling = mdVSWaveFrame.scaling;\n        var spectrum = mdVSWaveFrame.spectrum;\n        var smoothing = mdVSWaveFrame.smoothing;\n        var usedots = mdVSWaveFrame.usedots;\n        var frameR = mdVSWaveFrame.r;\n        var frameG = mdVSWaveFrame.g;\n        var frameB = mdVSWaveFrame.b;\n        var frameA = mdVSWaveFrame.a;\n        var waveScale = presetEquationRunner.mdVS.wave_scale;\n        this.samples -= sep;\n\n        if (this.samples >= 2 || usedots !== 0 && this.samples >= 1) {\n          var useSpectrum = spectrum !== 0;\n          var scale = (useSpectrum ? 0.15 : 0.004) * scaling * waveScale;\n          var pointsLeft = useSpectrum ? freqArrayL : timeArrayL;\n          var pointsRight = useSpectrum ? freqArrayR : timeArrayR;\n          var j0 = useSpectrum ? 0 : Math.floor((maxSamples - this.samples) / 2 - sep / 2);\n          var j1 = useSpectrum ? 0 : Math.floor((maxSamples - this.samples) / 2 + sep / 2);\n          var t = useSpectrum ? (maxSamples - sep) / this.samples : 1;\n          var mix1 = Math.pow(smoothing * 0.98, 0.5);\n          var mix2 = 1 - mix1; // Milkdrop smooths waveform forward, backward and then scales\n\n          this.pointsData[0][0] = pointsLeft[j0];\n          this.pointsData[1][0] = pointsRight[j1];\n\n          for (var j = 1; j < this.samples; j++) {\n            var left = pointsLeft[Math.floor(j * t + j0)];\n            var right = pointsRight[Math.floor(j * t + j1)];\n            this.pointsData[0][j] = left * mix2 + this.pointsData[0][j - 1] * mix1;\n            this.pointsData[1][j] = right * mix2 + this.pointsData[1][j - 1] * mix1;\n          }\n\n          for (var _j = this.samples - 2; _j >= 0; _j--) {\n            this.pointsData[0][_j] = this.pointsData[0][_j] * mix2 + this.pointsData[0][_j + 1] * mix1;\n            this.pointsData[1][_j] = this.pointsData[1][_j] * mix2 + this.pointsData[1][_j + 1] * mix1;\n          }\n\n          for (var _j2 = 0; _j2 < this.samples; _j2++) {\n            this.pointsData[0][_j2] *= scale;\n            this.pointsData[1][_j2] *= scale;\n          }\n\n          for (var _j3 = 0; _j3 < this.samples; _j3++) {\n            var value1 = this.pointsData[0][_j3];\n            var value2 = this.pointsData[1][_j3];\n            mdVSWaveFrame.sample = _j3 / (this.samples - 1);\n            mdVSWaveFrame.value1 = value1;\n            mdVSWaveFrame.value2 = value2;\n            mdVSWaveFrame.x = 0.5 + value1;\n            mdVSWaveFrame.y = 0.5 + value2;\n            mdVSWaveFrame.r = frameR;\n            mdVSWaveFrame.g = frameG;\n            mdVSWaveFrame.b = frameB;\n            mdVSWaveFrame.a = frameA;\n\n            if (waveEqs.point_eqs !== '') {\n              mdVSWaveFrame = waveEqs.point_eqs(mdVSWaveFrame);\n            }\n\n            var x = (mdVSWaveFrame.x * 2 - 1) * this.invAspectx;\n            var y = (mdVSWaveFrame.y * -2 + 1) * this.invAspecty;\n            var r = mdVSWaveFrame.r;\n            var g = mdVSWaveFrame.g;\n            var b = mdVSWaveFrame.b;\n            var a = mdVSWaveFrame.a;\n            this.positions[_j3 * 3 + 0] = x;\n            this.positions[_j3 * 3 + 1] = y;\n            this.positions[_j3 * 3 + 2] = 0;\n            this.colors[_j3 * 4 + 0] = r;\n            this.colors[_j3 * 4 + 1] = g;\n            this.colors[_j3 * 4 + 2] = b;\n            this.colors[_j3 * 4 + 3] = a * alphaMult;\n          } // this needs to be after per point (check fishbrain - witchcraft)\n\n\n          var mdvsUserKeysWave = presetEquationRunner.mdVSUserKeysWaves[this.index];\n          var mdVSNewFrameMapWave = _utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pick(mdVSWaveFrame, mdvsUserKeysWave); // eslint-disable-next-line no-param-reassign\n\n          presetEquationRunner.mdVSFrameMapWaves[this.index] = mdVSNewFrameMapWave;\n          this.mdVSWaveFrame = mdVSWaveFrame;\n\n          if (usedots === 0) {\n            _waveUtils__WEBPACK_IMPORTED_MODULE_2__[\"default\"].smoothWaveAndColor(this.positions, this.colors, this.smoothedPositions, this.smoothedColors, this.samples);\n          }\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }, {\n    key: \"drawCustomWaveform\",\n    value: function drawCustomWaveform(blendProgress, timeArrayL, timeArrayR, freqArrayL, freqArrayR, globalVars, presetEquationRunner, waveEqs) {\n      if (waveEqs && this.generateWaveform(timeArrayL, timeArrayR, freqArrayL, freqArrayR, globalVars, presetEquationRunner, waveEqs, blendProgress)) {\n        this.gl.useProgram(this.shaderProgram);\n        var waveUseDots = this.mdVSWaveFrame.usedots !== 0;\n        var waveThick = this.mdVSWaveFrame.thick !== 0;\n        var waveAdditive = this.mdVSWaveFrame.additive !== 0;\n        var positions;\n        var colors;\n        var numVerts;\n\n        if (!waveUseDots) {\n          positions = this.smoothedPositions;\n          colors = this.smoothedColors;\n          numVerts = this.samples * 2 - 1;\n        } else {\n          positions = this.positions;\n          colors = this.colors;\n          numVerts = this.samples;\n        }\n\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionVertexBuf);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, positions, this.gl.STATIC_DRAW);\n        this.gl.vertexAttribPointer(this.aPosLocation, 3, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aPosLocation);\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.colorVertexBuf);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, colors, this.gl.STATIC_DRAW);\n        this.gl.vertexAttribPointer(this.aColorLocation, 4, this.gl.FLOAT, false, 0, 0);\n        this.gl.enableVertexAttribArray(this.aColorLocation);\n        var instances = 1;\n\n        if (waveUseDots) {\n          if (waveThick) {\n            this.gl.uniform1f(this.sizeLoc, 2 + (this.texsizeX >= 1024 ? 1 : 0));\n          } else {\n            this.gl.uniform1f(this.sizeLoc, 1 + (this.texsizeX >= 1024 ? 1 : 0));\n          }\n        } else {\n          this.gl.uniform1f(this.sizeLoc, 1);\n\n          if (waveThick) {\n            instances = 4;\n          }\n        }\n\n        if (waveAdditive) {\n          this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE);\n        } else {\n          this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n        }\n\n        var drawMode = waveUseDots ? this.gl.POINTS : this.gl.LINE_STRIP; // TODO: use drawArraysInstanced\n\n        for (var i = 0; i < instances; i++) {\n          var offset = 2;\n\n          if (i === 0) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [0, 0]);\n          } else if (i === 1) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [offset / this.texsizeX, 0]);\n          } else if (i === 2) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [0, offset / this.texsizeY]);\n          } else if (i === 3) {\n            this.gl.uniform2fv(this.thickOffsetLoc, [offset / this.texsizeX, offset / this.texsizeY]);\n          }\n\n          this.gl.drawArrays(drawMode, 0, numVerts);\n        }\n      }\n    }\n  }]);\n\n  return CustomWaveform;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/rendering/waves/waveUtils.js\":\n/*!******************************************!*\\\n  !*** ./src/rendering/waves/waveUtils.js ***!\n  \\******************************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_315816__) {\n\n\"use strict\";\n__nested_webpack_require_315816__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_315816__.d(__nested_webpack_exports__, \"default\", function() { return WaveUtils; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar WaveUtils =\n/*#__PURE__*/\nfunction () {\n  function WaveUtils() {\n    _classCallCheck(this, WaveUtils);\n  }\n\n  _createClass(WaveUtils, null, [{\n    key: \"smoothWave\",\n\n    /* eslint-disable no-param-reassign */\n    value: function smoothWave(positions, positionsSmoothed, nVertsIn) {\n      var zCoord = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n      var c1 = -0.15;\n      var c2 = 1.15;\n      var c3 = 1.15;\n      var c4 = -0.15;\n      var invSum = 1.0 / (c1 + c2 + c3 + c4);\n      var j = 0;\n      var iBelow = 0;\n      var iAbove;\n      var iAbove2 = 1;\n\n      for (var i = 0; i < nVertsIn - 1; i++) {\n        iAbove = iAbove2;\n        iAbove2 = Math.min(nVertsIn - 1, i + 2);\n\n        for (var k = 0; k < 3; k++) {\n          positionsSmoothed[j * 3 + k] = positions[i * 3 + k];\n        }\n\n        if (zCoord) {\n          for (var _k = 0; _k < 3; _k++) {\n            positionsSmoothed[(j + 1) * 3 + _k] = (c1 * positions[iBelow * 3 + _k] + c2 * positions[i * 3 + _k] + c3 * positions[iAbove * 3 + _k] + c4 * positions[iAbove2 * 3 + _k]) * invSum;\n          }\n        } else {\n          for (var _k2 = 0; _k2 < 2; _k2++) {\n            positionsSmoothed[(j + 1) * 3 + _k2] = (c1 * positions[iBelow * 3 + _k2] + c2 * positions[i * 3 + _k2] + c3 * positions[iAbove * 3 + _k2] + c4 * positions[iAbove2 * 3 + _k2]) * invSum;\n          }\n\n          positionsSmoothed[(j + 1) * 3 + 2] = 0;\n        }\n\n        iBelow = i;\n        j += 2;\n      }\n\n      for (var _k3 = 0; _k3 < 3; _k3++) {\n        positionsSmoothed[j * 3 + _k3] = positions[(nVertsIn - 1) * 3 + _k3];\n      }\n    }\n  }, {\n    key: \"smoothWaveAndColor\",\n    value: function smoothWaveAndColor(positions, colors, positionsSmoothed, colorsSmoothed, nVertsIn) {\n      var zCoord = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n      var c1 = -0.15;\n      var c2 = 1.15;\n      var c3 = 1.15;\n      var c4 = -0.15;\n      var invSum = 1.0 / (c1 + c2 + c3 + c4);\n      var j = 0;\n      var iBelow = 0;\n      var iAbove;\n      var iAbove2 = 1;\n\n      for (var i = 0; i < nVertsIn - 1; i++) {\n        iAbove = iAbove2;\n        iAbove2 = Math.min(nVertsIn - 1, i + 2);\n\n        for (var k = 0; k < 3; k++) {\n          positionsSmoothed[j * 3 + k] = positions[i * 3 + k];\n        }\n\n        if (zCoord) {\n          for (var _k4 = 0; _k4 < 3; _k4++) {\n            positionsSmoothed[(j + 1) * 3 + _k4] = (c1 * positions[iBelow * 3 + _k4] + c2 * positions[i * 3 + _k4] + c3 * positions[iAbove * 3 + _k4] + c4 * positions[iAbove2 * 3 + _k4]) * invSum;\n          }\n        } else {\n          for (var _k5 = 0; _k5 < 2; _k5++) {\n            positionsSmoothed[(j + 1) * 3 + _k5] = (c1 * positions[iBelow * 3 + _k5] + c2 * positions[i * 3 + _k5] + c3 * positions[iAbove * 3 + _k5] + c4 * positions[iAbove2 * 3 + _k5]) * invSum;\n          }\n\n          positionsSmoothed[(j + 1) * 3 + 2] = 0;\n        }\n\n        for (var _k6 = 0; _k6 < 4; _k6++) {\n          colorsSmoothed[j * 4 + _k6] = colors[i * 4 + _k6];\n          colorsSmoothed[(j + 1) * 4 + _k6] = colors[i * 4 + _k6];\n        }\n\n        iBelow = i;\n        j += 2;\n      }\n\n      for (var _k7 = 0; _k7 < 3; _k7++) {\n        positionsSmoothed[j * 3 + _k7] = positions[(nVertsIn - 1) * 3 + _k7];\n      }\n\n      for (var _k8 = 0; _k8 < 4; _k8++) {\n        colorsSmoothed[j * 4 + _k8] = colors[(nVertsIn - 1) * 4 + _k8];\n      }\n    }\n    /* eslint-enable no-param-reassign */\n\n  }]);\n\n  return WaveUtils;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/utils.js\":\n/*!**********************!*\\\n  !*** ./src/utils.js ***!\n  \\**********************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_320376__) {\n\n\"use strict\";\n__nested_webpack_require_320376__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_320376__.d(__nested_webpack_exports__, \"default\", function() { return Utils; });\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Utils =\n/*#__PURE__*/\nfunction () {\n  function Utils() {\n    _classCallCheck(this, Utils);\n  }\n\n  _createClass(Utils, null, [{\n    key: \"atan2\",\n    value: function atan2(x, y) {\n      var a = Math.atan2(x, y);\n\n      if (a < 0) {\n        a += 2 * Math.PI;\n      }\n\n      return a;\n    }\n  }, {\n    key: \"cloneVars\",\n    value: function cloneVars(vars) {\n      return Object.assign({}, vars);\n    }\n  }, {\n    key: \"range\",\n    value: function range(start, end) {\n      if (end === undefined) {\n        return _toConsumableArray(Array(start).keys());\n      }\n\n      return Array.from({\n        length: end - start\n      }, function (_, i) {\n        return i + start;\n      });\n    }\n  }, {\n    key: \"pick\",\n    value: function pick(obj, keys) {\n      var newObj = {};\n\n      for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        newObj[key] = obj[key];\n      }\n\n      return newObj;\n    }\n  }, {\n    key: \"omit\",\n    value: function omit(obj, keys) {\n      var newObj = Object.assign({}, obj);\n\n      for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        delete newObj[key];\n      }\n\n      return newObj;\n    }\n  }]);\n\n  return Utils;\n}();\n\n\n\n/***/ }),\n\n/***/ \"./src/visualizer.js\":\n/*!***************************!*\\\n  !*** ./src/visualizer.js ***!\n  \\***************************/\n/*! exports provided: default */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_323228__) {\n\n\"use strict\";\n__nested_webpack_require_323228__.r(__nested_webpack_exports__);\n/* harmony export (binding) */ __nested_webpack_require_323228__.d(__nested_webpack_exports__, \"default\", function() { return Visualizer; });\n/* harmony import */ var _audio_audioProcessor__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_323228__(/*! ./audio/audioProcessor */ \"./src/audio/audioProcessor.js\");\n/* harmony import */ var _rendering_renderer__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_323228__(/*! ./rendering/renderer */ \"./src/rendering/renderer.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar Visualizer =\n/*#__PURE__*/\nfunction () {\n  function Visualizer(audioContext, canvas, opts) {\n    _classCallCheck(this, Visualizer);\n\n    this.audio = new _audio_audioProcessor__WEBPACK_IMPORTED_MODULE_0__[\"default\"](audioContext);\n    var gl = canvas.getContext('webgl2', {\n      alpha: false,\n      antialias: false,\n      depth: false,\n      stencil: false,\n      premultipliedAlpha: false\n    });\n    this.baseValsDefaults = {\n      decay: 0.98,\n      gammaadj: 2,\n      echo_zoom: 2,\n      echo_alpha: 0,\n      echo_orient: 0,\n      red_blue: 0,\n      brighten: 0,\n      darken: 0,\n      wrap: 1,\n      darken_center: 0,\n      solarize: 0,\n      invert: 0,\n      fshader: 0,\n      b1n: 0,\n      b2n: 0,\n      b3n: 0,\n      b1x: 1,\n      b2x: 1,\n      b3x: 1,\n      b1ed: 0.25,\n      wave_mode: 0,\n      additivewave: 0,\n      wave_dots: 0,\n      wave_thick: 0,\n      wave_a: 0.8,\n      wave_scale: 1,\n      wave_smoothing: 0.75,\n      wave_mystery: 0,\n      modwavealphabyvolume: 0,\n      modwavealphastart: 0.75,\n      modwavealphaend: 0.95,\n      wave_r: 1,\n      wave_g: 1,\n      wave_b: 1,\n      wave_x: 0.5,\n      wave_y: 0.5,\n      wave_brighten: 1,\n      mv_x: 12,\n      mv_y: 9,\n      mv_dx: 0,\n      mv_dy: 0,\n      mv_l: 0.9,\n      mv_r: 1,\n      mv_g: 1,\n      mv_b: 1,\n      mv_a: 1,\n      warpanimspeed: 1,\n      warpscale: 1,\n      zoomexp: 1,\n      zoom: 1,\n      rot: 0,\n      cx: 0.5,\n      cy: 0.5,\n      dx: 0,\n      dy: 0,\n      warp: 1,\n      sx: 1,\n      sy: 1,\n      ob_size: 0.01,\n      ob_r: 0,\n      ob_g: 0,\n      ob_b: 0,\n      ob_a: 0,\n      ib_size: 0.01,\n      ib_r: 0.25,\n      ib_g: 0.25,\n      ib_b: 0.25,\n      ib_a: 0\n    };\n    this.shapeBaseValsDefaults = {\n      enabled: 0,\n      sides: 4,\n      additive: 0,\n      thickoutline: 0,\n      textured: 0,\n      num_inst: 1,\n      tex_zoom: 1,\n      tex_ang: 0,\n      x: 0.5,\n      y: 0.5,\n      rad: 0.1,\n      ang: 0,\n      r: 1,\n      g: 0,\n      b: 0,\n      a: 1,\n      r2: 0,\n      g2: 1,\n      b2: 0,\n      a2: 0,\n      border_r: 1,\n      border_g: 1,\n      border_b: 1,\n      border_a: 0.1\n    };\n    this.waveBaseValsDefaults = {\n      enabled: 0,\n      samples: 512,\n      sep: 0,\n      scaling: 1,\n      smoothing: 0.5,\n      r: 1,\n      g: 1,\n      b: 1,\n      a: 1,\n      spectrum: 0,\n      usedots: 0,\n      thick: 0,\n      additive: 0\n    };\n    this.renderer = new _rendering_renderer__WEBPACK_IMPORTED_MODULE_1__[\"default\"](gl, this.audio, opts);\n  }\n\n  _createClass(Visualizer, [{\n    key: \"connectAudio\",\n    value: function connectAudio(audioNode) {\n      this.audioNode = audioNode;\n      this.audio.connectAudio(audioNode);\n    }\n  }, {\n    key: \"disconnectAudio\",\n    value: function disconnectAudio(audioNode) {\n      this.audio.disconnectAudio(audioNode);\n    }\n  }, {\n    key: \"loadPreset\",\n    value: function loadPreset(presetMap) {\n      var blendTime = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var preset = Object.assign({}, presetMap);\n      preset.baseVals = Object.assign({}, this.baseValsDefaults, preset.baseVals);\n\n      for (var i = 0; i < preset.shapes.length; i++) {\n        preset.shapes[i].baseVals = Object.assign({}, this.shapeBaseValsDefaults, preset.shapes[i].baseVals);\n      }\n\n      for (var _i = 0; _i < preset.waves.length; _i++) {\n        preset.waves[_i].baseVals = Object.assign({}, this.waveBaseValsDefaults, preset.waves[_i].baseVals);\n      }\n\n      if (typeof preset.init_eqs !== 'function') {\n        /* eslint-disable no-param-reassign, no-new-func */\n        preset.init_eqs = new Function('a', \"\".concat(preset.init_eqs_str, \" return a;\"));\n        preset.frame_eqs = new Function('a', \"\".concat(preset.frame_eqs_str, \" return a;\"));\n\n        if (preset.pixel_eqs_str && preset.pixel_eqs_str !== '') {\n          preset.pixel_eqs = new Function('a', \"\".concat(preset.pixel_eqs_str, \" return a;\"));\n        } else {\n          preset.pixel_eqs = '';\n        }\n\n        for (var _i2 = 0; _i2 < preset.shapes.length; _i2++) {\n          if (preset.shapes[_i2].baseVals.enabled !== 0) {\n            preset.shapes[_i2] = Object.assign({}, preset.shapes[_i2], {\n              init_eqs: new Function('a', \"\".concat(preset.shapes[_i2].init_eqs_str, \" return a;\")),\n              frame_eqs: new Function('a', \"\".concat(preset.shapes[_i2].frame_eqs_str, \" return a;\"))\n            });\n          }\n        }\n\n        for (var _i3 = 0; _i3 < preset.waves.length; _i3++) {\n          if (preset.waves[_i3].baseVals.enabled !== 0) {\n            var wave = {\n              init_eqs: new Function('a', \"\".concat(preset.waves[_i3].init_eqs_str, \" return a;\")),\n              frame_eqs: new Function('a', \"\".concat(preset.waves[_i3].frame_eqs_str, \" return a;\"))\n            };\n\n            if (preset.waves[_i3].point_eqs_str && preset.waves[_i3].point_eqs_str !== '') {\n              wave.point_eqs = new Function('a', \"\".concat(preset.waves[_i3].point_eqs_str, \" return a;\"));\n            } else {\n              wave.point_eqs = '';\n            }\n\n            preset.waves[_i3] = Object.assign({}, preset.waves[_i3], wave);\n          }\n        }\n        /* eslint-enable no-param-reassign, no-new-func */\n\n      }\n\n      this.renderer.loadPreset(preset, blendTime);\n    }\n  }, {\n    key: \"loadExtraImages\",\n    value: function loadExtraImages(imageData) {\n      this.renderer.loadExtraImages(imageData);\n    }\n  }, {\n    key: \"setRendererSize\",\n    value: function setRendererSize(width, height) {\n      var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      this.renderer.setRendererSize(width, height, opts);\n    }\n  }, {\n    key: \"setInternalMeshSize\",\n    value: function setInternalMeshSize(width, height) {\n      this.renderer.setInternalMeshSize(width, height);\n    }\n  }, {\n    key: \"setOutputAA\",\n    value: function setOutputAA(useAA) {\n      this.renderer.setOutputAA(useAA);\n    }\n  }, {\n    key: \"render\",\n    value: function render(opts) {\n      this.renderer.render(opts);\n    }\n  }, {\n    key: \"launchSongTitleAnim\",\n    value: function launchSongTitleAnim(text) {\n      this.renderer.launchSongTitleAnim(text);\n    }\n  }, {\n    key: \"toDataURL\",\n    value: function toDataURL() {\n      return this.renderer.toDataURL();\n    }\n  }, {\n    key: \"warpBufferToDataURL\",\n    value: function warpBufferToDataURL() {\n      return this.renderer.warpBufferToDataURL();\n    }\n  }]);\n\n  return Visualizer;\n}();\n\n\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=butterchurn.js.map\n\n/***/ }),\n\n/***/ 2394:\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"pack\": () => (/* binding */ byte_data_pack),\n  \"packArray\": () => (/* binding */ packArray),\n  \"packArrayTo\": () => (/* binding */ packArrayTo),\n  \"packString\": () => (/* binding */ packString),\n  \"packStringTo\": () => (/* binding */ packStringTo),\n  \"packTo\": () => (/* binding */ packTo),\n  \"unpack\": () => (/* binding */ byte_data_unpack),\n  \"unpackArray\": () => (/* binding */ unpackArray),\n  \"unpackArrayTo\": () => (/* binding */ unpackArrayTo),\n  \"unpackString\": () => (/* binding */ unpackString)\n});\n\n;// CONCATENATED MODULE: ../../node_modules/endianness/endianness.js\n/*\n * Copyright (c) 2017-2018 Rafael da Silva Rocha.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n/**\n * @fileoverview A function to swap endianness in byte buffers.\n * @see https://github.com/rochars/endianness\n */\n\n/** @module endianness */\n\n/**\n * Swap the byte ordering in a buffer. The buffer is modified in place.\n * @param {!Array|!Uint8Array} bytes The bytes.\n * @param {number} offset The byte offset.\n * @param {number=} start The start index. Assumes 0.\n * @param {number=} end The end index. Assumes the buffer length.\n * @throws {Error} If the buffer length is not valid.\n */\nfunction endianness(bytes, offset, start=0, end=bytes.length) {\n  if (end % offset) {\n    throw new Error(\"Bad buffer length.\");\n  }\n  for (let index = start; index < end; index += offset) {\n    swap(bytes, offset, index);\n  }\n}\n\n/**\n * Swap the byte order of a value in a buffer. The buffer is modified in place.\n * @param {!Array|!Uint8Array} bytes The bytes.\n * @param {number} offset The byte offset.\n * @param {number} index The start index.\n * @private\n */\nfunction swap(bytes, offset, index) {\n  offset--;\n  for(let x = 0; x < offset; x++) {\n    /** @type {*} */\n    let theByte = bytes[index + x];\n    bytes[index + x] = bytes[index + offset];\n    bytes[index + offset] = theByte;\n    offset--;\n  }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/utf8-buffer/index.js\n/*\n * Copyright (c) 2018 Rafael da Silva Rocha.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n/**\n * @fileoverview Functions to serialize and deserialize UTF-8 strings.\n * @see https://github.com/rochars/utf8-buffer\n * @see https://encoding.spec.whatwg.org/#the-encoding\n * @see https://encoding.spec.whatwg.org/#utf-8-encoder\n */\n\n/** @module utf8-buffer */\n\n/**\n * Read a string of UTF-8 characters from a byte buffer.\n * Invalid characters are replaced with 'REPLACEMENT CHARACTER' (U+FFFD).\n * @see https://encoding.spec.whatwg.org/#the-encoding\n * @see https://stackoverflow.com/a/34926911\n * @param {!Uint8Array|!Array<number>} buffer A byte buffer.\n * @param {number=} start The buffer index to start reading.\n * @param {?number=} end The buffer index to stop reading.\n *   Assumes the buffer length if undefined.\n * @return {string}\n */\nfunction unpack(buffer, start=0, end=buffer.length) {\n  /** @type {string} */\n  let str = '';\n  for(let index = start; index < end;) {\n    /** @type {number} */\n    let lowerBoundary = 0x80;\n    /** @type {number} */\n    let upperBoundary = 0xBF;\n    /** @type {boolean} */\n    let replace = false;\n    /** @type {number} */\n    let charCode = buffer[index++];\n    if (charCode >= 0x00 && charCode <= 0x7F) {\n      str += String.fromCharCode(charCode);\n    } else {\n      /** @type {number} */\n      let count = 0;\n      if (charCode >= 0xC2 && charCode <= 0xDF) {\n        count = 1;\n      } else if (charCode >= 0xE0 && charCode <= 0xEF ) {\n        count = 2;\n        if (buffer[index] === 0xE0) {\n          lowerBoundary = 0xA0;\n        }\n        if (buffer[index] === 0xED) {\n          upperBoundary = 0x9F;\n        }\n      } else if (charCode >= 0xF0 && charCode <= 0xF4 ) {\n        count = 3;\n        if (buffer[index] === 0xF0) {\n          lowerBoundary = 0x90;\n        }\n        if (buffer[index] === 0xF4) {\n          upperBoundary = 0x8F;\n        }\n      } else {\n        replace = true;\n      }\n      charCode = charCode & (1 << (8 - count - 1)) - 1;\n      for (let i = 0; i < count; i++) {\n        if (buffer[index] < lowerBoundary || buffer[index] > upperBoundary) {\n          replace = true;\n        }\n        charCode = (charCode << 6) | (buffer[index] & 0x3f);\n        index++;\n      }\n      if (replace) {\n        str += String.fromCharCode(0xFFFD);\n      } \n      else if (charCode <= 0xffff) {\n        str += String.fromCharCode(charCode);\n      } else {\n        charCode -= 0x10000;\n        str += String.fromCharCode(\n          ((charCode >> 10) & 0x3ff) + 0xd800,\n          (charCode & 0x3ff) + 0xdc00);\n      }\n    }\n  }\n  return str;\n}\n\n/**\n * Write a string of UTF-8 characters to a byte buffer.\n * @see https://encoding.spec.whatwg.org/#utf-8-encoder\n * @param {string} str The string to pack.\n * @param {!Uint8Array|!Array<number>} buffer The buffer to pack the string to.\n * @param {number=} index The buffer index to start writing.\n * @return {number} The next index to write in the buffer.\n */\nfunction pack(str, buffer, index=0) {\n  for (let i = 0, len = str.length; i < len; i++) {\n    /** @type {number} */\n    let codePoint = str.codePointAt(i);\n    if (codePoint < 128) {\n      buffer[index] = codePoint;\n      index++;\n    } else {\n      /** @type {number} */\n      let count = 0;\n      /** @type {number} */\n      let offset = 0;\n      if (codePoint <= 0x07FF) {\n        count = 1;\n        offset = 0xC0;\n      } else if(codePoint <= 0xFFFF) {\n        count = 2;\n        offset = 0xE0;\n      } else if(codePoint <= 0x10FFFF) {\n        count = 3;\n        offset = 0xF0;\n        i++;\n      }\n      buffer[index] = (codePoint >> (6 * count)) + offset;\n      index++;\n      while (count > 0) {\n        buffer[index] = 0x80 | (codePoint >> (6 * (count - 1)) & 0x3F);\n        index++;\n        count--;\n      }\n    }\n  }\n  return index;\n}\n\n;// CONCATENATED MODULE: ../../node_modules/byte-data/lib/int-parser.js\n/*\n * Copyright (c) 2017-2018 Rafael da Silva Rocha.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n/**\n * @fileoverview Encode and decode int numbers to and from byte buffers.\n * @see https://github.com/rochars/byte-data\n */\n\n/**\n * A class to write and read integer numbers to and from byte buffers.\n */\nclass IntParser {\n  \n  /**\n   * @param {number} bits The number of bits used by the integer.\n   * @param {boolean} [signed=false] True for signed, false otherwise.\n   * @param {boolean} [clamp=false] True to clamp on overflow.\n   */\n  constructor(bits, signed=false, clamp=false) {\n    /**\n     * The number of bits used by one number.\n     * @type {number}\n     */\n    this.bits = bits;\n    /**\n     * The number of bytes used by one number.\n     * @type {number}\n     */\n    this.bytes = bits < 8 ? 1 : Math.ceil(bits / 8);\n    /**\n     * @type {number}\n     * @protected\n     */\n    this.max = Math.pow(2, bits) - 1;\n    /**\n     * @type {number}\n     * @protected\n     */\n    this.min = 0;\n    /** @type {number} */\n    let r = 8 - ((((bits - 1) | 7) + 1) - bits);\n    /**\n     * @type {number}\n     * @private\n     */\n    this.lastByteMask_ = Math.pow(2, r > 0 ? r : 8) - 1;\n    /**\n     * @type {Function}\n     * @protected\n     */\n    this.unpack = this.unpackUnsigned_;\n    if (signed) {\n      this.max = Math.pow(2, bits) / 2 - 1;\n      this.min = -this.max - 1;\n      this.unpack = this.unpackSigned_;\n    }\n    if (clamp) {\n      this.overflow_ = this.overflowClamp_;\n    }\n  }\n\n  /**\n   * Write one unsigned integer to a byte buffer.\n   * @param {!(Uint8Array|Array<number>)} buffer An array of bytes.\n   * @param {number} num The number. Overflows are truncated.\n   * @param {number} [index=0] The index being written in the byte buffer.\n   * @return {number} The next index to write on the byte buffer.\n   */\n  pack(buffer, num, index=0) {\n    if (num !== num || num.constructor != Number) {\n      throw new TypeError();\n    }\n    num = this.overflow_(num);\n    buffer[index] = (num < 0 ? num + Math.pow(2, this.bits) : num) & 255;\n    index++;\n    for (let i = 2, len = this.bytes; i < len; i++) {\n      buffer[index] = Math.floor(num / Math.pow(2, ((i - 1) * 8))) & 255;\n      index++;\n    }\n    if (this.bits > 8) {\n      buffer[index] = Math.floor(\n        num / Math.pow(2, ((this.bytes - 1) * 8))) & this.lastByteMask_;\n      index++;\n    }\n    return index;\n  }\n\n  /**\n   * Read one unsigned integer from a byte buffer.\n   * Does not check for overflows.\n   * @param {!(Uint8Array|Array<number>)} buffer An array of bytes.\n   * @param {number} [index=0] The index to read.\n   * @return {number}\n   */\n  unpack_(buffer, index=0) {\n    /** @type {number} */\n    let num = 0;\n    for(let x = 0; x < this.bytes; x++) {\n      num += buffer[index + x] * Math.pow(256, x);\n    }\n    return num;\n  }\n\n  unpackUnsigned_(buffer, index=0) {\n    return this.overflow_(this.unpack_(buffer, index));\n  }\n\n  /**\n   * Read one two's complement signed integer from a byte buffer.\n   * @param {!(Uint8Array|Array<number>)} buffer An array of bytes.\n   * @param {number} [index=0] The index to read.\n   * @return {number}\n   */\n  unpackSigned_(buffer, index=0) {\n    return this.overflow_(this.sign_(this.unpack_(buffer, index)));\n  }\n\n  /**\n   * Truncate values in case of overflow.\n   * @param {number} num The number.\n   * @private\n   */\n  overflow_(num) {\n    if (num > this.max || num < this.min) {\n      throw new RangeError();\n    }\n    return num;\n  }\n\n  /**\n   * Truncate values in case of overflow.\n   * @param {number} num The number.\n   * @private\n   */\n  overflowClamp_(num) {\n    if (num > this.max) {\n      return this.max;\n    } else if (num < this.min) {\n      return this.min;\n    }\n    return num;\n  }\n\n  /**\n   * Sign a number.\n   * @param {number} num The number.\n   * @return {number}\n   * @private\n   */\n  sign_(num) {\n    if (num > this.max) {\n      num -= (this.max * 2) + 2;\n    }\n    return num;\n  }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/ieee754-buffer/index.js\n/*\n * Copyright (c) 2018-2019 Rafael da Silva Rocha.\n * Copyright (c) 2013 DeNA Co., Ltd.\n * Copyright (c) 2010, Linden Research, Inc\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n/**\n * @fileoverview Encode and decode IEEE 754 floating point numbers.\n * @see https://github.com/rochars/ieee754-buffer\n * @see https://bitbucket.org/lindenlab/llsd/raw/7d2646cd3f9b4c806e73aebc4b32bd81e4047fdc/js/typedarray.js\n * @see https://github.com/kazuho/ieee754.js/blob/master/ieee754.js\n */\n\n/** \n * @module ieee754-buffer\n */\n\n/**\n * A class to encode and decode IEEE 754 floating-point numbers.\n */\nclass IEEE754Buffer {\n\n  /**\n   * Pack a IEEE 754 floating point number.\n   * @param {number} ebits The exponent bits.\n   * @param {number} fbits The fraction bits.\n   */\n  constructor(ebits, fbits) {\n    /**\n     * @type {number}\n     * @private\n     */\n    this.ebits = ebits;\n    /**\n     * @type {number}\n     * @private\n     */\n    this.fbits = fbits;\n    /**\n     * @type {number}\n     * @private\n     */\n    this.bias = (1 << (ebits - 1)) - 1;\n    /**\n     * @type {number}\n     * @private\n     */\n    this.numBytes = Math.ceil((ebits + fbits) / 8);\n    /**\n     * @type {number}\n     * @private\n     */\n    this.biasP2 = Math.pow(2, this.bias + 1);\n    /**\n     * @type {number}\n     * @private\n     */\n    this.ebitsFbits = (ebits + fbits);\n    /**\n     * @type {number}\n     * @private\n     */\n    this.fbias = Math.pow(2, -(8 * this.numBytes - 1 - ebits));\n  }\n\n  /**\n   * Pack a IEEE 754 floating point number.\n   * @param {!Uint8Array|!Array<number>} buffer The buffer.\n   * @param {number} num The number.\n   * @param {number} index The index to write on the buffer.\n   * @return {number} The next index to write on the buffer.\n   * @throws {TypeError} If input is not a number.\n   */\n  pack(buffer, num, index) {\n    // Only numbers can be packed\n    if (typeof num != 'number') {\n      throw new TypeError();\n    }\n    // Round overflows\n    if (Math.abs(num) > this.biasP2 - (this.ebitsFbits * 2)) {\n      num = num < 0 ? -Infinity : Infinity;\n    }\n    /**\n     * sign, need this to handle negative zero\n     * @see http://cwestblog.com/2014/02/25/javascript-testing-for-negative-zero/\n     * @type {number}\n     */\n    let sign = (((num = +num) || 1 / num) < 0) ? 1 : num < 0 ? 1 : 0;\n    num = Math.abs(num);\n    /** @type {number} */\n    let exp = Math.min(Math.floor(Math.log(num) / Math.LN2), 1023);\n    /** @type {number} */\n    let fraction = roundToEven(num / Math.pow(2, exp) * Math.pow(2, this.fbits));\n    // NaN\n    if (num !== num) {\n      fraction = Math.pow(2, this.fbits - 1);\n      exp = (1 << this.ebits) - 1;\n    // Number\n    } else if (num !== 0) {\n      if (num >= Math.pow(2, 1 - this.bias)) {\n        if (fraction / Math.pow(2, this.fbits) >= 2) {\n          exp = exp + 1;\n          fraction = 1;\n        }\n        // Overflow\n        if (exp > this.bias) {\n          exp = (1 << this.ebits) - 1;\n          fraction = 0;\n        } else {\n          exp = exp + this.bias;\n          fraction = roundToEven(fraction) - Math.pow(2, this.fbits);\n        }\n      } else {\n        fraction = roundToEven(num / Math.pow(2, 1 - this.bias - this.fbits));\n        exp = 0;\n      } \n    }\n    return this.packFloatBits_(buffer, index, sign, exp, fraction);\n  }\n\n  /**\n   * Unpack a IEEE 754 floating point number.\n   * Derived from IEEE754 by DeNA Co., Ltd., MIT License. \n   * Adapted to handle NaN. Should port the solution to the original repo.\n   * @param {!Uint8Array|!Array<number>} buffer The buffer.\n   * @param {number} index The index to read from the buffer.\n   * @return {number} The floating point number.\n   */\n  unpack(buffer, index) {\n    /** @type {number} */\n    let eMax = (1 << this.ebits) - 1;\n    /** @type {number} */\n    let significand;\n    /** @type {string} */\n    let leftBits = \"\";\n    for (let i = this.numBytes - 1; i >= 0 ; i--) {\n      /** @type {string} */\n      let t = buffer[i + index].toString(2);\n      leftBits += \"00000000\".substring(t.length) + t;\n    }\n    /** @type {number} */\n    let sign = leftBits.charAt(0) == \"1\" ? -1 : 1;\n    leftBits = leftBits.substring(1);\n    /** @type {number} */\n    let exponent = parseInt(leftBits.substring(0, this.ebits), 2);\n    leftBits = leftBits.substring(this.ebits);\n    if (exponent == eMax) {\n      if (parseInt(leftBits, 2) !== 0) {\n        return NaN;\n      }\n      return sign * Infinity;  \n    } else if (exponent === 0) {\n      exponent += 1;\n      significand = parseInt(leftBits, 2);\n    } else {\n      significand = parseInt(\"1\" + leftBits, 2);\n    }\n    return sign * significand * this.fbias * Math.pow(2, exponent - this.bias);\n  }\n\n  /**\n   * Pack a IEEE754 from its sign, exponent and fraction bits\n   * and place it in a byte buffer.\n   * @param {!Uint8Array|!Array<number>} buffer The byte buffer to write to.\n   * @param {number} index The buffer index to write.\n   * @param {number} sign The sign.\n   * @param {number} exp the exponent.\n   * @param {number} fraction The fraction.\n   * @return {number}\n   * @private\n   */\n  packFloatBits_(buffer, index, sign, exp, fraction) {\n    /** @type {!Array<number>} */\n    let bits = [];\n    // the sign\n    bits.push(sign);\n    // the exponent\n    for (let i = this.ebits; i > 0; i -= 1) {\n      bits[i] = (exp % 2 ? 1 : 0);\n      exp = Math.floor(exp / 2);\n    }\n    // the fraction\n    let len = bits.length;\n    for (let i = this.fbits; i > 0; i -= 1) {\n      bits[len + i] = (fraction % 2 ? 1 : 0);\n      fraction = Math.floor(fraction / 2);\n    }\n    // pack as bytes\n    /** @type {string} */\n    let str = bits.join('');\n    /** @type {number} */\n    let numBytes = this.numBytes + index - 1;\n    /** @type {number} */\n    let k = index;\n    while (numBytes >= index) {\n      buffer[numBytes] = parseInt(str.substring(0, 8), 2);\n      str = str.substring(8);\n      numBytes--;\n      k++;\n    }\n    return k;\n  }\n}\n\n/**\n * Round a number to its nearest even value.\n * @param {number} n The number.\n * @return {number}\n * @private\n */\nfunction roundToEven(n) {\n  /** @type {number} */\n  let w = Math.floor(n);\n  let f = n - w;\n  if (f < 0.5) {\n    return w;\n  }\n  if (f > 0.5) {\n    return w + 1;\n  }\n  return w % 2 ? w + 1 : w;\n}\n\n;// CONCATENATED MODULE: ../../node_modules/byte-data/index.js\n/*\n * Copyright (c) 2017-2019 Rafael da Silva Rocha.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n/**\n * @fileoverview JavaScript binary parser for any browser or environment.\n * @see https://github.com/rochars/byte-data\n */\n\n/** @module byte-data */\n\n\n\n\n\n\n/**\n * Read a string of UTF-8 characters from a byte buffer.\n * @param {!(Uint8Array|Array<number>)} buffer A byte buffer.\n * @param {number} [index=0] The buffer index to start reading.\n * @param {number} [end=buffer.length] The index to stop reading, non inclusive.\n * @return {string}\n */\nfunction unpackString(buffer, index=0, end=buffer.length) {\n  return unpack(buffer, index, end);\n}\n\n/**\n * Write a string of UTF-8 characters as a byte buffer.\n * @param {string} str The string to pack.\n * @return {!Array<number>} The UTF-8 string bytes.\n */\nfunction packString(str) {\n  /** @type {!Array<number>} */\n  let buffer = [];\n  pack(str, buffer, 0);\n  return buffer;\n}\n\n/**\n * Write a string of UTF-8 characters to a byte buffer.\n * @param {string} str The string to pack.\n * @param {!(Uint8Array|Array<number>)} buffer The output buffer.\n * @param {number} [index=0] The buffer index to start writing.\n * @return {number} The next index to write in the buffer.\n */\nfunction packStringTo(str, buffer, index=0) {\n  return pack(str, buffer, index);\n}\n\n// Numbers\n/**\n * Pack a array of numbers to a byte buffer.\n * All other packing functions are interfaces to this function.\n * @param {!(Array<number>|TypedArray)} values The values to pack.\n * @param {!{bits:number,\n *   fp: (boolean|undefined),\n *   signed: (boolean|undefined),\n *   be: (boolean|undefined)}} theType The type definition.\n * @param {!(Uint8Array|Array<number>)} buffer The buffer to write on.\n * @param {number} [index=0] The buffer index to start writing.\n * @param {boolean} [clamp=false] True to clamp ints on overflow.\n * @return {number} The next index to write.\n * @throws {Error} If the type definition is not valid.\n * @throws {RangeError} On overflow.\n * @throws {TypeError} If input is not valid.\n */\nfunction packArrayTo(values, theType, buffer, index=0, clamp=false) {\n  theType = theType || {};\n  /** @type {!Object} */\n  let packer = getParser_(theType.bits, theType.fp, theType.signed, clamp);\n  /** @type {number} */\n  let offset = Math.ceil(theType.bits / 8);\n  /** @type {number} */\n  let i = 0;\n  /** @type {number} */\n  let start = index;\n  try {\n    for (let valuesLen = values.length; i < valuesLen; i++) {\n      index = packer.pack(buffer, values[i], index);\n    }\n    if (theType.be) {\n      endianness(buffer, offset, start, index);\n    }\n  } catch (e) {\n    throwValueError_(e, values[i], i);\n  }\n  return index;\n}\n\n/**\n * Unpack a array of numbers from a byte buffer to a array or a typed array.\n * All other unpacking functions are interfaces to this function.\n * @param {!(Uint8Array|Array<number>)} buffer The byte buffer.\n * @param {!{bits:number,\n *   fp: (boolean|undefined),\n *   signed: (boolean|undefined),\n *   be: (boolean|undefined)}} theType The type definition.\n * @param {!(TypedArray|Array<number>)} output The output array or typed array.\n * @param {number} [start=0] The buffer index to start reading.\n * @param {number} [end=buffer.length] The buffer index to stop reading.\n * @param {boolean} [safe=false] If set to false, extra bytes in the end of\n *   the array are ignored and input buffers with insufficient bytes will\n *   write nothing to the output array. If safe is set to true the function\n *   will throw a 'Bad buffer length' error.\n * @param {boolean} [clamp=false] True to clamp ints on overflow.\n * @throws {Error} If the type definition is not valid\n * @throws {RangeError} On overflow\n */\nfunction unpackArrayTo(\n    buffer, theType, output, start=0, end=buffer.length,\n    safe=false, clamp=false) {\n  theType = theType || {};\n  /** @type {!Object} */\n  let packer = getParser_(theType.bits, theType.fp, theType.signed, clamp);\n  /** @type {number} */\n  let offset = Math.ceil(theType.bits / 8);\n  // getUnpackLen_ will either fix the length of the input buffer\n  // according to the byte offset of the type (on unsafe mode) or\n  // throw a Error if the input buffer has a bad length (on safe mode)\n  end = getUnpackLen_(buffer, start, end, offset, safe);\n  /** @type {number} */\n  let index = 0;\n  let j = start;\n  try {\n    if (theType.be) {\n      endianness(buffer, offset, start, end);\n    }\n    for (; j < end; j += offset, index++) {\n      output[index] = packer.unpack(buffer, j);\n    }\n    if (theType.be) {\n      endianness(buffer, offset, start, end);\n    }\n  } catch (e) {\n    throwValueError_(e, buffer.slice(j, j + offset), j);\n  }\n}\n\n/**\n * Pack a number to a byte buffer.\n * @param {number} value The value.\n * @param {!{bits:number,\n *   fp: (boolean|undefined),\n *   signed: (boolean|undefined),\n *   be: (boolean|undefined)}} theType The type definition.\n * @param {!(Uint8Array|Array<number>)} buffer The byte buffer to write on.\n * @param {number} [index=0] The buffer index to write.\n * @param {boolean} [clamp=false] True to clamp ints on overflow.\n * @return {number} The next index to write.\n * @throws {Error} If the type definition is not valid.\n * @throws {RangeError} On overflow.\n * @throws {TypeError} If input is not valid.\n */\nfunction packTo(value, theType, buffer, index=0, clamp=false) {\n  return packArrayTo([value], theType, buffer, index, clamp);\n}\n\n/**\n * Pack a number as a array of bytes.\n * @param {number} value The number to pack.\n * @param {!{bits:number,\n *   fp: (boolean|undefined),\n *   signed: (boolean|undefined),\n *   be: (boolean|undefined)}} theType The type definition.\n * @param {boolean} [clamp=false] True to clamp ints on overflow.\n * @return {!Array<number>} The packed value.\n * @throws {Error} If the type definition is not valid.\n * @throws {RangeError} On overflow.\n * @throws {TypeError} If input is not valid.\n */\nfunction byte_data_pack(value, theType, clamp=false) {\n  /** @type {!Array<number>} */\n  let output = [];\n  packTo(value, theType, output, 0, clamp);\n  return output;\n}\n\n/**\n * Pack a array of numbers as a array of bytes.\n * @param {!(Array<number>|TypedArray)} values The values to pack.\n * @param {!{bits:number,\n *   fp: (boolean|undefined),\n *   signed: (boolean|undefined),\n *   be: (boolean|undefined)}} theType The type definition.\n * @param {boolean} [clamp=false] True to clamp ints on overflow.\n * @return {!Array<number>} The packed values.\n * @throws {Error} If the type definition is not valid.\n * @throws {RangeError} On overflow.\n * @throws {TypeError} If input is not valid.\n */\nfunction packArray(values, theType, clamp=false) {\n  /** @type {!Array<number>} */\n  let output = [];\n  packArrayTo(values, theType, output, 0, clamp);\n  return output;\n}\n\n/**\n * Unpack a array of numbers from a byte buffer.\n * @param {!(Uint8Array|Array<number>)} buffer The byte buffer.\n * @param {!{bits:number,\n *   fp: (boolean|undefined),\n *   signed: (boolean|undefined),\n *   be: (boolean|undefined)}} theType The type definition.\n * @param {number} [start=0] The buffer index to start reading.\n * @param {number} [end=buffer.length] The buffer index to stop reading.\n * @param {boolean} [safe=false] If set to false, extra bytes in the end of\n *   the array are ignored and input buffers with insufficient bytes will\n *   output a empty array. If safe is set to true the function\n *   will throw a 'Bad buffer length' error.\n * @param {boolean} [clamp=false] True to clamp ints on overflow.\n * @return {!Array<number>}\n * @throws {Error} If the type definition is not valid\n * @throws {RangeError} On overflow\n */\nfunction unpackArray(\n    buffer, theType, start=0, end=buffer.length, safe=false, clamp=false) {\n  /** @type {!Array<number>} */\n  let output = [];\n  unpackArrayTo(buffer, theType, output, start, end, safe, clamp);\n  return output;\n}\n\n/**\n * Unpack a number from a byte buffer.\n * @param {!(Uint8Array|Array<number>)} buffer The byte buffer.\n * @param {!{bits:number,\n *   fp: (boolean|undefined),\n *   signed: (boolean|undefined),\n *   be: (boolean|undefined)}} theType The type definition.\n * @param {number} [index=0] The buffer index to read.\n * @param {boolean} [clamp=false] True to clamp ints on overflow.\n * @return {number}\n * @throws {Error} If the type definition is not valid\n * @throws {Error} On bad buffer length.\n * @throws {RangeError} On overflow\n */\nfunction byte_data_unpack(buffer, theType, index=0, clamp=false) {\n  return unpackArray(\n    buffer, theType, index, index + Math.ceil(theType.bits / 8),\n    true, clamp)[0];\n}\n\n/**\n * Throw a error with information about the problem.\n * @param {!Object} err The Error object that is being raised.\n * @param {*} value The value that caused the error.\n * @param {number} index The index of the value that caused the error.\n * @throws {RangeError|TypeError|Error} A Error with a message.\n * @private\n */\nfunction throwValueError_(err, value, index) {\n  err.message = err.constructor.name +\n    ' at index ' + index + ': ' + value;\n  throw err;\n}\n\n/**\n * Unpack a array of numbers to a typed array.\n * All other unpacking functions are interfaces to this function.\n * @param {!(Uint8Array|Array<number>)} buffer The byte buffer.\n * @param {number} start The buffer index to start reading.\n * @param {number} end The buffer index to stop reading.\n * @param {number} offset The number of bytes used by the type.\n * @param {boolean} safe True for size-safe buffer reading.\n * @throws {Error} On bad buffer length, if safe.\n * @private\n */\nfunction getUnpackLen_(buffer, start, end, offset, safe) {\n  /** @type {number} */\n  let extra = (end - start) % offset;\n  if (safe && (extra || buffer.length < offset)) {\n    throw new Error('Bad buffer length');\n  }\n  return end - extra;\n}\n\n/**\n * Return a parser for int, uint or fp numbers.\n * @param {number} bits The number of bits.\n * @param {boolean|undefined} fp True for fp numbers, false otherwise.\n * @param {boolean|undefined} signed True for signed ints, false otherwise.\n * @param {boolean|undefined} clamp True to clamp ints on overflow, false otherwise.\n * @return {!Object}\n * @private\n */\nfunction getParser_(bits, fp, signed, clamp) {\n  if (fp) {\n    validateFloatType(bits);\n  } else {\n    validateIntType(bits);\n  }\n  if (fp && bits === 16) {\n    return new IEEE754Buffer(5, 11);\n  } else if (fp && bits == 32) {\n    return new IEEE754Buffer(8, 23);\n  } else if(fp && bits == 64) {\n    return new IEEE754Buffer(11, 52);\n  }\n  return new IntParser(bits, signed, clamp);\n}\n\n/**\n * The type definition error message.\n * @type {string}\n * @private\n */\nconst TYPE_ERR = 'Unsupported type';\n\n/**\n * Validate the type definition of floating-point numbers.\n * @param {number} bits The number of bits.\n * @throws {Error} If the type definition is not valid.\n * @private\n */\nfunction validateFloatType(bits) {\n  if (!bits || bits !== 16 && bits !== 32 && bits !== 64) {\n    throw new Error(TYPE_ERR + ': float, bits: ' + bits);\n  }\n}\n\n/**\n * Validate the type definition of integers.\n * @param {number} bits The number of bits.\n * @throws {Error} If the type definition is not valid.\n * @private\n */\nfunction validateIntType(bits) {\n  if (!bits || bits < 1 || bits > 53) {\n    throw new Error(TYPE_ERR + ': int, bits: ' + bits);\n  }\n}\n\n\n/***/ }),\n\n/***/ 2779:\n/***/ ((module, exports) => {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif ( true && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n\t\t\treturn classNames;\n\t\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {}\n}());\n\n\n/***/ }),\n\n/***/ 5388:\n/***/ ((__unused_webpack_module, exports) => {\n\n\"use strict\";\n/*!\n * content-type\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n\n\n/**\n * RegExp to match *( \";\" parameter ) in RFC 7231 sec 3.1.1.1\n *\n * parameter     = token \"=\" ( token / quoted-string )\n * token         = 1*tchar\n * tchar         = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\"\n *               / \"+\" / \"-\" / \".\" / \"^\" / \"_\" / \"`\" / \"|\" / \"~\"\n *               / DIGIT / ALPHA\n *               ; any VCHAR, except delimiters\n * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE\n * qdtext        = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text\n * obs-text      = %x80-FF\n * quoted-pair   = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n */\nvar PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *(\"(?:[\\u000b\\u0020\\u0021\\u0023-\\u005b\\u005d-\\u007e\\u0080-\\u00ff]|\\\\[\\u000b\\u0020-\\u00ff])*\"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g // eslint-disable-line no-control-regex\nvar TEXT_REGEXP = /^[\\u000b\\u0020-\\u007e\\u0080-\\u00ff]+$/ // eslint-disable-line no-control-regex\nvar TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/\n\n/**\n * RegExp to match quoted-pair in RFC 7230 sec 3.2.6\n *\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n * obs-text    = %x80-FF\n */\nvar QESC_REGEXP = /\\\\([\\u000b\\u0020-\\u00ff])/g // eslint-disable-line no-control-regex\n\n/**\n * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6\n */\nvar QUOTE_REGEXP = /([\\\\\"])/g\n\n/**\n * RegExp to match type in RFC 7231 sec 3.1.1.1\n *\n * media-type = type \"/\" subtype\n * type       = token\n * subtype    = token\n */\nvar TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/\n\n/**\n * Module exports.\n * @public\n */\n\nexports.format = format\nexports.parse = parse\n\n/**\n * Format object to media type.\n *\n * @param {object} obj\n * @return {string}\n * @public\n */\n\nfunction format (obj) {\n  if (!obj || typeof obj !== 'object') {\n    throw new TypeError('argument obj is required')\n  }\n\n  var parameters = obj.parameters\n  var type = obj.type\n\n  if (!type || !TYPE_REGEXP.test(type)) {\n    throw new TypeError('invalid type')\n  }\n\n  var string = type\n\n  // append parameters\n  if (parameters && typeof parameters === 'object') {\n    var param\n    var params = Object.keys(parameters).sort()\n\n    for (var i = 0; i < params.length; i++) {\n      param = params[i]\n\n      if (!TOKEN_REGEXP.test(param)) {\n        throw new TypeError('invalid parameter name')\n      }\n\n      string += '; ' + param + '=' + qstring(parameters[param])\n    }\n  }\n\n  return string\n}\n\n/**\n * Parse media type to object.\n *\n * @param {string|object} string\n * @return {Object}\n * @public\n */\n\nfunction parse (string) {\n  if (!string) {\n    throw new TypeError('argument string is required')\n  }\n\n  // support req/res-like objects as argument\n  var header = typeof string === 'object'\n    ? getcontenttype(string)\n    : string\n\n  if (typeof header !== 'string') {\n    throw new TypeError('argument string is required to be a string')\n  }\n\n  var index = header.indexOf(';')\n  var type = index !== -1\n    ? header.slice(0, index).trim()\n    : header.trim()\n\n  if (!TYPE_REGEXP.test(type)) {\n    throw new TypeError('invalid media type')\n  }\n\n  var obj = new ContentType(type.toLowerCase())\n\n  // parse parameters\n  if (index !== -1) {\n    var key\n    var match\n    var value\n\n    PARAM_REGEXP.lastIndex = index\n\n    while ((match = PARAM_REGEXP.exec(header))) {\n      if (match.index !== index) {\n        throw new TypeError('invalid parameter format')\n      }\n\n      index += match[0].length\n      key = match[1].toLowerCase()\n      value = match[2]\n\n      if (value.charCodeAt(0) === 0x22 /* \" */) {\n        // remove quotes\n        value = value.slice(1, -1)\n\n        // remove escapes\n        if (value.indexOf('\\\\') !== -1) {\n          value = value.replace(QESC_REGEXP, '$1')\n        }\n      }\n\n      obj.parameters[key] = value\n    }\n\n    if (index !== header.length) {\n      throw new TypeError('invalid parameter format')\n    }\n  }\n\n  return obj\n}\n\n/**\n * Get content-type from req/res objects.\n *\n * @param {object}\n * @return {Object}\n * @private\n */\n\nfunction getcontenttype (obj) {\n  var header\n\n  if (typeof obj.getHeader === 'function') {\n    // res-like\n    header = obj.getHeader('content-type')\n  } else if (typeof obj.headers === 'object') {\n    // req-like\n    header = obj.headers && obj.headers['content-type']\n  }\n\n  if (typeof header !== 'string') {\n    throw new TypeError('content-type header is missing from object')\n  }\n\n  return header\n}\n\n/**\n * Quote a string if necessary.\n *\n * @param {string} val\n * @return {string}\n * @private\n */\n\nfunction qstring (val) {\n  var str = String(val)\n\n  // no need to quote tokens\n  if (TOKEN_REGEXP.test(str)) {\n    return str\n  }\n\n  if (str.length > 0 && !TEXT_REGEXP.test(str)) {\n    throw new TypeError('invalid parameter value')\n  }\n\n  return '\"' + str.replace(QUOTE_REGEXP, '\\\\$1') + '\"'\n}\n\n/**\n * Class to represent a content type.\n * @private\n */\nfunction ContentType (type) {\n  this.parameters = Object.create(null)\n  this.type = type\n}\n\n\n/***/ }),\n\n/***/ 6539:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp #balance{background-image:url(data:image/png;base64,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)}#webamp #balance::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYvL0RKWmt7hJStvMTa5+opTTwbAAAAMUlEQVQI12NQFAQBIQaxNBBIZGALBYIQAyAtKiqKlwapM2RgcwEBQwZhYxAwZICaBwCdgQ6Jd297uQAAAABJRU5ErkJggg==)}#webamp #balance::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYvL0RKWmt7hJStvMTa5+opTTwbAAAAMUlEQVQI12NQFAQBIQaxNBBIZGALBYIQAyAtKiqKlwapM2RgcwEBQwZhYxAwZICaBwCdgQ6Jd297uQAAAABJRU5ErkJggg==)}#webamp #balance:active::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYZICovL0RKWmva5+r///+U4Y9MAAAAMUlEQVQI12MwFAQBYQbRUBAQZGBlAAIWBiQ6ISEBKw2SV4TTIi4gIMhgJKQopCgoDAB2aAh/NddRQgAAAABJRU5ErkJggg==)}#webamp #balance:active::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYZICovL0RKWmva5+r///+U4Y9MAAAAMUlEQVQI12MwFAQBYQbRUBAQZGBlAAIWBiQ6ISEBKw2SV4TTIi4gIMhgJKQopCgoDAB2aAh/NddRQgAAAABJRU5ErkJggg==)}#webamp .actions #previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAMAAACHObUhAAAASFBMVEUfHzEgHzIgIDMhITQiITMiITQiIjUjIzYjJDgkIzckIzgkJDklJTolJjsmJTsmJjtKWmtSY3N7hJSElKWXqLmttca9ztbv//8qmLzOAAAAcklEQVQY022QMQ7DMAwDj7KQvqD/f2UXD2YGN43cWAuNo0wI1JvNjE8SGzwiwf/Ywwr2k1M6HFMPwDgvvxnoU2DN6fl7xh7X/YJx4a/yte67FaPmV2O5pxi5ZN/Gt5+rI998DD/ridxiLAQiHBKEJYGaT1TOJE+BDpf2AAAAAElFTkSuQmCC)}#webamp .actions #previous:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASBAMAAABCyVggAAAAElBMVEUICBBKWmtSa3Nje4R7jJytvcYAUCbCAAAAS0lEQVQI12NgwA1MXKDACMhxDYWCEBAHJuOChcPAAsQwDmOIi4MoEocRieMgiMRhROYEInNckTkugcgcVzgnNASIwRxTZOcoIHwDAI4lI4lOrG7eAAAAAElFTkSuQmCC)}#webamp .actions #play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAMAAACHObUhAAAARVBMVEUmJTsmJTwnJz0nKD4oJz4oKD8pKUAqKUEqKUIqKkMrK0QrLEQsK0MsK0QsK0ZKWmtSY3N7hJSElKWXqLmttca9ztbv//93JWkaAAAAcElEQVQY022QQQ7FIAhEHzJpL/Dvf8y/MBG70VZbYEPeAIGxH0nEX5QEB4L+xj26CnkMXus2QJv92hXXrETluHnT07MqrnV6UbSfcY6rY+N+/1KUUTBl9Nl/vtxow5+PRyKif+1xpZhmmIEZMxFh+AXgtiNLLYv6agAAAABJRU5ErkJggg==)}#webamp .actions #play:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASBAMAAABCyVggAAAAElBMVEUICBBKWmtSa3Nje4R7jJytvcYAUCbCAAAARUlEQVQI12NgwA1MXKDACMhxDYWCEBAHJuOChcOAzGFkQOYIMiBzwDw4B8RDcEKROKFIykKRDAhFMjoUbqkpsnMUEL4BAGRUIvLymjxCAAAAAElFTkSuQmCC)}#webamp .actions #pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAMAAACHObUhAAAARVBMVEUsLEUsLEYtLUctLkguLUguLkkvL0ovMEswL0swL0wwMEsxMU0xMU4xMk0yMU5KWmtSY3N7hJSElKWXqLmttca9ztbv//90IK75AAAAY0lEQVQYGW3BwQ3DQAwDwRVPsBtI/3UGfpCBDfiT00x9GPjbiI2dhvAnjsSsuV3AARdwAMHNo1kBmhVuEjMxEyOLkcRMzMRIze3kcfJyQyA8wqsaO2zSdtitogqqqEoJIgTLP/lyHlITiB2JAAAAAElFTkSuQmCC)}#webamp .actions #pause:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASBAMAAABCyVggAAAAElBMVEUICBBKWmtSa3Nje4R7jJytvcYAUCbCAAAAOUlEQVQI12NgwA1MXKDACMhxDYWCEBAHJuOCyXFgYAEyYBzBEBdGUdpzXENDXEJDwRxTZOcoIHwDAEquItl9JSARAAAAAElFTkSuQmCC)}#webamp .actions #stop{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAMAAACHObUhAAAAP1BMVEUyMU4yMk8zM1AzNFE0M1E0M1I0NFE0NFM1NVQ1NlQ2NVM2NVQ2NlVKWmtSY3N7hJSElKWXqLmttca9ztbv//8mgTHJAAAAXElEQVQYGW3BQQ7DMAwDwRUttPf+/6FFD2SBBLnYmqkPA38bcbBpCJs4ErPm8uPxAgLNrbmtcBGjiFHETIyWGFmMIkarubzZNAQIm8YOB7cdTqsooERWkEXJheoPfCIcRKB1vkQAAAAASUVORK5CYII=)}#webamp .actions #stop:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASBAMAAABCyVggAAAAElBMVEUICBBKWmtSa3Nje4R7jJytvcYAUCbCAAAAMklEQVQI12NgwA1MXKDACMhxDYWCEBAHJuOChQPWC+MwCgoKitKBA3YamGOK7BwFhG8A34IfFkPmwnYAAAAASUVORK5CYII=)}#webamp .actions #next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASBAMAAABCyVggAAAALVBMVEUICBA2NlU2NlY3N1c4N1g4OFk4OFpKWmtSY3N7hJSElKWXqLmttca9ztbv//8TuYuxAAAAaUlEQVQI12M4AwenDjCcewcDJ4Ccu1BwZzkmp/zu3evld+9MB3Oqa+9e3wfnbEfm7K5F5mxH5uxD5rxF4uxDNuAtEufd3bv33kE4cFcDOWdWzoSC6QkMK8rhgIFB0MjY2NjFxSU0NJQBAK7vnSRnYMknAAAAAElFTkSuQmCC)}#webamp .actions #next:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAElBMVEUICBBKWmtSa3Nje4R7jJytvcYAUCbCAAAATElEQVQI12NgwAVMXCDAWYGBwTUUChyAbKi4CyabAcSAshlZXBxEYWwBJLYgCxJbAIktisQOQbBFkfSGINihLi6uoSC2KZIbFOCuBwDE5iIH3QcLbQAAAABJRU5ErkJggg==)}#webamp #eject{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAQBAMAAADgw5IVAAAAIVBMVEU4OFk4OFo5OVpKWmtSY3N7hJSElKWXqLmttca9ztbv//8Mnk1wAAAAVUlEQVQI12PogIM2hq5VMNDC0DUTCmYEQ9iWCPbkYgTbvNwSxp5cXl4MY5uXlwMlwOxZYBPh5sDNnGwMAlA2UHl5FYZ6uNuCGTpSQ6EgmEGISQkKmAB+iFckwoyJQwAAAABJRU5ErkJggg==)}#webamp #eject:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAQBAMAAADgw5IVAAAAElBMVEUICBBKWmtSa3Nje4R7jJytvcYAUCbCAAAATUlEQVQI12NgwAVMXCDAWYGBwTUUChyAbJAgCxBD2Q4CCDajIAuM7SAoKABjMwoKAiXAbIhJMPVgAGY7gO2EsoHKBUXR1ZsiqVeAuxIAu8seNVNafDwAAAAASUVORK5CYII=)}#webamp #main-window{background-image:url(data:image/png;base64,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)}#webamp .media-info #stereo,#webamp .stop .media-info #stereo.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAAAk1BMVEUlJTklJTolJjsmJTsmJjsnJz0nJz4oJz4oKD8pKUApKkEqKUEqKUIqKkEqKkIrK0MrK0QsK0QsLEUtLUYtLUguLUcuLUguLkcvL0U8PFNDQ1hJSWFQUGNaWm9lZXZpaXpvcH5wcX9xcYF3d4Z5eYh8e4x+fpCBgY+Dg5KKipaLi5mMi5mRkZ2bmqaioqypqbKqqrTexa8FAAAAvUlEQVQYGQXBQW4aURAFwOrPIJCjEY5Hytq73P9giCj2YBTy+7mqfkUTiURmtUiqRY8eJBJRFAGULIemEipBQySka0xQL+9Bz4FEwbBUj9PP+ffF22P1cXbc1+fnsv7br5ExRr9mz911M99Op+d2P1+22/yRitHttr9eUPP5cH+w/3ftQ4cFx9VX93a7nD+ObufVn/nbdSRqk4qWSCfERHS1USq6ggwkKTCMLBERpCuoVAQdYyAl4dASNJjKN1/Kh0LDHtt2AAAAAElFTkSuQmCC)}#webamp .media-info #stereo.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAMAAACpx0YDAAABXFBMVEUA/wAD+AQG7gkG8QkH4wwI6A0K2g8K3xAL2xIL4hIM2RMN2BUN3RUOxRYO1RUQ0xkSxh0SzBwS0RwTuR0VvCEVxSEapCkbnyscrSwfczAgpzIhkzQinDUlJTklJTolJjslJzklKDolLjslkzomJjsmKTsmKzsmLDomMjsmMjwmNjsmOjsmRjsmWjwmdzsmiDwnJz0nKT0nLT0nNT0nOj0nQjwnTj0nYj0oKz4oLT8oND4oOT8oRz4oSz4oZT8pL0ApO0ApTEApTkApZkApZ0EqMEIqMkMqPEEqTEMqT0IqUEIqZUIqZkMqa0IrLkIrL0UrNEQrPEQrPUQrQEMrSkUrYkQrfUQsMUQsNkUsQkQsS0MsTkYsVEQsWEUsYEYsZ0UtLkUtLkctL0gtMEYtM0YtM0gtNEgtNUctNkctOUYtP0YtQkctR0YtS0Yti0cuLUguLkcuMUcuM0cuN0c2LFEQAAABDklEQVQYGQXBvVHDQBCA0W/3TrJkBBhmPAQkBATUQA+0QEROT9RBwtADCQQkDMaBLIOk8+nnlvfkUfYq0HKgtzIMMIBBxNpR/+Qsy+pcxLnj46iFiKrquJeuw/xp51QvayeuxkSikk+YHuFmxLdetRH//HXnCIuoxiSxpzS1hFfRlw+/DrxWO1YdqdgXV9vd4mrZmWgl9UdaUnD/LX4bo9ue9O8/N/lnkFG0g+tquwGSy5dUR1BlABio2fmmoVzL00XfZMluV027WL3tK8DkIWtUJRBMJGCMQKQve5vT4C2tRDd5LSaS2wEDcjqz2cbZM0l7Nh/KHiPCCERIKfjR8EmnEApqAGMASDD9uiHBP3bmjPqWVRjwAAAAAElFTkSuQmCC)}#webamp .media-info #mono,#webamp .stop .media-info #mono.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAMCAMAAACk2TZEAAAAclBMVEUtLUguLkcuLkgvL0ovMEswL0swMEsxMU0xMU4xMk0xMk4yMU4yMk8zM1AzNFE0M1E0M1I0NFE0NFI0NVM3N1E8PFNJSWFQUGdSUmtaWm9gYHZuboJ2dol8e4x+fpCGhpeOjp2VlaOdnaqlpbKsrLetrbnuzsEEAAAAp0lEQVQYGQXBQU4bURQEwOrvkcA4iRS4/+VYwI6VEyTPzGuq8ppyrjHKIVPQsSnnGpReZkQnQzfImKJUU8saWUEWQZyV0g7dqs6X349tf7qfN3uf6t/N/imLDL7WY1/Xx8d1m/+X6+P9+U1XSADNH8Xkr9aqmTW7fY5+r9v9OHp859f9i7z2vJwZpUdUjWpqSZQytlYJUrOpWaR1FhhgbcLQRiEFTH4AmtR0pKKbMGAAAAAASUVORK5CYII=)}#webamp .media-info #mono.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAMCAMAAACk2TZEAAABJlBMVEUA/wAD9wUG8QkI6A0J5g4L4hIM2RMM3xMN2BUN3RUP2hgQ0xkSzBwS0RwVvCEVxSEWySIZwicZwigcrSwgpzIhkzQkpzkmdzsmiDwnmD0olD8qa0IrfUQtL0gtMUgtQkcti0cuLkcuMEguMUcuNkguOkkuR0ovL0ovMEsvM0ovNEkvNEovNkovOkovPUovUUkvXEovZkswMEswM0swNUswNkwwP0swQkowTEswT0swUEwwVkswZkswaksxNU0xN04xP04xRE0xZk4xbk0yNU8yNk4yNlAyOE8yQ00yTk4yU04yVk4yY04yaU8ybE8yek4zNFEzOVEzPVAzQ1EzRlEzTFEzU1AzXlE0M1E0NFE0NFI0NVM0NlE0NlI0OlE0PlI0QVI0RlJbMtAUAAAA50lEQVQYGQXBTW7CMBCA0W9mrJKEAKr4WXXTu3TXG3Dc7nuOIiohKLHjGJzpe3IUreZ6BxJkIIHjnlxxbDBVs7EXaVV1u1UtpehDAdloNB3Xo6p1XbF7CN2kj0YFEYmasmUz05yb3KjmfW5LcBnEvk7L1N8P4UwvN+HwS/c+iqIrAT68XTyvq7frZNt6W33+nUAFHADAHAyw+ZsA6tXx0AxtaHTz/Nm9dGGxqef9bkKOntdRUh8BIFGIOD42KSBLn6WtFQAWN7zBL68plYDXQVwYASABGTy6h4DMOHEOyATMOHWmJh7hH8HfcsJFco7ZAAAAAElFTkSuQmCC)}#webamp #time #minus-sign{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAABCAYAAAAW/mTzAAAAF0lEQVQYV2OUUNT8/+L+dQYJRU0GGA0AVz4HY4h207oAAAAASUVORK5CYII=)}#webamp #time.countdown #minus-sign{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAABCAYAAAAW/mTzAAAAEElEQVQYV2Nk+MHwnwENAAAjgQH5sdp7TQAAAABJRU5ErkJggg==)}#webamp .digit-0{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAFklEQVQI12OYGtrA4ACEHh0ORNFA9QAiPQsl393R7gAAAABJRU5ErkJggg==)}#webamp .digit-1{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAE0lEQVQI12PsYNjBwMDgwEgCDQAItwpIh/66WgAAAABJRU5ErkJggg==)}#webamp .digit-2{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAH0lEQVQI12OYGtrAwMDgwNDR4YBCg8RBLI8OVBooDgAebgr//9NFIgAAAABJRU5ErkJggg==)}#webamp .digit-3{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAGElEQVQI12OYGtrAwMDgwNDR4YBC4xEHAB3uCv9NUBWtAAAAAElFTkSuQmCC)}#webamp .digit-4{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAGklEQVQI12Pw6HBgAEF0emqoAwMDkO7owKABD8wKi451feQAAAAASUVORK5CYII=)}#webamp .digit-5{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAIElEQVQI12OYGtrA4MDAwODRgUqDxBmArI4OBxQaKA4AHm4K/5vyk78AAAAASUVORK5CYII=)}#webamp .digit-6{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAH0lEQVQI12OYGtrA4MDAwODRgUqHgsUdgHwHFBqoHgAbbgr/DdfRzgAAAABJRU5ErkJggg==)}#webamp .digit-7{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAFklEQVQI12MMZdBmYGBwYOxg2EEsDQDjggmI1L+I9wAAAABJRU5ErkJggg==)}#webamp .digit-8{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAFklEQVQI12OYGtrA4ACEHh0OKDQecQArbgt/wD0r9gAAAABJRU5ErkJggg==)}#webamp .digit-9{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANAgMAAAAGbqyVAAAACVBMVEUAAAAA+AAYISknP40bAAAAIUlEQVQI12OYGtrA4ACEHh0OKPTUUAcGBiDd0YFKA9UDACFuCv9mR03UAAAAAElFTkSuQmCC)}#webamp .play #play-pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAgMAAACd/+6DAAAACVBMVEUAAAAA6AAYISlH3xqZAAAAH0lEQVQI12Po8GhgYAhgYOgIAdKhQDrUAUKHQMU9GgCL+gfA1jUO8AAAAABJRU5ErkJggg==)}#webamp .pause #play-pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAgMAAACd/+6DAAAACVBMVEUAAAAA6AAYISlH3xqZAAAAGklEQVQI12Po6GhgAIGQVgeGEFYHFBoEgPIAiaIHnsCfw8kAAAAASUVORK5CYII=)}#webamp .stop #play-pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAgMAAACd/+6DAAAACVBMVEUAAAAA6AAYISlH3xqZAAAAGUlEQVQI12Po6GhgAIHWkAYG1hBUGgSA8gCN1wfe41RVhgAAAABJRU5ErkJggg==)}#webamp #work-indicator{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAFVBMVEUAAAAAAAAA6AARQDMYISlODwD/KDN/MQZsAAAAAXRSTlMAQObYZgAAAB9JREFUCNdjUFI2ZmBgQCYFBQWBpKOLCJwdGpaGSgIAfI8Fm6vX5/8AAAAASUVORK5CYII=)}#webamp #work-indicator.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAD1BMVEUAAAAAAAARQDMYISn/KDPWqFE6AAAAAXRSTlMAQObYZgAAABpJREFUCNdjUFJgAAJkUlAARBoaINguDmgkAEabAvbVxDW5AAAAAElFTkSuQmCC)}#webamp .playlist-top-left-fill,#webamp .playlist-top-left-spacer,#webamp .playlist-top-right-fill,#webamp .playlist-top-right-spacer{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWUlEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TllWjvk7ZyX9pb0jeRDhFvYqBDe5+kxzjR3hK6xImKqibtfUKXzEiXsosulowWkKRUQYx0SV10sYQeqQsAf0Ul/5LwY0QAAAAASUVORK5CYII=)}#webamp .playlist-top-left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAMAAABPqWaPAAAA/FBMVEUdHS0dHS4eHi8fHyIfHzAfHzIgHzIgITMhITQiITQiIjUjIzYkIzckIzgkJDckJDkkJSklJTomJTsmJjsmJjwnJz0oJz4oKD8pKUApKUEqKUEqKkEqKkIrKUIrKkMrK0QsK0MsK0QsLEMsLEUtLUYuLUcuLUguLkcuLkkvL0owMEsxMEwyMU0yMU4yMk8zM1A0MCw0MlA0NFE1NFM2NVM2NVQ2NlU3NVY3N1Y4N1c4N1g4OFg5OFk6OVo7Olw8O109O149PF9FQTtnXEJqanpra3xsbHxsbH1tbX9uboFwb4NxcYZzcoh0c4p0dIp1dYx4do54d5CGd02OkZDLe86vAAAAvUlEQVQYGQXBMUodUBQFwDnnXdMq2LuWQFy/nYVFQAIu47+bmSDSpFFtmyRp452oiIhIIjJ8Nr/2nD1Nc5ppJS3idhVqIRii93wDABiC79/PAACDdbwAABju8fAXAMBg7/EKAGBYu/YFAGAg9+0DAMDgNo/XSdLm5JxW0sH+JE2TJm1a9aQI2NiSYD0Mlj9JEiKSkAzY/XrKnPQkpydJUoDrXnvFQlIAu67aLVDAfbAgu4k1gHX/pZ2cJKme/xmiNhnfUYYUAAAAAElFTkSuQmCC)}#webamp .playlist-top-title{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAUCAMAAABMHminAAABd1BMVEUdHS0dHS4eHS4eHi8fHyIfHzAfHzIgHzIgITMhITQiITQiIjUjIzYkIzckIzgkJDkkJSklJTomJTsmJjsmJjwnJz0oJz4oKD8pJ0ApKUApKUEpKkEqKUEqKkEqKkIrKUIrKkMrK0QrLEQsK0MsK0QsLEUtLUYtLkctLkguLUcuLUguLkcuLkkvL0ovMEsvMSUwL0swMEsxMEwyMU0yMU4yMk8zM1A0MCw0MlA0M1E0NFE1NFM2NVM2NVQ2Nk82NlU3NVY3N1Y4N1c4N1g4OFg5OFM5OFk6OVo7Olo7Olw8O109O149O2A9PFs9PF89PGA+PGBAQFhCQV9FQTtIR2ZMTGFVVG1WVmNbWnZfYGpgX3dlZXdlZnRnXEJnaHZoaHhpaXtqanpraoBra3xsbHxsbH1tbX9uboFwb4NxcYZzcohzc4p0c4p0dIp1dYZ1dYx4do54d5B5eIl9fY6FhJSGd02LjJqOkZCQj6CXlqeioq+srbettMQFH6KtAAADiklEQVQYGQXBTa8VVhkG0PW8+1zuRYuN4gfgpV4q3PpRNTFGw8Q4MlaJsUPjr/D3OHJgjANnNR2hxA6MNW00mKJAC0YSSZu2SkmBnrP361o5gsY09UL3Ymrd3bq7073obgAQSoUYJJKoqIgoY0DYvAgaaFbr1tA0mrawAABKQghBEIkBQXTY3AG7mrpZbfYylzVr123ZrWx199TLWsBYo6vYJEYqoySxFzV6qEqhGIUCGmKJXlqoKRoaWbozWwKzDYvVDYDRmFmAAGTDFVZtdbN69WQuvey6Lbu1stOzrc4uC1ClspkjGTGGSmKjkhpJRUnsbfdeYvNz9399xXze354/8dqFT7z+rfGnb9fNunTr3/393H3Djzz53Qsn/ea7h6x//Hnxs32eXL14fPeVTD8++ejlH+7fvPXC9vc/2P5Bff7SuzeOT5tv1UXsro+XfnpGVZ1DPqqTJzz99AOQI8zz6bPB/pcOSLv5cj1rwC9v738F9Djog/VqX7ycN8PQ+Nzp7Y23//f+a++5fV2cq9pc85iu/1w44my9B+yfpc6s7f7pd8xxyXavpxMXbWvC5T0LJd/MvcNv/P3uhU/d/1dYo8Hel7cPPwDaNer4+OvEEwe7+XHvB+aTp3Dqow99Ju733mMW559555UZ+MKZu3/E0odz69Bfp9ehFN6+M+0dLcHg+Ph4c8Zb8GiOD058bAuLf34tzmc85dwNHp+8d6R481WrFvyKcPo7/nKwDvsgWYMYz3iAz5697Tk05p4Pn7X5hYdXiAeffNcXH2qK/9694OyTa763/2nuXbx+JBu6uxZgcOqU+G0uH371DWh1yS08Gs+ZtwtYV65elZ8AW61ZbfYyl6V3utc0s9U9Wy89QWpupMgoNoY9STKSUpWNFAmbLnIENHNaTbduk2XRemltsRoARFEiBokkKpJEijEgFOgGQNC0poGGBQBIWokINAgJLABsXgQ0DaZumoamad1YAEChCCEIIWFAkA6bO2CZui169uq1dPeu25q92k6bbWXtohlzswbJJjJkZCTJiCqjYkRJ2IMC5gTFAugpFhB2pa01emCOXVplQ0iNClAMelDAahTYjQHoDkEIMaJmM2Z3d7cFU2CubtoEWExMAAkKbOYEizRTLLSYbQ0SCd0WkvRCNVitgVAI0OwgR9CYJqvp7ja17tZtac3S3QCQiJJIIpLEEBWkjAHh/7B25tuthDwsAAAAAElFTkSuQmCC)}#webamp .playlist-top-right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAMAAABPqWaPAAABNVBMVEULDxYMDAwOFQsUFBQdHS0dHS4eHS4eHi8fEQofHyIfHzAfHzIgHzIhITQhIjQiITQiIjUjIzYkIzckIzgkJDklJTomJjsmJjwnJz0oJz4oKD8pKUApKUEpKkEqKUEqKkEqKkIrKUIrKkMrK0QsK0QsLEUtLUYtLkguLUcuLUguLkcuLkkvL0ovMSUwL0swMEsxMEwyMU0yMU4yMk0yMk8zM1A0LhA0MlA0NFE1NFM2NVM2NVQ2NlU3NVY3N1Y4N1c4OFg5OFk5OVc6OVo7Olo7Olw8O109O149PFs9PF89PGA+PGBFQTtGQh9ORDBQPx5YVjxnXEJqanpra3xsbHxsbH1tbX9uboFwTyxwb4NxcYZzcohzk5p0c4p0dIp1dYx4do54d5B4h4yGd02LjJqNcTiOkZC/uXdbAAABJElEQVQYGQXBsWpTYRyH4ff7cig5a8FCKAge2slNqFvoBai4e5d26h0UrCnYpaCSrbV2cA0k5/97fZ42WYVR1ZCgZWC4REGDSEAVuRpeUoayyiqddU6IdIGeDkCHBQFgpo2s1dXR/mj/66BvHm/h4vSunocv/67XrpYsWb69L5yAadsaw+IV8hMAAl8/Tbtxe/tahhtAAKAXuBt30KCfnUEHAAL8HXcnQKcfH2huAPje4fO0/fNjujC0kbXMNwds75ydHr/B+9NNntuHlJZWYpWpOcb4NDxYpUTVSAzzx03RoQECIAQomGG4RESDSFCuABheUv2AVTFV2ScamnRCNYiYKAsUhA5g0pqNRpgVADq01gCaxNIgAMODVZJz+F2WWisA+A8o2vB09xIFIgAAAABJRU5ErkJggg==)}#webamp .selected .playlist-top-left-fill,#webamp .selected .playlist-top-left-spacer,#webamp .selected .playlist-top-right-fill,#webamp .selected .playlist-top-right-spacer{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TkVWnvkzfnqmhvyf///2lviaujNe0tWTcplfaW0CVOVFQ1ae8TumRGupRddLFktIAkpQpipEvqoosl9EhdAAvFKfTd8tQbAAAAAElFTkSuQmCC)}#webamp .selected .playlist-top-left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAMAAABPqWaPAAAA/FBMVEUdHS0dHS4eHi8eHyUfHzAfHzIgHzIgITMhITQiITQiIjUjIzYkIzckIzgkJDckJDkkJSklJTomJTsmJjsmJjwnJz0oJz4oKD8pKUApKUEqKUEqKkEqKkIrKUIrKkMrK0QsK0MsK0QsLEMsLEUtLUYuLUcuLUguLkcuLkkvL0owMEsxMEwyMU0yMU4yMk8zM1A0MlA0NFE1NFM2NVM2NVQ2NlU3NVY3N1Y4N1c4N1g4OFg5OFk6OVo7Olw8O109O149PF9FQTtqanpra3xsbHxsbH1tbX9uboFwb4NxcYZzbFJzcoh0c4p0dIp1dYx4do54d5CukmXsznr///9ua7yBAAAAvklEQVQYGQXBsU0dQBAFwHnvFsshErl7MQVQtlsgIEGWSMkd/FvPBJEmjWrbJEkbr0RFRFQSkeG9+bHn7GmaNtNKWsTtKsRCMETv+QQAMASfbwEAGKyjAACGezx8AwAY7D2eAQAMa9e/nwAAA7m//gAAGNzm8TJJ2jTntJIO9itpmjRp06onRcDGlgTrYbD8TpIQlYRkwO7HU+akTU5PkqQA1712xUJSALuu2C1QwH2wILuJNYB1/6adnCSpnv/+0TYBQOmyqAAAAABJRU5ErkJggg==)}#webamp .selected .playlist-top-title{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAUCAMAAABMHminAAABd1BMVEUdHS0dHS4eHS4eHi8eHyUfHzAfHzIgHzIgITMhITQiITQiIjUjIzYkIzckIzgkJDkkJSklJTomJTsmJjsmJjwnJz0oJz4oKD8pJ0ApKUApKUEpKkEqKUEqKkEqKkIrKUIrKkMrK0QrLEQsK0MsK0QsLEUtLUYtLkctLkguLUcuLUguLkcuLkkvL0ovMEswL0swMEsxMEwyMU0yMU4yMk8zM1A0MlA0M1E0NFE1NFM2NVM2NVQ2NlU3NVY3N1Y4N1c4N1g4OE44OFg5OFM5OFk6OVo7Olw8O109O149O2A9PF89PGA+PGA/QitAQFhCQV9FQTtIR2ZMTGFVVG1WVmNbWnZgX3djY3BlZXdlZnRqanpraoBra3xsbHxsbH1tbX9uboFwb4NxcYZzbFJzcohzc4p0c4p0dIp1dYZ1dYx4do54d5B9fY6FhJSLjJqQj6CXlqeioq+srbettMSukmW8u8XHx83KydLW1tzk5Ojsznry8vT////NCpc8AAADfklEQVQYGQXBS6tfBxUH0PXb5+Q+Y2oFI5ZoknpLiU8cCELopANJG+M38Ds48nM4ciw4cVJ0INhBK5T6KPVRChVFIzHUB4IQvYbEe+//7O1auQGDzWYaM81mzMyYmclMMzMAIJQKsZBIoqIioiwLhPUuGGDoMaNhGAyj0QAAJSGEICiJBYKYsD4EW9oMM3bTunVnm9G2zoWZ2UzrBpZepoo1saRSJYk1qmaxVIKiCgUMxIhpI6TFwCBtJttIYBuLpmcAUINOAwKQlTt07cww073Rbdo2o23d2Zlt9GSXBlSprNuSLLGUSmJRSZZURSTW3fo667edf+eO/pL3vrj/7mf3f/OVS29/df3Dwc0H9+dry3/eds/Zj1858oN7V9j+9Ivmm3uc/+rqC6c/yuYbR09+cnf//u9f3b3x6sWb6vmbj3/95eNcPLj8HC7er9e/taeqDpDz5XjftYMzkOfR15c5CPZvHRLu/3y5aYHv/XXvC2CWwzns387Nl+vPoQyeu3z+u6ePPnz3sb+/Lw6q1g9sTM4Ob/DMegpm/yq5ttv2P/XQbj1xvjdcPbTVBrevaJS8lNMrt985feb4vw/CZMD+586e/TcwPqBOTl4k/ubwYnc8HwZ2Z8c4ON+5Hk9n7ynN0ccfv7cFrh+c/hBtnt21j3pz5y2Iwj8eXdi/PqA4OTlZ9/wTnu7Ws6zn0Pzx83F9ucQBnh49uaL4yy91NXyflPX2vHO4Hc1h0oi84DE+uX/fLUCvHn3C+l2P7xD/u3zq+MJQ/OvRx1w7+6mX9z/Nk8O37glmphqwtKPPOPRaXvnISz+Dsd70AGfLLRf3A/Sd18jXgZ0xzNhN69ZmM9Nty4WZbUybDaS2VYosxWqxSpJKSiqXJCQsU+QGMGybHmbM2GjNmDZG0wMAoigRC4kkKpJEimWBUGAGAMEwhgEGGgCQjBIRGBASaACsdwHDgM0MzcAwjBk0AFAoQghCkbBAkAnrQ9DajGF20zNtZrYZ3dNjZ2yj07sYlm3thWSNLLKkkqSiSlWsEQkrFNANQgNMiwbCrozuZRZsyy6jshJSlQBFMSsBelBgqwJMF0EIUVHbsGwzMzMaNoGtZxgN0DR2ABIUWLrBUE2LxogevZBImNFIMo0a0GOAEBQwbJAbMNhs9DAzYzNmxow2hjYzAJCIkkgiksQiKkhZFgj/B6KI5O4cXV8dAAAAAElFTkSuQmCC)}#webamp .selected .playlist-top-right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAMAAABPqWaPAAABI1BMVEUdHS0dHS4eHS4eHi8eHyUfHzAfHzIgHzIhITQhIjQiITQiIjUjIzYkIzckIzgkJDklJTomJjsmJjwnJz0oJz4oKD8pKUApKUEpKkEqKUEqKkEqKkIrKUIrKkMrK0QsK0QsLEUtLUYtLkguLUcuLUguLkcuLkkvL0owL0swMEsxMEwyMU0yMU4yMk0yMk8zM1A0LhA0MlA0NFE1NFM2NVM2NVQ2NlU3NVY3N1Y4N1c4OFg4QlY5OFk5OVc6OVo7Olo7Olw8O109O149PFs9PF89PGA+PGA/QitFQTtYVjxnXEJqanpra3xsbHxsbH1tbX9uboFwb4NxcYZzbFJzcoh0c4p0dIp1dYx4do54d5CNcTisrbeukmWwmV7O4tDsznr////5EmU+AAABC0lEQVQYGQXBMUpcYRiG0ef7708qu4mgxYCFVdbgtIGsIesLZAOuQ0GIlfXFMEMgTOXc7308p/Z2Y1Q1JGgMzAcUVIIIqsjjPKUNm912a+uWEBkCIwsAAwYBYKMmB3UP8Oeid65wW8/9Pn/274P7BeDbS+PXsnbHKmZN5B8ABNba9XJalbkCWgCOBvvLhxTMa2BggQSo5WMpGMzlTMUS+D+a293J2vk3zF8crPMVwBmt4wqWUN/T2rETu022GOM6X+1Womokhv7x1AwoQACEAIEN5gMiKkFEeQRgntLjglvHdOeSaCgZhC6ImCgLCsIAMF1lUcimADCgqgBKYmsQgPlqt8R73tpWcwMAn2oG882E0Lr4AAAAAElFTkSuQmCC)}#webamp .playlist-middle-left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAdAgMAAADjkWVKAAAADFBMVEUAAAAdHS0pKUBqano8VvpZAAAAD0lEQVQI12OoilvCQGcMALzxKw1EtyFgAAAAAElFTkSuQmCC)}#webamp .playlist-middle-right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdAgMAAADX6KRWAAAADFBMVEUAAAAdHS0pKUBqano8VvpZAAAAEklEQVQI12OwmrXq1UuGIUICAIEjYC7HaOXEAAAAAElFTkSuQmCC)}#webamp .playlist-scrollbar-handle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAASBAMAAACUbIJFAAAAG1BMVEUJAgJ1XCKNcTibgkmwmV6+sX3aypzy8vT06sbDyd/kAAAAKElEQVQI12NIAwKGJCWlAoakiHYHhqRGD/KJimYHhnQXFwEGBQYGBgB4dhfwKIryTQAAAABJRU5ErkJggg==)}#webamp .playlist-middle-right:active .playlist-scrollbar-handle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAASBAMAAACUbIJFAAAAGFBMVEUgDABsURh1XCKNcTihhkuwmV7DrnXaypzxKekLAAAAKklEQVQI12MIDQ0NYAgUFCxgCHRLN2AITDQjnyhLMmAINzYWYFBgYGAAAIGKEsehmtv8AAAAAElFTkSuQmCC)}#webamp .playlist-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAmAgMAAABMq9iIAAAACVBMVEUnJz04OFh0dIo98+79AAAAGUlEQVQY02NYBQYNDKFg4DDiaHSAKzygAADHT1L3iexI4AAAAABJRU5ErkJggg==)}#webamp .playlist-bottom-left{background-image:url(data:image/png;base64,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)}#webamp .playlist-bottom-right{background-image:url(data:image/png;base64,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)}#webamp .playlist-visualizer{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAAAmBAMAAAB+CntdAAAAIVBMVEUAAAAAAAwAABAACCEAa7UYGCkZGSMnJz04OFhjnPd0dIrCNSsmAAAAW0lEQVQ4y2NYRQxYwNBBDGgYDsrKiQELGIgCCxhYiQFEm8aiSpRpTMSZxkmcaYxEus2MmqaNum0Yuk1FU0VTRFPF0sQSOwZBovNCFXEFF1HZuYBYZQNSWhLnNgDqVFE4O/Zo0wAAAABJRU5ErkJggg==)}#webamp #playlist-window-shade{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAOAgMAAACnVF/TAAAADFBMVEUAAAAdHS0pKUBqano8VvpZAAAAHUlEQVQI12MIBQMHhv9gcIBhFRg0MFALwMyD2gMAcRoULw29bBMAAAAASUVORK5CYII=)}#webamp #playlist-window-shade .left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAOAgMAAACnVF/TAAAADFBMVEUAAAAdHS0pKUBqano8VvpZAAAAIklEQVQI12MIBQMHhvr/IHCAoWoVCDQwVDFAAMU01DyoPQAU7xeZEgCs6QAAAABJRU5ErkJggg==)}#webamp #playlist-window-shade .right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAOCAMAAABaWb9VAAAANlBMVEUAAAALDxYMDAwdHS0fEQopKUA0LhBGQh9ORDBQPx5YVjxnXEJqanpwTyxzk5p5ip6NcTiOkZBJ6prXAAAAbUlEQVQoz6XSORaAIAxFUQjyFTEO+9+sBI82ajT6KgpukYAL5txgLbhoLbjLfpFGkkMGESHfk2kXGEtiegbA0MiGUEm5GKnjxCCdCMJykDZxekdKqASc5idSZ6nk5SznjXnvtY2p7/Lh9e3fcgVRHAwq+Kdj5gAAAABJRU5ErkJggg==)}#webamp #playlist-window-shade.selected .right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAOCAMAAABaWb9VAAAAM1BMVEUAAAAdHS0pKUA0LhBFQTtPSThYVjxnXEJqanpzk5p5ip6NcTiOkZCsrbewmV7O4tD///+ogWxMAAAAbElEQVQoz52SSQ7AIAgAsQjU3f+/tpIup9ZI58SBCSs4M7BbcbBZcfDKHyXeCV7RQBgRWb6VfkmeQilBHa7CUnmmnBJRGdCIUGqqgnNFJWqPwqknXlIGtFxFG/O5tUyLs0TrxuLsLj+ub3/LA63jB8yJpQTsAAAAAElFTkSuQmCC)}#webamp #playlist-add-menu.selected .bar{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2AgMAAAB/8csyAAAADFBMVEUvL0RGUF2BkqXt//98VqXeAAAAFklEQVQI12NgYTBhKGHYQmNYArSFBQBn5SMZFZ1KogAAAABJRU5ErkJggg==)}#webamp #playlist-add-menu .add-url{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAWElEQVQI14WOsQ2AMAwEv3LPKBYTABsgorTfxCtkfRyUOIiGq04v62Sk4EKugxPZOmVzpxAGKeoupInwcWD6e3eP+9FpTnppOvm3g6307cTPinSsHcW+BDd3RTueo3YTtwAAAABJRU5ErkJggg==)}#webamp #playlist-add-menu .hover .add-url{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAV0lEQVQI14WOyQ2AMAwE9+MCEEkDdEAnGwmXACWQ9skFmx/zGq2skbEJLALBB8eOmF8S4n11zupOIxzW3Eg3Y3NAPu/Fv/tB77CU5OTfDtZSQpg6q/5/AGMtMU3PzLN0AAAAAElFTkSuQmCC)}#webamp #playlist-add-menu .add-dir{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAWUlEQVQI122OsQ2AMAwEv/qeUSwmADZARG6/iVdgfRrHScFVp5d1MlrxwN/BDY+kH/AQhQC7wYNSkOoGD2D6ulPzfnQsO2K6gtLifzuF4Uunfja0a08M51Z82fg51vPZ5kgAAAAASUVORK5CYII=)}#webamp #playlist-add-menu .hover .add-dir{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAV0lEQVQI12NQQgAGQQRgEAmFghBDBtFyGAhkEC1Lg4BUEDs0gDWAIZSBFcxmDQgIZWUNALMZGBBsZHEgG64eCuDmBLBC2QFgLQg2NnGQehBbBMkcYYT7AQVAL9EsAFyYAAAAAElFTkSuQmCC)}#webamp #playlist-add-menu .add-file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAXklEQVQI12WOsQ2AMAwEv3LPKBYTABsgorTfxCuwPpZJDIJzc3q9LaMkB+o52FGt0xZ3CmGQpu5CmgjDgcffuXv2xx13wseIcPOW8c4lXH65xQa+d/JnRdnmjmKdkguiDDkEOAftpAAAAABJRU5ErkJggg==)}#webamp #playlist-add-menu .hover .add-file{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAXUlEQVQI12WOwQ2AMAwD/ckAiHYBNmATI+ERYARYnzQttBKXz8lyomDpYOogqbGvyPfLhnydlaO4aIRg4UbKjOFA9zF3//qN4oSPiHB5S6y5hdsvV2x4Pw135v7/A+euLyJ1PQpNAAAAAElFTkSuQmCC)}#webamp #playlist-remove-menu.selected .bar{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAABIAgMAAABO2aeDAAAADFBMVEUvL0RGUF2BkqXt//98VqXeAAAAFklEQVQI12NgYTBhKGHYMghgCdAlLABvUy/BqCAQTQAAAABJRU5ErkJggg==)}#webamp #playlist-remove-menu .remove-all{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAWklEQVQI13WOMQqAQBADp0rvUw5foP5AlG23MV/w+xbenSI41RBCCHtnI87GSrhyTIQxknUUwpJM3o4xPLnU/Om3nULYSmf1zJfzk2eS+LvTPxf2ZawU5qFzAa7rOIxN5zmHAAAAAElFTkSuQmCC)}#webamp #playlist-remove-menu .hover .remove-all{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAWElEQVQI13WO0QmAMAxE7ycDiO0CbuAmJ3gj6Ai6vtGmpD8+CDwuIRyWBFOComBfUe/OhnqdjeN1QTCTfW5uoPVcQOY+4XkfNDeK4eTg+MnpG7iX4c+c/R8m4y6+oJDkfgAAAABJRU5ErkJggg==)}#webamp #playlist-remove-menu .crop{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAR0lEQVQI12MIhYMQhvByGAhiCE+DglRHJLYhHjZDAlsCEIPYCWkJYABlswGZyOIw9QlA9fjNxMGGu9mQIdTZGAoMGZwE4QAAjAZBLD2pp6oAAAAASUVORK5CYII=)}#webamp #playlist-remove-menu .hover .crop{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAASElEQVQI12NQQgAGQQRgEAmFghBDBtFyGAhkEC1Lg4BUEBumCC+bIYA1AIhB7IDQADCAslmBTGRxmPoAoPpQ4swXQWILI9wPAIC4Ne4ZKh5qAAAAAElFTkSuQmCC)}#webamp #playlist-remove-menu .remove-selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAXUlEQVQI112OvQnDUBgDr1KfUR6ZIMkGxuZr1VgreP0Ufj/gqw4hhDgmO3UNNiqd80OFIEVnoyIp+HZCYOXS8NUfO41KMO7uOMMja7pXbhmT58783Dh+707j+5r8AVpzN34SgZTJAAAAAElFTkSuQmCC)}#webamp #playlist-remove-menu .hover .remove-selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAWklEQVQI102O0QmAMAwF388bQGwXcAM3iWBG0BF0fWOb+rxSOI40FIvAJFA82VfUe7ChXmfneN3hIJ3NGQbj6A6ox03XfNIdBku3drLT+LmpR40X4eW3Z9b/H/ZpLd3ACl8TAAAAAElFTkSuQmCC)}#webamp #playlist-remove-menu .remove-misc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAYUlEQVQI102Ouw0CQRQDJ3JOKSsqADpAd3qpk3ULtE+wn7uJLGtkmXNzUL/Fl8qkv6gQpKg3KpKCRyYErl5a+fLXTqMcO4TeKIs4Hj04mtl27O1bw7/v7M+N8/OcNN6PzR8ABzaO5fDK/gAAAABJRU5ErkJggg==)}#webamp #playlist-remove-menu .hover .remove-misc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAXklEQVQI102O7QmAMAxE788NILYLuIGbRPBG0BF0fZN+EB8UXo9LCLYES4KiwbmjvpMD9bk7V7ggkGJzusE4cwGZ+xue/UG4ySwmmhPyf88BE4c7UZt9Y/TLb8+a93++ly0VHemPIgAAAABJRU5ErkJggg==)}#webamp #playlist-selection-menu.selected .bar{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2AgMAAAB/8csyAAAADFBMVEUvL0RGUF2BkqXt//98VqXeAAAAFklEQVQI12NgYTBhKGHYQmNYArSFBQBn5SMZFZ1KogAAAABJRU5ErkJggg==)}#webamp #playlist-selection-menu .invert-selection{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAXUlEQVQI113OsQ3DQAwEwY0udymEK7DdgSCBKZO/FtS+k39K0EYDgiDI0e3kudpIz8aHNFKVNYJ0mbu5LIxHzP3ldSdIu4Q0LcvLZdrWNccIPe/0z8Hxe8+C76v7A5OQN+oVjwHMAAAAAElFTkSuQmCC)}#webamp #playlist-selection-menu .hover .invert-selection{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAXUlEQVQI103OwQ2AMAxDUV88AIIswAZs4kh4BBihrM+BhvafnqooKfYRlhE2984D8VSJaPfXlYgmyKSciGaKkzFZFP3Pd9eBRDSLgrppuSyLZXO8w4LgxDbtWcf/X0qvMI9I7cp+AAAAAElFTkSuQmCC)}#webamp #playlist-selection-menu .select-zero{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAYElEQVQI102OwQ2AMAwD/cqfUSomADZAVHz9oSuwPm4aAtfPyXKtoCYHzvtlx9mCa+kOgvIip7/hzWjp/HKl+hF57Mh7SGs2OqoL9z5jw30+cu8z+r+dvLmgbnNQsE7JAyOvPXLeVffRAAAAAElFTkSuQmCC)}#webamp #playlist-selection-menu .hover .select-zero{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAX0lEQVQI102Oyw2AMAxDc8kAiHYBNmATI+ERYARYn3wK4fXyZLlWZClkKqRxsK/S75dN+nUmhzspEJDhiJdOhX6Oyi21HyNP3D2EUrNjdSPcZzQ95kcefXi//Xbmuv8BohAy09WnmqwAAAAASUVORK5CYII=)}#webamp #playlist-selection-menu .select-all{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAUklEQVQI12MIhYMQhvByGAhiCE+DglRHEJshgSEByDYEshPAEMJOY0tgg7MTEOJAUaAOqDjUHKh6hBpk9Qw4xBOwmgN3syFDqLMxFBgyOAnCAQD0WT/cwFbKdgAAAABJRU5ErkJggg==)}#webamp #playlist-selection-menu .hover .select-all{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAVElEQVQI12NQQgAGQQRgEAmFghBDBtFyGAhkEC1Lg4BUEDs0lCGAISA0FMwOAEMIO5Q1gBXODkCIA0WBOqDiEABTj1CDrJ4Bh3gA1BwRJHOEEe4HAB23NNar7KHYAAAAAElFTkSuQmCC)}#webamp #playlist-close-button:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAD1BMVEU0MCxnXEKGd02ukmX///8tdlhEAAAAKElEQVQI12MwBgIDBkMBBkEgySjIaMBgIKAgACSFnARgbIg4RA1YPQCfwgXpyvsxsgAAAABJRU5ErkJggg==)}#webamp #playlist-window #playlist-shade-button:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAFVBMVEVFQTtPSThYVjxnXEKukmW0r4e+sX1mGpZYAAAANklEQVQI12NwAQIHBpe0tBQHBrfUtDAHBmdjY2MHBidjYyMgqWys5MDgqKSkCFQjKCACJEHqAT9eCss1JzHfAAAAAElFTkSuQmCC)}#webamp #playlist-window-shade #playlist-shade-button:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAFVBMVEVFQTtPSThYVjyukmW0r4e+sX3BsGNteY1yAAAAMUlEQVQI12MwBgIDBmMBAWEDBkORkEADBiPV0CAgmQom09KUgOJpaYogNYLMQBKkHgD8fwlqtoGUgQAAAABJRU5ErkJggg==)}#webamp #playlist-misc-menu.selected .bar{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2AgMAAAB/8csyAAAADFBMVEUvL0RGUF2BkqXt//98VqXeAAAAFklEQVQI12NgYTBhKGHYQmNYArSFBQBn5SMZFZ1KogAAAABJRU5ErkJggg==)}#webamp #playlist-misc-menu .misc-options{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAYElEQVQI112OsQ0CQQwEN9qcUiwqADpAvJxOctsC7RPgPyEmmmA9so7NS/0+eaozrJuaQBStUmOFkFVqJOJxIIwH8He/O6VGmLMDv7eO4/HEYfaJ8X9n/1w6HtehdL9sPlWoO+DkW3+GAAAAAElFTkSuQmCC)}#webamp #playlist-misc-menu .hover .misc-options{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAYElEQVQI102O2xGAIAwE7ycFOEIDdmAn54xXgpag7Rsembj8LMwSwJZgSVA0OXfUNzhQn3twNadIQehukO/VHaBsutOy6GmjjwdGT2PMaX3eNfmaLnfO3p1+Xn5z1vz/BxcjMYQLzDa1AAAAAElFTkSuQmCC)}#webamp #playlist-misc-menu .file-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAX0lEQVQI12WOsQ2AMAwEv/qeUSwmADZARGndxCuwPomJTcGlOb0+L6MkF+odnKg2aRuqoj9TNOluxu7mTnf+cvMf3s+d4WOG4JtTSVo4iHSN3PvR+XbyZkE51olgX5IHU8k5In6uSFkAAAAASUVORK5CYII=)}#webamp #playlist-misc-menu .hover .file-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAXUlEQVQI12WOyw2AMAxDffEAiHYBNmCTIJERYAS6Pq1LKBIvlycrPywDTAMkf9hX5BJsyNfZOZobarlB7s7qLqecv9w1of44IG9rCPacRtLDQbxukau/efrsmcf/N3ldLzugWMN5AAAAAElFTkSuQmCC)}#webamp #playlist-misc-menu .sort-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAXklEQVQI102OsQ2AQAwDXaVnlIgJgA0Qr7Ru3iuwPgVJ4Corsk/BaC7EXZwIJXNDCASNmI6gSFI2HSEjaZn53WlEd8rzbiGUR0ZlXzLZL5cHRPt/nv7ZMY41cexL8wCXGToqpM1dFQAAAABJRU5ErkJggg==)}#webamp #playlist-misc-menu .hover .sort-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAXUlEQVQI102O0Q2AMAhE74cBjO0CbuAmZyIj6Ai6vtBS6fvpCzmOYkuwJCganDvqOzhQn7tzuSsICuFOpaHS5mIq4cy5Z/9MELvwru62rZG3V2Xy0dPuupepZ83/f5v5MBfSedE0AAAAAElFTkSuQmCC)}#webamp #playlist-list-menu.selected .bar{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2AgMAAAB/8csyAAAADFBMVEUvL0RGUF2BkqXt//98VqXeAAAAFklEQVQI12NgYTBhKGHYQmNYArSFBQBn5SMZFZ1KogAAAABJRU5ErkJggg==)}#webamp #playlist-list-menu .new-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAYElEQVQI123OsQ2DQBBE0R9NTiknKgB3YIE2nYRpgfYd3PlEwI9esBot5+yg7n9fKqNroxwhRVejLClSNyLQbSm4+3E/dxrlmGC6I2dsJooe9jDGLzvz58b5WUeNfZn9AKbQNSZ12uygAAAAAElFTkSuQmCC)}#webamp #playlist-list-menu .hover .new-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAXklEQVQI112O0QmAMAxE7+cGENsF3MBNIngj6Ai6vk3T0uKDwCM5kmAbYBkgqXHuyG/nQH7u4HI3EaRYnW4MByEgvAwE4z/fD0TfSt4QLnp1Fye35iVrtZ+mPev4/wORlyvp1GfF2gAAAABJRU5ErkJggg==)}#webamp #playlist-list-menu .load-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAWklEQVQI12MIhYMQhvByGAhiCE+DglRHhvCEtAQGIGRLNQSzwQDOZkBiw8RBqhMg6uHmQNQwpAHlIOw0NhCGsUEQzk6AssG2pmGYA3ezIUOoszEUGDI4CcIBAJZqO86fMyFaAAAAAElFTkSuQmCC)}#webamp #playlist-list-menu .hover .load-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAV0lEQVQI12NQQgAGQQRgEAmFghBDBtFyGAhkEC1Lg4BUEDsgNIABCFmhbDCAsxmQ2DBxkOoAiHqYBTBzQoFyEHYoKwjD2CAIZwdA2WBbQWwRJHOEEe4HAE6RMXWXqbP6AAAAAElFTkSuQmCC)}#webamp #playlist-list-menu .save-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUvN01OWG5XZHZ5gpaBkqWttMS/zdPt//9STElyAAAAYklEQVQI102OuQ3EQAwDGSl3KYIrsK+Dwy2UTrJswe1fsA880YCgCKltfqpn8VV50i+VhQD1VGEA3FPlQED0VBlAIyfAMfp7Z9zKWjsO7FjueDnThZj5e2f/nGqfc5K6j80fAQw6zDOWMCAAAAAASUVORK5CYII=)}#webamp #playlist-list-menu .hover .save-list{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASBAMAAACtCzMeAAAAGFBMVEUAAAALDxYZICpXZHZneYZ5ip6Jmq2tvMRwzsuHAAAAYElEQVQI102O0Q2AIAxE76cDGHEBN3CTM7Ej6Ai6vlwL4iMkL5ejBesA0wDFG8eG5ensWO4rOeUOgiTkdAqP3CK3cKXInFYLlv2+oL2FZqXXRr3ddT5nc+2NvPzmzOP/L+cIMJ5Oo2aQAAAAAElFTkSuQmCC)}#webamp #equalizer-window:not(.shade){background-image:url(data:image/png;base64,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)}#webamp .equalizer-top{background-image:url(data:image/png;base64,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)}#webamp .selected .equalizer-top{background-image:url(data:image/png;base64,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)}#webamp .band{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANEAAACBCAMAAABpaq8qAAABEVBMVEUAxv8SEh0SWwQTEx4XFyQaGigcGysdMBwfIDEhITQqKUIqKkEqmhYsK0MuLUcuLkgvL0ovL0svMiQwMEsxMC0xMU0xMU4yMU4yMk8yMlAzM1AzNFE0M1E0NFE0NFM1NVQ1NlQ2IRs2NVM2NlQ2NlU3N1Y3N1c3N1g4N1g4OFg4OFk5OFk5OVk9dCpCQl1EQTxNTWZYWHJZVjxasCxlmUVoaHhrcC1xzTR3QyiDg5WHd0yJ4jCNjp2QkJCQxz2SkqKTk6OTk6WWrI+ZmaidpDWfn62k4jipmGWrrZCtLSOvk4yvwziwcR3DcCrE2zLFVCrFhzDGeA/GszXOxtbTIhvTSR/cdx/gVB7gkijgsijgzTBk+3VYAAADm0lEQVR42u3bX09bNxjH8a8fP/lTombrhEC01TSkSuNik/Ym9q73XnKxqVs6VnUbNIFzbPcikNiIk4ZCIY4eXyB98OGIn+JjB4Wf+0aZN0l1KL5p4q+/VU91wqW0YXR0qsEnnHApPyJpUz5/dRe+4eJrU70nBjgaeG2jw3viyYTjYUaIOfs4t+KrtXwTSo75cBd+bO5OFSH+NAHtBfEREeIEJj+v2KeY7UPqZVTabjoFWXF4yV7TyfGAb88L8gVU8TCByS+hl5wgHgB8N5U2o4Lm1OLiQcDH7GeHzH0nB57B/N4U59zid+459Y7PU0E3vvgJqKpcDRdEqJ8iIVwJxVE/ld51QInaUj9l9Yo5glA/ZRlv+aVySlh+A6dQPxV3lfJqH6+esnyqHJDtE9VScRSjekoxFaifslOvz+qRupajfkqRTqmf4rxfPlIO6me5M+zC2MFEu3Yc2aqzRJbIElkiS2SJLJElskSWyBJZIktUT6JUun7u9KqL5UytFGIswlVPTalYjvVTs+crpET9LHaG1FI/7YTd/qHF+eSpn7JchiFBS/3UlJbHVFrshJXz+l8CiZAaqJ/Slu/56qcsT9wU8In6qeH6E7LkUhupn5r84kxypJZI/ZTUtg7AN8kHqJ8SQ9BjOBFPmwK38BJcxgCDjfkR2JgX0N6fGhMix4Nns1ZjhJgQOWGc0xVs2NNuxou1nLN31sn3eDe7NzW2DKZHvXYW274/Y8HhbB2bpptvP8Phv2uYhtyfGgQNfwBeIFA/Nfv7opXEDnDnhtvNRtUDNpteHzJ7Wuo9uksLHvA+4+H+3XgaunnINOcL2IQqQnwN4z+zdtK4LCut5UvhYLrivvLdP910JWG/nM15CIfvMvbpZ3wxgg+3UW9pNo2HMN+UDJjljaryVjfonhUX06NZM3ujfsW6ntcIRv9/YaPqBgXkcTpTIjlHMLJGlTWqrFH1lWiNqu2nNaq2n9ao2n5ao2r7aY0qa1TZJ8sPkMgaVbbqLJElskSWyBJZIktkiSyRJbJElsgSPVUia1TVtOqsUYU1qh6H1qjaftoJu/3DGlXbT2tUbT+tUWWNqsenNaq2hg5cd6PqPzjP2kl34l8l38GsmwkuM55C0z07LZtclzHGjGflxefLW+mijjQo2kmezTn/u2g2zeczf97J30fPc86mB8Xs976YnceQ3fntDyVf9ptbqQ9XZdqA06NUclpQhg9Aa1RtPz8But0Pz3B64+AAAAAASUVORK5CYII=)}#webamp .band .slider-handle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAGFBMVEUAAAAICBApKUJKWmt7hJSLm6etvcbd5ukLNggsAAAAMElEQVQI12NQZGBgYFRgEC8vLy8WYBBPS0tzRqIExXDyQlxcQJQxEAgwAE1hFFQAAB9KDSykox1vAAAAAElFTkSuQmCC)}#webamp .band:active .slider-handle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAD1BMVEUAAAApKUJKWmvd5un5/v8UiEZ+AAAAJ0lEQVQI12MQYAACAQZmY2NjIwYGZiCHCYlyccDNg1BKQAAyAGQKAHJPAsUS1KniAAAAAElFTkSuQmCC)}#webamp #on{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMBAMAAACO67B7AAAAIVBMVEUAAAASWwQvN01KWmtSZnN7hJSLm6ettca9ztbV3vL5/v8M+RL1AAAATklEQVQI12MoRwIJDFWr4GC5A0NVBxyUGjBUNRsbdzRpNHVoQHiCkh0aTU0aKDwlKG/mTBCvCcID6UfoQzUTYTmQV54aCgcGDCnGCGAAAPUyQLvRdOj2AAAAAElFTkSuQmCC)}#webamp #on:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMBAMAAACO67B7AAAAFVBMVEUICBASWwRSZnNje4R7jJyLm6etvcYvdU+XAAAAQElEQVQI12NgwAdMXODAgYHBLQ0OEoA8VDkgdnFgcXBhgfAERV1YHBxYUHgMUF5oKIjnAOGB9cP0maGYqYDkEgAFZxmn+1/+wgAAAABJRU5ErkJggg==)}#webamp #on.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMBAMAAACO67B7AAAAIVBMVEUAAAAA1gAvN01KWmtSZnN7hJSLm6ettca9ztbV3vL5/v911B9qAAAATklEQVQI12MoRwIJDFWr4GC5A0NVBxyUGjBUNRsbdzRpNHVoQHiCkh0aTU0aKDwlKG/mTBCvCcID6UfoQzUTYTmQV54aCgcGDCnGCGAAAPUyQLvRdOj2AAAAAElFTkSuQmCC)}#webamp #on.selected:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMBAMAAACO67B7AAAAFVBMVEUA1gAICBBSZnNje4R7jJyLm6etvcapTzEQAAAARElEQVQI12MQRAYMaDwTFzhwZBB0S4ODRCAPVc5RUNDFUcTRRQTCY2B1EXF0FEHhCUJ5oaEgniOEB9YP02eGYqYiklsAdNMdgDKFw2kAAAAASUVORK5CYII=)}#webamp #auto{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMBAMAAADxOqKKAAAAHlBMVEUSWwQvN01KWmtSZnN7hJSLm6ettca9ztbV3vL5/v/WADVeAAAAV0lEQVQI12NIQwWpDJkzUUAyQ2Y5MihzYsgsUlIqLxQvLBcXFC8UBwswcJSLFwIFQAgmICiILNDRgaoCZBaQI1heWA4xA8MWVIc5MaSFuCADJ4ZgJVQAABsNRRhxaDvQAAAAAElFTkSuQmCC)}#webamp #auto:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMBAMAAADxOqKKAAAAFVBMVEUICBASWwRSZnNje4R7jJyLm6etvcYvdU+XAAAAS0lEQVQI14WOsQ2AQBDDAh8GYKMUHgF6ihP7j0CFxF+DS8tSIv0ymIh8T1xy9aIkI5wIEbmW/Qh2cPAr9BXb2QogOMaIaPSVtR19ACp1H3+cU6+ZAAAAAElFTkSuQmCC)}#webamp #auto.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMBAMAAADxOqKKAAAAHlBMVEUA1gAvN01KWmtSZnN7hJSLm6ettca9ztbV3vL5/v+vLTjBAAAAV0lEQVQI12NIQwWpDJkzUUAyQ2Y5MihzYsgsUlIqLxQvLBcXFC8UBwswcJSLFwIFQAgmICiILNDRgaoCZBaQI1heWA4xA8MWVIc5MaSFuCADJ4ZgJVQAABsNRRhxaDvQAAAAAElFTkSuQmCC)}#webamp #auto.selected:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMBAMAAADxOqKKAAAAFVBMVEUA1gAICBBSZnNje4R7jJyLm6etvcapTzEQAAAATElEQVQI12WOwQmAQBADtwSjsaDAlKAFCIf9l+BL8NZ5DgNJqVE/sTGR8j1xlUcvhmSEEyFSHksdwQ4OfoW+Yj9bAQTHGJHa+sranj59DSTnUdDwigAAAABJRU5ErkJggg==)}#webamp #eqGraph{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAATCAMAAACQnBKzAAAAw1BMVEUqKUEqKUIqKkMrK0QrLEQsK0MsK0QsLEUtLUYtLUgtLkctLkguLUcuLUguLkcuLkgvL0ovL0swL0owMEsxMU0xMU4xMk0xMk4yMU0yMU4yMk0yMk8yMlAzM1AzM1IzNFE0M1E0NFE0NFM1NVQ1NVY1NlM1NlQ2NVM2NVQ2NlQ2NlU3N1Y3N1c3N1g3OFc3OFg4N1c4N1g4OFc4OFg4OFk4OFo5OFk5OVk5OVpsbH5vb4JxcYZzc4hzc4p0c4p0dIt1dYwbWqB2AAAC2klEQVQYGQXBIQ9lSRkFwDpf930zCQqBxaLQ/H+PRuDXrCQkbObd7kNVzD/+qSay+fu/BDL87d/MMtL5628iiP2X31cQ5M//6cp3nrJ//u+upgM//2gAfv7BO6aOP/33ndQx4HVJMQGeXnSgB0/V/lWicJvObrKOrDNJCwJQ1XVzz1F3DxYTsaHBBbx7MIhsfDNHfwSNlE8vuCO8V7QAEJGzTnSlYxL3nojNJkVC+NRLGtoC8wjSIOl9Z2NJ3syeugkAwLvjyFtMl6FaGhoGyK/HZ1SX20D2CzQN+nn3vK8eOoaxAFC0vKxplMlx14qEucCdC10XJquy4/Ho/gKmbO/Mu5/sGQZcAAhN7tr1Jk3cWcu6EM4rGCbBXNdwouX72M0DgXizjh19T6S9twBASU1a+632nn2wiPIgCLDfTViHDV52oFHo+4Oy35M6Ww0KEBXlOilu9uKs6AMCHYH3McpZdQe29gshzE17tlSWZLkDAkCKhnV4wxwW8t4ZCqUAZC8xeL5yLihY6Xx3NGfclqEAgLg30dPcW3dcNzBCigBAigvI95kPSMp36Udti+be6kkBoK0knVTXJzKLwnYgzBAea8Y0hwGery9I2vjkheSMe5iJjABwG5G0Rm6v27ksCXNfEMDXoLHSAq/nM0grfDs+r46LIUgLwKRoj1wd5TOzSG2ZLUgFmCu1dALPd7sFSVDXO3L1rDWARAElTmXuEe5qf8290uDdUqZDyHJnJAfwePrc7wtVsz+SPdou5xwKCCDK0pNFuehkkaI0dC7YXDe6kzP4ft/j+bGJ4J5fH4WIZSnXBYBGxDrvgt2MPRW2hhB30nDHIHTw4OXXD9BBn3yCNF3W62aNAYA7Dtfc4867j2sOxBkCiWIGUsrw5bXyA9FRJj0SzVJZ9qK3ANqRvWql7crWMitq27OBlNAro0E6+OKeF6Sy7XOPNhk3CmQCIORWVk/inPcO/g8Gk8tpHAw47gAAAABJRU5ErkJggg==)}#webamp #presets{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAMBAMAAADrBkIEAAAAGFBMVEUvN01KWmtSZnN7hJSLm6ettca9ztb5/v8/TtPPAAAAXUlEQVQY022PsQ2AQAwDXblnlBcbwAYI9K0bbgXWpwAEErnSuii2topV/ShY1PmzN3UiZOQIWY7uGDsBEwj+2pHjyCF+bJwACdfBGyNfD9Bt102qOU3bPP5pmoaKE9BgTHfswQ68AAAAAElFTkSuQmCC)}#webamp #presets:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAMBAMAAADrBkIEAAAAElBMVEUAAAAICBBSZnNje4R7jJytvcYlh7IyAAAAW0lEQVQY03WPsQ2AMAwEv/gFMgI7QP+RLgNQsP8qFAGBlOTK01m2VaZopXdGqkq7Rk6VtqiJkJEjZDl6NHYCJhD8ryPHkUP81jgBEvrAp5H7AmSqyjG/ZJt9eQMWOi9EkrQa+gAAAABJRU5ErkJggg==)}#webamp #preamp-line{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==)}#webamp #equalizer-window.shade{background-image:url(data:image/png;base64,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)}#webamp #equalizer-window.shade.selected{background-image:url(data:image/png;base64,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)}#webamp #equalizer-volume.left::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAE0lEQVQI12PYwPCF4QcYfmHYAAArXgYxq2vCDQAAAABJRU5ErkJggg==)}#webamp #equalizer-volume.left::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAE0lEQVQI12PYwPCF4QcYfmHYAAArXgYxq2vCDQAAAABJRU5ErkJggg==)}#webamp #equalizer-volume.center::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAQMAAAD3d2XqAAAABlBMVEWjlGrsznoPowceAAAADklEQVQI12NwYHgAhw4AIi4E4a+iLsYAAAAASUVORK5CYII=)}#webamp #equalizer-volume.center::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAQMAAAD3d2XqAAAABlBMVEWjlGrsznoPowceAAAADklEQVQI12NwYHgAhw4AIi4E4a+iLsYAAAAASUVORK5CYII=)}#webamp #equalizer-volume.right::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAEklEQVQI12OwYKhh2AOGNQwWABlSA52dOQTnAAAAAElFTkSuQmCC)}#webamp #equalizer-volume.right::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAEklEQVQI12OwYKhh2AOGNQwWABlSA52dOQTnAAAAAElFTkSuQmCC)}#webamp #equalizer-balance.left::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAE0lEQVQI12PYwPCF4QcYfmHYAAArXgYxq2vCDQAAAABJRU5ErkJggg==)}#webamp #equalizer-balance.left::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAE0lEQVQI12PYwPCF4QcYfmHYAAArXgYxq2vCDQAAAABJRU5ErkJggg==)}#webamp #equalizer-balance.center::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAQMAAAD3d2XqAAAABlBMVEWjlGrsznoPowceAAAADklEQVQI12NwYHgAhw4AIi4E4a+iLsYAAAAASUVORK5CYII=)}#webamp #equalizer-balance.center::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAQMAAAD3d2XqAAAABlBMVEWjlGrsznoPowceAAAADklEQVQI12NwYHgAhw4AIi4E4a+iLsYAAAAASUVORK5CYII=)}#webamp #equalizer-balance.right::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAEklEQVQI12OwYKhh2AOGNQwWABlSA52dOQTnAAAAAElFTkSuQmCC)}#webamp #equalizer-balance.right::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU5QE1jXjujlGrsznokh70QAAAAEklEQVQI12OwYKhh2AOGNQwWABlSA52dOQTnAAAAAElFTkSuQmCC)}#webamp #equalizer-shade:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAD1BMVEVKQT5SSj1sXUO0kWO/uX6z+JYEAAAAM0lEQVQIHQXBwRGAIAwAsLT07Z2zsP8qbuDBAliTmDjl1m8Gob6HK5uWti27V6uxDDFxfn1PDx8P0VYSAAAAAElFTkSuQmCC)}#webamp #equalizer-window.shade #equalizer-shade:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAD1BMVEVKQT5SSj20kWO/uX7CsWHebnl7AAAALUlEQVQI12NQAgIFBiUGBiYFBgVhYwMFBkVhY0Mg6QwmXVwEgeIuLgIwNWD1AJzCBeFqt4OOAAAAAElFTkSuQmCC)}#webamp #equalizer-window.selected #eq-buttons.clicked #equalizer-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAFVBMVEUpKUI1LxJZVjxkW0SHd0ypmGX5/v9OYEDlAAAAJ0lEQVQI12NgAANmRUFlBgamYOUgBgZGU1dDIKmSoghjQ8QhasAAAHO7BEc0qEt/AAAAAElFTkSuQmCC)}#webamp #equalizer-window.selected #eq-buttons.clicked #equalizer-close:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAElBMVEUxMC1ZVjxkW0SHd0ypmGX5/v/v3/6CAAAAKUlEQVQI12NwAQIHBicBBiEHBkcmIUYHBgcFAwUgKRwsAGNDxCFqwOoB1gEH67W94+0AAAAASUVORK5CYII=)}#webamp #equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAALVBMVEUoJz4oKD8pKUAqKUEqKUIqKkMrK0Q6MSljXjtsXUORbkq0h2O0kWPCsWH///8vo79mAAAAO0lEQVQI12NIdTFWUmDIbC/vFGCI2Nl5QoAhfM6a6UCy61U7A4P7nLVAdsTJzhsMDJ5ANQwMLkaKCgwA6D4RaTQt0CAAAAAASUVORK5CYII=)}#webamp #equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAElBMVEU6MSljXjtsXUORbkq0kWP////9IyyfAAAAKUlEQVQI12NwAQIHBicBBiEHBkcmIUYHBgcFAwUgKRwsAGNDxCFqwOoB1gEH67W94+0AAAAASUVORK5CYII=)}#webamp #position{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPgAAAAKCAMAAACuVWMrAAAByFBMVEUPDxgPEBkQDxgQEBkRERoREhsSERsSEhsTEx0TEx4TFB4UEx8UFB8VFSEVFSIVFiEVFiIWFSEWFiIXFyMXFyQXGCUYFyUYGCUZGSYZGSgZGicZGigaGSYaGSgaGicaGikbGyobGywbHCsbHCwcGyscGywcHCsdHSwdHS4dHi0dHi4eHS0eHS4eHi0eHi8fHzAfHzEfHzIfIDEfIDIgHzEgHzIgIDEgIDMhITQhIjUiITUiIjUiIzYjIzcjJDgkIzckIzgkJDckJTklJTolJTwlJjslJjwmJTsmJTwmJjwnJz0nJz4nKD4oJz4oKD8pKUApKUIpKkEpKkIqKUEqKUIqKkErK0IrK0QrK0YrLEUrLEYsK0UsK0YsLEUtLUctLUgtLkctLkguLUcuLUguLkcuLkkvL0ovMEswL0swL0wwMEswMEwxMUwxMU1hYm1iYW1jY29jY3BjZHFkY3FlZHFlZXNmZXRmZnNnZnVnZ3ZoZ3VoaHVoaHdpaXhpaXppanlpanpqanlqanpra3xrbHxsbH1sbH9tbYBuboBvboFvb4NvcINwcINwcYVxcYZxcoZycYdycodzc4hzc4pzdIp0c4p0dIt1dYwExkcuAAACuklEQVQYGQXBAWEANxADMPmSFsOAjT+QNX+eFEYgZicIBCMQMBlphNGBIJgZQLjId3bmPtcHfncAkIZoAAAAAECBAuy7Hsfb2dnuwEPB7qKawjer1OYBhR0jAFMAFQIAQRJsAjSBnQUJF74aHp+DuQAgDVEAAAAA0EIVAPvgy7BSeLTgWUChFhr5QAsS/jFumXD3NrlkiGDOkNnJbGJigksiOHuIuyYmFdzxMmaH3/9+GHvAqKPTkMKgAQCbziLV77xZCiv/AZY+qB2bv/Oofmn5+1mPWnm0fPieUjVG5pZJMZJ9aqXB75nFTm3qxgAsxZ5SxrBNcN/uGQz256vdKdg5+aRBMSAAAFlorc0OCQtg11sXYnbtobUU7nJJ1FA+1D3QmNQZjHKXmptFA3+LmAzGK3D1OyAjxDo1swV0Abc95UQZY4toTBKjAAqgE1qdo5YW/HFh/OSBMuBiBLx97+GTtxrf0NVHpSbxHki4w65eI8GECWoGluBxP0gg7iQwgTdmAF9nx6iwmeecpNK0aVdQEKWKLch+MxB4zvVgAbCr3vewCp+5QKpU6FKASaQM7oWZ3y9vBPTMgtCMeyjoOzBN4fGZ3YDfmWVA7zcmpTjvWpVSVkYRQAiTgXxfp4uqrJt92KUPAJun+FJwAkpHFAsvoLuD81MLrLqSSwOHCRM2jBnhXi7iGxH3rmEGWH8H4P4NKglchgoTkwUA0M3aqJ67pgt8w9+MNcjlgcV3oaelLA/7bSgahUfBrBkMnlHoR1LMM0Ew7HQFfDcgi3pzQYB1i+HKDxbg+8yXENasqQAASbNa5c1OhjRr/d3HWNiF2tHOg1ShO6hxPCld4S8IuOPfCIjpIJiaHdMDaXL2QJAQEAYEGCKAEQRpgLGGaBoBAABomkIrWkAVbIFSNkVhU4raFMWbLYV2WcX/K67c097eK2wAAAAASUVORK5CYII=)}#webamp #position::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKBAMAAAC6bkgfAAAAJ1BMVEUJAgJlZXNlZnN1WyKDaTCNdTqcgkqvmGHFsn7by57u4rv06sf19fW6wGFFAAAARElEQVQI12PQnIkMAhgkXZDAUQYGSY/dcLCnFMj3PgMHp8F8YziwBvPL4aAaxPdB6N8G4p9CyJebAvmhyICBQYABBQAALnc7YhsUgeUAAAAASUVORK5CYII=)}#webamp #position::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKBAMAAAC6bkgfAAAAJ1BMVEUJAgJlZXNlZnN1WyKDaTCNdTqcgkqvmGHFsn7by57u4rv06sf19fW6wGFFAAAARElEQVQI12PQnIkMAhgkXZDAUQYGSY/dcLCnFMj3PgMHp8F8YziwBvPL4aAaxPdB6N8G4p9CyJebAvmhyICBQYABBQAALnc7YhsUgeUAAAAASUVORK5CYII=)}#webamp #position:active::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKBAMAAAC6bkgfAAAAJ1BMVEUgDABhRhBmSxNsUBdwVRt4XSGBZyqPdTmhhkuwmF6+qG/DrnXYxZOv4MtwAAAAR0lEQVQI12PwnIkMAhg8XZDAUQYGT4/dcLCnlIHB0vsMHJwG85XgQBvML4eDaiBf0wehfxuIfwohX67KwCAZigwYGAQYUAAAXWI7mESGeYIAAAAASUVORK5CYII=)}#webamp #position:active::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKBAMAAAC6bkgfAAAAJ1BMVEUgDABhRhBmSxNsUBdwVRt4XSGBZyqPdTmhhkuwmF6+qG/DrnXYxZOv4MtwAAAAR0lEQVQI12PwnIkMAhg8XZDAUQYGT4/dcLCnlIHB0vsMHJwG85XgQBvML4eDaiBf0wehfxuIfwohX67KwCAZigwYGAQYUAAAXWI7mESGeYIAAAAASUVORK5CYII=)}#webamp #shuffle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPCAMAAABDVWaoAAAAilBMVEUQWgAqKUIqKkEqKkMrK0QsK0MsK0QsLEUsLEYtLUcuLUcuLUguLkkvL0ovN00wL0swL0wwMEsxMU0xMU4yMU4yMk8zM1A0M1E0M1I0NFE0NFM1NVQ1NlQ2NVM2NlU2NlY3N1c3N1g3OFc4N1g4OFk5OVpKWmtSY3N7hJSElKWttca9ztbV3vLv///LbncEAAAAqklEQVQoz5WSsQ7CMBBD37WpGPgDpJtY+/8fAxLLfUbVM0OiNgKG4CGKL45jRbYbiSUIkBAiMZJEqI2EMjGYynVhHHoWmIfle1IEOeqeogCwAQwFq3oesIoADyfaAt4mBHivb/Av5h8nRQCslQVOHPrK/Nif/ouaSdDd+OlvXYDD2qOP1r9j98s8/p/5KlarMIoCu/SPXvmf/yb2SQJkotZD087Z2VrcBIM3KB9V4lGQbMMAAAAASUVORK5CYII=)}#webamp #shuffle:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPBAMAAACGpYupAAAAGFBMVEUAAAAICBAQWgBSa3Nje4R7jJyPn6itvca8iDuFAAAAY0lEQVQY02MQxA4EGHBLuIZighBDoER4ORYQCJLAoiMUIiEoKIpdQkgpNYAhIJSVNQBIARkBDEgSoRCJUAiESoilgXQwYOoAgQBsOkDiIDsCWMHCDCg6sLoKh4Q7LglD7IEIAKjwVurEkbm9AAAAAElFTkSuQmCC)}#webamp #shuffle.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPCAMAAABDVWaoAAAAilBMVEUA1gAqKUIqKkEqKkMrK0QsK0MsK0QsLEUsLEYtLUcuLUcuLUguLkkvL0ovN00wL0swL0wwMEsxMU0xMU4yMU4yMk8zM1A0M1E0M1I0NFE0NFM1NVQ1NlQ2NVM2NlU2NlY3N1c3N1g3OFc4N1g4OFk5OVpKWmtSY3N7hJSElKWttca9ztbV3vLv//8gEwg9AAAAqklEQVQoz5WSsQ7CMBBD37WpGPgDpJtY+/8fAxLLfUbVM0OiNgKG4CGKL45jRbYbiSUIkBAiMZJEqI2EMjGYynVhHHoWmIfle1IEOeqeogCwAQwFq3oesIoADyfaAt4mBHivb/Av5h8nRQCslQVOHPrK/Nif/ouaSdDd+OlvXYDD2qOP1r9j98s8/p/5KlarMIoCu/SPXvmf/yb2SQJkotZD087Z2VrcBIM3KB9V4lGQbMMAAAAASUVORK5CYII=)}#webamp #shuffle.selected:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPBAMAAACGpYupAAAAGFBMVEUAAAAA1gAICBBSa3Nje4R7jJyPn6itvcZs8alFAAAAY0lEQVQY02NQwg4UGHBLuIZighAjoER4ORYQBJLAoiMUIqGkpIpdQlEwNYAhIJSVNQBIARkBDEgSoRCJUAiESqilgXQwYOoAgQBsOkDiIDsCWMHCDCg6sLoKh4Q7Lgkj7IEIAGMfXXXsp3orAAAAAElFTkSuQmCC)}#webamp #repeat{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAMAAADAkV+TAAAAeFBMVEUQWgAoKD8pKUApKkEqKUEqKkEqKkMrK0QsK0MsK0QsLEUsLEYtLUcuLUcuLUguLkkvL0ovN00wL0swL0wwMEsxMU01NlQ2NVM2NVQ2NlU2NlY3N1c3N1g3OFg4N1g4OFlKWmtSY3N7hJSElKWttca9ztbV3vLv//8ki4GoAAAAgUlEQVQYGQXBMQ7CUAwFMP+SzkgoO1vvfyQOgJBYWKB52OsOQpIVSJaZTdTnCgAAIDUuAACAcwoDAAAyKfCFHQBAAQ+OyO8NGlAAkL3Bs4Fa4AAvGgAqsAfQAKAWAPQTNKACgNYAoBYBAAAozgQAAFAyAQAAWLeRNSQRmS3j3GTCH4ZgNtlEi15VAAAAAElFTkSuQmCC)}#webamp #repeat:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPBAMAAAAFYbKSAAAAFVBMVEUICBAQWgBSa3Nje4R7jJyPn6itvcb4vicLAAAASElEQVQI12NgwA9MXODAWYGBwS0NARyAXISsC5jLwMCCzGUUDAHpYkFwnUBSUC5raIgDA4ILkmFB5Tog9KJZhMI1Q+UqIHsAAPs1JqMDCtK2AAAAAElFTkSuQmCC)}#webamp #repeat.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAMAAADAkV+TAAAAeFBMVEUA1gAoKD8pKUApKkEqKUEqKkEqKkMrK0QsK0MsK0QsLEUsLEYtLUcuLUcuLUguLkkvL0ovN00wL0swL0wwMEsxMU01NlQ2NVM2NVQ2NlU2NlY3N1c3N1g3OFg4N1g4OFlKWmtSY3N7hJSElKWttca9ztbV3vLv///lInoXAAAAgUlEQVQYGQXBMQ7CUAwFMP+SzkgoO1vvfyQOgJBYWKB52OsOQpIVSJaZTdTnCgAAIDUuAACAcwoDAAAyKfCFHQBAAQ+OyO8NGlAAkL3Bs4Fa4AAvGgAqsAfQAKAWAPQTNKACgNYAoBYBAAAozgQAAFAyAQAAWLeRNSQRmS3j3GTCH4ZgNtlEi15VAAAAAElFTkSuQmCC)}#webamp #repeat.selected:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPBAMAAAAFYbKSAAAAFVBMVEUA1gAICBBSa3Nje4R7jJyPn6itvcYox7XLAAAATElEQVQI12MQRAEM6FwTFzhwVmQQdEtDAEcgFyHrAuYKCoogcwUYQpwVwWIwrhNICsoVDQ1xFERwQTIiqFxHhF40i1C4ZqhcRWQvAAA51isA/VWazgAAAABJRU5ErkJggg==)}#webamp #equalizer-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAMAAAC+5dbKAAAAUVBMVEUQWgAqKUIqKkMrK0QrLEQsK0MsK0QsK0YsLEUsLEYtLUcuLUcuLUguLkkvL0ovN00wL0wwMEsxMU1KWmtSY3N7hJSElKWttca9ztbV3vLv//9O4LHRAAAAaUlEQVQYGQXBwQ2DUAwFMEODRCao2H++HnrKofBf7e0NAAD5lhcAAM+6iwUAkJVXwQ8Ho42GVeDjimmmTSM7AGYAKHCBhmmww5GEntHTAykCcIozZ6A8CQAAqawAAEDda/NgbZFErMfuD041NCuZPULmAAAAAElFTkSuQmCC)}#webamp #equalizer-button.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMBAMAAAB7FTvLAAAAIVBMVEUA1gArK0QvN01KWmtSY3N7hJSElKWttca9ztbV3vLv//9R/wqlAAAAT0lEQVQI12Moh4MyAYaqVTBQAuR0QEF7MIhjbNzRpNGkAeEYcHZodGg0wTlKGjCO5UyQDFQZEAD1QGTg9gA55amhUADkpBjDgQCDIAIIAAAWsDNHmvvPEQAAAABJRU5ErkJggg==)}#webamp #equalizer-button:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMBAMAAAB7FTvLAAAAGFBMVEUAAAAICBAQWgBSa3Nje4R7jJyPn6itvca8iDuFAAAASElEQVQI12MQRAABBhSOgGsoFAQDOeHlUFAK4sBkQsEcQcHQANYAVghHSC2UNZQ1AM5hYIVxxNJAMlBlQADUA5ZxRzbNEOECAM5YHW8MP5O/AAAAAElFTkSuQmCC)}#webamp #equalizer-button.selected:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMBAMAAAB7FTvLAAAAGFBMVEUAAAAA1gAICBBSa3Nje4R7jJyPn6itvcZs8alFAAAAR0lEQVQI12NQUIIDBQZUjmsoFAQDOeHlUFAK4sBkQsEcJaXQANYAVghHUSyUNZQ1AM5hYIVx1NJAMlBlQADUA5ZxRzYNyQUAEUAg+7nvOG8AAAAASUVORK5CYII=)}#webamp #playlist-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAMAAAC+5dbKAAAAUVBMVEUQWgAjIzgkIzckIzgkJDklJTolJjsmJTwmJjsnJz0nKD4oJz0oJz4oKD8pKUAqKUEqKUIqKkEvN01KWmtSY3N7hJSElKWttca9ztbV3vLv//+EzjHeAAAAXklEQVQYGQXBgRHCMAwEMLk4WYFj//nKAOHqR6o3AADk214AADyjGQCATKrhh+WwzwZygfve2ADUBYADwDT4gA2AhhUAxwZNACssAtqTAACgMwEAwPRRI5GpmTIhUX81UygSftVjhQAAAABJRU5ErkJggg==)}#webamp #playlist-button.selected{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMBAMAAAB7FTvLAAAAIVBMVEUA1gArK0QvN01KWmtSY3N7hJSElKWttca9ztbV3vLv//9R/wqlAAAASklEQVQI12Moh4MyAYaqVTBQAuR0QEF7MIhjbNyhpKEB5RhwdmggcxAyljM7NDpgHCDQAMqBOXB7gJzy1FAoAHJSjOFAgEEQAQQAwMcyRToQk0kAAAAASUVORK5CYII=)}#webamp #playlist-button:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMBAMAAAB7FTvLAAAAGFBMVEUAAAAICBAQWgBSa3Nje4R7jJyPn6itvca8iDuFAAAARElEQVQI12MQRAABBhQOo2soFDgDOeHlUFAK4sBkQsEcQcFQBlZWKEdILZQVmYOQEUsLZQ2FcYCAFSgH4rgjm2aIcAEAbLsb8tZoQy8AAAAASUVORK5CYII=)}#webamp #playlist-button.selected:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMBAMAAAB7FTvLAAAAGFBMVEUAAAAA1gAICBBSa3Nje4R7jJyPn6itvcZs8alFAAAARElEQVQI12NgUoIDBQZUjmsoFDgDOeHlUFAK4sBkQsEcJaVQBlZWKEdRLJQVmYOQUUsLZQ2FcYCAFSgH4rgjm2aEcAEAZCcevKaFFFgAAAAASUVORK5CYII=)}#webamp #title-bar{background-image:url(data:image/png;base64,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)}#webamp .selected #title-bar{background-image:url(data:image/png;base64,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)}#webamp .llama #title-bar{background-image:url(data:image/png;base64,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)}#webamp .llama.selected #title-bar{background-image:url(data:image/png;base64,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)}#webamp .selected #title-bar #option.clicked{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAHlBMVEUUFB8VFSAVFSIVFiEWFSAWFiEWFiI0MCyah13sznoaG8L5AAAAPElEQVQI12NgYBAUCmBgmCCoaMDAWSmoZMAwvVIwNIBhRueMjgkMAoLTKwMYGAWnz0xgEBT0DAWxXdMSACxMDDJsyBoOAAAAAElFTkSuQmCC)}#webamp .selected #title-bar #option.selected,#webamp .selected #title-bar #option:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAD1BMVEUhKDU0MCyah12jlGrsznoe/O3VAAAAMklEQVQI12MwBgIDBgMHBgYDBhMRASDpKCIIJJ1UnJQcGAwEHUWAsoyOLkCSgQWIweoBtzQG0TH1VqcAAAAASUVORK5CYII=)}#webamp .selected #title-bar #minimize.clicked{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAASFBMVEUqKUIqKkMrK0QrLEQsK0QsLEUtLUctLUgtLkcuLUhFQTxSSj1aVzpoWTVrXUNzbFKId0mckXWqurG71tm/uX7AwcbE3+HO4c5KSa+JAAAAPElEQVQIHQXBwQHAMAjEMJvQfLv/lJ0ArpK3FsLQZxogW9uqXjqlkKQphYTmcGBI4wPU6OVd4FtvYEzyA+cLGDTjuSw1AAAAAElFTkSuQmCC)}#webamp .selected #title-bar #minimize:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAIVBMVEVFQTxSSj1aVzpoWTVrXUNzbFKId0mRbkqckXWjlGq/uX4Hs2WWAAAAOUlEQVQI12OYCQQTGKYzMLBPYJggKCgwgWGSiYvRBIYpYWkhExhmdK3qAJKrVq0AqunoaJ/AAFYPAAQVFS+2qihdAAAAAElFTkSuQmCC)}#webamp .selected #title-bar #shade.clicked{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAMFBMVEUtLUgtLkguLUcuLUguLkcuLkkvL0ovMEswL0swMEswMExFQTxSSj1rXUOqurHO4c6W/ePHAAAAQUlEQVQIHQE2AMn/AKqHZlVQAJnu7uUQAK7///4wAK3d3d0wAKzd3dwwAJzN3cwwAJvMzMNAAIi7u7MgAIZlVTAwDDgbUKzozR4AAAAASUVORK5CYII=)}#webamp .selected #title-bar #shade:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAD1BMVEVFQTxSSj1rXUOjlGq/uX5Idn/CAAAAM0lEQVQIHQXBwRGAIAwAsLT07Z2zsP8qbuDBAliTmDjl1m8Gob6HK5uWti27V6uxDDFxfn1PDx8P0VYSAAAAAElFTkSuQmCC)}#webamp .selected #title-bar #close.clicked{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAALVBMVEUoJz4oKD8pKUAqKUEqKUIqKkMrK0Q0MCxoWTVrXUORbkqjlGq0h2PCsWH///9ex0i3AAAAO0lEQVQI12NIdTFWUmDIbC/vFGCIONm5Q4AhfPbq6UCy61U7A4P77LVAdsTOzhsMDJ5ANQwMLkaKCgwA5wURVkMAFf0AAAAASUVORK5CYII=)}#webamp .selected #title-bar #close:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAElBMVEU0MCxoWTVrXUORbkqjlGr///+HjTObAAAAKUlEQVQI12NwAQIHBicBBiEHBkcmIUYHBgcFAwUgKRwsAGNDxCFqwOoB1gEH67W94+0AAAAASUVORK5CYII=)}#webamp #clutter-bar{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAArBAMAAAC3GdQgAAAAElBMVEUAAAAAAAgQECEYGCkzPElgYGraVCJcAAAAVElEQVQI132NsQ2AQAwDr8gCv0FGMNLTu8gKv/8qFCAgQqI7WWebbYyBACQJEUbyRDgaTf95Va3xeGWkKUTQqPz12m9eyyYB8s7eVEUSJs8VIPe1DmVJGRTmaMgdAAAAAElFTkSuQmCC)}#webamp #clutter-bar.disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAArBAMAAAC3GdQgAAAAD1BMVEUAAAAAAAgQECEYGClgYGoHCnLLAAAAIklEQVQI12MwFBQUZDBgAAIDIBhULAVUlgJhFlivgomLCwA8qROh1kJ8awAAAABJRU5ErkJggg==)}#webamp #button-0.selected,#webamp #button-o:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAgMAAAC5YVYYAAAACVBMVEUAAAAYGClwgY/qIgoqAAAAGUlEQVQI12Nw0GBwaWNwaIKRGQwODAwuLgA+SAT1jbNsAAAAAABJRU5ErkJggg==)}#webamp #button-a.selected,#webamp #button-a:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHAgMAAABIN+TNAAAACVBMVEUAAAAYGClwgY/qIgoqAAAAGElEQVQI12Nw0GBwaWNwaGJwWQUmgWwGADIVBK9/og4OAAAAAElFTkSuQmCC)}#webamp #button-i.selected,#webamp #button-i:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHAgMAAABIN+TNAAAACVBMVEUAAAAYGClwgY/qIgoqAAAAF0lEQVQI12NwcWFwWMHgksLgoAAjVwAALckEbUwsrjEAAAAASUVORK5CYII=)}#webamp #button-d.selected,#webamp #button-d:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAgMAAAC5YVYYAAAADFBMVEUAAAAQECEYGClwgY/lGZUOAAAAHElEQVQI12NoYGDo6GBo+MPQcZqh4TCIdACSfwBnkgl9KMHv2wAAAABJRU5ErkJggg==)}#webamp #button-v.selected,#webamp #button-v:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHAgMAAABIN+TNAAAADFBMVEUAAAAQECEYGClwgY/lGZUOAAAAF0lEQVQI12NwYGDwOM3gcBhG/mdwsAEAPG8GMJvxEOEAAAAASUVORK5CYII=)}#webamp .shade #title-bar{background-image:url(data:image/png;base64,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)}#webamp .shade.selected #title-bar{background-image:url(data:image/png;base64,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)}#webamp .shade.selected #title-bar #shade{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAAM1BMVEUtLUgtLkguLUcuLUguLkcuLkkvL0ovMEswL0swMEswMExFQTxSSj1zk5qBl42qurHO4c7FV37rAAAAOklEQVQIHQXBwQ2EQAwEMCdEPK7/YhFiM2fXzybCxAXvN1VVbe9tpenSDDCh+GhZVmpyHDwZu2HP9QfI+BkLtDdVPQAAAABJRU5ErkJggg==)}#webamp .shade #title-bar #shade:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAD1BMVEVFQTxSSj2jlGq/uX7CsWH/Y2uiAAAALUlEQVQI12NQAgIFBiUGBiYFBgVhYwMFBkVhY0Mg6QwmXVwEgeIuLgIwNWD1AJzCBeFqt4OOAAAAAElFTkSuQmCC)}#webamp .shade #position{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAHAgMAAACTjE7vAAAADFBMVEUAABAwMEsxMUJaa3u9OGBkAAAAIklEQVQI12NgAIIDDFqrVq06wCAaBiZDQ8PAZCiM/A8EBwAZeBBhq+F40QAAAABJRU5ErkJggg==)}#webamp .shade #position::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAQMAAAD3d2XqAAAABlBMVEWjlGrsznoPowceAAAADklEQVQI12NwYHgAhw4AIi4E4a+iLsYAAAAASUVORK5CYII=)}#webamp .shade #position::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAQMAAAD3d2XqAAAABlBMVEWjlGrsznoPowceAAAADklEQVQI12NwYHgAhw4AIi4E4a+iLsYAAAAASUVORK5CYII=)}#webamp .shade #position.left::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU9P0xoWTWjlGrsznp9Nqf9AAAAE0lEQVQI12PYwPCF4QcYfmHYAAArXgYxq2vCDQAAAABJRU5ErkJggg==)}#webamp .shade #position.left::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU9P0xoWTWjlGrsznp9Nqf9AAAAE0lEQVQI12PYwPCF4QcYfmHYAAArXgYxq2vCDQAAAABJRU5ErkJggg==)}#webamp .shade #position.right::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU9P0xoWTWjlGrsznp9Nqf9AAAAEklEQVQI12OwYKhh2AOGNQwWABlSA52dOQTnAAAAAElFTkSuQmCC)}#webamp .shade #position.right::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHAgMAAACw1x86AAAADFBMVEU9P0xoWTWjlGrsznp9Nqf9AAAAEklEQVQI12OwYKhh2AOGNQwWABlSA52dOQTnAAAAAElFTkSuQmCC)}#webamp #volume{background-image:url(data:image/png;base64,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)}#webamp #volume input::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYvL0RKWmt7hJStvMTa5+opTTwbAAAAMUlEQVQI12NQFAQBIQaxNBBIZGALBYIQAyAtKiqKlwapM2RgcwEBQwZhYxAwZICaBwCdgQ6Jd297uQAAAABJRU5ErkJggg==)}#webamp #volume input::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYvL0RKWmt7hJStvMTa5+opTTwbAAAAMUlEQVQI12NQFAQBIQaxNBBIZGALBYIQAyAtKiqKlwapM2RgcwEBQwZhYxAwZICaBwCdgQ6Jd297uQAAAABJRU5ErkJggg==)}#webamp #volume input:active::-webkit-slider-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYZICovL0RKWmva5+r///+U4Y9MAAAAMUlEQVQI12MwFAQBYQbRUBAQZGBlAAIWBiQ6ISEBKw2SV4TTIi4gIMhgJKQopCgoDAB2aAh/NddRQgAAAABJRU5ErkJggg==)}#webamp #volume input:active::-moz-range-thumb{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALBAMAAAC9q6FRAAAAFVBMVEUAAAALDxYZICovL0RKWmva5+r///+U4Y9MAAAAMUlEQVQI12MwFAQBYQbRUBAQZGBlAAIWBiQ6ISEBKw2SV4TTIi4gIMhgJKQopCgoDAB2aAh/NddRQgAAAABJRU5ErkJggg==)}#webamp .gen-window .gen-top{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUAgMAAAAFGX4uAAAACVBMVEUeHi8rK0Rra3zjkZV/AAAAG0lEQVQI12NggIJVYNDAEAoGDlSj0QGx9kABAFXxKF3wQT+3AAAAAElFTkSuQmCC)}#webamp .gen-window .gen-top-left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAB4ElEQVRIS61Vu04DMRDc3WuQqEBIVKlAQkKioEZU1PkVpHzhXZX8RUCiTpUjojs04/XrcjyUxFF09p3t8c7OjnU2exikaiqqmt6wryY6iLCrxg5+aGp4Wh77WszjDMwFyHw+r2GwEb9jmm+GycXmEYhgFjaM8/fWRZCuXYaj8kweTbExI4gbqYpxnIFThFxj+UBlJG27DFQ4DE9anb4Y+yYJhNSoqMWD/ATSrSIxKZJtv67TdeAo5SREoqJD4Ljv1/LydCO3s7MDt87LEsg4J/3nmywWr0cDkP6U+G4l0LKnXQByeXF+YhCoC1lxmQIEdJ2iTdAlzEu/e5f7u2t5frw6GqcG8QrFA3Ww+/o4GqDOCeny5iqD7vkP9ZzrZqJOyDTs5bdipLpEZNtv9guSi8MBcuXnwvMP2SmSE4y8awwyrnzaSGmMlc2MDTLazR8gMM1sM7Rb5im4cuHCUZFuQdlQs9ftJT7SBZCOVuNUaSNmOGEjhnfsF5R5Tho1GSpjLax+TBdB2pWXTsPUmzXBYV0M6JvfN3R8CZTGdxRM6cLTIMH+UTe8nCJl1jh1iDJSmNVVglBt1X1SqCtE4rIeSdpIHaIK9FF4BmKjOAA88Nv/InHgcJXmeyJTN3X91ur6BrqJo0MRJOhhAAAAAElFTkSuQmCC)}#webamp .gen-window .gen-top-left-end{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAABxklEQVRIS7WVvUoDQRDHZ/r4DIEThCiCtn4UCpa+gIiF76DmCWwv+D5WYm0nCFpZCSKWKZIdmY//Zu/CxSaXQPZuM7v/md2Z3/DO6FSEhESE9COSbCSbjUdKpC9qY7Nmu7wGa5MQsVn6Djy+qWMpRHwD1+nazIXwdVGTtfkU7+EZ8dHBpVnoD5tBcglsoqNGZ2Nsi7nCGbWx/+EYIhUhPj68Et/EpVTCDIsNTVznUyJhIUouZh7H8apzcIQ4HApRHg4rHH3cwHqHwaAivr87703k/XNKj88fxJPJpDcRPZO6fiDe39vtTSTxlH5/5sTXF2e9iWgkdlx93snTyze9vn0RV5tbvUUyn81osFGVdeJalu9R7VbBKVmN2JzWSVQ1UASUoBiBJq96rxdeF7u8lt3BJXZtj06CIisA2Y6uzbQcnQs5uhYI4vFtLZmuK6CIYyi5lsFYOBGYzAxTmwKQosjpZlcAEPfWuAtEUrQL3ImJAJDGOu0bIPAShb3XLHqP09lhGmgFqdVbPDdE0LDQrAoROwLNrPZcRn5k5X+o7+4nqXGMubdEerZT2BxpR+Ip7BlRpiHaL5pQo3aK7MpNOqLKTbHIrj9doofFD8vqAQAAAABJRU5ErkJggg==)}#webamp .gen-window .gen-top-right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAMAAABPqWaPAAABYlBMVEULFRIMDAweHS4eHi8fHyIfHzAfHzIgHzEgHzIhIDIhITMhITQiITQiIjUiIyYjIjYkIzckIzgkJDklJDomJTkmJTsmJTwmJjsnJj0oJj0oJz4oKD8oKEApKEApKUApKkEqKUAqKUEqKkEqKkIrKUIrKkMrK0QsK0QsLEMsLEUsLEYtLUYuLUcuLUguLkcvJwgvLkkvL0ovMSUwL0kwL0owMEsxL0wxMC0xMEwxMU4yMU0yMU4zMk8zMlA0MlA0M1E1M1I1NFM2NFM2NVQ2Nhg3KxA3NlU3NlY4NVU4NlU4N1c5N1g5OFo6OFk6OVo7OVw7Ols7Olw8OVs8Olw8O11GQh9JRjlORDBQPx5dVztiWkVqanprXUFra3xsa3xsbH5tbX9tboBubX9vboFvb4JwTyxwb4Nxb4RxcIVxcYZycYZzcodzcoh0c4l0c4p1dIt1dIx2dY13dY6Gd02QkJCZc0LWhhB9AAABJUlEQVQYGT3BvWqUYRRG0X2++bRSGxsVhBls0oidP3W8gYCFXoW3JV6DVgmxslBbIQELJRAQA0Kc9zzbmcBkrVrZrTEaYuylEXs+EK/EEKNo4HA+SVf0n2mTMTqJcc00TTeBoGwUBZMINXPteTL2fn2E/XvHg/ktOz/fP4Ve7ZerU2Cqaw/YePdndXd1+qEWzIfsrKGbXNy+OCPN/IhrX1nI7+XFw3OqnO+z8wOa17dOz86XL79L3WHn7zMz9r59gSePP62pgxrG0bG1L23TraRWI24kRGNilv3iqJiaAgQRtEAomF+JIYRotPGIrfkki3UcncTkcqQHsjEtGEBRVeRymIBsTBYb3lCaqTqJbE0lG5WqVHrEyJX586A12omj45tj2foP9wDyBsXxPvcAAAAASUVORK5CYII=)}#webamp .gen-window .gen-top-right-end{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAByUlEQVRIS7VVPUsDQRCdWRvBShGszoAKYg4C1mJj8m8Cgr2/1cLfENBu5b352D1NY7GXhLvszc57MzvzRqdpU1VV8MOlolJFpeCvFuEq3uMDGyxU3Ls1mrit22MvfWDffv9e7dGccfGXg3CYd5o6KS1GrtsbPoK0zuttNXtjh3thZG0zWaYTY8z3ngGVIlosMiMS0cNGhCBprCq1ihTEWVW0mPNMlRNAKrC5SAAZoRLA/uzsRed5Vw+HDxqNunS1uqnbp1u5m05HYQhB3t5ehwHweABycX42HgTpGnkxkvX9lTw/Xg7DYXV9fX8OA+CZzA8vVbwfotYhK9Zw3iuhAtmgaEhvvGhIykqoABq6UJ74vZ422YwhAyYLTbOsgTv5iOdOz9j1qVve/a5UekwgE2ThfAnSVMCpdXLS5MlOIQWyZ2tpa/q1EMbQOAV3k5c/kaYqe/r+L5AOvtAuW4voeKY8DmhfJ5BkXzwlfOksUBR5oFhvotkLa4BYVKHGATLvcp5AdS3DHYinrZ8XrQgccDEa4MMjCQVnCZ+oaEy7fkZ0g2kBQp1HfA3E5lArDpawF0OWcIaJ4/TDzPF7tMpatNYOffX5hPUW/wFZNjaZ4b4luAAAAABJRU5ErkJggg==)}#webamp .gen-window .gen-top-left-fill,#webamp .gen-window .gen-top-right-fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU0nT8z0BjwFhe1kd7S2ysY4eJJfLySrT3SVu5L+0tmTBhAu0tMTTQpb0lSVGutLeELnGipKxGe5/QJTPSpeyiiyWjBSQpVRAjXVIXXSyhR+oCAGL8JbEqBdscAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-top{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUAgMAAAAFGX4uAAAACVBMVEUeHi8rK0Rra3zjkZV/AAAAG0lEQVQI12NggIJVYNDAEAoGDlSj0QGx9kABAFXxKF3wQT+3AAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-top-left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAMAAABPqWaPAAABHVBMVEUdHS0dHS4dHi4eHS4eHi8eHyUfHzAfHzIfIDIgHzEgHzIhIDIhITMiITQiIjUjIjYkIzckIzgkJDckJDklJDolJiwmJTsmJTwnJj0oJj0oJz4pKUApKkEqKUAqKUEqKkEqKkIrKUIrKkMrK0QsK0MsK0QsLEUsLEYtLUYuLUcuLUgvLkkvL0owL0owMEsxL0wxMEwyMU0yMU4zMk8zMlA0Mk80MlA0M1E0NFE1M1I1NFM2NFM2NVQ3NVY3NlY4NVU4NlU4N1c5N1g5OFk6OFlCQTtqanpra3xrbHxsa3xsbH1sbH5tbX9ubYBuboBvboFvb4Jwb4Nxb4RxcIVxcYZycYZzbFJzcodzcoh0c4l0c4p1dIujlGrsznr///9wBmqFAAAAvklEQVQYGQXBwQlVSQBFwTq33+DWnUuj0RQmXMNwMzAKgjkI/7dVQYdtrZwyq3xFTlqqtUoP39dOa9apc9pOjXe8cRky8NDN/gcA8HDVj38DAHiYew0AwMNeD78BADy8hk8AAB4W/nwAAHh4nXz+BgDgoejjqXaqp22nHs79lZ0yM2tVgze8BHcBD68zX0yt1Jbp4XrPf6fqbJ72zz1tsN7e6N47eo07eFvBcrnQIPdyXbjyuu7DdOlnZk5Z1V/Roy8hK3ODtwAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-top-left-end{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAByUlEQVRIS7WVPU4DQQyF7Z5cgaVJpAAnIFAk50AcgB4UwQEoKNJQp6GkpKCgp6ShoUFcgCJtkBgj/7zZ2Y0WmmwiZXcnXj97xv7MB+OZCAmJCOlHJNmVbDVuKZE+qI2tmu3mO3g3CRGbpXvg+cUiXoWIO3CdLmcuhK+Lmqytp3iOyIiPj07NQn/YDJJLwIleNTu7hlusFcGojf2PwJCpCPHJ5EzciUuphBkWDk1c11MiYSFKLmYRx/ZqcAiEOAIKUd6thtj6OIHtXgY7FfHX61VvIk8vK7q+fdZjyKe03RTCW7U3Ip5NJ71l8sMr+vz4Jr6/O+9NRJOx7erzTG6W7/Tw+EY8HB32lsl6vabBoCr7xLWs3qPbrYNTsh6xNe2T6GqgCChBMwJN3vXeL7wtdnkve4Ab7NofT4MifwCynV2baTk7F/KmqBHE88uFtQqI2QVFbEPJtQzGIojAZGaY2hSAFEVON7sCgDi3xlkgk2Jc4ExMBIA01uncAIE3KOyzpp49TmeHaaAVpNZocd8QwcDCsCpEbAu0stprGflRlf+hvnuepMY25tkS5dkuYQuknYmXsFdEWYYYvyiERu8U1ZWHdGRV47aurl8JSofPjXVkWwAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-top-right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAMAAABPqWaPAAABO1BMVEUeHyUfHzAfHzIgHzEgHzIhIDIhITMhITQiITQiIjUjIjYkIzckIzgkJDklJDolJiwmJTsmJTwmJjsnJj0oJj0oJz4oKD8oKEApKEApKUApKkEqKUAqKUEqKkEqKkIrKUIrKkMrK0QsK0QsLEUsLEYtLUYuLUcuLUguLkcvLkkvL0owL0owMEsxMEwyMU0yMU4zMk8zMlA0MlA0M1E1M1I1NFM2NFM2NVQ2Nhg3NlU3NlY4NVU4NlU4N1c5N1g5OFo6OFk6OVo7OVw7Ols7Olw8OVs8Olw8O10/QitCQTtdVztqanprXUFra3xsa3xsbH5tbX9tboBubYBvboFvb4Jwb4Nxb4RxcIVxcYZycYZzbFJzcodzcoh0c4l0c4p1dIt1dIx2dY13dY6Zc0KjlGqxnVm2nF7sznr///+ZhXPBAAABBUlEQVQYGQXBwYmUURBG0Vv1P90KvWtnQCcBxyBEEAMxKWMSWjQAB2V2DeKyX33Xc+reGY3RoHHeGHHWR1HVMWgUDXxbT5mK3swYkyQab3T3SyAoQFFQIhQAAPA+5iFXOPVls74AADBf30HuOn3+A6wCAGABXPucfr7WMesXAICAkry4hQzrDgAAoIru29FUuQ4AAP6BnM7P6df5LfUKAOAvj5qHXOHU32/Uh9rGnTiaMSapza77HdWEqCbm7Txetj0UIIigJRBkfRJDGKJq5EID6ynHLe4kMTpxAKEPNlBUFRiQAhZtAbgUqgqqJDV0CVCpEqHAojesn5vRyBh0/PyD5tj8B5vM5TGngJW4AAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-top-right-end{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAABzUlEQVRIS7VVu04DQQy0lx+gokuQEEjAiXwAJYSCgpIfoE1NgUTLT1KRjh4qKBbN+LF7kIZiL4nusuf1jL32WBeLVVVVwQ+XikoVlYK/WoSreI8PbLBQce/WaOK2bo+99IF9m81ztUdzxsVfDsJh3mnqpLQYuW5v+AjSOp1fV7M3drgXRtY2k2U6McZ87xlQKaLFIjMiET1sRAiSxqpSq0hBnFVFiznPVDkBpAKbiwSQESoB7M/OXnSa1vXjc0ujUZcuD0/qy+ON3F7uj8IQgmzfXocB8HgAcnx0MB4E6Rp5MZL7uwt5ejgdhsPq+vp+HwbAM5nOrqp4P0StQ1as4bxXQgWyQdGQ3njRkJSVUAE0dKE88btcrLIZQwZMFppmWQN38hHPnZ6x61O3vPtdqXSXQCbIzPkcpKmAU+vkpMmTnUIKZM/W0tb0ayaMoXEK7iYvfyJNVfb0/V8gHXymXbYW0fFMeRzQvk4gyb54SvjSWaAo8kCx3kSzF9YAsahCjQNkWuc8gepahjsQT1s/L1oROOBsNMCHRxIKzhLeU9GYdv2M6AbTDIQ6j/gaiM2hVhwsYS+GLOEME8fph5njd2eVtWitHfrq8wnrLf4D9zg6mAHJo5AAAAAASUVORK5CYII=)}#webamp .gen-window.selected .gen-top-left-fill,#webamp .gen-window.selected .gen-top-right-fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU0nT8z0BjwFhe1kd7S2ysY4eJJXLyqrT3yZtzVbS35P///7S3xMnRmvaWLJ6SRXtL6BInqmo6tPcJXTIjXcouulgyWkCSUgUx0iV10cUSeqQuABQNKbDZQyxmAAAAAElFTkSuQmCC)}#webamp .gen-window .gen-bottom-left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAAAOCAMAAAA16ON4AAABfVBMVEUdHS0dHS4dHi4eHS4eHi8fHzAfHzIgHzEgHzIhIDIhITMhITQiITQiIjUjIjYkIzckIzgkJDckJDklJDomJTsmJTwmJjsnJj0oJj0oJz4oKD8oKEApKEApKUApKkEqKUAqKUEqKkEqKkIrKUIrKkMrK0QrLEQsK0MsK0QsLEUsLEYtLUYtLUgtLkctLkguLUcuLUguLkcvLkkvL0ovMEowL0kwL0owMEsxL0wxMEwxMU4yMU0yMU4zMk8zMlA0MlA0M1E0NFE1M1I1NFM1NFQ2NFM2NFQ2NVQ3NlU3NlY4NVU4NlU4N1c5N1g5OFk5OFo6N1k6OFk6OVo7OVw7Ols7Olw8OVs8OVw8Olw8O109O149O2A9PF89PGA+O18+O2A+PF8+PGBqanpra3xsa3xsbH1sbH5tbX9ubX9ubYBuboBvboFvb4Jwb4Nxb4RxcIVxcYZycYZzcYhzcodzcoh0c4l0c4p1dIt1dIx2dY13dY53do54dY94do94d5Ap3ahhAAACBUlEQVQYGQXBAQEYNRAEwNlLig3E4KTCcFK81AZ8bpmJn7/89vOX3z+BgBAEgQyBNARCIEHS2YEICIEAIR0BUsEF8OcvxhhwKxiXKQNxZDCBMGJ0mL3OmhpJwxHBfacmzA4u333+gAGAMQk6PqlkL7tYrnOSWca2CaCb1g5vqESDReG8+koHcOdcHwYAI6SVPWcL+RgMvmA6kEQLdOrMDHYAOHaFxxl3Hxafz6Y9ywAQEZWKTEgVwQB9igVJqkbtpkA84Jl56tjNiaM78F1mtsMAaLSrxWjKTgIB4DQs1Wg13U5p0W3nALrS7TPd/x4MYHZzggGIBmlEvUrYizwLfWvBCAVNNB3zhMYDTo5xfpzPMQ4Bxk7+/f77GEDfiYyXYh3RrO+z3xgcqmWsgkjaRuweNSbn0VIv+rmM82jB4vtxzuUCf5OKQUBgEAiSgATSIBiCwGww0hAkHRyEA0BgAFSwAsDA7iaQAECRYUYCMDvMUBJoAp51AARw4c+/AASIRgTSmEYCIkAIIQ1iEAQEIg0CqVMBBBfrn67rHZEBmWCa+913YcLhwAghaSJx1umI2RwBZ08a15c5zyGBS3NoDGtekTFMmXNm26i6TsyMOk+2BkAlgjUZTM+8tiV7FJ9rzXlPAZv0CQGAMDUNBIaOkCbSEAIiMAEERo1UCCSB67vOOwBR8T8KSRhI0bzb7AAAAABJRU5ErkJggg==)}#webamp .gen-window .gen-bottom-right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAAAOCAMAAAA16ON4AAABfVBMVEUdHS0dHS4dHi4eHS4eHi8fHzAfHzIgHzEgHzIhIDIhITMhITQiITQiIjUjIjYkIzckIzgkJDklJDomJTkmJTsmJTwmJjsnJj0oJj0oJz4oKD8oKEApKEApKUApKkEqKUAqKUEqKkEqKkIrKUIrKkMrK0QrLEQsK0MsK0QsLEMsLEUsLEYtLUYuLUcuLUguLkcvLkkvL0ovMEowL0owMEsxL0wxMEwyMU0yMU4zMk8zMlA0Mk80MlA0M1E0NFE1M1I1NFM1NFQ2NFM2NFQ2NVQ3NlU3NlY4NVU4NlU4N1c5N1g5OFk5OFo6N1k6OFk6OVo7OVw7Ols7Olw8OVs8OVw8Olw8O109O149O2A9PF89PGA+O18+O2A+PF8+PGBAP1BAQFFAQFJfX3Fqanpra3xrbHxsa3xsbH1sbH5tbX9ubYBuboBvboFvb4Jwb4Nxb4RxcIVxcYZycYZzcYhzcodzcoh0c4l0c4p1dIt1dIx2dY13dY54dY94do94d5CUuEDKAAACKUlEQVQYGQXBwZFdRRAEwKyev3ZwwQ8gFisgdMIPzFlhhLhih2THvukiM3+jqRRolgIKpUAV2KZoU6WgaQGrKQoK3VQBvvH7Nz9e39nZ7ezsPJoFrni8PvOgNNUV91y7s21xqaaqWM2dy5qVLS12Ps3q1sL7v2Awd/u6Y56XmHB7N4960mOKVDO1uSwlSgsKjNQeZuhKStg9lkwM3i8wcPblwIOGfbzdFy6bfQFbaXtqZg+ROxEqBJ0ai91AUTvjhZox3u8HMKg8l31AlrfxibfXMHPQclzJubnWbTasVChFsFPQQXTgU6GM9/vxBRikk6zxAuHOcfAElAjS7dUTkxjOGBBgl1nAYjMLbxYhftt/vlxgIIfBA8rJTXa9WstC3UwS4s6dAl2ECjS7xI6Kxk6wDcT+0q9/7gcwwNnxvEAHV9t5PkPbCeFYHfSsG6gUGEV0UGMiomkhCeLXfvzZr1+A/ExTAFw8xwVdKIU1XdhZilIKFKWxpdGdsqBA2Ub565sfgzQAwHMu0AIKTAErSAMAKNJt0AoMAHsVLeD1B1QKaNEoqIJCUWiVpkpTTaEFbKooFLUACsDrO2zhARaXDg+3zNWUS+fiZnVn6ZaiTVk2FyzZplqWO4srzTaes2NgZ7AvUNyj1kOHc0mDmTjIIo2aCTQpRrOCDSvbbcApbaapcd2s13/QFMDlOXmgNtqURq1Ys3aWRosWUAW1qaZZDQuF7qkt+Gke/wNCVMxEPwTsWgAAAABJRU5ErkJggg==)}#webamp .gen-window .gen-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAOAgMAAACnVF/TAAAACVBMVEUrKkM+PGB4d5A1hmUAAAAAGElEQVQI12NYBQYNDKFg4EAyjQ5wmQcFAFaEHSfLt0cNAAAAAElFTkSuQmCC)}#webamp .gen-window .gen-middle-left{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAdAgMAAAABTX4zAAAACVBMVEUdHS0qKUBqanoMSFahAAAAD0lEQVQI12NQ5QxhoDMGAFFyDru7vcmtAAAAAElFTkSuQmCC)}#webamp .gen-window .gen-middle-left-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAYAgMAAABRgO+AAAAACVBMVEUdHS0qKUBqanoMSFahAAAAD0lEQVQI12NQ5QxhoCEGAEUWDDHkAu/CAAAAAElFTkSuQmCC)}#webamp .gen-window .gen-middle-right{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAdAgMAAADqesUwAAAACVBMVEUdHS0qKUBqanoMSFahAAAADklEQVQI12OYOoWBBggAuDohplXr188AAAAASUVORK5CYII=)}#webamp .gen-window .gen-middle-right-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAYAgMAAAC6t1SDAAAACVBMVEUdHS0qKUBqanoMSFahAAAADklEQVQI12OYOoWBGggA6uEb2fBejlkAAAAASUVORK5CYII=)}#webamp .gen-window .gen-close:active{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJBAMAAAASvxsjAAAAElBMVEU6MSljXjtsXUORbkq0kWP////9IyyfAAAAKUlEQVQI12NwAQIHBicBBiEHBkcmIUYHBgcFAwUgKRwsAGNDxCFqwOoB1gEH67W94+0AAAAASUVORK5CYII=)}#webamp .character-48{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAE0lEQVQI12NIYJjAsIHhApBMAAAULANhy/alSwAAAABJRU5ErkJggg==)}#webamp .character-49{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAD0lEQVQI12NQYEhgUIBAAAbMAQE/4OmzAAAAAElFTkSuQmCC)}#webamp .character-50{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12N4wCAAhAkMDQwfAA78AtFOxm3MAAAAAElFTkSuQmCC)}#webamp .character-51{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWP4wKDAkMAgwDCBIQEAEHwCcej/ubUAAAAASUVORK5CYII=)}#webamp .character-52{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWNQYEhgWMDwgUGBQQEADlwCUbptSVYAAAAASUVORK5CYII=)}#webamp .character-53{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAE0lEQVQI12P4wNDA8IBBAAgfAAAWXANRkouswAAAAABJRU5ErkJggg==)}#webamp .character-54{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NIYGhgeMAwAQgTABOsA0E/JWQ/AAAAAElFTkSuQmCC)}#webamp .character-55{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEUlEQVQI12P4wCDAoMDgAIIADgwB4bVklkQAAAAASUVORK5CYII=)}#webamp .character-56{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEElEQVQI12NIYJjAAMJAEgAQvALRax9yugAAAABJRU5ErkJggg==)}#webamp .character-57{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NIYJgAhAUMAgwJAA/sAmFIDiRPAAAAAElFTkSuQmCC)}#webamp .character-97{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEUlEQVQI12NIYJjA8AGIgRAAFNwDkUdAkdwAAAAASUVORK5CYII=)}#webamp .character-98{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEElEQVQI12N4wDCBAYSBJAAaPARRW/xs+gAAAABJRU5ErkJggg==)}#webamp .character-99{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NIYJjA0ACEExgSABFMAuEl/r42AAAAAElFTkSuQmCC)}#webamp .character-100{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQYV2NkeMTwnwEG5CAMRrAglMPwiIEBxKaKIJpFADZCEAGAIkAWAAAAAElFTkSuQmCC)}#webamp .character-101{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAE0lEQVQI12P4wNDA8ACIGxg+AAAZ7ARBle8LfgAAAABJRU5ErkJggg==)}#webamp .character-102{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEUlEQVQI12P4wNDA8ACIgRAAGXwD0QArRQgAAAAASUVORK5CYII=)}#webamp .character-103{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12MoYGhg2MAwAQgTABMMAyEYrKesAAAAAElFTkSuQmCC)}#webamp .character-104{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIklEQVQYV2NkeMTwn0GOAQIeMTCA2Iy4BaEKwRR+lcSYCQBnQhEB2omL+AAAAABJRU5ErkJggg==)}#webamp .character-105{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAADklEQVQI12MoYFCAwgIACEwBYXIvChIAAAAASUVORK5CYII=)}#webamp .character-106{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEElEQVQI12MQYADBCUCYAAAGnAGx9K9L/wAAAABJRU5ErkJggg==)}#webamp .character-107{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAE0lEQVQI12OYwLCA4QAQLmCYAAAXTAPhR2cHZQAAAABJRU5ErkJggg==)}#webamp .character-108{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAGUlEQVQYV2NkeMTwn0GOAQUw0kwQ2RqgpQBKiwwB5wSvgwAAAABJRU5ErkJggg==)}#webamp .character-109{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQYV2NkeMTwn0GOAQIeMTCA2IxgQWSAXxCrdmIEAQtSEAH0ktA/AAAAAElFTkSuQmCC)}#webamp .character-110{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAE0lEQVQI12OYwMTAcIHpARAyAAATGAMpx84ilAAAAABJRU5ErkJggg==)}#webamp .character-111{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAADklEQVQI12NIYJgAhQkAEgwDAakOOnUAAAAASUVORK5CYII=)}#webamp .character-112{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12N4wDCB4QFDAwgCABlcA9Fh/HqiAAAAAElFTkSuQmCC)}#webamp .character-113{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAE0lEQVQI12NIYJgAhBcYNjAUAAATvANxqBzBZwAAAABJRU5ErkJggg==)}#webamp .character-114{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12N4wKzA8IAJBD8AABkSBJqXbNZ9AAAAAElFTkSuQmCC)}#webamp .character-115{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12MoYGhgSGAQAMIHAA1cAlFD9hA9AAAAAElFTkSuQmCC)}#webamp .character-116{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAADUlEQVQI12MoYFCAQQAH/AERspkQDgAAAABJRU5ErkJggg==)}#webamp .character-117{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAADUlEQVQI12OYwACDCQAUHAMxvRgSGgAAAABJRU5ErkJggg==)}#webamp .character-118{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAD0lEQVQI12OYwACBCQwJABOMAwEw9lTJAAAAAElFTkSuQmCC)}#webamp .character-119{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEElEQVQI12OYwACCH4BwAgAXTAQhMxLiQgAAAABJRU5ErkJggg==)}#webamp .character-120{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEUlEQVQI12OYwDCBIQEIgTQAEgwDAb4oAK0AAAAASUVORK5CYII=)}#webamp .character-121{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEUlEQVQI12OYwDCBIYFBAQQBDwwB4W/sEnMAAAAASUVORK5CYII=)}#webamp .character-122{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWP4wCDAoMDgwNDA8AEAD3wC0QyxJxkAAAAASUVORK5CYII=)}#webamp .character-34{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAADUlEQVQIHWMIYGKAAQADkABTwIHJLQAAAABJRU5ErkJggg==)}#webamp .character-64{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12OQYFBgiABCBQYJAAbMASFkTTvgAAAAAElFTkSuQmCC)}#webamp .character-32{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAE0lEQVQYV2NkYGD4z4AGGOklCAChpQYBD5K5XgAAAABJRU5ErkJggg==)}#webamp .character-8230{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAC0lEQVQIHWNAgBUAALQAqf6ZnokAAAAASUVORK5CYII=)}#webamp .character-46{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAGUlEQVQYV2NkYGD4z4AGGGki+AhqkRzCNgCztQcBQ/F5qwAAAABJRU5ErkJggg==)}#webamp .character-58{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAG0lEQVQYV2NkYGD4z4AGGHELPoIqlYPQFKoEABHUCAEa7xBFAAAAAElFTkSuQmCC)}#webamp .character-40{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NgYBBgUABCAQYGAAJMAGFQC8mLAAAAAElFTkSuQmCC)}#webamp .character-41{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NgYGhgcADCBgYGAAkMAYFEejkbAAAAAElFTkSuQmCC)}#webamp .character-45{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAG0lEQVQYV2NkYGD4z4AGGEkQfISmXY6BgXjtANzFBwGYHC/oAAAAAElFTkSuQmCC)}#webamp .character-39{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAADUlEQVQIHWNQYGKAAQABgAAjjGgVVgAAAABJRU5ErkJggg==)}#webamp .character-33{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAH0lEQVQYV2NkYGD4z/CIgYFBjgEOGKkhiDAOzMJqJgAQawsBnvEUjAAAAABJRU5ErkJggg==)}#webamp .character-95{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAFklEQVQYV2NkYGD4z4AGGGki+AjTIgCyawbjsVUKxAAAAABJRU5ErkJggg==)}#webamp .character-43{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEUlEQVQI12NQYGJg+MEAIhkACPABPfEgkLEAAAAASUVORK5CYII=)}#webamp .character-92{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAD0lEQVQI12NgYGhgZoBAAATIAI13IxiAAAAAAElFTkSuQmCC)}#webamp .character-47{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWNgYOBgEGBQYHBgaAAAAqQA+cACQKYAAAAASUVORK5CYII=)}#webamp .character-91{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQYV2NkYGD4z/CIAQLkIBQjXBAqQFVBJIsAMwMMAVy4DMAAAAAASUVORK5CYII=)}#webamp .character-93{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4zwACj8AkA4McAwMjXBAmQU1BJIsACwMMAZBptUcAAAAASUVORK5CYII=)}#webamp .character-94{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEElEQVQIHWNQYAhg6GAAAwAH9AD5R+QUOwAAAABJRU5ErkJggg==)}#webamp .character-38{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NQYAhgUGCIAJIaAAfsAWHaIpwJAAAAAElFTkSuQmCC)}#webamp .character-37{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWNIYMhgEGBQYIhgkAAACgQBacCaDW0AAAAASUVORK5CYII=)}#webamp .character-44{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHklEQVQYV2NkYGD4z4AGGKkl+IiBgUEOYjjCTCRBAMu1CAHlOP+DAAAAAElFTkSuQmCC)}#webamp .character-61{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAH0lEQVQYV2NkYGD4z4AGGMGCj5BE5RgYIIIUqkTTDgA65AgBoymWoAAAAABJRU5ErkJggg==)}#webamp .character-36{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NQYChgSGAwAJIKAApcAbE85GZ1AAAAAElFTkSuQmCC)}#webamp .character-35{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAD0lEQVQI12NIYPjAAMEMABUMAwFxUzDLAAAAAElFTkSuQmCC)}#webamp .character-197{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEklEQVQI12NIYJjAAMIfGCYAABIMA2Fjj6V0AAAAAElFTkSuQmCC)}#webamp .character-214{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAEElEQVQI12OYwJDAMAEMEwASbAMBKm1nAQAAAABJRU5ErkJggg==)}#webamp .character-196{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWOYwMDAkMAwgeEDwwQADwwDAcWvnbkAAAAASUVORK5CYII=)}#webamp .character-63{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWNIYJjAIMCQwMDAkAAAC+wBwX8tiscAAAAASUVORK5CYII=)}#webamp .character-42{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGAQMAAAAxNcYIAAAABlBMVEUAAAAA4gDJLyihAAAAFElEQVQIHWNgYFBgeMBQwODAwAAACjwBsYRIp8kAAAAASUVORK5CYII=)}#webamp .character-60{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQYV2NkYGD4z/CIAQLkIBQjXBAqQFVBJIsAMwMMAVy4DMAAAAAASUVORK5CYII=)}#webamp .character-62{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4zwACj8AkA4McAwMjXBAmQU1BJIsACwMMAZBptUcAAAAASUVORK5CYII=)}#webamp .character-123{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQYV2NkYGD4z/CIAQLkIBQjXBAqQFVBJIsAMwMMAVy4DMAAAAAASUVORK5CYII=)}#webamp .character-125{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4zwACj8AkA4McAwMjXBAmQU1BJIsACwMMAZBptUcAAAAASUVORK5CYII=)}#webamp .character-1072{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAI0lEQVQImWNk+M+AAVgYnmATfowm+JjhPyOGIC6VTJiqGBgANx0MVYCEVe8AAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1073{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQImWNk+M+AAVgYnmATfowpyIhNEFPlY4b/WFUCAN57DFR5NnIGAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1074{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJElEQVQImWNk+M+AAVgYnmATfowm+JjhPyOGoCwDI5EqGRgYAF4UDlRFZVCIAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1075{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAG0lEQVQImWNk+M+AAVgYnmATfowpyISpihRBANfsBNA3v6roAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1076{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAL0lEQVQImW3MsQ0AIAwDMJc/+P+wHlIWhAQlYyInlJYA+U6prjLVAHOLwxv9/aVaTx4OUfBlaGMAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1077,#webamp .character-1105{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAG0lEQVQImWNk+M+AAVgYnmATfowpyIhNkHiVALNJCnKvN99fAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1078{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAMElEQVQImWNk+M+AAZgYnjD8Z2BkYECmmTDVMTAwMjAwMDA8RjJEloERIYBEY9UOALBpDlkg8uNoAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1079{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQImWNk+M+AAVgYnmATRgePGf4zMjxGUynLwEikSgYGBgB8TQqQxg7asAAAAABJRU5ErkJggg==);margin-right:1px}#webamp .character-1080{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKklEQVQImWNk+M+AAVgYnjD8Z5BlYGR4jJBmQlEiy8CIKYhVJYrgY1TrAB8nBvC0lcJLAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1081{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKUlEQVQImWNk+M+ABTxGE37M8J8RQxAXgKiUZUDRwYRiriwDIwMDAwMAGlUMjW7WMDYAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1082{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQImWNk+M+ABTxGE37M8J8JmzpGDJWyDIzEawcAyhMKjnu/FzwAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1083{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJklEQVQImWNk+M+AARgZGBgYGB5jk0IWfMzwnwlTBQMDDkEs5gEAY1cIkHhjciYAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1084{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJ0lEQVQImWNk+M+AAVgYnmAKMzEwMDAwyDIwItNMmJqRBWGqcakEAFVAA0pJnD/NAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1085{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQImWNk+M+ABTxGE37M8J8JmzpGDJUkaQcAxM8KcP3m1OQAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1086{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJklEQVQImWNk+M+AAVgYnmATfowm+JjhPxOmKgYGrIKMGNoZGBgAc/QIk+4mIMQAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1087{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQImWNk+M+AAVgYnmATfowm+JjhPxOmKgYG4gUBUkEGshOLi5IAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1088{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJklEQVQImWNk+M+AAVgYnmATfowm+JjhPyOGIFaVDAwMTJiqGBgAC+sKc47Gie0AAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1089{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQImWNk+M+AAVgYnmATfowm+JjhP6YgAwMDEzadjNhUAgAPkwxVI4s+ywAAAABJRU5ErkJggg==);margin-right:1px}#webamp .character-1090{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQImWNk+M+AAVgYnmAThoHHCEkmbPLECwIAyNwE0AzefvcAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1091{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIklEQVQImWNk+M+ABTxGE37M8J8JmzpGDJVYwWOG/1hVAgCdMApvvWqOkgAAAABJRU5ErkJggg==);margin-right:1px}#webamp .character-1092{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJElEQVQImWNk+M+ABzxGSDMic2CAiYGBgYFBloERmcaqEquZAC9SCMnuOrSGAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1093{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQImWNk+M+ABTxGE37M8J8JmzpGDNWyDIzEawcAwosKjn1oYWsAAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1094{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQImWNk+M+ABTxGE37M8J8JmzqsgowY2rGCxwz/ASyoCI44/durAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1095{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHklEQVQImWNk+M+ABTxGE37M8J8JmzpGDJVYAS7tAHt9CI6iI2Q+AAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1096{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQImWNk+M+AAZgYnjD8Z2BkYECmmTDVMTAQL8jI8BjTKgC1QgiXKlFJMwAAAABJRU5ErkJggg==);margin-right:1px}#webamp .character-1097{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKklEQVQImWNk+M+AAZgYnjD8Z2BkYECmmTDVMTBgFWRkeIzNVHTwmOE/AOA1CncblCSyAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1098{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQImWNk+M+AAVgYniAJyzIwoko/RkgyYhNkQlEN1Y5VJQBLCQjOfIdw2wAAAABJRU5ErkJggg==);margin-right:1px}#webamp .character-1099{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQImWNk+M+ABTxGE37M8J8JmzomuGokHRBBWQZG7CqRAADJmAqRI8FgzgAAAABJRU5ErkJggg==);margin-right:1px}#webamp .character-1100{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAH0lEQVQImWNk+M+ABTzGFGbCpo4Rm0pM7Y8Z/mNVCQBEsgpv+1PDPgAAAABJRU5ErkJggg==);margin-right:1px}#webamp .character-1101{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQImWNk+M+AAVgYnmATRgePGf4zMjymRCUAdwkKclNysG4AAAAASUVORK5CYII=);margin-right:1px}#webamp .character-1102{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALUlEQVQImWNk+M+AAVgYnjD8Z5BlYGR4jJBmQlEiy8CIEHyMaggTsgrs2qE6AH2hCPDPss/JAAAAAElFTkSuQmCC);margin-right:1px}#webamp .character-1103{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQImWNk+M+AAVgYnmATfowm+JjhPyOGIFYdjxn+s2BTCQBJ/w45lRHASAAAAABJRU5ErkJggg==);margin-right:1px}#webamp .gen-text-a{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAGFBMVEUpKUA3N01bW21iYnN4eIZ/f4yNjZmUlKDQ9WnQAAAAIUlEQVQIHWMAAcZyAQamdAUGVrMABnGVQgY11yKGIIZUACkrA92ildtqAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-a{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAGFBMVEUpKUBGRlmNjZmbm6bGxszU1Nnx8fL///8iRh7bAAAAIUlEQVQIHWMAAcZyAQamdAUGVrMABnGVQgY11yKGIIZUACkrA92ildtqAAAAAElFTkSuQmCC)}#webamp .gen-text-b{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAHlBMVEUpKUAxMUdGRlliYnNqanpwcIB4eIZ/f4yNjZmUlKBMQpI+AAAAIUlEQVQI12NgAAHOmVOARIKlAgNnWyuQVRQuAOXOnMoAAFkvBehWf7S3AAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-b{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAHlBMVEUpKUA3N01iYnObm6apqbO4uL/GxszU1Nnx8fL////s2d+PAAAAIUlEQVQI12NgAAHOmVOARIKlAgNnWyuQVRQuAOXOnMoAAFkvBehWf7S3AAAAAElFTkSuQmCC)}#webamp .gen-text-c{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJ1BMVEUpKUAxMUc3N00/P1NGRllUVGZbW21qanpwcIB4eIaGhpONjZmUlKBrx3tvAAAAJUlEQVQI12NgAAHWNZMZGHQSdzAw5DgwgAgFBgabgk6gxJ7JDABjoQaLYu6ObAAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-c{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJ1BMVEUpKUA3N01GRllUVGZiYnN/f4yNjZmpqbO4uL/Gxszi4ubx8fL///9AK9zxAAAAJUlEQVQI12NgAAHWNZMZGHQSdzAw5DgwgAgFBgabgk6gxJ7JDABjoQaLYu6ObAAAAABJRU5ErkJggg==)}#webamp .gen-text-d{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAElBMVEUpKUBUVGZbW214eIaNjZmUlKBPxwelAAAAG0lEQVQI12NgAALTEAUGU6ZABlOGYAgGsUMUACkqA3OelxceAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-d{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAElBMVEUpKUB/f4yNjZnGxszx8fL///90u0SbAAAAG0lEQVQI12NgAALTEAUGU6ZABlOGYAgGsUMUACkqA3OelxceAAAAAElFTkSuQmCC)}#webamp .gen-text-e{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAHlBMVEUpKUA3N00/P1NGRllUVGZbW214eIZ/f4yNjZmUlKBpF6uKAAAAH0lEQVQI12NgAALOmVMZOBOAdJsDA2exABAbAcWmAQA4DwTidXJmqwAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-e{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAHlBMVEUpKUBGRllUVGZiYnN/f4yNjZnGxszU1Nnx8fL///+DgC81AAAAH0lEQVQI12NgAALOmVMZOBOAdJsDA2exABAbAcWmAQA4DwTidXJmqwAAAABJRU5ErkJggg==)}#webamp .gen-text-f{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAElBMVEUpKUA3N01GRllbW21qanqUlKC2H8YaAAAAGklEQVQI12NgAALT0CAGUwUg7SwAwSC2AgMAKTIC7Ms0rr0AAAAASUVORK5CYII=)}#webamp .gen-window.selected .gen-text-f{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAElBMVEUpKUBGRlliYnONjZmpqbP///9D5gpdAAAAGklEQVQI12NgAALT0CAGUwUg7SwAwSC2AgMAKTIC7Ms0rr0AAAAASUVORK5CYII=)}#webamp .gen-text-g{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAIVBMVEUpKUA/P1NGRllUVGZbW21wcIB4eIZ/f4yGhpONjZmUlKCnwN9hAAAAJ0lEQVQIHWMAA8aqZgYGzoQoAQYtBwYGBi2XVQoMnAVeCgyMXa0KAE4GBYcb4B3nAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-g{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAIVBMVEUpKUBUVGZiYnN/f4yNjZm4uL/GxszU1Nni4ubx8fL///+LwSrlAAAAJ0lEQVQIHWMAA8aqZgYGzoQoAQYtBwYGBi2XVQoMnAVeCgyMXa0KAE4GBYcb4B3nAAAAAElFTkSuQmCC)}#webamp .gen-text-h{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAJFBMVEUpKUBwcIBycoGCgo+hoauqqrO3t767u8O8vMPDw8nGxszKytD26YaTAAAAGElEQVQI12NgAAJphQoITl3BIO08A8YHADj6BOvV9DaxAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-h{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAFVBMVEUpKUCrq7TDw8no6Ovw8PH5+fr///9e3zXEAAAAFklEQVQI12NgAAIxgTQIDgFiozQYHwAqqAOv6ufnjgAAAABJRU5ErkJggg==)}#webamp .gen-text-i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHBAMAAADdS/HjAAAAFVBMVEUhITkkJDxra3xwcIBycoF6eoiCgo8pCsaXAAAAFUlEQVQI12MQEGQQCoQi4UQGERACABeTAqlm5PZ5AAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHBAMAAADdS/HjAAAAFVBMVEUkJDwxMULAwMfDw8ne3uHh4eXl5ehBk9l/AAAAFUlEQVQI12NgFGBgcgCjAAZmCEoAABAKAfHk6DTHAAAAAElFTkSuQmCC)}#webamp .gen-text-j{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAGFBMVEUpKUAxMUdGRllNTWBUVGZ4eIaNjZmUlKAAywzwAAAAE0lEQVQI12NgAIFSVCwCxOrJDAAh4QLodMJ9awAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-j{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAGFBMVEUpKUA3N01iYnNwcIB/f4zGxszx8fL///+/0FlwAAAAE0lEQVQI12NgAIFSVCwCxOrJDAAh4QLodMJ9awAAAABJRU5ErkJggg==)}#webamp .gen-text-k{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAHlBMVEUpKUAxMUc/P1NGRllNTWBUVGZbW22GhpONjZmUlKC0yuawAAAAIklEQVQI12NgAIFM00lAIiMBSHQGAImKAiDhNhVIGLYzAABxtgda2evVPQAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-k{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAHlBMVEUpKUA3N01UVGZiYnNwcIB/f4yNjZni4ubx8fL////1B4EGAAAAIklEQVQI12NgAIFM00lAIiMBSHQGAImKAiDhNhVIGLYzAABxtgda2evVPQAAAABJRU5ErkJggg==)}#webamp .gen-text-l{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHBAMAAAAyiZrdAAAAElBMVEUpKUAxMUdGRll4eIZ/f4yUlKDDTNTnAAAAFUlEQVQI12NgAIJgNByiJMAQGqoAABtZAp1Ff+GZAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-l{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAADAp4fuAAAAMklEQVQYV2PU1HT4z4AGGP//////+PGzDMnJJXApaghevXqLoa9vFthMEBtsJrLlIAsBN0svzTt3mzcAAAAASUVORK5CYII=)}#webamp .gen-text-m{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHBAMAAADHdxFtAAAAIVBMVEUpKUAxMUdGRllUVGZbW21iYnNwcIB4eIZ/f4yGhpOUlKBZcblpAAAAI0lEQVQI12NgAAGtJZzLGbRWaAGJrjIg4bUYSGguBBKqCcsBjp0JorkYhMsAAAAASUVORK5CYII=)}#webamp .gen-window.selected .gen-text-m{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHBAMAAADHdxFtAAAAIVBMVEUpKUA3N01iYnN/f4yNjZmbm6a4uL/GxszU1Nni4ub////cS6NmAAAAI0lEQVQI12NgAAGtJZzLGbRWaAGJrjIg4bUYSGguBBKqCcsBjp0JorkYhMsAAAAASUVORK5CYII=)}#webamp .gen-text-n{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAHlBMVEUpKUAxMUc3N01GRllNTWBiYnNwcIB4eIaNjZmUlKCfa5y8AAAAIElEQVQI12NgAIIK5clMjA4MTP+NgPgKAxPDeiB+wwAASdwGGeDXGZQAAAAASUVORK5CYII=)}#webamp .gen-window.selected .gen-text-n{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAHlBMVEUpKUA3N01GRlliYnNwcICbm6a4uL/Gxszx8fL///8Fv7lnAAAAIElEQVQI12NgAIIK5clMjA4MTP+NgPgKAxPDeiB+wwAASdwGGeDXGZQAAAAASUVORK5CYII=)}#webamp .gen-text-o{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAHlBMVEUpKUA/P1NGRllUVGZbW214eIZ/f4yGhpONjZmUlKDmamWaAAAAHElEQVQI12NgAAKx6QYMrSwTGaYwTQFjEBsoBgBK6AZDMgIWOQAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-o{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAHlBMVEUpKUBUVGZiYnN/f4yNjZnGxszU1Nni4ubx8fL////xzWRAAAAAHElEQVQI12NgAAKx6QYMrSwTGaYwTQFjEBsoBgBK6AZDMgIWOQAAAABJRU5ErkJggg==)}#webamp .gen-text-p{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAJ1BMVEUpKUAxMUc/P1NGRllNTWBbW21iYnNqanpwcIB4eIZ/f4yGhpOUlKBLTaK7AAAAIElEQVQI12NgAIKYM5sYYgxPMMSEHGeIWZnIEGPAAMIAZzYHJUki1qIAAAAASUVORK5CYII=)}#webamp .gen-window.selected .gen-text-p{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAJ1BMVEUpKUA3N01UVGZiYnNwcICNjZmbm6apqbO4uL/GxszU1Nni4ub////2OqNjAAAAIElEQVQI12NgAIKYM5sYYgxPMMSEHGeIWZnIEGPAAMIAZzYHJUki1qIAAAAASUVORK5CYII=)}#webamp .gen-text-q{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJFBMVEUpKUA3N00/P1NGRllUVGZbW214eIZ/f4yGhpONjZmSkp6UlKAHPYNOAAAAI0lEQVQI12NgAAGm6hYGBs6EaAEG6wDrAAjBmdBtAJTY1QAAWmwG3UPBF3oAAAAASUVORK5CYII=)}#webamp .gen-window.selected .gen-text-q{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJ1BMVEUpKUBGRllUVGZiYnN/f4yNjZm4uMDGxszU1Nni4ubx8fL7+/v////Rx7x8AAAAI0lEQVQI12NgAAGmnikMDFwFMQIMNgE2ARCCq2COAVDidAIAYQkHOMhnyMoAAAAASUVORK5CYII=)}#webamp .gen-text-r{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJ1BMVEUpKUAxMUc3N01GRllUVGZbW21qanpwcIB4eIZ/f4yGhpONjZmUlKDditvQAAAAIklEQVQI12NgAAGbM1uARMAcILHiJJBIPwQkQo4AicCTDACHOAih1LnoFgAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-r{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJ1BMVEUpKUA3N01GRlliYnN/f4yNjZmpqbO4uL/GxszU1Nni4ubx8fL///9vCc2uAAAAIklEQVQI12NgAAGbM1uARMAcILHiJJBIPwQkQo4AicCTDACHOAih1LnoFgAAAABJRU5ErkJggg==)}#webamp .gen-text-s{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAJFBMVEUpKUAxMUc/P1NGRllUVGZbW21qanpwcIB4eIaGhpONjZmUlKCHjnJIAAAAIklEQVQIHWMAAY1dAQzVygoM1TsDGMRmb2IIZdvE4LnLAQBTHAco/pVKOwAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-s{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAJFBMVEUpKUA3N01UVGZiYnN/f4yNjZmpqbO4uL/Gxszi4ubx8fL///+qJyS0AAAAIklEQVQIHWMAAY1dAQzVygoM1TsDGMRmb2IIZdvE4LnLAQBTHAco/pVKOwAAAABJRU5ErkJggg==)}#webamp .gen-text-t{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAADAp4fuAAAALklEQVQYV2PU0XH+z4AGGCdMmIMpqKZq819FVZHBzc2eYfXqLQyvX71hYKSBIACnryn7i49aBgAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-t{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHAgMAAAC9yW99AAAADFBMVEUpKUBUVGZycoH///9VDRy9AAAAE0lEQVQI12NgYGD4f4BBlwEZAQAkDAKhcYNEwQAAAABJRU5ErkJggg==)}#webamp .gen-text-u{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAFVBMVEUpKUAxMUdGRllUVGZbW21qanqUlKDA77WeAAAAFklEQVQI12NgAAI3hRRUHJLMIJoWAAA5UATxAlDxBQAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-u{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAFVBMVEUpKUA3N01iYnN/f4yNjZmpqbP///8SF7O4AAAAFklEQVQI12NgAAI3hRRUHJLMIJoWAAA5UATxAlDxBQAAAABJRU5ErkJggg==)}#webamp .gen-text-v{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAKlBMVEUpKUAxMUc/P1NGRllNTWBUVGZbW21iYnNqanpwcIB4eIaGhpONjZmUlKDthvA2AAAAIklEQVQIHWMAAd8EWQaeDTEMHJeWMzDfvMTAsHcDA0NtAgBSrAdcNQnv8gAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-v{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAKlBMVEUpKUA3N01UVGZiYnNwcIB/f4yNjZmbm6apqbO4uL/Gxszi4ubx8fL///81zHafAAAAIklEQVQIHWMAAd8EWQaeDTEMHJeWMzDfvMTAsHcDA0NtAgBSrAdcNQnv8gAAAABJRU5ErkJggg==)}#webamp .gen-text-w{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHBAMAAADHdxFtAAAALVBMVEUpKUAxMUc3N00/P1NGRllNTWBUVGZbW21iYnNqanpwcIB4eIZ/f4yNjZmUlKD3PA89AAAAKUlEQVQIHWMAg3nqT/wY8rKfdzPIzXt9nIHnXd9jBo7XcRcYWJ7zLQAAwo4M1uKKXVEAAAAASUVORK5CYII=)}#webamp .gen-window.selected .gen-text-w{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHBAMAAADHdxFtAAAALVBMVEUpKUA3N01GRllUVGZiYnNwcIB/f4yNjZmbm6apqbO4uL/GxszU1Nnx8fL///+8HCoLAAAAKUlEQVQIHWMAg3nqT/wY8rKfdzPIzXt9nIHnXd9jBo7XcRcYWJ7zLQAAwo4M1uKKXVEAAAAASUVORK5CYII=)}#webamp .gen-text-x{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJFBMVEUpKUAxMUc3N01GRllNTWBbW21iYnNwcIB4eIaGhpONjZmUlKDqWCJLAAAAJElEQVQI12NgAAHJiVECDMzbtwCZ2Q0gYhEDA/PWHUCJhOwAAGilBx+T4WwNAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-x{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHBAMAAAA2fErgAAAAJFBMVEUpKUA3N01GRlliYnNwcICNjZmbm6a4uL/Gxszi4ubx8fL///+x/boCAAAAJElEQVQI12NgAAHJiVECDMzbtwCZ2Q0gYhEDA/PWHUCJhOwAAGilBx+T4WwNAAAAAElFTkSuQmCC)}#webamp .gen-text-y{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAJFBMVEUpKUAxMUc/P1NGRllNTWBUVGZbW21iYnN4eIaGhpONjZmUlKAsqFJVAAAAHklEQVQI12NgAIIdrJsYsrMKGDh3CTCwbGNgYIZgAE8aBbSrMTxDAAAAAElFTkSuQmCC)}#webamp .gen-window.selected .gen-text-y{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHBAMAAADZviHeAAAAJFBMVEUpKUA3N01UVGZiYnNwcIB/f4yNjZmbm6bGxszi4ubx8fL///+UuWJCAAAAHklEQVQI12NgAIIdrJsYsrMKGDh3CTCwbGNgYIZgAE8aBbSrMTxDAAAAAElFTkSuQmCC)}#webamp .gen-text-z{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHBAMAAAAsQKpuAAAAIVBMVEUAAAApKUAxMUc/P1NGRllbW21qanp4eIZ/f4yGhpOUlKAeeVtyAAAAAXRSTlMAQObYZgAAACdJREFUCNdjEBQUYACCqlULQJRgVgCIElkBFtRcDKaiShxA1CqwEgClfwdsfnJFGQAAAABJRU5ErkJggg==)}#webamp .gen-window.selected .gen-text-z{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHBAMAAAAsQKpuAAAAIVBMVEUAAAApKUA3N01UVGZiYnONjZmpqbPGxszU1Nni4ub///8EpbEBAAAAAXRSTlMAQObYZgAAACdJREFUCNdjEBQUYACCqlULQJRgVgCIElkBFtRcDKaiShxA1CqwEgClfwdsfnJFGQAAAABJRU5ErkJggg==)}#webamp .gen-text-a,#webamp .selected .gen-text-a{width:6px}#webamp .gen-text-b,#webamp .gen-text-c,#webamp .selected .gen-text-b,#webamp .selected .gen-text-c{width:7px}#webamp .gen-text-d,#webamp .gen-text-e,#webamp .gen-text-f,#webamp .selected .gen-text-d,#webamp .selected .gen-text-e,#webamp .selected .gen-text-f{width:6px}#webamp .gen-text-g,#webamp .selected .gen-text-g{width:7px}#webamp .gen-text-h,#webamp .selected .gen-text-h{width:6px}#webamp .gen-text-i,#webamp .selected .gen-text-i{width:4px}#webamp .gen-text-j,#webamp .selected .gen-text-j{width:6px}#webamp .gen-text-k,#webamp .selected .gen-text-k{width:7px}#webamp .gen-text-l,#webamp .selected .gen-text-l{width:5px}#webamp .gen-text-m,#webamp .selected .gen-text-m{width:8px}#webamp .gen-text-n,#webamp .gen-text-o,#webamp .gen-text-p,#webamp .selected .gen-text-n,#webamp .selected .gen-text-o,#webamp .selected .gen-text-p{width:6px}#webamp .gen-text-q,#webamp .gen-text-r,#webamp .selected .gen-text-q,#webamp .selected .gen-text-r{width:7px}#webamp .gen-text-s,#webamp .selected .gen-text-s{width:6px}#webamp .gen-text-t,#webamp .selected .gen-text-t{width:5px}#webamp .gen-text-u,#webamp .gen-text-v,#webamp .selected .gen-text-u,#webamp .selected .gen-text-v{width:6px}#webamp .gen-text-w,#webamp .selected .gen-text-w{width:8px}#webamp .gen-text-x,#webamp .selected .gen-text-x{width:7px}#webamp .gen-text-y,#webamp .selected .gen-text-y{width:6px}#webamp .gen-text-z,#webamp .selected .gen-text-z{width:11px}#webamp #title-bar #close{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAIgAAAAAAAAAAAAAAAf4AACAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAADwAAAAAAAAAAAAf/gAAAAA8AAAAAAAAAAAAH//iIiAAPAAAAAAAAAAAAB//4iIAADwAAAAAAAAAAAAf/iIgAAA8AAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+HP//3hz//8w8///EP///wHz//8AE///ADP//wBz//8A8///AfP//wP///8H////D////x////8/////f////w==),auto}#webamp #equalizer-window .band{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAAAAA/3cAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAAAAj3AAAA9wAAAAAAAAAAgACPcAAAAPcAAAAAAAAAAIcAj3AAAAAAAAAAAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAA/3cAAAAAAAAACP/3d3AAAA9wAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////////////////////////8////+H///jA///wwP//8P///+Hz//3h4f/8w+H//EPz//wH///8AED//ADA//wB4f/8A/P//Af///wP///8H////D////x////8/////f////w==),auto}#webamp #equalizer-window.shade,#webamp #equalizer-window.shade input,#webamp #equalizer-window .title-bar{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==),auto}#webamp #main-window,#webamp #main-window.shade #title-bar,#webamp #playlist-window,#webamp .window,#webamp .window input{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH//iIiAAAAAAAAAAAAAAAB//4iIAAAAAAAAAAAAAAAAf/iIgAAAAAAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+H///3h///8w////EP///wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==),auto}#webamp #playlist-window .playlist-top{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==),auto}#webamp #main-window #position{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==),auto}#webamp #playlist-window #playlist-resize-target{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAAAAA/3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAcAAAAAAAAAAACPcAAAdwAHcAAAAAAAAAAAj3AAAP8AD/AAAAAAAAgACPcAAAAAAA8AAAAAAAAIcAj3AAAAAAAAAAAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////n////w////4H///iB///w/n//8OY//+HCH/3hwh/8w+Y//EP+f/wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==),auto}#webamp #playlist-window .playlist-scrollbar{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAAAAA/3cAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAAAAj3AAAA9wAAAAAAAAAAgACPcAAAAPcAAAAAAAAAAIcAj3AAAAAAAAAAAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAA/3cAAAAAAAAACP/3d3AAAA9wAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////////////////////////8////+H///jA///wwP//8P///+Hz//3h4f/8w+H//EPz//wH///8AED//ADA//wB4f/8A/P//Af///wP///8H////D////x////8/////f////w==),auto}#webamp #main-window #title-bar{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==),auto}#webamp #balance,#webamp #volume,#webamp #volume input{cursor:url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==),auto}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 4606:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp-context-menu .context-menu{left:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:default}#webamp-context-menu .context-menu.bottom{top:12px}#webamp-context-menu .context-menu.top{top:0}#webamp-context-menu .context-menu,#webamp-context-menu .context-menu ul{z-index:50;background-color:#fff;position:absolute;list-style:none;padding:0;margin:0;border:1px solid #a7a394;box-shadow:2px 2px 4px rgba(0,0,0,.5)}#webamp-context-menu .context-menu li{position:relative;font-family:Tahoma;font-size:11px;color:#000;white-space:nowrap;margin:2px;padding:1px 18px 3px;display:block}#webamp-context-menu .context-menu li.input{padding:0}#webamp-context-menu .context-menu li.checked:before{float:left;content:\\\"\\\\2713\\\";margin-left:-12px}#webamp-context-menu .context-menu li.parent:after{float:right;content:\\\"\\\\25B8\\\";margin-right:-12px}#webamp-context-menu .context-menu li a{text-decoration:none;color:#000;cursor:default}#webamp-context-menu .context-menu li:hover,#webamp-context-menu .context-menu li:hover a{background-color:#224eb7;color:#fff}#webamp-context-menu .context-menu li.hr{padding:2px 0}#webamp-context-menu .context-menu li.hr:hover{background-color:#fff}#webamp-context-menu .context-menu li.hr hr{border:none;height:1px;background-color:#a7a394;margin:0;padding:0}#webamp-context-menu .context-menu ul{display:none;left:100%;margin-left:-3px;max-height:300px;overflow-y:auto}#webamp-context-menu .context-menu li:hover>ul{display:block}.searchField{width:120px;height:20px;border:0;padding:1px 18px 3px;font-family:Tahoma;font-size:11px}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 7806:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp #equalizer-window{height:116px;width:275px}#webamp #equalizer-window.shade{height:14px}#webamp #equalizer-volume{position:absolute;left:61px;top:4px;height:6px;width:97px;background-position:0 0}#webamp #equalizer-volume::-webkit-slider-thumb{height:7px;width:3px}#webamp #equalizer-volume::-moz-range-thumb{height:7px;width:3px}#webamp #equalizer-balance{position:absolute;left:164px;top:4px;height:6px;width:43px;background-position:0 0}#webamp #equalizer-balance::-webkit-slider-thumb{height:7px;width:3px}#webamp #equalizer-balance::-moz-range-thumb{height:7px;width:3px}#webamp .equalizer-top{height:14px;width:275px;position:relative}#webamp #equalizer-close{position:absolute;height:9px;width:9px;left:264px;top:3px}#webamp #equalizer-shade{position:absolute;height:9px;width:9px;left:254px;top:3px}#webamp #on{width:26px;left:14px}#webamp #auto,#webamp #on{position:absolute;height:12px;top:18px}#webamp #auto{width:32px;left:40px}#webamp #presets-context{position:absolute;width:44px;height:12px;top:18px;left:217px}#webamp #presets{width:100%;height:100%}#webamp #eqGraph{position:absolute;width:113px;height:19px;top:17px;left:86px}#webamp #preamp{position:absolute;left:21px;top:38px}#webamp #plus12db{top:36px}#webamp #plus12db,#webamp #zerodb{position:absolute;left:45px;width:22px;height:8px}#webamp #zerodb{top:64px}#webamp #minus12db{position:absolute;left:45px;top:95px;width:22px;height:8px}#webamp #band-60{position:absolute;left:78px;top:38px}#webamp #band-170{position:absolute;left:96px;top:38px}#webamp #band-310{position:absolute;left:114px;top:38px}#webamp #band-600{position:absolute;left:132px;top:38px}#webamp #band-1000{position:absolute;left:150px;top:38px}#webamp #band-3000{position:absolute;left:168px;top:38px}#webamp #band-6000{position:absolute;left:186px;top:38px}#webamp #band-12000{position:absolute;left:204px;top:38px}#webamp #band-14000{position:absolute;left:222px;top:38px}#webamp #band-16000{position:absolute;left:240px;top:38px}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 5597:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp .gen-text-space{width:5px}#webamp .gen-text-letter{height:7px;display:inline-block}#webamp .gen-window{width:275px;height:116px;display:flex;flex-direction:column}#webamp .gen-top{height:20px;display:flex;flex-direction:row}#webamp .gen-top-left{width:25px;height:20px}#webamp .gen-top-title{line-height:7px;margin-top:2px;padding:0 3px 0 4px}#webamp .gen-top-left-fill{flex-grow:1;height:20px;background-position:0}#webamp .gen-top-right-fill{flex-grow:1;height:20px;background-position:100%}#webamp .gen-top-left-end,#webamp .gen-top-right,#webamp .gen-top-right-end{width:25px;height:20px}#webamp .gen-close{width:9px;height:9px;position:absolute;right:2px;top:3px}#webamp .gen-middle{flex-grow:1;display:flex;flex-direction:row;position:relative}#webamp .gen-middle-left{width:11px}#webamp .gen-middle-left-bottom{width:11px;height:24px;bottom:0;position:absolute}#webamp .gen-middle-center{flex-grow:1;position:relative}#webamp .gen-middle-right{width:8px}#webamp .gen-middle-right-bottom{width:8px;height:24px;bottom:0;position:absolute}#webamp .gen-bottom{height:14px;background-repeat:repeat-x}#webamp .gen-bottom-left{position:absolute;left:0;width:125px;height:14px}#webamp .gen-bottom-right{position:absolute;right:0;width:125px;height:14px}#webamp .gen-bottom-right #gen-resize-target{position:absolute;right:0;bottom:0;height:20px;width:20px}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 2419:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp #main-window{position:absolute;height:116px;width:275px;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:pixelated;-ms-interpolation-mode:nearest-neighbor}#webamp #title-bar{position:absolute;top:0;left:0;height:14px;width:275px;-webkit-app-region:drag}#webamp #close,#webamp #minimize,#webamp #option-context,#webamp #shade{position:absolute;height:9px;width:9px;top:3px;-webkit-app-region:no-drag;cursor:pointer}#webamp #title-bar #option{width:100%;height:100%}#webamp #title-bar #option-context{left:6px}#webamp #title-bar #minimize{left:244px}#webamp #title-bar #shade{left:254px}#webamp #title-bar #close{left:264px}#webamp #clutter-bar{position:absolute;top:22px;left:10px;height:43px;width:8px}#webamp #clutter-bar div{position:absolute;height:7px;width:8px;left:0}#webamp #clutter-bar #button-o{top:3px;height:8px}#webamp #clutter-bar #button-a{top:11px}#webamp #clutter-bar #button-i{top:18px}#webamp #clutter-bar #button-d{top:25px;height:8px}#webamp #clutter-bar #button-v{top:33px}#webamp #play-pause{position:absolute;top:28px;left:26px;height:9px;width:9px;background-repeat:no-repeat}#webamp #work-indicator.selected,#webamp .play #work-indicator{position:absolute;top:28px;left:24px;height:9px;width:3px}#webamp .status #time{position:absolute;left:39px;top:26px;height:13px;width:59px}#webamp .stop .status #time{display:none}#webamp .pause .status #time{animation:blink 2s step-start 1s infinite;-webkit-animation:blink 2s step-start 1s infinite}#webamp .status #time #minus-sign{position:absolute;top:6px;left:-1px;width:5px;height:1px}#webamp .status #time #minute-first-digit{position:absolute;pointer-events:none;left:9px;height:13px;width:9px}#webamp .status #time #minute-second-digit{position:absolute;pointer-events:none;left:21px;height:13px;width:9px}#webamp .status #time #second-first-digit{position:absolute;pointer-events:none;left:39px;height:13px;width:9px}#webamp .status #time #second-second-digit{position:absolute;pointer-events:none;left:51px;height:13px;width:9px}#webamp #main-window #visualizer{position:absolute;top:43px;left:24px}#webamp #main-window.shade #visualizer{top:5px;left:79px}#webamp #main-window.stop #visualizer,#webamp .text{display:none}#webamp #marquee{top:24px;width:155px;display:block;padding:3px 0}#webamp #marquee,#webamp .media-info #kbps{position:absolute;left:111px;height:6px;overflow:hidden}#webamp .media-info #kbps{top:43px;width:15px}#webamp .stop .media-info #kbps{display:none}#webamp .media-info #khz{position:absolute;left:156px;top:43px;width:10px;height:6px;overflow:hidden}#webamp .stop .media-info #khz{display:none}#webamp .media-info .mono-stereo{position:absolute;left:212px;top:41px;width:57px;height:12px}#webamp .media-info .mono-stereo div{position:absolute;height:12px}#webamp .media-info .mono-stereo #mono{width:27px}#webamp .media-info .mono-stereo #stereo{left:27px;width:29px}#webamp #volume{position:absolute;left:107px;top:57px;height:13px;width:68px;background-position:0 0}#webamp #volume input{height:13px;width:65px;display:block}#webamp #volume input::-webkit-slider-thumb{top:1px;height:11px;width:14px}#webamp #volume input::-moz-range-thumb{top:1px;height:11px;width:14px}#webamp #balance{position:absolute;left:177px;top:57px;height:13px;width:38px;background-position:0 0}#webamp #balance::-webkit-slider-thumb{top:1px;height:11px;width:14px}#webamp #balance::-moz-range-thumb{top:1px;height:11px;width:14px}#webamp .windows{position:absolute;left:219px;top:58px;width:46px;height:12px}#webamp .windows div{position:absolute;width:23px;height:12px}#webamp .windows #equalizer-button{left:0}#webamp .windows #playlist-button{left:23px}#webamp #position{position:absolute;left:16px;top:72px;width:248px;height:10px}#webamp #position::-webkit-slider-thumb{height:10px;width:29px;-webkit-box-sizing:border-box;position:relative}#webamp #position::-moz-range-thumb{height:10px;width:29px}#webamp .stop #position::-webkit-slider-thumb{visibility:hidden}#webamp .stop #position::-moz-range-thumb{visibility:hidden}#webamp .play #position::-webkit-slider-thumb{visibility:visible}#webamp .actions div{height:18px;width:23px;position:absolute}#webamp .actions #previous{top:88px;left:16px}#webamp .actions #play{top:88px;left:39px}#webamp .actions #pause{top:88px;left:62px}#webamp .actions #stop{top:88px;left:85px}#webamp .actions #next{top:88px;left:108px;width:22px}#webamp #eject{position:absolute;top:89px;left:136px;height:16px;width:22px}#webamp .shuffle-repeat{position:absolute;top:89px;left:164px;width:74px}#webamp .shuffle-repeat div{position:absolute;height:15px}#webamp .shuffle-repeat #shuffle{width:47px}#webamp .shuffle-repeat #repeat{left:46px;width:28px}#webamp #about{position:absolute;top:91px;left:253px;height:15px;width:13px}#webamp .digit{position:absolute;display:inline-block;width:9px;height:13px;background-repeat:no-repeat;text-indent:-9999px}#webamp #main-window.shade{height:14px}#webamp .shade #balance,#webamp .shade #volume,#webamp .shade .media-info,#webamp .shade .shuffle-repeat,#webamp .shade .status,#webamp .shade .windows{display:none}#webamp .shade .actions div{position:absolute}#webamp .shade .actions #previous,#webamp .shade .actions #previous:active{background:none;height:10px;width:7px;top:2px;left:169px}#webamp .shade .actions #play,#webamp .shade .actions #play:active{background:none;height:10px;width:10px;top:2px;left:176px}#webamp .shade .actions #pause,#webamp .shade .actions #pause:active{background:none;height:10px;width:9px;top:2px;left:186px}#webamp .shade .actions #stop,#webamp .shade .actions #stop:active{background:none;height:10px;width:9px;top:2px;left:195px}#webamp .shade .actions #next,#webamp .shade .actions #next:active{background:none;height:10px;width:10px;top:2px;left:204px}#webamp .shade #eject,#webamp .shade #eject:active{height:10px;width:10px;top:2px;left:215px;background:none}#webamp .shade #position{position:absolute;left:226px;top:4px;width:17px;height:7px}#webamp .shade #position::-webkit-slider-thumb{height:7px;width:3px;background:none}#webamp .shade #position::-moz-range-thumb{height:7px;width:3px;background:none}#webamp #main-window .mini-time{position:absolute;top:4px;left:127px}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 7029:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp .mini-time{display:block;height:6px;width:25px}#webamp .mini-time.blinking .character:not(.background-character){animation:blink 2s step-start 1s infinite;-webkit-animation:blink 2s step-start 1s infinite}#webamp .mini-time .background-character{z-index:1}#webamp .mini-time .character{position:absolute;top:0;z-index:2}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 7886:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp #playlist-window{display:flex;flex-direction:column}#webamp .playlist-top{width:100%;min-height:20px;max-height:20px;position:relative;display:flex}#webamp .playlist-top-left{width:25px}#webamp .playlist-top-left-spacer{width:12px}#webamp .playlist-top-left-fill{flex-grow:1;background-position:100%}#webamp .playlist-top-right-spacer{width:13px}#webamp .playlist-top-right-fill{flex-grow:1;background-position:100%}#webamp .playlist-top-title{width:100px}#webamp .playlist-top-right{width:25px}#webamp .playlist-middle{flex-grow:1;display:flex;flex-direction:row;overflow:hidden}#webamp .playlist-middle-left{background-repeat:repeat-y;width:12px;min-width:12px}#webamp .playlist-middle-center{flex-grow:1;padding:3px 0;min-width:0}#webamp .playlist-tracks{display:flex;flex:1 0 auto}#webamp .playlist-tracks .track-cell{height:13px;line-height:13px;font-size:9px;letter-spacing:.5px;-webkit-user-select:none;-moz-user-select:none;user-select:none}#webamp .playlist-track-durations>div{padding-right:3px;text-align:right}#webamp .playlist-track-titles{flex:1 1 auto;overflow:hidden}#webamp .playlist-track-titles>div{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}#webamp .playlist-middle-right{background-repeat:repeat-y;background-position:100% 0;width:20px;min-width:20px;position:relative;padding-bottom:18px}#webamp .playlist-bottom{width:100%;height:38px;min-height:38px;max-height:38px;position:relative}#webamp .playlist-bottom-left{width:125px;height:100%;position:absolute}#webamp .playlist-menu li{list-style:none;display:none;width:22px;height:18px;padding:0;margin:0}#webamp .playlist-menu li>div{height:100%}#webamp .playlist-menu ul{padding:0;margin:0;position:absolute;bottom:0}#webamp .playlist-menu.selected li{display:block}#webamp .playlist-menu .bar{position:absolute;bottom:0;left:-3px;width:3px;height:54px}#webamp #playlist-add-menu{position:absolute;bottom:12px;left:14px;width:22px;height:18px}#webamp #playlist-remove-menu.playlist-menu .bar{height:72px}#webamp #playlist-remove-menu{position:absolute;bottom:12px;left:43px;width:22px;height:18px}#webamp #playlist-selection-menu{position:absolute;bottom:12px;left:72px;width:22px;height:18px}#webamp #playlist-misc-menu{position:absolute;bottom:12px;left:101px;width:22px;height:18px}#webamp #playlist-list-menu{position:absolute;bottom:12px;right:22px;width:22px;height:18px}#webamp .playlist-bottom-right{width:150px;height:100%;position:absolute;right:0}#webamp .playlist-running-time-display{position:absolute;top:10px;left:7px;height:10px}#webamp .playlist-action-buttons{position:absolute;top:22px;left:3px;display:flex}#webamp .playlist-action-buttons>div{height:10px;width:10px}#webamp #playlist-window .playlist-visualizer{width:75px;height:100%;position:absolute;right:150px}#webamp #playlist-window .mini-time{position:absolute;top:23px;left:66px}#webamp #playlist-window #playlist-resize-target{position:absolute;right:0;bottom:0;height:20px;width:20px}#webamp #playlist-close-button{position:absolute;right:2px;height:9px;width:9px;top:3px}#webamp #playlist-shade-button{position:absolute;right:12px;height:9px;width:9px;top:3px}#webamp #playlist-window-shade{height:14px}#webamp #playlist-window-shade .left,#webamp #playlist-window-shade .right{height:14px;background-repeat:no-repeat}#webamp #playlist-window-shade .right{background-position-x:right}#webamp #playlist-window #playlist-scroll-down-button,#webamp #playlist-window #playlist-scroll-up-button{position:absolute;width:8px;height:5px;right:7px}#webamp #playlist-window #playlist-scroll-up-button{top:2px}#webamp #playlist-window #playlist-scroll-down-button{top:8px}#webamp #playlist-window-shade #playlist-resize-target{position:absolute;right:20px;top:3px;height:9px;width:9px}#webamp #playlist-shade-track-title{position:absolute;top:4px;left:5px}#webamp #playlist-shade-time{position:absolute;top:4px;right:30px}#webamp #playlist-window .visualizer-wrapper{position:absolute;top:12px;left:2px;width:72px;overflow:hidden}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 8915:\n/***/ ((module, exports, __webpack_require__) => {\n\nexports = module.exports = __webpack_require__(3965)(false);\n// imports\n\n\n// module\nexports.push([module.id, \"#webamp{position:absolute;top:0;left:0}#webamp canvas{-webkit-user-select:none;-moz-user-select:none;user-select:none}#webamp *{box-sizing:initial;-webkit-box-sizing:content-box}#webamp :focus{outline:0}#webamp input[type=range]{-webkit-appearance:none;margin:0;padding:0;background:none;border:none}#webamp input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:none;border-radius:0;background:none}#webamp input[type=range]::-moz-range-thumb{border:none;border-radius:0;background:none}#webamp input[type=range]::-moz-range-track{border:none;background:none}#webamp input[type=range]:focus{outline:none}#webamp input[type=range]::-moz-focus-outer{border:0}#webamp a:focus{outline:none}@keyframes blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}@-webkit-keyframes blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}#webamp .character{display:inline-block;vertical-align:top;width:5px;height:6px;text-indent:-9999px}#webamp .window{position:absolute;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:pixelated;-ms-interpolation-mode:nearest-neighbor;-webkit-transform:translateZ(0)}#webamp .window.doubled{-moz-transform:translateZ(0) scale(2);-moz-transform-origin:top left;-webkit-transform:translateZ(0) scale(2);-webkit-transform-origin:top left}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 3965:\n/***/ ((module) => {\n\n/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t//  when a module is imported multiple times with different media queries.\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n/***/ }),\n\n/***/ 3463:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nvar reactIs = __webpack_require__(8570);\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextType: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDefaultProps: true,\n  getDerivedStateFromError: true,\n  getDerivedStateFromProps: true,\n  mixins: true,\n  propTypes: true,\n  type: true\n};\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\nvar FORWARD_REF_STATICS = {\n  '$$typeof': true,\n  render: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true\n};\nvar MEMO_STATICS = {\n  '$$typeof': true,\n  compare: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true,\n  type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n  // React v16.11 and below\n  if (reactIs.isMemo(component)) {\n    return MEMO_STATICS;\n  } // React v16.12 and above\n\n\n  return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n    if (objectPrototype) {\n      var inheritedComponent = getPrototypeOf(sourceComponent);\n\n      if (inheritedComponent && inheritedComponent !== objectPrototype) {\n        hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n      }\n    }\n\n    var keys = getOwnPropertyNames(sourceComponent);\n\n    if (getOwnPropertySymbols) {\n      keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n    }\n\n    var targetStatics = getStatics(targetComponent);\n    var sourceStatics = getStatics(sourceComponent);\n\n    for (var i = 0; i < keys.length; ++i) {\n      var key = keys[i];\n\n      if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        try {\n          // Avoid failures from read-only properties\n          defineProperty(targetComponent, key, descriptor);\n        } catch (e) {}\n      }\n    }\n  }\n\n  return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n\n\n/***/ }),\n\n/***/ 2333:\n/***/ ((__unused_webpack_module, exports) => {\n\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.i = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.c = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n\n/***/ }),\n\n/***/ 7677:\n/***/ ((module) => {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (false) {}\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n\n\n/***/ }),\n\n/***/ 1297:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(true)module.exports=e();else {}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=undefined;if(!e&&t)return require(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=undefined,e=0;e<h.length;e++)u(h[e]);return u}({1:[function(e,t,r){\"use strict\";var d=e(\"./utils\"),c=e(\"./support\"),p=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";r.encode=function(e){for(var t,r,n,i,s,a,o,h=[],u=0,l=e.length,f=l,c=\"string\"!==d.getTypeOf(e);u<e.length;)f=l-u,n=c?(t=e[u++],r=u<l?e[u++]:0,u<l?e[u++]:0):(t=e.charCodeAt(u++),r=u<l?e.charCodeAt(u++):0,u<l?e.charCodeAt(u++):0),i=t>>2,s=(3&t)<<4|r>>4,a=1<f?(15&r)<<2|n>>6:64,o=2<f?63&n:64,h.push(p.charAt(i)+p.charAt(s)+p.charAt(a)+p.charAt(o));return h.join(\"\")},r.decode=function(e){var t,r,n,i,s,a,o=0,h=0,u=\"data:\";if(e.substr(0,u.length)===u)throw new Error(\"Invalid base64 input, it looks like a data url.\");var l,f=3*(e=e.replace(/[^A-Za-z0-9+/=]/g,\"\")).length/4;if(e.charAt(e.length-1)===p.charAt(64)&&f--,e.charAt(e.length-2)===p.charAt(64)&&f--,f%1!=0)throw new Error(\"Invalid base64 input, bad content length.\");for(l=c.uint8array?new Uint8Array(0|f):new Array(0|f);o<e.length;)t=p.indexOf(e.charAt(o++))<<2|(i=p.indexOf(e.charAt(o++)))>>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r<t;r++)n+=String.fromCharCode(255&e),e>>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t<this.dirRecords.length;t++)this.push({data:this.dirRecords[t],meta:{percent:100}});var r=this.bytesWritten-e,n=function(e,t,r,n,i){var s=I.transformTo(\"string\",i(n));return R.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+A(e,2)+A(e,2)+A(t,4)+A(r,4)+A(s.length,2)+s}(this.dirRecords.length,r,e,this.zipComment,this.encodeFileName);this.push({data:n,meta:{percent:100}})},s.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},s.prototype.registerPrevious=function(e){this._sources.push(e);var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.closedSource(t.previous.streamInfo),t._sources.length?t.prepareNextSource():t.end()}),e.on(\"error\",function(e){t.error(e)}),this},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},s.prototype.error=function(e){var t=this._sources;if(!i.prototype.error.call(this,e))return!1;for(var r=0;r<t.length;r++)try{t[r].error(e)}catch(e){}return!0},s.prototype.lock=function(){i.prototype.lock.call(this);for(var e=this._sources,t=0;t<e.length;t++)e[t].lock()},t.exports=s},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(e,t,r){\"use strict\";var u=e(\"../compressions\"),n=e(\"./ZipFileWorker\");r.generateWorker=function(e,a,t){var o=new n(a.streamFiles,t,a.platform,a.encodeFileName),h=0;try{e.forEach(function(e,t){h++;var r=function(e,t){var r=e||t,n=u[r];if(!n)throw new Error(r+\" is not a valid compression method !\");return n}(t.options.compression,a.compression),n=t.options.compressionOptions||a.compressionOptions||{},i=t.dir,s=t.date;t._compressWorker(r,n).withStreamInfo(\"file\",{name:e,dir:i,date:s,comment:t.comment||\"\",unixPermissions:t.unixPermissions,dosPermissions:t.dosPermissions}).pipe(o)}),o.entriesCount=h}catch(e){o.error(e)}return o}},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(e,t,r){\"use strict\";function n(){if(!(this instanceof n))return new n;if(arguments.length)throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");this.files=Object.create(null),this.comment=null,this.root=\"\",this.clone=function(){var e=new n;for(var t in this)\"function\"!=typeof this[t]&&(e[t]=this[t]);return e}}(n.prototype=e(\"./object\")).loadAsync=e(\"./load\"),n.support=e(\"./support\"),n.defaults=e(\"./defaults\"),n.version=\"3.10.1\",n.loadAsync=function(e,t){return(new n).loadAsync(e,t)},n.external=e(\"./external\"),t.exports=n},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(e,t,r){\"use strict\";var u=e(\"./utils\"),i=e(\"./external\"),n=e(\"./utf8\"),s=e(\"./zipEntries\"),a=e(\"./stream/Crc32Probe\"),l=e(\"./nodejsUtils\");function f(n){return new i.Promise(function(e,t){var r=n.decompressed.getContentWorker().pipe(new a);r.on(\"error\",function(e){t(e)}).on(\"end\",function(){r.streamInfo.crc32!==n.decompressed.crc32?t(new Error(\"Corrupted zip : CRC32 mismatch\")):e()}).resume()})}t.exports=function(e,o){var h=this;return o=u.extend(o||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:n.utf8decode}),l.isNode&&l.isStream(e)?i.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")):u.prepareContent(\"the loaded zip file\",e,!0,o.optimizedBinaryString,o.base64).then(function(e){var t=new s(o);return t.load(e),t}).then(function(e){var t=[i.Promise.resolve(e)],r=e.files;if(o.checkCRC32)for(var n=0;n<r.length;n++)t.push(f(r[n]));return i.Promise.all(t)}).then(function(e){for(var t=e.shift(),r=t.files,n=0;n<r.length;n++){var i=r[n],s=i.fileNameStr,a=u.resolve(i.fileNameStr);h.file(a,i.decompressed,{binary:!0,optimizedBinaryString:!0,date:i.date,dir:i.dir,comment:i.fileCommentStr.length?i.fileCommentStr:null,unixPermissions:i.unixPermissions,dosPermissions:i.dosPermissions,createFolders:o.createFolders}),i.dir||(h.file(a).unsafeOriginalName=s)}return t.zipComment.length&&(h.comment=t.zipComment),h})}},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../stream/GenericWorker\");function s(e,t){i.call(this,\"Nodejs stream input adapter for \"+e),this._upstreamEnded=!1,this._bindStream(t)}n.inherits(s,i),s.prototype._bindStream=function(e){var t=this;(this._stream=e).pause(),e.on(\"data\",function(e){t.push({data:e,meta:{percent:0}})}).on(\"error\",function(e){t.isPaused?this.generatedError=e:t.error(e)}).on(\"end\",function(){t.isPaused?t._upstreamEnded=!0:t.end()})},s.prototype.pause=function(){return!!i.prototype.pause.call(this)&&(this._stream.pause(),!0)},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},t.exports=s},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(e,t,r){\"use strict\";var i=e(\"readable-stream\").Readable;function n(e,t,r){i.call(this,t),this._helper=e;var n=this;e.on(\"data\",function(e,t){n.push(e)||n._helper.pause(),r&&r(t)}).on(\"error\",function(e){n.emit(\"error\",e)}).on(\"end\",function(){n.push(null)})}e(\"../utils\").inherits(n,i),n.prototype._read=function(){this._helper.resume()},t.exports=n},{\"../utils\":32,\"readable-stream\":16}],14:[function(e,t,r){\"use strict\";t.exports={isNode:\"undefined\"!=typeof Buffer,newBufferFrom:function(e,t){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from(e,t);if(\"number\"==typeof e)throw new Error('The \"data\" argument must not be a number');return new Buffer(e,t)},allocBuffer:function(e){if(Buffer.alloc)return Buffer.alloc(e);var t=new Buffer(e);return t.fill(0),t},isBuffer:function(e){return Buffer.isBuffer(e)},isStream:function(e){return e&&\"function\"==typeof e.on&&\"function\"==typeof e.pause&&\"function\"==typeof e.resume}}},{}],15:[function(e,t,r){\"use strict\";function s(e,t,r){var n,i=u.getTypeOf(t),s=u.extend(r||{},f);s.date=s.date||new Date,null!==s.compression&&(s.compression=s.compression.toUpperCase()),\"string\"==typeof s.unixPermissions&&(s.unixPermissions=parseInt(s.unixPermissions,8)),s.unixPermissions&&16384&s.unixPermissions&&(s.dir=!0),s.dosPermissions&&16&s.dosPermissions&&(s.dir=!0),s.dir&&(e=g(e)),s.createFolders&&(n=_(e))&&b.call(this,n,!0);var a=\"string\"===i&&!1===s.binary&&!1===s.base64;r&&void 0!==r.binary||(s.binary=!a),(t instanceof c&&0===t.uncompressedSize||s.dir||!t||0===t.length)&&(s.base64=!1,s.binary=!0,t=\"\",s.compression=\"STORE\",i=\"string\");var o=null;o=t instanceof c||t instanceof l?t:p.isNode&&p.isStream(t)?new m(e,t):u.prepareContent(e,t,s.binary,s.optimizedBinaryString,s.base64);var h=new d(e,o,s);this.files[e]=h}var i=e(\"./utf8\"),u=e(\"./utils\"),l=e(\"./stream/GenericWorker\"),a=e(\"./stream/StreamHelper\"),f=e(\"./defaults\"),c=e(\"./compressedObject\"),d=e(\"./zipObject\"),o=e(\"./generate\"),p=e(\"./nodejsUtils\"),m=e(\"./nodejs/NodejsStreamInputAdapter\"),_=function(e){\"/\"===e.slice(-1)&&(e=e.substring(0,e.length-1));var t=e.lastIndexOf(\"/\");return 0<t?e.substring(0,t):\"\"},g=function(e){return\"/\"!==e.slice(-1)&&(e+=\"/\"),e},b=function(e,t){return t=void 0!==t?t:f.createFolders,e=g(e),this.files[e]||s.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]};function h(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)}var n={load:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},forEach:function(e){var t,r,n;for(t in this.files)n=this.files[t],(r=t.slice(this.root.length,t.length))&&t.slice(0,this.root.length)===this.root&&e(r,n)},filter:function(r){var n=[];return this.forEach(function(e,t){r(e,t)&&n.push(t)}),n},file:function(e,t,r){if(1!==arguments.length)return e=this.root+e,s.call(this,e,t,r),this;if(h(e)){var n=e;return this.filter(function(e,t){return!t.dir&&n.test(e)})}var i=this.files[this.root+e];return i&&!i.dir?i:null},folder:function(r){if(!r)return this;if(h(r))return this.filter(function(e,t){return t.dir&&r.test(e)});var e=this.root+r,t=b.call(this,e),n=this.clone();return n.root=t.name,n},remove:function(r){r=this.root+r;var e=this.files[r];if(e||(\"/\"!==r.slice(-1)&&(r+=\"/\"),e=this.files[r]),e&&!e.dir)delete this.files[r];else for(var t=this.filter(function(e,t){return t.name.slice(0,r.length)===r}),n=0;n<t.length;n++)delete this.files[t[n].name];return this},generate:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},generateInternalStream:function(e){var t,r={};try{if((r=u.extend(e||{},{streamFiles:!1,compression:\"STORE\",compressionOptions:null,type:\"\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:i.utf8encode})).type=r.type.toLowerCase(),r.compression=r.compression.toUpperCase(),\"binarystring\"===r.type&&(r.type=\"string\"),!r.type)throw new Error(\"No output type specified.\");u.checkSupport(r.type),\"darwin\"!==r.platform&&\"freebsd\"!==r.platform&&\"linux\"!==r.platform&&\"sunos\"!==r.platform||(r.platform=\"UNIX\"),\"win32\"===r.platform&&(r.platform=\"DOS\");var n=r.comment||this.comment||\"\";t=o.generateWorker(this,r,n)}catch(e){(t=new l(\"error\")).error(e)}return new a(t,r.type||\"string\",r.mimeType)},generateAsync:function(e,t){return this.generateInternalStream(e).accumulate(t)},generateNodeStream:function(e,t){return(e=e||{}).type||(e.type=\"nodebuffer\"),this.generateInternalStream(e).toNodejsStream(t)}};t.exports=n},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(e,t,r){\"use strict\";t.exports=e(\"stream\")},{stream:void 0}],17:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e);for(var t=0;t<this.data.length;t++)e[t]=255&e[t]}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data[this.zero+e]},i.prototype.lastIndexOfSignature=function(e){for(var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.length-4;0<=s;--s)if(this.data[s]===t&&this.data[s+1]===r&&this.data[s+2]===n&&this.data[s+3]===i)return s-this.zero;return-1},i.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.readData(4);return t===s[0]&&r===s[1]&&n===s[2]&&i===s[3]},i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],18:[function(e,t,r){\"use strict\";var n=e(\"../utils\");function i(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.length<this.zero+e||e<0)throw new Error(\"End of data reached (data length = \"+this.length+\", asked index = \"+e+\"). Corrupted zip ?\")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r<this._listeners[e].length;r++)this._listeners[e][r].call(this,t)},pipe:function(e){return e.registerPrevious(this)},registerPrevious:function(e){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.streamInfo=e.streamInfo,this.mergeStreamInfo(),this.previous=e;var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.end()}),e.on(\"error\",function(e){t.error(e)}),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;var e=this.isPaused=!1;return this.generatedError&&(this.error(this.generatedError),e=!0),this.previous&&this.previous.resume(),!e},flush:function(){},processChunk:function(e){this.push(e)},withStreamInfo:function(e,t){return this.extraStreamInfo[e]=t,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var e in this.extraStreamInfo)Object.prototype.hasOwnProperty.call(this.extraStreamInfo,e)&&(this.streamInfo[e]=this.extraStreamInfo[e])},lock:function(){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var e=\"Worker \"+this.name;return this.previous?this.previous+\" -> \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r<t.length;r++)s+=t[r].length;switch(e){case\"string\":return t.join(\"\");case\"array\":return Array.prototype.concat.apply([],t);case\"uint8array\":for(i=new Uint8Array(s),r=0;r<t.length;r++)i.set(t[r],n),n+=t[r].length;return i;case\"nodebuffer\":return Buffer.concat(t);default:throw new Error(\"concat : unsupported type '\"+e+\"'\")}}(i,n),a);t(e)}catch(e){r(e)}n=[]}).resume()})}function f(e,t,r){var n=t;switch(t){case\"blob\":case\"arraybuffer\":n=\"uint8array\";break;case\"base64\":n=\"string\"}try{this._internalType=n,this._outputType=t,this._mimeType=r,h.checkSupport(n),this._worker=e.pipe(new i(n)),e.lock()}catch(e){this._worker=new s(\"error\"),this._worker.error(e)}}f.prototype={accumulate:function(e){return l(this,e)},on:function(e,t){var r=this;return\"data\"===e?this._worker.on(e,function(e){t.call(r,e.data,e.meta)}):this._worker.on(e,function(){h.delay(t,arguments,r)}),this},resume:function(){return h.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(e){if(h.checkSupport(\"nodestream\"),\"nodebuffer\"!==this._outputType)throw new Error(this._outputType+\" is not supported by this method\");return new o(this,{objectMode:\"nodebuffer\"!==this._outputType},e)}},t.exports=f},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(e,t,r){\"use strict\";if(r.base64=!0,r.array=!0,r.string=!0,r.arraybuffer=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof Uint8Array,r.nodebuffer=\"undefined\"!=typeof Buffer,r.uint8array=\"undefined\"!=typeof Uint8Array,\"undefined\"==typeof ArrayBuffer)r.blob=!1;else{var n=new ArrayBuffer(0);try{r.blob=0===new Blob([n],{type:\"application/zip\"}).size}catch(e){try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(n),r.blob=0===i.getBlob(\"application/zip\").size}catch(e){r.blob=!1}}}try{r.nodestream=!!e(\"readable-stream\").Readable}catch(e){r.nodestream=!1}},{\"readable-stream\":16}],31:[function(e,t,s){\"use strict\";for(var o=e(\"./utils\"),h=e(\"./support\"),r=e(\"./nodejsUtils\"),n=e(\"./stream/GenericWorker\"),u=new Array(256),i=0;i<256;i++)u[i]=252<=i?6:248<=i?5:240<=i?4:224<=i?3:192<=i?2:1;u[254]=u[254]=1;function a(){n.call(this,\"utf-8 decode\"),this.leftOver=null}function l(){n.call(this,\"utf-8 encode\")}s.utf8encode=function(e){return h.nodebuffer?r.newBufferFrom(e,\"utf-8\"):function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=h.uint8array?new Uint8Array(o):new Array(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t<s;)if((n=e[t++])<128)a[r++]=n;else if(4<(i=u[n]))a[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;1<i&&t<s;)n=n<<6|63&e[t++],i--;1<i?a[r++]=65533:n<65536?a[r++]=n:(n-=65536,a[r++]=55296|n>>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r<e.length;++r)t[r]=255&e.charCodeAt(r);return t}e(\"setimmediate\"),a.newBlob=function(t,r){a.checkSupport(\"blob\");try{return new Blob([t],{type:r})}catch(e){try{var n=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);return n.append(t),n.getBlob(r)}catch(e){throw new Error(\"Bug : can't construct the Blob.\")}}};var i={stringifyByChunk:function(e,t,r){var n=[],i=0,s=e.length;if(s<=r)return String.fromCharCode.apply(null,e);for(;i<s;)\"array\"===t||\"nodebuffer\"===t?n.push(String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,s)))):n.push(String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,s)))),i+=r;return n.join(\"\")},stringifyByChar:function(e){for(var t=\"\",r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return t},applyCanBeUsed:{uint8array:function(){try{return o.uint8array&&1===String.fromCharCode.apply(null,new Uint8Array(1)).length}catch(e){return!1}}(),nodebuffer:function(){try{return o.nodebuffer&&1===String.fromCharCode.apply(null,r.allocBuffer(1)).length}catch(e){return!1}}()}};function s(e){var t=65536,r=a.getTypeOf(e),n=!0;if(\"uint8array\"===r?n=i.applyCanBeUsed.uint8array:\"nodebuffer\"===r&&(n=i.applyCanBeUsed.nodebuffer),n)for(;1<t;)try{return i.stringifyByChunk(e,r,t)}catch(e){t=Math.floor(t/2)}return i.stringifyByChar(e)}function f(e,t){for(var r=0;r<e.length;r++)t[r]=e[r];return t}a.applyFromCharCode=s;var c={};c.string={string:n,array:function(e){return l(e,new Array(e.length))},arraybuffer:function(e){return c.string.uint8array(e).buffer},uint8array:function(e){return l(e,new Uint8Array(e.length))},nodebuffer:function(e){return l(e,r.allocBuffer(e.length))}},c.array={string:s,array:n,arraybuffer:function(e){return new Uint8Array(e).buffer},uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(e)}},c.arraybuffer={string:function(e){return s(new Uint8Array(e))},array:function(e){return f(new Uint8Array(e),new Array(e.byteLength))},arraybuffer:n,uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(new Uint8Array(e))}},c.uint8array={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return e.buffer},uint8array:n,nodebuffer:function(e){return r.newBufferFrom(e)}},c.nodebuffer={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return c.nodebuffer.uint8array(e).buffer},uint8array:function(e){return f(e,new Uint8Array(e.length))},nodebuffer:n},a.transformTo=function(e,t){if(t=t||\"\",!e)return t;a.checkSupport(e);var r=a.getTypeOf(t);return c[r][e](t)},a.resolve=function(e){for(var t=e.split(\"/\"),r=[],n=0;n<t.length;n++){var i=t[n];\".\"===i||\"\"===i&&0!==n&&n!==t.length-1||(\"..\"===i?r.pop():r.push(i))}return r.join(\"/\")},a.getTypeOf=function(e){return\"string\"==typeof e?\"string\":\"[object Array]\"===Object.prototype.toString.call(e)?\"array\":o.nodebuffer&&r.isBuffer(e)?\"nodebuffer\":o.uint8array&&e instanceof Uint8Array?\"uint8array\":o.arraybuffer&&e instanceof ArrayBuffer?\"arraybuffer\":void 0},a.checkSupport=function(e){if(!o[e.toLowerCase()])throw new Error(e+\" is not supported by this platform\")},a.MAX_VALUE_16BITS=65535,a.MAX_VALUE_32BITS=-1,a.pretty=function(e){var t,r,n=\"\";for(r=0;r<(e||\"\").length;r++)n+=\"\\\\x\"+((t=e.charCodeAt(r))<16?\"0\":\"\")+t.toString(16).toUpperCase();return n},a.delay=function(e,t,r){setImmediate(function(){e.apply(r||null,t||[])})},a.inherits=function(e,t){function r(){}r.prototype=t.prototype,e.prototype=new r},a.extend=function(){var e,t,r={};for(e=0;e<arguments.length;e++)for(t in arguments[e])Object.prototype.hasOwnProperty.call(arguments[e],t)&&void 0===r[t]&&(r[t]=arguments[e][t]);return r},a.prepareContent=function(r,e,n,i,s){return u.Promise.resolve(e).then(function(n){return o.blob&&(n instanceof Blob||-1!==[\"[object File]\",\"[object Blob]\"].indexOf(Object.prototype.toString.call(n)))&&\"undefined\"!=typeof FileReader?new u.Promise(function(t,r){var e=new FileReader;e.onload=function(e){t(e.target.result)},e.onerror=function(e){r(e.target.error)},e.readAsArrayBuffer(n)}):n}).then(function(e){var t=a.getTypeOf(e);return t?(\"arraybuffer\"===t?e=a.transformTo(\"uint8array\",e):\"string\"===t&&(s?e=h.decode(e):n&&!0!==i&&(e=function(e){return l(e,o.uint8array?new Uint8Array(e.length):new Array(e.length))}(e))),e):u.Promise.reject(new Error(\"Can't read the data of '\"+r+\"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"))})}},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,setimmediate:54}],33:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),i=e(\"./utils\"),s=e(\"./signature\"),a=e(\"./zipEntry\"),o=e(\"./support\");function h(e){this.files=[],this.loadOptions=e}h.prototype={checkSignature:function(e){if(!this.reader.readAndCheckSignature(e)){this.reader.index-=4;var t=this.reader.readString(4);throw new Error(\"Corrupted zip or bug: unexpected signature (\"+i.pretty(t)+\", expected \"+i.pretty(e)+\")\")}},isSignature:function(e,t){var r=this.reader.index;this.reader.setIndex(e);var n=this.reader.readString(4)===t;return this.reader.setIndex(r),n},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var e=this.reader.readData(this.zipCommentLength),t=o.uint8array?\"uint8array\":\"array\",r=i.transformTo(t,e);this.zipComment=this.loadOptions.decodeFileName(r)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var e,t,r,n=this.zip64EndOfCentralSize-44;0<n;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var e,t;for(e=0;e<this.files.length;e++)t=this.files[e],this.reader.setIndex(t.localHeaderOffset),this.checkSignature(s.LOCAL_FILE_HEADER),t.readLocalPart(this.reader),t.handleUTF8(),t.processAttributes()},readCentralDir:function(){var e;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER);)(e=new a({zip64:this.zip64},this.loadOptions)).readCentralPart(this.reader),this.files.push(e);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var e=this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);if(e<0)throw!this.isSignature(0,s.LOCAL_FILE_HEADER)?new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\"):new Error(\"Corrupted zip: can't find end of central directory\");this.reader.setIndex(e);var t=e;if(this.checkSignature(s.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,(e=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(e),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,s.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var r=this.centralDirOffset+this.centralDirSize;this.zip64&&(r+=20,r+=12+this.zip64EndOfCentralSize);var n=t-r;if(0<n)this.isSignature(t,s.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(n)+\" bytes.\")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=h},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utils\":32,\"./zipEntry\":34}],34:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),s=e(\"./utils\"),i=e(\"./compressedObject\"),a=e(\"./crc32\"),o=e(\"./utf8\"),h=e(\"./compressions\"),u=e(\"./support\");function l(e,t){this.options=e,this.loadOptions=t}l.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");if(null===(t=function(e){for(var t in h)if(Object.prototype.hasOwnProperty.call(h,t)&&h[t].magic===e)return h[t];return null}(this.compressionMethod)))throw new Error(\"Corrupted zip : compression \"+s.pretty(this.compressionMethod)+\" unknown (inner file : \"+s.transformTo(\"string\",this.fileName)+\")\");this.decompressed=new i(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4<i;)t=e.readInt(2),r=e.readInt(2),n=e.readData(r),this.extraFields[t]={id:t,length:r,value:n};e.setIndex(i)},handleUTF8:function(){var e=u.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=o.utf8decode(this.fileName),this.fileCommentStr=o.utf8decode(this.fileComment);else{var t=this.findExtraFieldUnicodePath();if(null!==t)this.fileNameStr=t;else{var r=s.transformTo(e,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(r)}var n=this.findExtraFieldUnicodeComment();if(null!==n)this.fileCommentStr=n;else{var i=s.transformTo(e,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(i)}}},findExtraFieldUnicodePath:function(){var e=this.extraFields[28789];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileName)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null},findExtraFieldUnicodeComment:function(){var e=this.extraFields[25461];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileComment)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null}},t.exports=l},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(e,t,r){\"use strict\";function n(e,t,r){this.name=e,this.dir=r.dir,this.date=r.date,this.comment=r.comment,this.unixPermissions=r.unixPermissions,this.dosPermissions=r.dosPermissions,this._data=t,this._dataBinary=r.binary,this.options={compression:r.compression,compressionOptions:r.compressionOptions}}var s=e(\"./stream/StreamHelper\"),i=e(\"./stream/DataWorker\"),a=e(\"./utf8\"),o=e(\"./compressedObject\"),h=e(\"./stream/GenericWorker\");n.prototype={internalStream:function(e){var t=null,r=\"string\";try{if(!e)throw new Error(\"No output type specified.\");var n=\"string\"===(r=e.toLowerCase())||\"text\"===r;\"binarystring\"!==r&&\"text\"!==r||(r=\"string\"),t=this._decompressWorker();var i=!this._dataBinary;i&&!n&&(t=t.pipe(new a.Utf8EncodeWorker)),!i&&n&&(t=t.pipe(new a.Utf8DecodeWorker))}catch(e){(t=new h(\"error\")).error(e)}return new s(t,r,\"\")},async:function(e,t){return this.internalStream(e).accumulate(t)},nodeStream:function(e,t){return this.internalStream(e||\"nodebuffer\").toNodejsStream(t)},_compressWorker:function(e,t){if(this._data instanceof o&&this._data.compression.magic===e.magic)return this._data.getCompressedWorker();var r=this._decompressWorker();return this._dataBinary||(r=r.pipe(new a.Utf8EncodeWorker)),o.createWorkerFrom(r,e,t)},_decompressWorker:function(){return this._data instanceof o?this._data.getContentWorker():this._data instanceof h?this._data:new i(this._data)}};for(var u=[\"asText\",\"asBinary\",\"asNodeBuffer\",\"asUint8Array\",\"asArrayBuffer\"],l=function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},f=0;f<u.length;f++)n.prototype[u[f]]=l;t.exports=n},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(e,l,t){(function(t){\"use strict\";var r,n,e=t.MutationObserver||t.WebKitMutationObserver;if(e){var i=0,s=new e(u),a=t.document.createTextNode(\"\");s.observe(a,{characterData:!0}),r=function(){a.data=i=++i%2}}else if(t.setImmediate||void 0===t.MessageChannel)r=\"document\"in t&&\"onreadystatechange\"in t.document.createElement(\"script\")?function(){var e=t.document.createElement(\"script\");e.onreadystatechange=function(){u(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},t.document.documentElement.appendChild(e)}:function(){setTimeout(u,0)};else{var o=new t.MessageChannel;o.port1.onmessage=u,r=function(){o.port2.postMessage(0)}}var h=[];function u(){var e,t;n=!0;for(var r=h.length;r;){for(t=h,h=[],e=-1;++e<r;)t[e]();r=h.length}n=!1}l.exports=function(e){1!==h.push(e)||n||r()}}).call(this,\"undefined\"!=typeof __webpack_require__.g?__webpack_require__.g:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],37:[function(e,t,r){\"use strict\";var i=e(\"immediate\");function u(){}var l={},s=[\"REJECTED\"],a=[\"FULFILLED\"],n=[\"PENDING\"];function o(e){if(\"function\"!=typeof e)throw new TypeError(\"resolver must be a function\");this.state=n,this.queue=[],this.outcome=void 0,e!==u&&d(this,e)}function h(e,t,r){this.promise=e,\"function\"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),\"function\"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function f(t,r,n){i(function(){var e;try{e=r(n)}catch(e){return l.reject(t,e)}e===t?l.reject(t,new TypeError(\"Cannot resolve promise with itself\")):l.resolve(t,e)})}function c(e){var t=e&&e.then;if(e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof t)return function(){t.apply(e,arguments)}}function d(t,e){var r=!1;function n(e){r||(r=!0,l.reject(t,e))}function i(e){r||(r=!0,l.resolve(t,e))}var s=p(function(){e(i,n)});\"error\"===s.status&&n(s.value)}function p(e,t){var r={};try{r.value=e(t),r.status=\"success\"}catch(e){r.status=\"error\",r.value=e}return r}(t.exports=o).prototype.finally=function(t){if(\"function\"!=typeof t)return this;var r=this.constructor;return this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})})},o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){if(\"function\"!=typeof e&&this.state===a||\"function\"!=typeof t&&this.state===s)return this;var r=new this.constructor(u);this.state!==n?f(r,this.state===a?e:t,this.outcome):this.queue.push(new h(r,e,t));return r},h.prototype.callFulfilled=function(e){l.resolve(this.promise,e)},h.prototype.otherCallFulfilled=function(e){f(this.promise,this.onFulfilled,e)},h.prototype.callRejected=function(e){l.reject(this.promise,e)},h.prototype.otherCallRejected=function(e){f(this.promise,this.onRejected,e)},l.resolve=function(e,t){var r=p(c,t);if(\"error\"===r.status)return l.reject(e,r.value);var n=r.value;if(n)d(e,n);else{e.state=a,e.outcome=t;for(var i=-1,s=e.queue.length;++i<s;)e.queue[i].callFulfilled(t)}return e},l.reject=function(e,t){e.state=s,e.outcome=t;for(var r=-1,n=e.queue.length;++r<n;)e.queue[r].callRejected(t);return e},o.resolve=function(e){if(e instanceof this)return e;return l.resolve(new this(u),e)},o.reject=function(e){var t=new this(u);return l.reject(t,e)},o.all=function(e){var r=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var n=e.length,i=!1;if(!n)return this.resolve([]);var s=new Array(n),a=0,t=-1,o=new this(u);for(;++t<n;)h(e[t],t);return o;function h(e,t){r.resolve(e).then(function(e){s[t]=e,++a!==n||i||(i=!0,l.resolve(o,s))},function(e){i||(i=!0,l.reject(o,e))})}},o.race=function(e){var t=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var r=e.length,n=!1;if(!r)return this.resolve([]);var i=-1,s=new this(u);for(;++i<r;)a=e[i],t.resolve(a).then(function(e){n||(n=!0,l.resolve(s,e))},function(e){n||(n=!0,l.reject(s,e))});var a;return s}},{immediate:36}],38:[function(e,t,r){\"use strict\";var n={};(0,e(\"./lib/utils/common\").assign)(n,e(\"./lib/deflate\"),e(\"./lib/inflate\"),e(\"./lib/zlib/constants\")),t.exports=n},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(e,t,r){\"use strict\";var a=e(\"./zlib/deflate\"),o=e(\"./utils/common\"),h=e(\"./utils/strings\"),i=e(\"./zlib/messages\"),s=e(\"./zlib/zstream\"),u=Object.prototype.toString,l=0,f=-1,c=0,d=8;function p(e){if(!(this instanceof p))return new p(e);this.options=o.assign({level:f,method:d,chunkSize:16384,windowBits:15,memLevel:8,strategy:c,to:\"\"},e||{});var t=this.options;t.raw&&0<t.windowBits?t.windowBits=-t.windowBits:t.gzip&&0<t.windowBits&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new s,this.strm.avail_out=0;var r=a.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==l)throw new Error(i[r]);if(t.header&&a.deflateSetHeader(this.strm,t.header),t.dictionary){var n;if(n=\"string\"==typeof t.dictionary?h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===u.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,(r=a.deflateSetDictionary(this.strm,n))!==l)throw new Error(i[r]);this._dict_set=!0}}function n(e,t){var r=new p(t);if(r.push(e,!0),r.err)throw r.msg||i[r.err];return r.result}p.prototype.push=function(e,t){var r,n,i=this.strm,s=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:!0===t?4:0,\"string\"==typeof e?i.input=h.string2buf(e):\"[object ArrayBuffer]\"===u.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new o.Buf8(s),i.next_out=0,i.avail_out=s),1!==(r=a.deflate(i,n))&&r!==l)return this.onEnd(r),!(this.ended=!0);0!==i.avail_out&&(0!==i.avail_in||4!==n&&2!==n)||(\"string\"===this.options.to?this.onData(h.buf2binstring(o.shrinkBuf(i.output,i.next_out))):this.onData(o.shrinkBuf(i.output,i.next_out)))}while((0<i.avail_in||0===i.avail_out)&&1!==r);return 4===n?(r=a.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l):2!==n||(this.onEnd(l),!(i.avail_out=0))},p.prototype.onData=function(e){this.chunks.push(e)},p.prototype.onEnd=function(e){e===l&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=o.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=p,r.deflate=n,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,n(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,n(e,t)}},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(e,t,r){\"use strict\";var c=e(\"./zlib/inflate\"),d=e(\"./utils/common\"),p=e(\"./utils/strings\"),m=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),i=e(\"./zlib/zstream\"),s=e(\"./zlib/gzheader\"),_=Object.prototype.toString;function a(e){if(!(this instanceof a))return new a(e);this.options=d.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new i,this.strm.avail_out=0;var r=c.inflateInit2(this.strm,t.windowBits);if(r!==m.Z_OK)throw new Error(n[r]);this.header=new s,c.inflateGetHeader(this.strm,this.header)}function o(e,t){var r=new a(t);if(r.push(e,!0),r.err)throw r.msg||n[r.err];return r.result}a.prototype.push=function(e,t){var r,n,i,s,a,o,h=this.strm,u=this.options.chunkSize,l=this.options.dictionary,f=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?m.Z_FINISH:m.Z_NO_FLUSH,\"string\"==typeof e?h.input=p.binstring2buf(e):\"[object ArrayBuffer]\"===_.call(e)?h.input=new Uint8Array(e):h.input=e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new d.Buf8(u),h.next_out=0,h.avail_out=u),(r=c.inflate(h,m.Z_NO_FLUSH))===m.Z_NEED_DICT&&l&&(o=\"string\"==typeof l?p.string2buf(l):\"[object ArrayBuffer]\"===_.call(l)?new Uint8Array(l):l,r=c.inflateSetDictionary(this.strm,o)),r===m.Z_BUF_ERROR&&!0===f&&(r=m.Z_OK,f=!1),r!==m.Z_STREAM_END&&r!==m.Z_OK)return this.onEnd(r),!(this.ended=!0);h.next_out&&(0!==h.avail_out&&r!==m.Z_STREAM_END&&(0!==h.avail_in||n!==m.Z_FINISH&&n!==m.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(i=p.utf8border(h.output,h.next_out),s=h.next_out-i,a=p.buf2string(h.output,i),h.next_out=s,h.avail_out=u-s,s&&d.arraySet(h.output,h.output,i,s,0),this.onData(a)):this.onData(d.shrinkBuf(h.output,h.next_out)))),0===h.avail_in&&0===h.avail_out&&(f=!0)}while((0<h.avail_in||0===h.avail_out)&&r!==m.Z_STREAM_END);return r===m.Z_STREAM_END&&(n=m.Z_FINISH),n===m.Z_FINISH?(r=c.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===m.Z_OK):n!==m.Z_SYNC_FLUSH||(this.onEnd(m.Z_OK),!(h.avail_out=0))},a.prototype.onData=function(e){this.chunks.push(e)},a.prototype.onEnd=function(e){e===m.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=d.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=a,r.inflate=o,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,o(e,t)},r.ungzip=o},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if(\"object\"!=typeof r)throw new TypeError(r+\"must be non-object\");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),i);else for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){var t,r,n,i,s,a;for(t=n=0,r=e.length;t<r;t++)n+=e[t].length;for(a=new Uint8Array(n),t=i=0,r=e.length;t<r;t++)s=e[t],a.set(s,i),i+=s.length;return a}},s={arraySet:function(e,t,r,n,i){for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,s))},r.setTyped(n)},{}],42:[function(e,t,r){\"use strict\";var h=e(\"./common\"),i=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(e){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){s=!1}for(var u=new h.Buf8(256),n=0;n<256;n++)u[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function l(e,t){if(t<65537&&(e.subarray&&s||!e.subarray&&i))return String.fromCharCode.apply(null,h.shrinkBuf(e,t));for(var r=\"\",n=0;n<t;n++)r+=String.fromCharCode(e[n]);return r}u[254]=u[254]=1,r.string2buf=function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=new h.Buf8(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r<n;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,n,i,s,a=t||e.length,o=new Array(2*a);for(r=n=0;r<a;)if((i=e[r++])<128)o[n++]=i;else if(4<(s=u[i]))o[n++]=65533,r+=s-1;else{for(i&=2===s?31:3===s?15:7;1<s&&r<a;)i=i<<6|63&e[r++],s--;1<s?o[n++]=65533:i<65536?o[n++]=i:(i-=65536,o[n++]=55296|i>>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3<r?2e3:r;s=s+(i=i+t[n++]|0)|0,--a;);i%=65521,s%=65521}return i|s<<16|0}},{}],44:[function(e,t,r){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(e,t,r){\"use strict\";var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4<e?9:0)}function D(e){for(var t=e.length;0<=--t;)e[t]=0}function F(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&s<c);if(n=S-(c-s),s=c-S,a<n){if(e.match_start=t,o<=(a=n))break;d=u[s+a-1],p=u[s+a]}}}while((t=f[t&l])>h&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u<l&&(l=u),r=0===l?0:(a.avail_in-=l,c.arraySet(o,a.input,a.next_in,l,h),1===a.state.wrap?a.adler=d(a.adler,o,l,h):2===a.state.wrap&&(a.adler=p(a.adler,o,l,h)),a.next_in+=l,a.total_in+=l,l),e.lookahead+=r,e.lookahead+e.insert>=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+1])&e.hash_mask;e.insert&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+x-1])&e.hash_mask,e.prev[s&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=s,s++,e.insert--,!(e.lookahead+e.insert<x)););}while(e.lookahead<z&&0!==e.strm.avail_in)}function Z(e,t){for(var r,n;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==r&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r)),e.match_length>=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart,0!=--e.match_length;);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+1])&e.hash_mask;else n=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function W(e,t){for(var r,n,i;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=x-1,0!==r&&e.prev_length<e.max_lazy_match&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r),e.match_length<=5&&(1===e.strategy||e.match_length===x&&4096<e.strstart-e.match_start)&&(e.match_length=x-1)),e.prev_length>=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!=--e.prev_length;);if(e.match_available=0,e.match_length=x-1,e.strstart++,n&&(N(e,!1),0===e.strm.avail_out))return A}else if(e.match_available){if((n=u._tr_tally(e,0,e.window[e.strstart-1]))&&N(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return A}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=u._tr_tally(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function M(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function H(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=v,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new c.Buf16(2*w),this.dyn_dtree=new c.Buf16(2*(2*a+1)),this.bl_tree=new c.Buf16(2*(2*o+1)),D(this.dyn_ltree),D(this.dyn_dtree),D(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new c.Buf16(k+1),this.heap=new c.Buf16(2*s+1),D(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new c.Buf16(2*s+1),D(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function G(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=i,(t=e.state).pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?C:E,e.adler=2===t.wrap?0:1,t.last_flush=l,u._tr_init(t),m):R(e,_)}function K(e){var t=G(e);return t===m&&function(e){e.window_size=2*e.w_size,D(e.head),e.max_lazy_match=h[e.level].max_lazy,e.good_match=h[e.level].good_length,e.nice_match=h[e.level].nice_length,e.max_chain_length=h[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=x-1,e.match_available=0,e.ins_h=0}(e.state),t}function Y(e,t,r,n,i,s){if(!e)return _;var a=1;if(t===g&&(t=6),n<0?(a=0,n=-n):15<n&&(a=2,n-=16),i<1||y<i||r!==v||n<8||15<n||t<0||9<t||s<0||b<s)return R(e,_);8===n&&(n=9);var o=new H;return(e.state=o).strm=e,o.wrap=a,o.gzhead=null,o.w_bits=n,o.w_size=1<<o.w_bits,o.w_mask=o.w_size-1,o.hash_bits=i+7,o.hash_size=1<<o.hash_bits,o.hash_mask=o.hash_size-1,o.hash_shift=~~((o.hash_bits+x-1)/x),o.window=new c.Buf8(2*o.w_size),o.head=new c.Buf16(o.hash_size),o.prev=new c.Buf16(o.w_size),o.lit_bufsize=1<<i+6,o.pending_buf_size=4*o.lit_bufsize,o.pending_buf=new c.Buf8(o.pending_buf_size),o.d_buf=1*o.lit_bufsize,o.l_buf=3*o.lit_bufsize,o.level=t,o.strategy=s,o.method=r,K(e)}h=[new M(0,0,0,0,function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5<t||t<0)return e?R(e,_):_;if(n=e.state,!e.output||!e.input&&0!==e.avail_in||666===n.status&&t!==f)return R(e,0===e.avail_out?-5:_);if(n.strm=e,r=n.last_flush,n.last_flush=t,n.status===C)if(2===n.wrap)e.adler=0,U(n,31),U(n,139),U(n,8),n.gzhead?(U(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),U(n,255&n.gzhead.time),U(n,n.gzhead.time>>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.name.length?255&n.gzhead.name.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.comment.length?255&n.gzhead.comment.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0<e.strstart&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){s=e.strstart+S;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&i<s);e.match_length=S-(s-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0<n.wrap&&(n.wrap=-n.wrap),0!==n.pending?m:1)},r.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==C&&69!==t&&73!==t&&91!==t&&103!==t&&t!==E&&666!==t?R(e,_):(e.state=null,t===E?R(e,-3):m):_},r.deflateSetDictionary=function(e,t){var r,n,i,s,a,o,h,u,l=t.length;if(!e||!e.state)return _;if(2===(s=(r=e.state).wrap)||1===s&&r.status!==C||r.lookahead)return _;for(1===s&&(e.adler=d(e.adler,t,l,0)),r.wrap=0,l>=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<<r.hash_shift^r.window[n+x-1])&r.hash_mask,r.prev[n&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=n,n++,--i;);r.strstart=n,r.lookahead=x-1,j(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=x-1,r.match_available=0,e.next_in=o,e.input=h,e.avail_in=a,r.wrap=s,m},r.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(e,t,r){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],48:[function(e,t,r){\"use strict\";t.exports=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C;r=e.state,n=e.next_in,z=e.input,i=n+(e.avail_in-5),s=e.next_out,C=e.output,a=s-(t-e.avail_out),o=s+(e.avail_out-257),h=r.dmax,u=r.wsize,l=r.whave,f=r.wnext,c=r.window,d=r.hold,p=r.bits,m=r.lencode,_=r.distcode,g=(1<<r.lenbits)-1,b=(1<<r.distbits)-1;e:do{p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=m[d&g];t:for(;;){if(d>>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<<y)-1)];continue t}if(32&y){r.mode=12;break e}e.msg=\"invalid literal/length code\",r.mode=30;break e}w=65535&v,(y&=15)&&(p<y&&(d+=z[n++]<<p,p+=8),w+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=_[d&b];r:for(;;){if(d>>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<<y)-1)];continue r}e.msg=\"invalid distance code\",r.mode=30;break e}if(k=65535&v,p<(y&=15)&&(d+=z[n++]<<p,(p+=8)<y&&(d+=z[n++]<<p,p+=8)),h<(k+=d&(1<<y)-1)){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(d>>>=y,p-=y,(y=s-a)<k){if(l<(y=k-y)&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(S=c,(x=0)===f){if(x+=u-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}}else if(f<y){if(x+=u+f-y,(y-=f)<w){for(w-=y;C[s++]=c[x++],--y;);if(x=0,f<w){for(w-=y=f;C[s++]=c[x++],--y;);x=s-k,S=C}}}else if(x+=f-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}for(;2<w;)C[s++]=S[x++],C[s++]=S[x++],C[s++]=S[x++],w-=3;w&&(C[s++]=S[x++],1<w&&(C[s++]=S[x++]))}else{for(x=s-k;C[s++]=C[x++],C[s++]=C[x++],C[s++]=C[x++],2<(w-=3););w&&(C[s++]=C[x++],1<w&&(C[s++]=C[x++]))}break}}break}}while(n<i&&s<o);n-=w=p>>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n<i?i-n+5:5-(n-i),e.avail_out=s<o?o-s+257:257-(s-o),r.hold=d,r.bits=p}},{}],49:[function(e,t,r){\"use strict\";var I=e(\"../utils/common\"),O=e(\"./adler32\"),B=e(\"./crc32\"),R=e(\"./inffast\"),T=e(\"./inftrees\"),D=1,F=2,N=0,U=-2,P=1,n=852,i=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,o(e))):U}function u(e,t){var r,n;return e?(n=new s,(e.state=n).window=null,(r=h(e,t))!==N&&(e.state=null),r):U}var l,f,c=!0;function j(e){if(c){var t;for(l=new I.Buf32(512),f=new I.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(T(D,e.lens,0,288,l,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;T(F,e.lens,0,32,f,0,e.work,{bits:5}),c=!1}e.lencode=l,e.lenbits=9,e.distcode=f,e.distbits=5}function Z(e,t,r,n){var i,s=e.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new I.Buf8(s.wsize)),n>=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=i))),0}r.inflateReset=o,r.inflateReset2=h,r.inflateResetKeep=a,r.inflateInit=function(e){return u(e,15)},r.inflateInit2=u,r.inflate=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C=0,E=new I.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(r=e.state).mode&&(r.mode=13),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,f=o,c=h,x=N;e:for(;;)switch(r.mode){case P:if(0===r.wrap){r.mode=13;break}for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(2&r.wrap&&35615===u){E[r.check=0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<<k,e.adler=r.check=1,r.mode=512&u?10:12,l=u=0;break;case 2:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.flags=u,8!=(255&r.flags)){e.msg=\"unknown compression method\",r.mode=30;break}if(57344&r.flags){e.msg=\"unknown header flags set\",r.mode=30;break}r.head&&(r.head.text=u>>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.time=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.xflags=255&u,r.head.os=u>>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length=u,r.head&&(r.head.extra_len=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=8;case 8:if(4096&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.comment+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.comment=null);r.mode=9;case 9:if(512&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(65535&r.check)){e.msg=\"header crc mismatch\",r.mode=30;break}l=u=0}r.head&&(r.head.hcrc=r.flags>>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}e.adler=r.check=L(u),l=u=0,r.mode=11;case 11:if(0===r.havedict)return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,2;e.adler=r.check=1,r.mode=12;case 12:if(5===t||6===t)break e;case 13:if(r.last){u>>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}switch(r.last=1&u,l-=1,3&(u>>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if((65535&u)!=(u>>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o<d&&(d=o),h<d&&(d=h),0===d)break e;I.arraySet(i,n,s,d,a),o-=d,s+=d,h-=d,a+=d,r.length-=d;break}r.mode=12;break;case 17:for(;l<14;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.nlen=257+(31&u),u>>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286<r.nlen||30<r.ndist){e.msg=\"too many length or distance symbols\",r.mode=30;break}r.have=0,r.mode=18;case 18:for(;r.have<r.ncode;){for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.lens[A[r.have++]]=7&u,u>>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have<r.nlen+r.ndist;){for(;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(b<16)u>>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u>>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=3+(7&(u>>>=_)),u>>>=3,l-=3}else{for(z=_+7;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=11+(127&(u>>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(g&&0==(240&g)){for(v=_,y=g,w=b;g=(C=r.lencode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<<r.distbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(0==(240&g)){for(v=_,y=g,w=b;g=(C=r.distcode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.offset+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(h<d&&(d=h),h-=d,r.length-=d;i[a++]=m[p++],--d;);0===r.length&&(r.mode=21);break;case 26:if(0===h)break e;i[a++]=r.length,h--,r.mode=21;break;case 27:if(r.wrap){for(;l<32;){if(0===o)break e;o--,u|=n[s++]<<l,l+=8}if(c-=h,e.total_out+=c,r.total+=c,c&&(e.adler=r.check=r.flags?B(r.check,i,c,a-c):O(r.check,i,c,a-c)),c=h,(r.flags?u:L(u))!==r.check){e.msg=\"incorrect data check\",r.mode=30;break}l=u=0}r.mode=28;case 28:if(r.wrap&&r.flags){for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(4294967295&r.total)){e.msg=\"incorrect length check\",r.mode=30;break}l=u=0}r.mode=29;case 29:x=1;break e;case 30:x=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,(r.wsize||c!==e.avail_out&&r.mode<30&&(r.mode<27||4!==t))&&Z(e,e.output,e.next_out,c-e.avail_out)?(r.mode=31,-4):(f-=e.avail_in,c-=e.avail_out,e.total_in+=f,e.total_out+=c,r.total+=c,r.wrap&&c&&(e.adler=r.check=r.flags?B(r.check,i,c,e.next_out-c):O(r.check,i,c,e.next_out-c)),e.data_type=r.bits+(r.last?64:0)+(12===r.mode?128:0)+(20===r.mode||15===r.mode?256:0),(0==f&&0===c||4===t)&&x===N&&(x=-5),x)},r.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,N},r.inflateGetHeader=function(e,t){var r;return e&&e.state?0==(2&(r=e.state).wrap)?U:((r.head=t).done=!1,N):U},r.inflateSetDictionary=function(e,t){var r,n=t.length;return e&&e.state?0!==(r=e.state).wrap&&11!==r.mode?U:11===r.mode&&O(1,t,n,0)!==r.check?-3:Z(e,t,n,n)?(r.mode=31,-4):(r.havedict=1,N):U},r.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(e,t,r){\"use strict\";var D=e(\"../utils/common\"),F=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],N=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],P=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,r,n,i,s,a,o){var h,u,l,f,c,d,p,m,_,g=o.bits,b=0,v=0,y=0,w=0,k=0,x=0,S=0,z=0,C=0,E=0,A=null,I=0,O=new D.Buf16(16),B=new D.Buf16(16),R=null,T=0;for(b=0;b<=15;b++)O[b]=0;for(v=0;v<n;v++)O[t[r+v]]++;for(k=g,w=15;1<=w&&0===O[w];w--);if(w<k&&(k=w),0===w)return i[s++]=20971520,i[s++]=20971520,o.bits=1,0;for(y=1;y<w&&0===O[y];y++);for(k<y&&(k=y),b=z=1;b<=15;b++)if(z<<=1,(z-=O[b])<0)return-1;if(0<z&&(0===e||1!==w))return-1;for(B[1]=0,b=1;b<15;b++)B[b+1]=B[b]+O[b];for(v=0;v<n;v++)0!==t[r+v]&&(a[B[t[r+v]]++]=v);if(d=0===e?(A=R=a,19):1===e?(A=F,I-=257,R=N,T-=257,256):(A=U,R=P,-1),b=y,c=s,S=v=E=0,l=-1,f=(C=1<<(x=k))-1,1===e&&852<C||2===e&&592<C)return 1;for(;;){for(p=b-S,_=a[v]<d?(m=0,a[v]):a[v]>d?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<<b-S,y=u=1<<x;i[c+(E>>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<<b-1;E&h;)h>>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k<b&&(E&f)!==l){for(0===S&&(S=k),c+=y,z=1<<(x=b-S);x+S<w&&!((z-=O[x+S])<=0);)x++,z<<=1;if(C+=1<<x,1===e&&852<C||2===e&&592<C)return 1;i[l=E&f]=k<<24|x<<16|c-s|0}}return 0!==E&&(i[c+E]=b-S<<24|64<<16|0),o.bits=k,0}},{\"../utils/common\":41}],51:[function(e,t,r){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],52:[function(e,t,r){\"use strict\";var i=e(\"../utils/common\"),o=0,h=1;function n(e){for(var t=e.length;0<=--t;)e[t]=0}var s=0,a=29,u=256,l=u+1+a,f=30,c=19,_=2*l+1,g=15,d=16,p=7,m=256,b=16,v=17,y=18,w=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],k=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],x=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],z=new Array(2*(l+2));n(z);var C=new Array(2*f);n(C);var E=new Array(512);n(E);var A=new Array(256);n(A);var I=new Array(a);n(I);var O,B,R,T=new Array(f);function D(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function F(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function N(e){return e<256?E[e]:E[256+(e>>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<<e.bi_valid&65535,U(e,e.bi_buf),e.bi_buf=t>>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=r)}function L(e,t,r){P(e,r[2*t],r[2*t+1])}function j(e,t){for(var r=0;r|=1&e,e>>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t<l;t++)e.dyn_ltree[2*t]=0;for(t=0;t<f;t++)e.dyn_dtree[2*t]=0;for(t=0;t<c;t++)e.bl_tree[2*t]=0;e.dyn_ltree[2*m]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function M(e){8<e.bi_valid?U(e,e.bi_buf):0<e.bi_valid&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function H(e,t,r,n){var i=2*t,s=2*r;return e[i]<e[s]||e[i]===e[s]&&n[t]<=n[r]}function G(e,t,r){for(var n=e.heap[r],i=r<<1;i<=e.heap_len&&(i<e.heap_len&&H(t,e.heap[i+1],e.heap[i],e.depth)&&i++,!H(t,n,e.heap[i],e.depth));)e.heap[r]=e.heap[i],r=i,i<<=1;e.heap[r]=n}function K(e,t,r){var n,i,s,a,o=0;if(0!==e.last_lit)for(;n=e.pending_buf[e.d_buf+2*o]<<8|e.pending_buf[e.d_buf+2*o+1],i=e.pending_buf[e.l_buf+o],o++,0===n?L(e,i,t):(L(e,(s=A[i])+u+1,t),0!==(a=w[s])&&P(e,i-=I[s],a),L(e,s=N(--n),r),0!==(a=k[s])&&P(e,n-=T[s],a)),o<e.last_lit;);L(e,m,t)}function Y(e,t){var r,n,i,s=t.dyn_tree,a=t.stat_desc.static_tree,o=t.stat_desc.has_stree,h=t.stat_desc.elems,u=-1;for(e.heap_len=0,e.heap_max=_,r=0;r<h;r++)0!==s[2*r]?(e.heap[++e.heap_len]=u=r,e.depth[r]=0):s[2*r+1]=0;for(;e.heap_len<2;)s[2*(i=e.heap[++e.heap_len]=u<2?++u:0)]=1,e.depth[i]=0,e.opt_len--,o&&(e.static_len-=a[2*i+1]);for(t.max_code=u,r=e.heap_len>>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u<n||(e.bl_count[s]++,a=0,d<=n&&(a=c[n-d]),o=h[2*n],e.opt_len+=o*(s+a),f&&(e.static_len+=o*(l[2*n+1]+a)));if(0!==m){do{for(s=p-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[p]--,m-=2}while(0<m);for(s=p;0!==s;s--)for(n=e.bl_count[s];0!==n;)u<(i=e.heap[--r])||(h[2*i+1]!==s&&(e.opt_len+=(s-h[2*i+1])*h[2*i],h[2*i+1]=s),n--)}}(e,t),Z(s,u,e.bl_count)}function X(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=a,a=t[2*(n+1)+1],++o<h&&i===a||(o<u?e.bl_tree[2*i]+=o:0!==i?(i!==s&&e.bl_tree[2*i]++,e.bl_tree[2*b]++):o<=10?e.bl_tree[2*v]++:e.bl_tree[2*y]++,s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4))}function V(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),n=0;n<=r;n++)if(i=a,a=t[2*(n+1)+1],!(++o<h&&i===a)){if(o<u)for(;L(e,i,e.bl_tree),0!=--o;);else 0!==i?(i!==s&&(L(e,i,e.bl_tree),o--),L(e,b,e.bl_tree),P(e,o-3,2)):o<=10?(L(e,v,e.bl_tree),P(e,o-3,3)):(L(e,y,e.bl_tree),P(e,o-11,7));s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4)}}n(T);var q=!1;function J(e,t,r,n){P(e,(s<<1)+(n?1:0),3),function(e,t,r,n){M(e),n&&(U(e,r),U(e,~r)),i.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}(e,t,r,!0)}r._tr_init=function(e){q||(function(){var e,t,r,n,i,s=new Array(g+1);for(n=r=0;n<a-1;n++)for(I[n]=r,e=0;e<1<<w[n];e++)A[r++]=n;for(A[r-1]=n,n=i=0;n<16;n++)for(T[n]=i,e=0;e<1<<k[n];e++)E[i++]=n;for(i>>=7;n<f;n++)for(T[n]=i<<7,e=0;e<1<<k[n]-7;e++)E[256+i++]=n;for(t=0;t<=g;t++)s[t]=0;for(e=0;e<=143;)z[2*e+1]=8,e++,s[8]++;for(;e<=255;)z[2*e+1]=9,e++,s[9]++;for(;e<=279;)z[2*e+1]=7,e++,s[7]++;for(;e<=287;)z[2*e+1]=8,e++,s[8]++;for(Z(z,l+1,s),e=0;e<f;e++)C[2*e+1]=5,C[2*e]=j(e,5);O=new D(z,w,u+1,l,g),B=new D(C,k,0,f,g),R=new D(new Array(0),x,0,c,p)}(),q=!0),e.l_desc=new F(e.dyn_ltree,O),e.d_desc=new F(e.dyn_dtree,B),e.bl_desc=new F(e.bl_tree,R),e.bi_buf=0,e.bi_valid=0,W(e)},r._tr_stored_block=J,r._tr_flush_block=function(e,t,r,n){var i,s,a=0;0<e.level?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t<u;t++)if(0!==e.dyn_ltree[2*t])return h;return o}(e)),Y(e,e.l_desc),Y(e,e.d_desc),a=function(e){var t;for(X(e,e.dyn_ltree,e.l_desc.max_code),X(e,e.dyn_dtree,e.d_desc.max_code),Y(e,e.bl_desc),t=c-1;3<=t&&0===e.bl_tree[2*S[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i<n;i++)P(e,e.bl_tree[2*S[i]+1],3);V(e,e.dyn_ltree,t-1),V(e,e.dyn_dtree,r-1)}(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),K(e,e.dyn_ltree,e.dyn_dtree)),W(e),n&&M(e)},r._tr_tally=function(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r<t.length;r++)t[r]=arguments[r+1];var n={callback:e,args:t};return h[o]=n,i(o),o++},e.clearImmediate=f}function f(e){delete h[e]}function c(e){if(u)setTimeout(c,0,e);else{var t=h[e];if(t){u=!0;try{!function(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}(t)}finally{f(e),u=!1}}}}function d(e){e.source===r&&\"string\"==typeof e.data&&0===e.data.indexOf(a)&&c(+e.data.slice(a.length))}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(this,\"undefined\"!=typeof __webpack_require__.g?__webpack_require__.g:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}]},{},[10])(10)});\n\n/***/ }),\n\n/***/ 857:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar root = __webpack_require__(7772);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n\n/***/ 343:\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n\n/***/ }),\n\n/***/ 3366:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(857),\n    getRawTag = __webpack_require__(2107),\n    objectToString = __webpack_require__(7157);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n\n/***/ 6435:\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n  return function(key) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = basePropertyOf;\n\n\n/***/ }),\n\n/***/ 1054:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(857),\n    arrayMap = __webpack_require__(343),\n    isArray = __webpack_require__(6152),\n    isSymbol = __webpack_require__(4795);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n\n\n/***/ }),\n\n/***/ 1655:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar basePropertyOf = __webpack_require__(6435);\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n  // Latin-1 Supplement block.\n  '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n  '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n  '\\xc7': 'C',  '\\xe7': 'c',\n  '\\xd0': 'D',  '\\xf0': 'd',\n  '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n  '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n  '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n  '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n  '\\xd1': 'N',  '\\xf1': 'n',\n  '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n  '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n  '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n  '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n  '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n  '\\xc6': 'Ae', '\\xe6': 'ae',\n  '\\xde': 'Th', '\\xfe': 'th',\n  '\\xdf': 'ss',\n  // Latin Extended-A block.\n  '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n  '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n  '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n  '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n  '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n  '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n  '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n  '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n  '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n  '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n  '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n  '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n  '\\u0134': 'J',  '\\u0135': 'j',\n  '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n  '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n  '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n  '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n  '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n  '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n  '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n  '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n  '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n  '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n  '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n  '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n  '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n  '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n  '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n  '\\u0174': 'W',  '\\u0175': 'w',\n  '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n  '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n  '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n  '\\u0132': 'IJ', '\\u0133': 'ij',\n  '\\u0152': 'Oe', '\\u0153': 'oe',\n  '\\u0149': \"'n\", '\\u017f': 's'\n};\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\nmodule.exports = deburrLetter;\n\n\n/***/ }),\n\n/***/ 1242:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;\n\nmodule.exports = freeGlobal;\n\n\n/***/ }),\n\n/***/ 2107:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(857);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n\n/***/ 7157:\n/***/ ((module) => {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n\n/***/ 7772:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar freeGlobal = __webpack_require__(1242);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n\n/***/ 7329:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar deburrLetter = __webpack_require__(1655),\n    toString = __webpack_require__(6188);\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\n\n/** Used to compose unicode capture groups. */\nvar rsCombo = '[' + rsComboRange + ']';\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n  string = toString(string);\n  return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\nmodule.exports = deburr;\n\n\n/***/ }),\n\n/***/ 6152:\n/***/ ((module) => {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n\n/***/ 5125:\n/***/ ((module) => {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n\n/***/ 4795:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(3366),\n    isObjectLike = __webpack_require__(5125);\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n\n\n/***/ }),\n\n/***/ 6635:\n/***/ (function(module, exports, __webpack_require__) {\n\n/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports =  true && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (true) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return _;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else {}\n}.call(this));\n\n\n/***/ }),\n\n/***/ 6188:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseToString = __webpack_require__(1054);\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n\n\n/***/ }),\n\n/***/ 8137:\n/***/ ((__unused_webpack_module, exports) => {\n\n\"use strict\";\nvar __webpack_unused_export__;\n/*!\n * media-typer\n * Copyright(c) 2014-2017 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n\n\n/**\n * RegExp to match type in RFC 6838\n *\n * type-name = restricted-name\n * subtype-name = restricted-name\n * restricted-name = restricted-name-first *126restricted-name-chars\n * restricted-name-first  = ALPHA / DIGIT\n * restricted-name-chars  = ALPHA / DIGIT / \"!\" / \"#\" /\n *                          \"$\" / \"&\" / \"-\" / \"^\" / \"_\"\n * restricted-name-chars =/ \".\" ; Characters before first dot always\n *                              ; specify a facet name\n * restricted-name-chars =/ \"+\" ; Characters after last plus always\n *                              ; specify a structured syntax suffix\n * ALPHA =  %x41-5A / %x61-7A   ; A-Z / a-z\n * DIGIT =  %x30-39             ; 0-9\n */\nvar SUBTYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/\nvar TYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/\nvar TYPE_REGEXP = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/\n\n/**\n * Module exports.\n */\n\n__webpack_unused_export__ = format\nexports.Qc = parse\n__webpack_unused_export__ = test\n\n/**\n * Format object to media type.\n *\n * @param {object} obj\n * @return {string}\n * @public\n */\n\nfunction format (obj) {\n  if (!obj || typeof obj !== 'object') {\n    throw new TypeError('argument obj is required')\n  }\n\n  var subtype = obj.subtype\n  var suffix = obj.suffix\n  var type = obj.type\n\n  if (!type || !TYPE_NAME_REGEXP.test(type)) {\n    throw new TypeError('invalid type')\n  }\n\n  if (!subtype || !SUBTYPE_NAME_REGEXP.test(subtype)) {\n    throw new TypeError('invalid subtype')\n  }\n\n  // format as type/subtype\n  var string = type + '/' + subtype\n\n  // append +suffix\n  if (suffix) {\n    if (!TYPE_NAME_REGEXP.test(suffix)) {\n      throw new TypeError('invalid suffix')\n    }\n\n    string += '+' + suffix\n  }\n\n  return string\n}\n\n/**\n * Test media type.\n *\n * @param {string} string\n * @return {object}\n * @public\n */\n\nfunction test (string) {\n  if (!string) {\n    throw new TypeError('argument string is required')\n  }\n\n  if (typeof string !== 'string') {\n    throw new TypeError('argument string is required to be a string')\n  }\n\n  return TYPE_REGEXP.test(string.toLowerCase())\n}\n\n/**\n * Parse media type to object.\n *\n * @param {string} string\n * @return {object}\n * @public\n */\n\nfunction parse (string) {\n  if (!string) {\n    throw new TypeError('argument string is required')\n  }\n\n  if (typeof string !== 'string') {\n    throw new TypeError('argument string is required to be a string')\n  }\n\n  var match = TYPE_REGEXP.exec(string.toLowerCase())\n\n  if (!match) {\n    throw new TypeError('invalid media type')\n  }\n\n  var type = match[1]\n  var subtype = match[2]\n  var suffix\n\n  // suffix after last +\n  var index = subtype.lastIndexOf('+')\n  if (index !== -1) {\n    suffix = subtype.substr(index + 1)\n    subtype = subtype.substr(0, index)\n  }\n\n  return new MediaType(type, subtype, suffix)\n}\n\n/**\n * Class for MediaType object.\n * @public\n */\n\nfunction MediaType (type, subtype, suffix) {\n  this.type = type\n  this.subtype = subtype\n  this.suffix = suffix\n}\n\n\n/***/ }),\n\n/***/ 7260:\n/***/ ((module, exports, __webpack_require__) => {\n\n/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = __webpack_require__(7543)(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n\n\n/***/ }),\n\n/***/ 7543:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = __webpack_require__(6727);\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(' ', ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n\n\n/***/ }),\n\n/***/ 6727:\n/***/ ((module) => {\n\n/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n\n\n/***/ }),\n\n/***/ 7320:\n/***/ ((module) => {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n\n/***/ 2967:\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\"use strict\";\n/** @license React v17.0.2\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\nvar aa=__webpack_require__(2784),m=__webpack_require__(7320),r=__webpack_require__(4616);function y(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}if(!aa)throw Error(y(227));var ba=new Set,ca={};function da(a,b){ea(a,b);ea(a+\"Capture\",b)}\nfunction ea(a,b){ca[a]=b;for(a=0;a<b.length;a++)ba.add(b[a])}\nvar fa=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),ha=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,ia=Object.prototype.hasOwnProperty,\nja={},ka={};function la(a){if(ia.call(ka,a))return!0;if(ia.call(ja,a))return!1;if(ha.test(a))return ka[a]=!0;ja[a]=!0;return!1}function ma(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction na(a,b,c,d){if(null===b||\"undefined\"===typeof b||ma(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function B(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var D={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){D[a]=new B(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];D[b]=new B(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){D[a]=new B(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){D[a]=new B(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){D[a]=new B(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){D[a]=new B(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){D[a]=new B(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){D[a]=new B(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){D[a]=new B(a,5,!1,a.toLowerCase(),null,!1,!1)});var oa=/[\\-:]([a-z])/g;function pa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(oa,\npa);D[b]=new B(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!1,!1)});\nD.xlinkHref=new B(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction qa(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(na(b,c,e,d)&&(c=null),d||null===e?la(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nvar ra=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,sa=60103,ta=60106,ua=60107,wa=60108,xa=60114,ya=60109,za=60110,Aa=60112,Ba=60113,Ca=60120,Da=60115,Ea=60116,Fa=60121,Ga=60128,Ha=60129,Ia=60130,Ja=60131;\nif(\"function\"===typeof Symbol&&Symbol.for){var E=Symbol.for;sa=E(\"react.element\");ta=E(\"react.portal\");ua=E(\"react.fragment\");wa=E(\"react.strict_mode\");xa=E(\"react.profiler\");ya=E(\"react.provider\");za=E(\"react.context\");Aa=E(\"react.forward_ref\");Ba=E(\"react.suspense\");Ca=E(\"react.suspense_list\");Da=E(\"react.memo\");Ea=E(\"react.lazy\");Fa=E(\"react.block\");E(\"react.scope\");Ga=E(\"react.opaque.id\");Ha=E(\"react.debug_trace_mode\");Ia=E(\"react.offscreen\");Ja=E(\"react.legacy_hidden\")}\nvar Ka=\"function\"===typeof Symbol&&Symbol.iterator;function La(a){if(null===a||\"object\"!==typeof a)return null;a=Ka&&a[Ka]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}var Ma;function Na(a){if(void 0===Ma)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);Ma=b&&b[1]||\"\"}return\"\\n\"+Ma+a}var Oa=!1;\nfunction Pa(a,b){if(!a||Oa)return\"\";Oa=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,\"props\",{set:function(){throw Error();}}),\"object\"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(k){var d=k}Reflect.construct(a,[],b)}else{try{b.call()}catch(k){d=k}a.call(b.prototype)}else{try{throw Error();}catch(k){d=k}a()}}catch(k){if(k&&d&&\"string\"===typeof k.stack){for(var e=k.stack.split(\"\\n\"),\nf=d.stack.split(\"\\n\"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h])return\"\\n\"+e[g].replace(\" at new \",\" at \");while(1<=g&&0<=h)}break}}}finally{Oa=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Na(a):\"\"}\nfunction Qa(a){switch(a.tag){case 5:return Na(a.type);case 16:return Na(\"Lazy\");case 13:return Na(\"Suspense\");case 19:return Na(\"SuspenseList\");case 0:case 2:case 15:return a=Pa(a.type,!1),a;case 11:return a=Pa(a.type.render,!1),a;case 22:return a=Pa(a.type._render,!1),a;case 1:return a=Pa(a.type,!0),a;default:return\"\"}}\nfunction Ra(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ua:return\"Fragment\";case ta:return\"Portal\";case xa:return\"Profiler\";case wa:return\"StrictMode\";case Ba:return\"Suspense\";case Ca:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case za:return(a.displayName||\"Context\")+\".Consumer\";case ya:return(a._context.displayName||\"Context\")+\".Provider\";case Aa:var b=a.render;b=b.displayName||b.name||\"\";\nreturn a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\"ForwardRef\");case Da:return Ra(a.type);case Fa:return Ra(a._render);case Ea:b=a._payload;a=a._init;try{return Ra(a(b))}catch(c){}}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}function Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return m({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function $a(a,b){b=b.checked;null!=b&&qa(a,\"checked\",b,!1)}\nfunction ab(a,b){$a(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?bb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&bb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction cb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction bb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function db(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function eb(a,b){a=m({children:void 0},b);if(b=db(b.children))a.children=b;return a}\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(y(91));return m({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(y(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(y(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var kb={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction lb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function mb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?lb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar nb,ob=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==kb.svg||\"innerHTML\"in a)a.innerHTML=b;else{nb=nb||document.createElement(\"div\");nb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=nb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction pb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar qb={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},rb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(qb).forEach(function(a){rb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);qb[b]=qb[a]})});function sb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||qb.hasOwnProperty(a)&&qb[a]?(\"\"+b).trim():b+\"px\"}\nfunction tb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=sb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var ub=m({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction vb(a,b){if(b){if(ub[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(y(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(y(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw Error(y(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(y(62));}}\nfunction wb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(y(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(a,b,c,d,e){return a(b,c,d,e)}function Ib(){}var Jb=Gb,Kb=!1,Lb=!1;function Mb(){if(null!==zb||null!==Ab)Ib(),Fb()}\nfunction Nb(a,b,c){if(Lb)return a(b,c);Lb=!0;try{return Jb(a,b,c)}finally{Lb=!1,Mb()}}\nfunction Ob(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==\ntypeof c)throw Error(y(231,b,typeof c));return c}var Pb=!1;if(fa)try{var Qb={};Object.defineProperty(Qb,\"passive\",{get:function(){Pb=!0}});window.addEventListener(\"test\",Qb,Qb);window.removeEventListener(\"test\",Qb,Qb)}catch(a){Pb=!1}function Rb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(n){this.onError(n)}}var Sb=!1,Tb=null,Ub=!1,Vb=null,Wb={onError:function(a){Sb=!0;Tb=a}};function Xb(a,b,c,d,e,f,g,h,k){Sb=!1;Tb=null;Rb.apply(Wb,arguments)}\nfunction Yb(a,b,c,d,e,f,g,h,k){Xb.apply(this,arguments);if(Sb){if(Sb){var l=Tb;Sb=!1;Tb=null}else throw Error(y(198));Ub||(Ub=!0,Vb=l)}}function Zb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function $b(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function ac(a){if(Zb(a)!==a)throw Error(y(188));}\nfunction bc(a){var b=a.alternate;if(!b){b=Zb(a);if(null===b)throw Error(y(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return ac(e),a;if(f===d)return ac(e),b;f=f.sibling}throw Error(y(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(y(189));}}if(c.alternate!==d)throw Error(y(190));}if(3!==c.tag)throw Error(y(188));return c.stateNode.current===c?a:b}function cc(a){a=bc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nfunction dc(a,b){for(var c=a.alternate;null!==b;){if(b===a||b===c)return!0;b=b.return}return!1}var ec,fc,gc,hc,ic=!1,jc=[],kc=null,lc=null,mc=null,nc=new Map,oc=new Map,pc=[],qc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");\nfunction rc(a,b,c,d,e){return{blockedOn:a,domEventName:b,eventSystemFlags:c|16,nativeEvent:e,targetContainers:[d]}}function sc(a,b){switch(a){case \"focusin\":case \"focusout\":kc=null;break;case \"dragenter\":case \"dragleave\":lc=null;break;case \"mouseover\":case \"mouseout\":mc=null;break;case \"pointerover\":case \"pointerout\":nc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":oc.delete(b.pointerId)}}\nfunction tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=rc(b,c,d,e,f),null!==b&&(b=Cb(b),null!==b&&fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction uc(a,b,c,d,e){switch(b){case \"focusin\":return kc=tc(kc,a,b,c,d,e),!0;case \"dragenter\":return lc=tc(lc,a,b,c,d,e),!0;case \"mouseover\":return mc=tc(mc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;nc.set(f,tc(nc.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,oc.set(f,tc(oc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction vc(a){var b=wc(a.target);if(null!==b){var c=Zb(b);if(null!==c)if(b=c.tag,13===b){if(b=$b(c),null!==b){a.blockedOn=b;hc(a.lanePriority,function(){r.unstable_runWithPriority(a.priority,function(){gc(c)})});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null!==c)return b=Cb(c),null!==b&&fc(b),a.blockedOn=c,!1;b.shift()}return!0}function zc(a,b,c){xc(a)&&c.delete(b)}\nfunction Ac(){for(ic=!1;0<jc.length;){var a=jc[0];if(null!==a.blockedOn){a=Cb(a.blockedOn);null!==a&&ec(a);break}for(var b=a.targetContainers;0<b.length;){var c=yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null!==c){a.blockedOn=c;break}b.shift()}null===a.blockedOn&&jc.shift()}null!==kc&&xc(kc)&&(kc=null);null!==lc&&xc(lc)&&(lc=null);null!==mc&&xc(mc)&&(mc=null);nc.forEach(zc);oc.forEach(zc)}\nfunction Bc(a,b){a.blockedOn===b&&(a.blockedOn=null,ic||(ic=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Ac)))}\nfunction Cc(a){function b(b){return Bc(b,a)}if(0<jc.length){Bc(jc[0],a);for(var c=1;c<jc.length;c++){var d=jc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==kc&&Bc(kc,a);null!==lc&&Bc(lc,a);null!==mc&&Bc(mc,a);nc.forEach(b);oc.forEach(b);for(c=0;c<pc.length;c++)d=pc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<pc.length&&(c=pc[0],null===c.blockedOn);)vc(c),null===c.blockedOn&&pc.shift()}\nfunction Dc(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Ec={animationend:Dc(\"Animation\",\"AnimationEnd\"),animationiteration:Dc(\"Animation\",\"AnimationIteration\"),animationstart:Dc(\"Animation\",\"AnimationStart\"),transitionend:Dc(\"Transition\",\"TransitionEnd\")},Fc={},Gc={};\nfa&&(Gc=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Ec.animationend.animation,delete Ec.animationiteration.animation,delete Ec.animationstart.animation),\"TransitionEvent\"in window||delete Ec.transitionend.transition);function Hc(a){if(Fc[a])return Fc[a];if(!Ec[a])return a;var b=Ec[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Gc)return Fc[a]=b[c];return a}\nvar Ic=Hc(\"animationend\"),Jc=Hc(\"animationiteration\"),Kc=Hc(\"animationstart\"),Lc=Hc(\"transitionend\"),Mc=new Map,Nc=new Map,Oc=[\"abort\",\"abort\",Ic,\"animationEnd\",Jc,\"animationIteration\",Kc,\"animationStart\",\"canplay\",\"canPlay\",\"canplaythrough\",\"canPlayThrough\",\"durationchange\",\"durationChange\",\"emptied\",\"emptied\",\"encrypted\",\"encrypted\",\"ended\",\"ended\",\"error\",\"error\",\"gotpointercapture\",\"gotPointerCapture\",\"load\",\"load\",\"loadeddata\",\"loadedData\",\"loadedmetadata\",\"loadedMetadata\",\"loadstart\",\"loadStart\",\n\"lostpointercapture\",\"lostPointerCapture\",\"playing\",\"playing\",\"progress\",\"progress\",\"seeking\",\"seeking\",\"stalled\",\"stalled\",\"suspend\",\"suspend\",\"timeupdate\",\"timeUpdate\",Lc,\"transitionEnd\",\"waiting\",\"waiting\"];function Pc(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1];e=\"on\"+(e[0].toUpperCase()+e.slice(1));Nc.set(d,b);Mc.set(d,e);da(e,[d])}}var Qc=r.unstable_now;Qc();var F=8;\nfunction Rc(a){if(0!==(1&a))return F=15,1;if(0!==(2&a))return F=14,2;if(0!==(4&a))return F=13,4;var b=24&a;if(0!==b)return F=12,b;if(0!==(a&32))return F=11,32;b=192&a;if(0!==b)return F=10,b;if(0!==(a&256))return F=9,256;b=3584&a;if(0!==b)return F=8,b;if(0!==(a&4096))return F=7,4096;b=4186112&a;if(0!==b)return F=6,b;b=62914560&a;if(0!==b)return F=5,b;if(a&67108864)return F=4,67108864;if(0!==(a&134217728))return F=3,134217728;b=805306368&a;if(0!==b)return F=2,b;if(0!==(1073741824&a))return F=1,1073741824;\nF=8;return a}function Sc(a){switch(a){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}function Tc(a){switch(a){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(y(358,a));}}\nfunction Uc(a,b){var c=a.pendingLanes;if(0===c)return F=0;var d=0,e=0,f=a.expiredLanes,g=a.suspendedLanes,h=a.pingedLanes;if(0!==f)d=f,e=F=15;else if(f=c&134217727,0!==f){var k=f&~g;0!==k?(d=Rc(k),e=F):(h&=f,0!==h&&(d=Rc(h),e=F))}else f=c&~g,0!==f?(d=Rc(f),e=F):0!==h&&(d=Rc(h),e=F);if(0===d)return 0;d=31-Vc(d);d=c&((0>d?0:1<<d)<<1)-1;if(0!==b&&b!==d&&0===(b&g)){Rc(b);if(e<=F)return b;F=e}b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-Vc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction Wc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function Xc(a,b){switch(a){case 15:return 1;case 14:return 2;case 12:return a=Yc(24&~b),0===a?Xc(10,b):a;case 10:return a=Yc(192&~b),0===a?Xc(8,b):a;case 8:return a=Yc(3584&~b),0===a&&(a=Yc(4186112&~b),0===a&&(a=512)),a;case 2:return b=Yc(805306368&~b),0===b&&(b=268435456),b}throw Error(y(358,a));}function Yc(a){return a&-a}function Zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction $c(a,b,c){a.pendingLanes|=b;var d=b-1;a.suspendedLanes&=d;a.pingedLanes&=d;a=a.eventTimes;b=31-Vc(b);a[b]=c}var Vc=Math.clz32?Math.clz32:ad,bd=Math.log,cd=Math.LN2;function ad(a){return 0===a?32:31-(bd(a)/cd|0)|0}var dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function gd(a,b,c,d){Kb||Ib();var e=hd,f=Kb;Kb=!0;try{Hb(e,a,b,c,d)}finally{(Kb=f)||Mb()}}function id(a,b,c,d){ed(dd,hd.bind(null,a,b,c,d))}\nfunction hd(a,b,c,d){if(fd){var e;if((e=0===(b&4))&&0<jc.length&&-1<qc.indexOf(a))a=rc(null,a,b,c,d),jc.push(a);else{var f=yc(a,b,c,d);if(null===f)e&&sc(a,d);else{if(e){if(-1<qc.indexOf(a)){a=rc(f,a,b,c,d);jc.push(a);return}if(uc(f,a,b,c,d))return;sc(a,d)}jd(a,b,d,null,c)}}}}\nfunction yc(a,b,c,d){var e=xb(d);e=wc(e);if(null!==e){var f=Zb(e);if(null===f)e=null;else{var g=f.tag;if(13===g){e=$b(f);if(null!==e)return e;e=null}else if(3===g){if(f.stateNode.hydrate)return 3===f.tag?f.stateNode.containerInfo:null;e=null}else f!==e&&(e=null)}}jd(a,b,d,e,c);return null}var kd=null,ld=null,md=null;\nfunction nd(){if(md)return md;var a,b=ld,c=b.length,d,e=\"value\"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}function od(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}m(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=m({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=m({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if(\"movementX\"in\na)return a.movementX;a!==yd&&(yd&&\"mousemove\"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return\"movementY\"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=m({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=m({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=m({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=m({},sd,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=m({},sd,{data:0}),Ld=rd(Kd),Md={Esc:\"Escape\",\nSpacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",\n119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Od={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=m({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=od(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Nd[a.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return\"keypress\"===a.type?od(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?od(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=m({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=m({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=m({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=m({},Ad,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=fa&&\"CompositionEvent\"in window,be=null;fa&&\"documentMode\"in document&&(be=document.documentMode);var ce=fa&&\"TextEvent\"in window&&!be,de=fa&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return de&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!le[a.type]:\"textarea\"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,\"onChange\");0<b.length&&(c=new td(\"onChange\",\"change\",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if(\"change\"===a)return b}var we=!1;if(fa){var xe;if(fa){var ye=\"oninput\"in document;if(!ye){var ze=document.createElement(\"div\");ze.setAttribute(\"oninput\",\"return;\");ye=\"function\"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent(\"onpropertychange\",Be),qe=pe=null)}function Be(a){if(\"value\"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));a=re;if(Kb)a(b);else{Kb=!0;try{Gb(a,b)}finally{Kb=!1,Mb()}}}}\nfunction Ce(a,b,c){\"focusin\"===a?(Ae(),pe=b,qe=c,pe.attachEvent(\"onpropertychange\",Be)):\"focusout\"===a&&Ae()}function De(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return te(qe)}function Ee(a,b){if(\"click\"===a)return te(b)}function Fe(a,b){if(\"input\"===a||\"change\"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He=\"function\"===typeof Object.is?Object.is:Ge,Ie=Object.prototype.hasOwnProperty;\nfunction Je(a,b){if(He(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!Ie.call(b,c[d])||!He(a[c[d]],b[c[d]]))return!1;return!0}function Ke(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Le(a,b){var c=Ke(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Ke(c)}}function Me(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Me(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Ne(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Oe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nvar Pe=fa&&\"documentMode\"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Oe(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Je(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0<d.length&&(b=new td(\"onSelect\",\"select\",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nPc(\"cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange\".split(\" \"),\n0);Pc(\"drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel\".split(\" \"),1);Pc(Oc,2);for(var Ve=\"change selectionchange textInput compositionstart compositionend compositionupdate\".split(\" \"),We=0;We<Ve.length;We++)Nc.set(Ve[We],0);ea(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]);\nea(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]);ea(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]);ea(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]);da(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \"));da(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \"));da(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]);da(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \"));\nda(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \"));da(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var Xe=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),Ye=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(Xe));\nfunction Ze(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=c;Yb(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;Ze(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;Ze(e,h,l);f=k}}}if(Ub)throw a=Vb,Ub=!1,Vb=null,a;}\nfunction G(a,b){var c=$e(b),d=a+\"__bubble\";c.has(d)||(af(b,a,2,!1),c.add(d))}var bf=\"_reactListening\"+Math.random().toString(36).slice(2);function cf(a){a[bf]||(a[bf]=!0,ba.forEach(function(b){Ye.has(b)||df(b,!1,a,null);df(b,!0,a,null)}))}\nfunction df(a,b,c,d){var e=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,f=c;\"selectionchange\"===a&&9!==c.nodeType&&(f=c.ownerDocument);if(null!==d&&!b&&Ye.has(a)){if(\"scroll\"!==a)return;e|=2;f=d}var g=$e(f),h=a+\"__\"+(b?\"capture\":\"bubble\");g.has(h)||(b&&(e|=4),af(f,a,e,b),g.add(h))}\nfunction af(a,b,c,d){var e=Nc.get(b);switch(void 0===e?2:e){case 0:e=gd;break;case 1:e=id;break;default:e=hd}c=e.bind(null,b,c,a);e=void 0;!Pb||\"touchstart\"!==b&&\"touchmove\"!==b&&\"wheel\"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction jd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Nb(function(){var d=f,e=xb(c),g=[];\na:{var h=Mc.get(a);if(void 0!==h){var k=td,x=a;switch(a){case \"keypress\":if(0===od(c))break a;case \"keydown\":case \"keyup\":k=Rd;break;case \"focusin\":x=\"focus\";k=Fd;break;case \"focusout\":x=\"blur\";k=Fd;break;case \"beforeblur\":case \"afterblur\":k=Fd;break;case \"click\":if(2===c.button)break a;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":k=Bd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":k=\nDd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":k=Vd;break;case Ic:case Jc:case Kc:k=Hd;break;case Lc:k=Xd;break;case \"scroll\":k=vd;break;case \"wheel\":k=Zd;break;case \"copy\":case \"cut\":case \"paste\":k=Jd;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":k=Td}var w=0!==(b&4),z=!w&&\"scroll\"===a,u=w?null!==h?h+\"Capture\":null:h;w=[];for(var t=d,q;null!==\nt;){q=t;var v=q.stateNode;5===q.tag&&null!==v&&(q=v,null!==u&&(v=Ob(t,u),null!=v&&w.push(ef(t,v,q))));if(z)break;t=t.return}0<w.length&&(h=new k(h,x,null,c,e),g.push({event:h,listeners:w}))}}if(0===(b&7)){a:{h=\"mouseover\"===a||\"pointerover\"===a;k=\"mouseout\"===a||\"pointerout\"===a;if(h&&0===(b&16)&&(x=c.relatedTarget||c.fromElement)&&(wc(x)||x[ff]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(x=c.relatedTarget||c.toElement,k=d,x=x?wc(x):null,null!==\nx&&(z=Zb(x),x!==z||5!==x.tag&&6!==x.tag))x=null}else k=null,x=d;if(k!==x){w=Bd;v=\"onMouseLeave\";u=\"onMouseEnter\";t=\"mouse\";if(\"pointerout\"===a||\"pointerover\"===a)w=Td,v=\"onPointerLeave\",u=\"onPointerEnter\",t=\"pointer\";z=null==k?h:ue(k);q=null==x?h:ue(x);h=new w(v,t+\"leave\",k,c,e);h.target=z;h.relatedTarget=q;v=null;wc(e)===d&&(w=new w(u,t+\"enter\",x,c,e),w.target=q,w.relatedTarget=z,v=w);z=v;if(k&&x)b:{w=k;u=x;t=0;for(q=w;q;q=gf(q))t++;q=0;for(v=u;v;v=gf(v))q++;for(;0<t-q;)w=gf(w),t--;for(;0<q-t;)u=\ngf(u),q--;for(;t--;){if(w===u||null!==u&&w===u.alternate)break b;w=gf(w);u=gf(u)}w=null}else w=null;null!==k&&hf(g,h,k,w,!1);null!==x&&null!==z&&hf(g,z,x,w,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if(\"select\"===k||\"input\"===k&&\"file\"===h.type)var J=ve;else if(me(h))if(we)J=Fe;else{J=De;var K=Ce}else(k=h.nodeName)&&\"input\"===k.toLowerCase()&&(\"checkbox\"===h.type||\"radio\"===h.type)&&(J=Ee);if(J&&(J=J(a,d))){ne(g,J,c,e);break a}K&&K(a,h,d);\"focusout\"===a&&(K=h._wrapperState)&&\nK.controlled&&\"number\"===h.type&&bb(h,\"number\",h.value)}K=d?ue(d):window;switch(a){case \"focusin\":if(me(K)||\"true\"===K.contentEditable)Qe=K,Re=d,Se=null;break;case \"focusout\":Se=Re=Qe=null;break;case \"mousedown\":Te=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":Te=!1;Ue(g,c,e);break;case \"selectionchange\":if(Pe)break;case \"keydown\":case \"keyup\":Ue(g,c,e)}var Q;if(ae)b:{switch(a){case \"compositionstart\":var L=\"onCompositionStart\";break b;case \"compositionend\":L=\"onCompositionEnd\";break b;\ncase \"compositionupdate\":L=\"onCompositionUpdate\";break b}L=void 0}else ie?ge(a,c)&&(L=\"onCompositionEnd\"):\"keydown\"===a&&229===c.keyCode&&(L=\"onCompositionStart\");L&&(de&&\"ko\"!==c.locale&&(ie||\"onCompositionStart\"!==L?\"onCompositionEnd\"===L&&ie&&(Q=nd()):(kd=e,ld=\"value\"in kd?kd.value:kd.textContent,ie=!0)),K=oe(d,L),0<K.length&&(L=new Ld(L,a,null,c,e),g.push({event:L,listeners:K}),Q?L.data=Q:(Q=he(c),null!==Q&&(L.data=Q))));if(Q=ce?je(a,c):ke(a,c))d=oe(d,\"onBeforeInput\"),0<d.length&&(e=new Ld(\"onBeforeInput\",\n\"beforeinput\",null,c,e),g.push({event:e,listeners:d}),e.data=Q)}se(g,b)})}function ef(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+\"Capture\",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Ob(a,c),null!=f&&d.unshift(ef(a,f,e)),f=Ob(a,b),null!=f&&d.push(ef(a,f,e)));a=a.return}return d}function gf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction hf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Ob(c,f),null!=k&&g.unshift(ef(c,k,h))):e||(k=Ob(c,f),null!=k&&g.push(ef(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}function jf(){}var kf=null,lf=null;function mf(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction nf(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var of=\"function\"===typeof setTimeout?setTimeout:void 0,pf=\"function\"===typeof clearTimeout?clearTimeout:void 0;function qf(a){1===a.nodeType?a.textContent=\"\":9===a.nodeType&&(a=a.body,null!=a&&(a.textContent=\"\"))}\nfunction rf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function sf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(\"$\"===c||\"$!\"===c||\"$?\"===c){if(0===b)return a;b--}else\"/$\"===c&&b++}a=a.previousSibling}return null}var tf=0;function uf(a){return{$$typeof:Ga,toString:a,valueOf:a}}var vf=Math.random().toString(36).slice(2),wf=\"__reactFiber$\"+vf,xf=\"__reactProps$\"+vf,ff=\"__reactContainer$\"+vf,yf=\"__reactEvents$\"+vf;\nfunction wc(a){var b=a[wf];if(b)return b;for(var c=a.parentNode;c;){if(b=c[ff]||c[wf]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=sf(a);null!==a;){if(c=a[wf])return c;a=sf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[wf]||a[ff];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(y(33));}function Db(a){return a[xf]||null}\nfunction $e(a){var b=a[yf];void 0===b&&(b=a[yf]=new Set);return b}var zf=[],Af=-1;function Bf(a){return{current:a}}function H(a){0>Af||(a.current=zf[Af],zf[Af]=null,Af--)}function I(a,b){Af++;zf[Af]=a.current;a.current=b}var Cf={},M=Bf(Cf),N=Bf(!1),Df=Cf;\nfunction Ef(a,b){var c=a.type.contextTypes;if(!c)return Cf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function Ff(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Gf(){H(N);H(M)}function Hf(a,b,c){if(M.current!==Cf)throw Error(y(168));I(M,b);I(N,c)}\nfunction If(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(y(108,Ra(b)||\"Unknown\",e));return m({},c,d)}function Jf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Cf;Df=M.current;I(M,a);I(N,N.current);return!0}function Kf(a,b,c){var d=a.stateNode;if(!d)throw Error(y(169));c?(a=If(a,b,Df),d.__reactInternalMemoizedMergedChildContext=a,H(N),H(M),I(M,a)):H(N);I(N,c)}\nvar Lf=null,Mf=null,Nf=r.unstable_runWithPriority,Of=r.unstable_scheduleCallback,Pf=r.unstable_cancelCallback,Qf=r.unstable_shouldYield,Rf=r.unstable_requestPaint,Sf=r.unstable_now,Tf=r.unstable_getCurrentPriorityLevel,Uf=r.unstable_ImmediatePriority,Vf=r.unstable_UserBlockingPriority,Wf=r.unstable_NormalPriority,Xf=r.unstable_LowPriority,Yf=r.unstable_IdlePriority,Zf={},$f=void 0!==Rf?Rf:function(){},ag=null,bg=null,cg=!1,dg=Sf(),O=1E4>dg?Sf:function(){return Sf()-dg};\nfunction eg(){switch(Tf()){case Uf:return 99;case Vf:return 98;case Wf:return 97;case Xf:return 96;case Yf:return 95;default:throw Error(y(332));}}function fg(a){switch(a){case 99:return Uf;case 98:return Vf;case 97:return Wf;case 96:return Xf;case 95:return Yf;default:throw Error(y(332));}}function gg(a,b){a=fg(a);return Nf(a,b)}function hg(a,b,c){a=fg(a);return Of(a,b,c)}function ig(){if(null!==bg){var a=bg;bg=null;Pf(a)}jg()}\nfunction jg(){if(!cg&&null!==ag){cg=!0;var a=0;try{var b=ag;gg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});ag=null}catch(c){throw null!==ag&&(ag=ag.slice(a+1)),Of(Uf,ig),c;}finally{cg=!1}}}var kg=ra.ReactCurrentBatchConfig;function lg(a,b){if(a&&a.defaultProps){b=m({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}var mg=Bf(null),ng=null,og=null,pg=null;function qg(){pg=og=ng=null}\nfunction rg(a){var b=mg.current;H(mg);a.type._context._currentValue=b}function sg(a,b){for(;null!==a;){var c=a.alternate;if((a.childLanes&b)===b)if(null===c||(c.childLanes&b)===b)break;else c.childLanes|=b;else a.childLanes|=b,null!==c&&(c.childLanes|=b);a=a.return}}function tg(a,b){ng=a;pg=og=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(ug=!0),a.firstContext=null)}\nfunction vg(a,b){if(pg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)pg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===og){if(null===ng)throw Error(y(308));og=b;ng.dependencies={lanes:0,firstContext:b,responders:null}}else og=og.next=b}return a._currentValue}var wg=!1;function xg(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}\nfunction yg(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function zg(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}function Ag(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}\nfunction Bg(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction Cg(a,b,c,d){var e=a.updateQueue;wg=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var n=a.alternate;if(null!==n){n=n.updateQueue;var A=n.lastBaseUpdate;A!==g&&(null===A?n.firstBaseUpdate=l:A.next=l,n.lastBaseUpdate=k)}}if(null!==f){A=e.baseState;g=0;n=l=k=null;do{h=f.lane;var p=f.eventTime;if((d&h)===h){null!==n&&(n=n.next={eventTime:p,lane:0,tag:f.tag,payload:f.payload,callback:f.callback,\nnext:null});a:{var C=a,x=f;h=b;p=c;switch(x.tag){case 1:C=x.payload;if(\"function\"===typeof C){A=C.call(p,A,h);break a}A=C;break a;case 3:C.flags=C.flags&-4097|64;case 0:C=x.payload;h=\"function\"===typeof C?C.call(p,A,h):C;if(null===h||void 0===h)break a;A=m({},A,h);break a;case 2:wg=!0}}null!==f.callback&&(a.flags|=32,h=e.effects,null===h?e.effects=[f]:h.push(f))}else p={eventTime:p,lane:h,tag:f.tag,payload:f.payload,callback:f.callback,next:null},null===n?(l=n=p,k=A):n=n.next=p,g|=h;f=f.next;if(null===\nf)if(h=e.shared.pending,null===h)break;else f=h.next,h.next=null,e.lastBaseUpdate=h,e.shared.pending=null}while(1);null===n&&(k=A);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=n;Dg|=g;a.lanes=g;a.memoizedState=A}}function Eg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if(\"function\"!==typeof e)throw Error(y(191,e));e.call(d)}}}var Fg=(new aa.Component).refs;\nfunction Gg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:m({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar Kg={isMounted:function(a){return(a=a._reactInternals)?Zb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=Hg(),e=Ig(a),f=zg(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);Ag(a,f);Jg(a,e,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=Hg(),e=Ig(a),f=zg(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);Ag(a,f);Jg(a,e,d)},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=Hg(),d=Ig(a),e=zg(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=\nb);Ag(a,e);Jg(a,d,c)}};function Lg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Je(c,d)||!Je(e,f):!0}\nfunction Mg(a,b,c){var d=!1,e=Cf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=vg(f):(e=Ff(b)?Df:M.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Ef(a,e):Cf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Kg;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Ng(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Kg.enqueueReplaceState(b,b.state,null)}\nfunction Og(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Fg;xg(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=vg(f):(f=Ff(b)?Df:M.current,e.context=Ef(a,f));Cg(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Gg(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||\n(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Kg.enqueueReplaceState(e,e.state,null),Cg(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.flags|=4)}var Pg=Array.isArray;\nfunction Qg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(y(309));var d=c.stateNode}if(!d)throw Error(y(147,a));var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Fg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw Error(y(284));if(!c._owner)throw Error(y(290,a));}return a}\nfunction Rg(a,b){if(\"textarea\"!==a.type)throw Error(y(31,\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b));}\nfunction Sg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.flags=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Tg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags=2,\nc):d;b.flags=2;return c}function g(b){a&&null===b.alternate&&(b.flags=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Ug(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Qg(a,b,c),d.return=a,d;d=Vg(c.type,c.key,c.props,null,a.mode,d);d.ref=Qg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=\nWg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function n(a,b,c,d,f){if(null===b||7!==b.tag)return b=Xg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function A(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Ug(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case sa:return c=Vg(b.type,b.key,b.props,null,a.mode,c),c.ref=Qg(a,null,b),c.return=a,c;case ta:return b=Wg(b,a.mode,c),b.return=a,b}if(Pg(b)||La(b))return b=Xg(b,\na.mode,c,null),b.return=a,b;Rg(a,b)}return null}function p(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case sa:return c.key===e?c.type===ua?n(a,b,c.props.children,d,e):k(a,b,c,d):null;case ta:return c.key===e?l(a,b,c,d):null}if(Pg(c)||La(c))return null!==e?null:n(a,b,c,d,null);Rg(a,c)}return null}function C(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=a.get(c)||\nnull,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case sa:return a=a.get(null===d.key?c:d.key)||null,d.type===ua?n(b,a,d.props.children,e,d.key):k(b,a,d,e);case ta:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Pg(d)||La(d))return a=a.get(c)||null,n(b,a,d,e,null);Rg(b,d)}return null}function x(e,g,h,k){for(var l=null,t=null,u=g,z=g=0,q=null;null!==u&&z<h.length;z++){u.index>z?(q=u,u=null):q=u.sibling;var n=p(e,u,h[z],k);if(null===n){null===u&&(u=q);break}a&&u&&null===\nn.alternate&&b(e,u);g=f(n,g,z);null===t?l=n:t.sibling=n;t=n;u=q}if(z===h.length)return c(e,u),l;if(null===u){for(;z<h.length;z++)u=A(e,h[z],k),null!==u&&(g=f(u,g,z),null===t?l=u:t.sibling=u,t=u);return l}for(u=d(e,u);z<h.length;z++)q=C(u,e,z,h[z],k),null!==q&&(a&&null!==q.alternate&&u.delete(null===q.key?z:q.key),g=f(q,g,z),null===t?l=q:t.sibling=q,t=q);a&&u.forEach(function(a){return b(e,a)});return l}function w(e,g,h,k){var l=La(h);if(\"function\"!==typeof l)throw Error(y(150));h=l.call(h);if(null==\nh)throw Error(y(151));for(var t=l=null,u=g,z=g=0,q=null,n=h.next();null!==u&&!n.done;z++,n=h.next()){u.index>z?(q=u,u=null):q=u.sibling;var w=p(e,u,n.value,k);if(null===w){null===u&&(u=q);break}a&&u&&null===w.alternate&&b(e,u);g=f(w,g,z);null===t?l=w:t.sibling=w;t=w;u=q}if(n.done)return c(e,u),l;if(null===u){for(;!n.done;z++,n=h.next())n=A(e,n.value,k),null!==n&&(g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);return l}for(u=d(e,u);!n.done;z++,n=h.next())n=C(u,e,z,n.value,k),null!==n&&(a&&null!==n.alternate&&\nu.delete(null===n.key?z:n.key),g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);a&&u.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===ua&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case sa:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ua){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,k.sibling);\nd=e(k,f.props);d.ref=Qg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ua?(d=Xg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Vg(f.type,f.key,f.props,null,a.mode,h),h.ref=Qg(a,d,f),h.return=a,a=h)}return g(a);case ta:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=\nWg(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Ug(f,a.mode,h),d.return=a,a=d),g(a);if(Pg(f))return x(a,d,f,h);if(La(f))return w(a,d,f,h);l&&Rg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 22:case 0:case 11:case 15:throw Error(y(152,Ra(a.type)||\"Component\"));}return c(a,d)}}var Yg=Sg(!0),Zg=Sg(!1),$g={},ah=Bf($g),bh=Bf($g),ch=Bf($g);\nfunction dh(a){if(a===$g)throw Error(y(174));return a}function eh(a,b){I(ch,b);I(bh,a);I(ah,$g);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:mb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=mb(b,a)}H(ah);I(ah,b)}function fh(){H(ah);H(bh);H(ch)}function gh(a){dh(ch.current);var b=dh(ah.current);var c=mb(b,a.type);b!==c&&(I(bh,a),I(ah,c))}function hh(a){bh.current===a&&(H(ah),H(bh))}var P=Bf(0);\nfunction ih(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var jh=null,kh=null,lh=!1;\nfunction mh(a,b){var c=nh(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.flags=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function oh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction ph(a){if(lh){var b=kh;if(b){var c=b;if(!oh(a,b)){b=rf(c.nextSibling);if(!b||!oh(a,b)){a.flags=a.flags&-1025|2;lh=!1;jh=a;return}mh(jh,c)}jh=a;kh=rf(b.firstChild)}else a.flags=a.flags&-1025|2,lh=!1,jh=a}}function qh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;jh=a}\nfunction rh(a){if(a!==jh)return!1;if(!lh)return qh(a),lh=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!nf(b,a.memoizedProps))for(b=kh;b;)mh(a,b),b=rf(b.nextSibling);qh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(y(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(\"/$\"===c){if(0===b){kh=rf(a.nextSibling);break a}b--}else\"$\"!==c&&\"$!\"!==c&&\"$?\"!==c||b++}a=a.nextSibling}kh=null}}else kh=jh?rf(a.stateNode.nextSibling):null;return!0}\nfunction sh(){kh=jh=null;lh=!1}var th=[];function uh(){for(var a=0;a<th.length;a++)th[a]._workInProgressVersionPrimary=null;th.length=0}var vh=ra.ReactCurrentDispatcher,wh=ra.ReactCurrentBatchConfig,xh=0,R=null,S=null,T=null,yh=!1,zh=!1;function Ah(){throw Error(y(321));}function Bh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Ch(a,b,c,d,e,f){xh=f;R=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;vh.current=null===a||null===a.memoizedState?Dh:Eh;a=c(d,e);if(zh){f=0;do{zh=!1;if(!(25>f))throw Error(y(301));f+=1;T=S=null;b.updateQueue=null;vh.current=Fh;a=c(d,e)}while(zh)}vh.current=Gh;b=null!==S&&null!==S.next;xh=0;T=S=R=null;yh=!1;if(b)throw Error(y(300));return a}function Hh(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===T?R.memoizedState=T=a:T=T.next=a;return T}\nfunction Ih(){if(null===S){var a=R.alternate;a=null!==a?a.memoizedState:null}else a=S.next;var b=null===T?R.memoizedState:T.next;if(null!==b)T=b,S=a;else{if(null===a)throw Error(y(310));S=a;a={memoizedState:S.memoizedState,baseState:S.baseState,baseQueue:S.baseQueue,queue:S.queue,next:null};null===T?R.memoizedState=T=a:T=T.next=a}return T}function Jh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Kh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=S,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.lane;if((xh&l)===l)null!==h&&(h=h.next={lane:0,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),d=k.eagerReducer===a?k.eagerState:a(d,k.action);else{var n={lane:l,action:k.action,eagerReducer:k.eagerReducer,\neagerState:k.eagerState,next:null};null===h?(g=h=n,f=d):h=h.next=n;R.lanes|=l;Dg|=l}k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;He(d,b.memoizedState)||(ug=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\nfunction Lh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(ug=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\nfunction Mh(a,b,c){var d=b._getVersion;d=d(b._source);var e=b._workInProgressVersionPrimary;if(null!==e)a=e===d;else if(a=a.mutableReadLanes,a=(xh&a)===a)b._workInProgressVersionPrimary=d,th.push(b);if(a)return c(b._source);th.push(b);throw Error(y(350));}\nfunction Nh(a,b,c,d){var e=U;if(null===e)throw Error(y(349));var f=b._getVersion,g=f(b._source),h=vh.current,k=h.useState(function(){return Mh(e,b,c)}),l=k[1],n=k[0];k=T;var A=a.memoizedState,p=A.refs,C=p.getSnapshot,x=A.source;A=A.subscribe;var w=R;a.memoizedState={refs:p,source:b,subscribe:d};h.useEffect(function(){p.getSnapshot=c;p.setSnapshot=l;var a=f(b._source);if(!He(g,a)){a=c(b._source);He(n,a)||(l(a),a=Ig(w),e.mutableReadLanes|=a&e.pendingLanes);a=e.mutableReadLanes;e.entangledLanes|=a;for(var d=\ne.entanglements,h=a;0<h;){var k=31-Vc(h),v=1<<k;d[k]|=a;h&=~v}}},[c,b,d]);h.useEffect(function(){return d(b._source,function(){var a=p.getSnapshot,c=p.setSnapshot;try{c(a(b._source));var d=Ig(w);e.mutableReadLanes|=d&e.pendingLanes}catch(q){c(function(){throw q;})}})},[b,d]);He(C,c)&&He(x,b)&&He(A,d)||(a={pending:null,dispatch:null,lastRenderedReducer:Jh,lastRenderedState:n},a.dispatch=l=Oh.bind(null,R,a),k.queue=a,k.baseQueue=null,n=Mh(e,b,c),k.memoizedState=k.baseState=n);return n}\nfunction Ph(a,b,c){var d=Ih();return Nh(d,a,b,c)}function Qh(a){var b=Hh();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:Jh,lastRenderedState:a};a=a.dispatch=Oh.bind(null,R,a);return[b.memoizedState,a]}\nfunction Rh(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=R.updateQueue;null===b?(b={lastEffect:null},R.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function Sh(a){var b=Hh();a={current:a};return b.memoizedState=a}function Th(){return Ih().memoizedState}function Uh(a,b,c,d){var e=Hh();R.flags|=a;e.memoizedState=Rh(1|b,c,void 0,void 0===d?null:d)}\nfunction Vh(a,b,c,d){var e=Ih();d=void 0===d?null:d;var f=void 0;if(null!==S){var g=S.memoizedState;f=g.destroy;if(null!==d&&Bh(d,g.deps)){Rh(b,c,f,d);return}}R.flags|=a;e.memoizedState=Rh(1|b,c,f,d)}function Wh(a,b){return Uh(516,4,a,b)}function Xh(a,b){return Vh(516,4,a,b)}function Yh(a,b){return Vh(4,2,a,b)}function Zh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}\nfunction $h(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Vh(4,2,Zh.bind(null,b,a),c)}function ai(){}function bi(a,b){var c=Ih();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Bh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function ci(a,b){var c=Ih();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Bh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}\nfunction di(a,b){var c=eg();gg(98>c?98:c,function(){a(!0)});gg(97<c?97:c,function(){var c=wh.transition;wh.transition=1;try{a(!1),b()}finally{wh.transition=c}})}\nfunction Oh(a,b,c){var d=Hg(),e=Ig(a),f={lane:e,action:c,eagerReducer:null,eagerState:null,next:null},g=b.pending;null===g?f.next=f:(f.next=g.next,g.next=f);b.pending=f;g=a.alternate;if(a===R||null!==g&&g===R)zh=yh=!0;else{if(0===a.lanes&&(null===g||0===g.lanes)&&(g=b.lastRenderedReducer,null!==g))try{var h=b.lastRenderedState,k=g(h,c);f.eagerReducer=g;f.eagerState=k;if(He(k,h))return}catch(l){}finally{}Jg(a,e,d)}}\nvar Gh={readContext:vg,useCallback:Ah,useContext:Ah,useEffect:Ah,useImperativeHandle:Ah,useLayoutEffect:Ah,useMemo:Ah,useReducer:Ah,useRef:Ah,useState:Ah,useDebugValue:Ah,useDeferredValue:Ah,useTransition:Ah,useMutableSource:Ah,useOpaqueIdentifier:Ah,unstable_isNewReconciler:!1},Dh={readContext:vg,useCallback:function(a,b){Hh().memoizedState=[a,void 0===b?null:b];return a},useContext:vg,useEffect:Wh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Uh(4,2,Zh.bind(null,\nb,a),c)},useLayoutEffect:function(a,b){return Uh(4,2,a,b)},useMemo:function(a,b){var c=Hh();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Hh();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=Oh.bind(null,R,a);return[d.memoizedState,a]},useRef:Sh,useState:Qh,useDebugValue:ai,useDeferredValue:function(a){var b=Qh(a),c=b[0],d=b[1];Wh(function(){var b=wh.transition;\nwh.transition=1;try{d(a)}finally{wh.transition=b}},[a]);return c},useTransition:function(){var a=Qh(!1),b=a[0];a=di.bind(null,a[1]);Sh(a);return[a,b]},useMutableSource:function(a,b,c){var d=Hh();d.memoizedState={refs:{getSnapshot:b,setSnapshot:null},source:a,subscribe:c};return Nh(d,a,b,c)},useOpaqueIdentifier:function(){if(lh){var a=!1,b=uf(function(){a||(a=!0,c(\"r:\"+(tf++).toString(36)));throw Error(y(355));}),c=Qh(b)[1];0===(R.mode&2)&&(R.flags|=516,Rh(5,function(){c(\"r:\"+(tf++).toString(36))},\nvoid 0,null));return b}b=\"r:\"+(tf++).toString(36);Qh(b);return b},unstable_isNewReconciler:!1},Eh={readContext:vg,useCallback:bi,useContext:vg,useEffect:Xh,useImperativeHandle:$h,useLayoutEffect:Yh,useMemo:ci,useReducer:Kh,useRef:Th,useState:function(){return Kh(Jh)},useDebugValue:ai,useDeferredValue:function(a){var b=Kh(Jh),c=b[0],d=b[1];Xh(function(){var b=wh.transition;wh.transition=1;try{d(a)}finally{wh.transition=b}},[a]);return c},useTransition:function(){var a=Kh(Jh)[0];return[Th().current,\na]},useMutableSource:Ph,useOpaqueIdentifier:function(){return Kh(Jh)[0]},unstable_isNewReconciler:!1},Fh={readContext:vg,useCallback:bi,useContext:vg,useEffect:Xh,useImperativeHandle:$h,useLayoutEffect:Yh,useMemo:ci,useReducer:Lh,useRef:Th,useState:function(){return Lh(Jh)},useDebugValue:ai,useDeferredValue:function(a){var b=Lh(Jh),c=b[0],d=b[1];Xh(function(){var b=wh.transition;wh.transition=1;try{d(a)}finally{wh.transition=b}},[a]);return c},useTransition:function(){var a=Lh(Jh)[0];return[Th().current,\na]},useMutableSource:Ph,useOpaqueIdentifier:function(){return Lh(Jh)[0]},unstable_isNewReconciler:!1},ei=ra.ReactCurrentOwner,ug=!1;function fi(a,b,c,d){b.child=null===a?Zg(b,null,c,d):Yg(b,a.child,c,d)}function gi(a,b,c,d,e){c=c.render;var f=b.ref;tg(b,e);d=Ch(a,b,c,d,f,e);if(null!==a&&!ug)return b.updateQueue=a.updateQueue,b.flags&=-517,a.lanes&=~e,hi(a,b,e);b.flags|=1;fi(a,b,d,e);return b.child}\nfunction ii(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!ji(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ki(a,b,g,d,e,f);a=Vg(c.type,null,d,b,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(0===(e&f)&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Je,c(e,d)&&a.ref===b.ref))return hi(a,b,f);b.flags|=1;a=Tg(g,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ki(a,b,c,d,e,f){if(null!==a&&Je(a.memoizedProps,d)&&a.ref===b.ref)if(ug=!1,0!==(f&e))0!==(a.flags&16384)&&(ug=!0);else return b.lanes=a.lanes,hi(a,b,f);return li(a,b,c,d,f)}\nfunction mi(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode||\"unstable-defer-without-hiding\"===d.mode)if(0===(b.mode&4))b.memoizedState={baseLanes:0},ni(b,c);else if(0!==(c&1073741824))b.memoizedState={baseLanes:0},ni(b,null!==f?f.baseLanes:c);else return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a},ni(b,a),null;else null!==f?(d=f.baseLanes|c,b.memoizedState=null):d=c,ni(b,d);fi(a,b,e,c);return b.child}\nfunction oi(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=128}function li(a,b,c,d,e){var f=Ff(c)?Df:M.current;f=Ef(b,f);tg(b,e);c=Ch(a,b,c,d,f,e);if(null!==a&&!ug)return b.updateQueue=a.updateQueue,b.flags&=-517,a.lanes&=~e,hi(a,b,e);b.flags|=1;fi(a,b,c,e);return b.child}\nfunction pi(a,b,c,d,e){if(Ff(c)){var f=!0;Jf(b)}else f=!1;tg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2),Mg(b,c,d),Og(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=vg(l):(l=Ff(c)?Df:M.current,l=Ef(b,l));var n=c.getDerivedStateFromProps,A=\"function\"===typeof n||\"function\"===typeof g.getSnapshotBeforeUpdate;A||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Ng(b,g,d,l);wg=!1;var p=b.memoizedState;g.state=p;Cg(b,d,g,e);k=b.memoizedState;h!==d||p!==k||N.current||wg?(\"function\"===typeof n&&(Gg(b,c,n,d),k=b.memoizedState),(h=wg||Lg(b,c,h,d,p,k,l))?(A||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===\ntypeof g.componentDidMount&&(b.flags|=4)):(\"function\"===typeof g.componentDidMount&&(b.flags|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4),d=!1)}else{g=b.stateNode;yg(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:lg(b.type,h);g.props=l;A=b.pendingProps;p=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=vg(k):(k=Ff(c)?Df:M.current,k=Ef(b,k));var C=c.getDerivedStateFromProps;(n=\"function\"===typeof C||\n\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==A||p!==k)&&Ng(b,g,d,k);wg=!1;p=b.memoizedState;g.state=p;Cg(b,d,g,e);var x=b.memoizedState;h!==A||p!==x||N.current||wg?(\"function\"===typeof C&&(Gg(b,c,C,d),x=b.memoizedState),(l=wg||Lg(b,c,l,d,p,x,k))?(n||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,\nx,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,x,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&p===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&p===a.memoizedState||(b.flags|=256),b.memoizedProps=d,b.memoizedState=x),g.props=d,g.state=x,g.context=k,d=l):(\"function\"!==typeof g.componentDidUpdate||\nh===a.memoizedProps&&p===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&p===a.memoizedState||(b.flags|=256),d=!1)}return qi(a,b,c,d,f,e)}\nfunction qi(a,b,c,d,e,f){oi(a,b);var g=0!==(b.flags&64);if(!d&&!g)return e&&Kf(b,c,!1),hi(a,b,f);d=b.stateNode;ei.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Yg(b,a.child,null,f),b.child=Yg(b,null,h,f)):fi(a,b,h,f);b.memoizedState=d.state;e&&Kf(b,c,!0);return b.child}function ri(a){var b=a.stateNode;b.pendingContext?Hf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Hf(a,b.context,!1);eh(a,b.containerInfo)}\nvar si={dehydrated:null,retryLane:0};\nfunction ti(a,b,c){var d=b.pendingProps,e=P.current,f=!1,g;(g=0!==(b.flags&64))||(g=null!==a&&null===a.memoizedState?!1:0!==(e&2));g?(f=!0,b.flags&=-65):null!==a&&null===a.memoizedState||void 0===d.fallback||!0===d.unstable_avoidThisFallback||(e|=1);I(P,e&1);if(null===a){void 0!==d.fallback&&ph(b);a=d.children;e=d.fallback;if(f)return a=ui(b,a,e,c),b.child.memoizedState={baseLanes:c},b.memoizedState=si,a;if(\"number\"===typeof d.unstable_expectedLoadTime)return a=ui(b,a,e,c),b.child.memoizedState={baseLanes:c},\nb.memoizedState=si,b.lanes=33554432,a;c=vi({mode:\"visible\",children:a},b.mode,c,null);c.return=b;return b.child=c}if(null!==a.memoizedState){if(f)return d=wi(a,b,d.children,d.fallback,c),f=b.child,e=a.child.memoizedState,f.memoizedState=null===e?{baseLanes:c}:{baseLanes:e.baseLanes|c},f.childLanes=a.childLanes&~c,b.memoizedState=si,d;c=xi(a,b,d.children,c);b.memoizedState=null;return c}if(f)return d=wi(a,b,d.children,d.fallback,c),f=b.child,e=a.child.memoizedState,f.memoizedState=null===e?{baseLanes:c}:\n{baseLanes:e.baseLanes|c},f.childLanes=a.childLanes&~c,b.memoizedState=si,d;c=xi(a,b,d.children,c);b.memoizedState=null;return c}function ui(a,b,c,d){var e=a.mode,f=a.child;b={mode:\"hidden\",children:b};0===(e&2)&&null!==f?(f.childLanes=0,f.pendingProps=b):f=vi(b,e,0,null);c=Xg(c,e,d,null);f.return=a;c.return=a;f.sibling=c;a.child=f;return c}\nfunction xi(a,b,c,d){var e=a.child;a=e.sibling;c=Tg(e,{mode:\"visible\",children:c});0===(b.mode&2)&&(c.lanes=d);c.return=b;c.sibling=null;null!==a&&(a.nextEffect=null,a.flags=8,b.firstEffect=b.lastEffect=a);return b.child=c}\nfunction wi(a,b,c,d,e){var f=b.mode,g=a.child;a=g.sibling;var h={mode:\"hidden\",children:c};0===(f&2)&&b.child!==g?(c=b.child,c.childLanes=0,c.pendingProps=h,g=c.lastEffect,null!==g?(b.firstEffect=c.firstEffect,b.lastEffect=g,g.nextEffect=null):b.firstEffect=b.lastEffect=null):c=Tg(g,h);null!==a?d=Tg(a,d):(d=Xg(d,f,e,null),d.flags|=2);d.return=b;c.return=b;c.sibling=d;b.child=c;return d}function yi(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);sg(a.return,b)}\nfunction zi(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailMode=e,g.lastEffect=f)}\nfunction Ai(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;fi(a,b,d.children,c);d=P.current;if(0!==(d&2))d=d&1|2,b.flags|=64;else{if(null!==a&&0!==(a.flags&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&yi(a,c);else if(19===a.tag)yi(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(P,d);if(0===(b.mode&2))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===ih(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);zi(b,!1,e,c,f,b.lastEffect);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===ih(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}zi(b,!0,c,null,f,b.lastEffect);break;case \"together\":zi(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\nfunction hi(a,b,c){null!==a&&(b.dependencies=a.dependencies);Dg|=b.lanes;if(0!==(c&b.childLanes)){if(null!==a&&b.child!==a.child)throw Error(y(153));if(null!==b.child){a=b.child;c=Tg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Tg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}return null}var Bi,Ci,Di,Ei;\nBi=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Ci=function(){};\nDi=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;dh(ah.current);var f=null;switch(c){case \"input\":e=Ya(a,e);d=Ya(a,d);f=[];break;case \"option\":e=eb(a,e);d=eb(a,d);f=[];break;case \"select\":e=m({},e,{value:void 0});d=m({},d,{value:void 0});f=[];break;case \"textarea\":e=gb(a,e);d=gb(a,d);f=[];break;default:\"function\"!==typeof e.onClick&&\"function\"===typeof d.onClick&&(a.onclick=jf)}vb(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if(\"style\"===\nl){var h=e[l];for(g in h)h.hasOwnProperty(g)&&(c||(c={}),c[g]=\"\")}else\"dangerouslySetInnerHTML\"!==l&&\"children\"!==l&&\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&\"autoFocus\"!==l&&(ca.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if(\"style\"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]=\"\");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||\n(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,c)),c=k;else\"dangerouslySetInnerHTML\"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):\"children\"===l?\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(l,\"\"+k):\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&(ca.hasOwnProperty(l)?(null!=k&&\"onScroll\"===l&&G(\"scroll\",a),f||h===k||(f=[])):\"object\"===typeof k&&null!==k&&k.$$typeof===Ga?k.toString():(f=f||[]).push(l,k))}c&&(f=f||[]).push(\"style\",\nc);var l=f;if(b.updateQueue=l)b.flags|=4}};Ei=function(a,b,c,d){c!==d&&(b.flags|=4)};function Fi(a,b){if(!lh)switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction Gi(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return Ff(b.type)&&Gf(),null;case 3:fh();H(N);H(M);uh();d=b.stateNode;d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)rh(b)?b.flags|=4:d.hydrate||(b.flags|=256);Ci(b);return null;case 5:hh(b);var e=dh(ch.current);c=b.type;if(null!==a&&null!=b.stateNode)Di(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=128);else{if(!d){if(null===\nb.stateNode)throw Error(y(166));return null}a=dh(ah.current);if(rh(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[wf]=b;d[xf]=f;switch(c){case \"dialog\":G(\"cancel\",d);G(\"close\",d);break;case \"iframe\":case \"object\":case \"embed\":G(\"load\",d);break;case \"video\":case \"audio\":for(a=0;a<Xe.length;a++)G(Xe[a],d);break;case \"source\":G(\"error\",d);break;case \"img\":case \"image\":case \"link\":G(\"error\",d);G(\"load\",d);break;case \"details\":G(\"toggle\",d);break;case \"input\":Za(d,f);G(\"invalid\",d);break;case \"select\":d._wrapperState=\n{wasMultiple:!!f.multiple};G(\"invalid\",d);break;case \"textarea\":hb(d,f),G(\"invalid\",d)}vb(c,f);a=null;for(var g in f)f.hasOwnProperty(g)&&(e=f[g],\"children\"===g?\"string\"===typeof e?d.textContent!==e&&(a=[\"children\",e]):\"number\"===typeof e&&d.textContent!==\"\"+e&&(a=[\"children\",\"\"+e]):ca.hasOwnProperty(g)&&null!=e&&\"onScroll\"===g&&G(\"scroll\",d));switch(c){case \"input\":Va(d);cb(d,f,!0);break;case \"textarea\":Va(d);jb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&(d.onclick=\njf)}d=a;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;a===kb.html&&(a=lb(c));a===kb.html?\"script\"===c?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[wf]=b;a[xf]=d;Bi(a,b,!1,!1);b.stateNode=a;g=wb(c,d);switch(c){case \"dialog\":G(\"cancel\",a);G(\"close\",a);\ne=d;break;case \"iframe\":case \"object\":case \"embed\":G(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;e<Xe.length;e++)G(Xe[e],a);e=d;break;case \"source\":G(\"error\",a);e=d;break;case \"img\":case \"image\":case \"link\":G(\"error\",a);G(\"load\",a);e=d;break;case \"details\":G(\"toggle\",a);e=d;break;case \"input\":Za(a,d);e=Ya(a,d);G(\"invalid\",a);break;case \"option\":e=eb(a,d);break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};e=m({},d,{value:void 0});G(\"invalid\",a);break;case \"textarea\":hb(a,d);e=\ngb(a,d);G(\"invalid\",a);break;default:e=d}vb(c,e);var h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];\"style\"===f?tb(a,k):\"dangerouslySetInnerHTML\"===f?(k=k?k.__html:void 0,null!=k&&ob(a,k)):\"children\"===f?\"string\"===typeof k?(\"textarea\"!==c||\"\"!==k)&&pb(a,k):\"number\"===typeof k&&pb(a,\"\"+k):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(ca.hasOwnProperty(f)?null!=k&&\"onScroll\"===f&&G(\"scroll\",a):null!=k&&qa(a,f,k,g))}switch(c){case \"input\":Va(a);cb(a,d,!1);\nbreak;case \"textarea\":Va(a);jb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+Sa(d.value));break;case \"select\":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,!0);break;default:\"function\"===typeof e.onClick&&(a.onclick=jf)}mf(c,d)&&(b.flags|=4)}null!==b.ref&&(b.flags|=128)}return null;case 6:if(a&&null!=b.stateNode)Ei(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(y(166));\nc=dh(ch.current);dh(ah.current);rh(b)?(d=b.stateNode,c=b.memoizedProps,d[wf]=b,d.nodeValue!==c&&(b.flags|=4)):(d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[wf]=b,b.stateNode=d)}return null;case 13:H(P);d=b.memoizedState;if(0!==(b.flags&64))return b.lanes=c,b;d=null!==d;c=!1;null===a?void 0!==b.memoizedProps.fallback&&rh(b):c=null!==a.memoizedState;if(d&&!c&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(P.current&1))0===V&&(V=3);else{if(0===V||3===V)V=\n4;null===U||0===(Dg&134217727)&&0===(Hi&134217727)||Ii(U,W)}if(d||c)b.flags|=4;return null;case 4:return fh(),Ci(b),null===a&&cf(b.stateNode.containerInfo),null;case 10:return rg(b),null;case 17:return Ff(b.type)&&Gf(),null;case 19:H(P);d=b.memoizedState;if(null===d)return null;f=0!==(b.flags&64);g=d.rendering;if(null===g)if(f)Fi(d,!1);else{if(0!==V||null!==a&&0!==(a.flags&64))for(a=b.child;null!==a;){g=ih(a);if(null!==g){b.flags|=64;Fi(d,!1);f=g.updateQueue;null!==f&&(b.updateQueue=f,b.flags|=4);\nnull===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=2,f.nextEffect=null,f.firstEffect=null,f.lastEffect=null,g=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,\nf.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;I(P,P.current&1|2);return b.child}a=a.sibling}null!==d.tail&&O()>Ji&&(b.flags|=64,f=!0,Fi(d,!1),b.lanes=33554432)}else{if(!f)if(a=ih(g),null!==a){if(b.flags|=64,f=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Fi(d,!0),null===d.tail&&\"hidden\"===d.tailMode&&!g.alternate&&!lh)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*O()-d.renderingStartTime>Ji&&1073741824!==c&&(b.flags|=\n64,f=!0,Fi(d,!1),b.lanes=33554432);d.isBackwards?(g.sibling=b.child,b.child=g):(c=d.last,null!==c?c.sibling=g:b.child=g,d.last=g)}return null!==d.tail?(c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=O(),c.sibling=null,b=P.current,I(P,f?b&1|2:b&1),c):null;case 23:case 24:return Ki(),null!==a&&null!==a.memoizedState!==(null!==b.memoizedState)&&\"unstable-defer-without-hiding\"!==d.mode&&(b.flags|=4),null}throw Error(y(156,b.tag));}\nfunction Li(a){switch(a.tag){case 1:Ff(a.type)&&Gf();var b=a.flags;return b&4096?(a.flags=b&-4097|64,a):null;case 3:fh();H(N);H(M);uh();b=a.flags;if(0!==(b&64))throw Error(y(285));a.flags=b&-4097|64;return a;case 5:return hh(a),null;case 13:return H(P),b=a.flags,b&4096?(a.flags=b&-4097|64,a):null;case 19:return H(P),null;case 4:return fh(),null;case 10:return rg(a),null;case 23:case 24:return Ki(),null;default:return null}}\nfunction Mi(a,b){try{var c=\"\",d=b;do c+=Qa(d),d=d.return;while(d);var e=c}catch(f){e=\"\\nError generating stack: \"+f.message+\"\\n\"+f.stack}return{value:a,source:b,stack:e}}function Ni(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Oi=\"function\"===typeof WeakMap?WeakMap:Map;function Pi(a,b,c){c=zg(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Qi||(Qi=!0,Ri=d);Ni(a,b)};return c}\nfunction Si(a,b,c){c=zg(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){Ni(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===Ti?Ti=new Set([this]):Ti.add(this),Ni(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}var Ui=\"function\"===typeof WeakSet?WeakSet:Set;\nfunction Vi(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){Wi(a,c)}else b.current=null}function Xi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.flags&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:lg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:b.flags&256&&qf(b.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(y(163));}\nfunction Yi(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{if(3===(a.tag&3)){var d=a.create;a.destroy=d()}a=a.next}while(a!==b)}b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{var e=a;d=e.next;e=e.tag;0!==(e&4)&&0!==(e&1)&&(Zi(c,a),$i(c,a));a=d}while(a!==b)}return;case 1:a=c.stateNode;c.flags&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:lg(c.type,b.memoizedProps),a.componentDidUpdate(d,\nb.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Eg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Eg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.flags&4&&mf(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Cc(c))));\nreturn;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(y(163));}\nfunction aj(a,b){for(var c=a;;){if(5===c.tag){var d=c.stateNode;if(b)d=d.style,\"function\"===typeof d.setProperty?d.setProperty(\"display\",\"none\",\"important\"):d.display=\"none\";else{d=c.stateNode;var e=c.memoizedProps.style;e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null;d.style.display=sb(\"display\",e)}}else if(6===c.tag)c.stateNode.nodeValue=b?\"\":c.memoizedProps;else if((23!==c.tag&&24!==c.tag||null===c.memoizedState||c===a)&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===\na)break;for(;null===c.sibling;){if(null===c.return||c.return===a)return;c=c.return}c.sibling.return=c.return;c=c.sibling}}\nfunction bj(a,b){if(Mf&&\"function\"===typeof Mf.onCommitFiberUnmount)try{Mf.onCommitFiberUnmount(Lf,b)}catch(f){}switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var c=a=a.next;do{var d=c,e=d.destroy;d=d.tag;if(void 0!==e)if(0!==(d&4))Zi(b,c);else{d=b;try{e()}catch(f){Wi(d,f)}}c=c.next}while(c!==a)}break;case 1:Vi(b);a=b.stateNode;if(\"function\"===typeof a.componentWillUnmount)try{a.props=b.memoizedProps,a.state=b.memoizedState,a.componentWillUnmount()}catch(f){Wi(b,\nf)}break;case 5:Vi(b);break;case 4:cj(a,b)}}function dj(a){a.alternate=null;a.child=null;a.dependencies=null;a.firstEffect=null;a.lastEffect=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.return=null;a.updateQueue=null}function ej(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction fj(a){a:{for(var b=a.return;null!==b;){if(ej(b))break a;b=b.return}throw Error(y(160));}var c=b;b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(y(161));}c.flags&16&&(pb(b,\"\"),c.flags&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||ej(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.flags&2)continue b;if(null===\nc.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.flags&2)){c=c.stateNode;break a}}d?gj(a,c,b):hj(a,c,b)}\nfunction gj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=jf));else if(4!==d&&(a=a.child,null!==a))for(gj(a,b,c),a=a.sibling;null!==a;)gj(a,b,c),a=a.sibling}\nfunction hj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(hj(a,b,c),a=a.sibling;null!==a;)hj(a,b,c),a=a.sibling}\nfunction cj(a,b){for(var c=b,d=!1,e,f;;){if(!d){d=c.return;a:for(;;){if(null===d)throw Error(y(160));e=d.stateNode;switch(d.tag){case 5:f=!1;break a;case 3:e=e.containerInfo;f=!0;break a;case 4:e=e.containerInfo;f=!0;break a}d=d.return}d=!0}if(5===c.tag||6===c.tag){a:for(var g=a,h=c,k=h;;)if(bj(g,k),null!==k.child&&4!==k.tag)k.child.return=k,k=k.child;else{if(k===h)break a;for(;null===k.sibling;){if(null===k.return||k.return===h)break a;k=k.return}k.sibling.return=k.return;k=k.sibling}f?(g=e,h=c.stateNode,\n8===g.nodeType?g.parentNode.removeChild(h):g.removeChild(h)):e.removeChild(c.stateNode)}else if(4===c.tag){if(null!==c.child){e=c.stateNode.containerInfo;f=!0;c.child.return=c;c=c.child;continue}}else if(bj(a,c),null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return;4===c.tag&&(d=!1)}c.sibling.return=c.return;c=c.sibling}}\nfunction ij(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:var c=b.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do 3===(d.tag&3)&&(a=d.destroy,d.destroy=void 0,void 0!==a&&a()),d=d.next;while(d!==c)}return;case 1:return;case 5:c=b.stateNode;if(null!=c){d=b.memoizedProps;var e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[xf]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&$a(c,d);wb(a,e);b=wb(a,d);for(e=0;e<f.length;e+=\n2){var g=f[e],h=f[e+1];\"style\"===g?tb(c,h):\"dangerouslySetInnerHTML\"===g?ob(c,h):\"children\"===g?pb(c,h):qa(c,g,h,b)}switch(a){case \"input\":ab(c,d);break;case \"textarea\":ib(c,d);break;case \"select\":a=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,f=d.value,null!=f?fb(c,!!d.multiple,f,!1):a!==!!d.multiple&&(null!=d.defaultValue?fb(c,!!d.multiple,d.defaultValue,!0):fb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}return;case 6:if(null===b.stateNode)throw Error(y(162));b.stateNode.nodeValue=\nb.memoizedProps;return;case 3:c=b.stateNode;c.hydrate&&(c.hydrate=!1,Cc(c.containerInfo));return;case 12:return;case 13:null!==b.memoizedState&&(jj=O(),aj(b.child,!0));kj(b);return;case 19:kj(b);return;case 17:return;case 23:case 24:aj(b,null!==b.memoizedState);return}throw Error(y(163));}function kj(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Ui);b.forEach(function(b){var d=lj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction mj(a,b){return null!==a&&(a=a.memoizedState,null===a||null!==a.dehydrated)?(b=b.memoizedState,null!==b&&null===b.dehydrated):!1}var nj=Math.ceil,oj=ra.ReactCurrentDispatcher,pj=ra.ReactCurrentOwner,X=0,U=null,Y=null,W=0,qj=0,rj=Bf(0),V=0,sj=null,tj=0,Dg=0,Hi=0,uj=0,vj=null,jj=0,Ji=Infinity;function wj(){Ji=O()+500}var Z=null,Qi=!1,Ri=null,Ti=null,xj=!1,yj=null,zj=90,Aj=[],Bj=[],Cj=null,Dj=0,Ej=null,Fj=-1,Gj=0,Hj=0,Ij=null,Jj=!1;function Hg(){return 0!==(X&48)?O():-1!==Fj?Fj:Fj=O()}\nfunction Ig(a){a=a.mode;if(0===(a&2))return 1;if(0===(a&4))return 99===eg()?1:2;0===Gj&&(Gj=tj);if(0!==kg.transition){0!==Hj&&(Hj=null!==vj?vj.pendingLanes:0);a=Gj;var b=4186112&~Hj;b&=-b;0===b&&(a=4186112&~a,b=a&-a,0===b&&(b=8192));return b}a=eg();0!==(X&4)&&98===a?a=Xc(12,Gj):(a=Sc(a),a=Xc(a,Gj));return a}\nfunction Jg(a,b,c){if(50<Dj)throw Dj=0,Ej=null,Error(y(185));a=Kj(a,b);if(null===a)return null;$c(a,b,c);a===U&&(Hi|=b,4===V&&Ii(a,W));var d=eg();1===b?0!==(X&8)&&0===(X&48)?Lj(a):(Mj(a,c),0===X&&(wj(),ig())):(0===(X&4)||98!==d&&99!==d||(null===Cj?Cj=new Set([a]):Cj.add(a)),Mj(a,c));vj=a}function Kj(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}\nfunction Mj(a,b){for(var c=a.callbackNode,d=a.suspendedLanes,e=a.pingedLanes,f=a.expirationTimes,g=a.pendingLanes;0<g;){var h=31-Vc(g),k=1<<h,l=f[h];if(-1===l){if(0===(k&d)||0!==(k&e)){l=b;Rc(k);var n=F;f[h]=10<=n?l+250:6<=n?l+5E3:-1}}else l<=b&&(a.expiredLanes|=k);g&=~k}d=Uc(a,a===U?W:0);b=F;if(0===d)null!==c&&(c!==Zf&&Pf(c),a.callbackNode=null,a.callbackPriority=0);else{if(null!==c){if(a.callbackPriority===b)return;c!==Zf&&Pf(c)}15===b?(c=Lj.bind(null,a),null===ag?(ag=[c],bg=Of(Uf,jg)):ag.push(c),\nc=Zf):14===b?c=hg(99,Lj.bind(null,a)):(c=Tc(b),c=hg(c,Nj.bind(null,a)));a.callbackPriority=b;a.callbackNode=c}}\nfunction Nj(a){Fj=-1;Hj=Gj=0;if(0!==(X&48))throw Error(y(327));var b=a.callbackNode;if(Oj()&&a.callbackNode!==b)return null;var c=Uc(a,a===U?W:0);if(0===c)return null;var d=c;var e=X;X|=16;var f=Pj();if(U!==a||W!==d)wj(),Qj(a,d);do try{Rj();break}catch(h){Sj(a,h)}while(1);qg();oj.current=f;X=e;null!==Y?d=0:(U=null,W=0,d=V);if(0!==(tj&Hi))Qj(a,0);else if(0!==d){2===d&&(X|=64,a.hydrate&&(a.hydrate=!1,qf(a.containerInfo)),c=Wc(a),0!==c&&(d=Tj(a,c)));if(1===d)throw b=sj,Qj(a,0),Ii(a,c),Mj(a,O()),b;a.finishedWork=\na.current.alternate;a.finishedLanes=c;switch(d){case 0:case 1:throw Error(y(345));case 2:Uj(a);break;case 3:Ii(a,c);if((c&62914560)===c&&(d=jj+500-O(),10<d)){if(0!==Uc(a,0))break;e=a.suspendedLanes;if((e&c)!==c){Hg();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=of(Uj.bind(null,a),d);break}Uj(a);break;case 4:Ii(a,c);if((c&4186112)===c)break;d=a.eventTimes;for(e=-1;0<c;){var g=31-Vc(c);f=1<<g;g=d[g];g>e&&(e=g);c&=~f}c=e;c=O()-c;c=(120>c?120:480>c?480:1080>c?1080:1920>c?1920:3E3>c?3E3:4320>\nc?4320:1960*nj(c/1960))-c;if(10<c){a.timeoutHandle=of(Uj.bind(null,a),c);break}Uj(a);break;case 5:Uj(a);break;default:throw Error(y(329));}}Mj(a,O());return a.callbackNode===b?Nj.bind(null,a):null}function Ii(a,b){b&=~uj;b&=~Hi;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-Vc(b),d=1<<c;a[c]=-1;b&=~d}}\nfunction Lj(a){if(0!==(X&48))throw Error(y(327));Oj();if(a===U&&0!==(a.expiredLanes&W)){var b=W;var c=Tj(a,b);0!==(tj&Hi)&&(b=Uc(a,b),c=Tj(a,b))}else b=Uc(a,0),c=Tj(a,b);0!==a.tag&&2===c&&(X|=64,a.hydrate&&(a.hydrate=!1,qf(a.containerInfo)),b=Wc(a),0!==b&&(c=Tj(a,b)));if(1===c)throw c=sj,Qj(a,0),Ii(a,b),Mj(a,O()),c;a.finishedWork=a.current.alternate;a.finishedLanes=b;Uj(a);Mj(a,O());return null}\nfunction Vj(){if(null!==Cj){var a=Cj;Cj=null;a.forEach(function(a){a.expiredLanes|=24&a.pendingLanes;Mj(a,O())})}ig()}function Wj(a,b){var c=X;X|=1;try{return a(b)}finally{X=c,0===X&&(wj(),ig())}}function Xj(a,b){var c=X;X&=-2;X|=8;try{return a(b)}finally{X=c,0===X&&(wj(),ig())}}function ni(a,b){I(rj,qj);qj|=b;tj|=b}function Ki(){qj=rj.current;H(rj)}\nfunction Qj(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,pf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&Gf();break;case 3:fh();H(N);H(M);uh();break;case 5:hh(d);break;case 4:fh();break;case 13:H(P);break;case 19:H(P);break;case 10:rg(d);break;case 23:case 24:Ki()}c=c.return}U=a;Y=Tg(a.current,null);W=qj=tj=b;V=0;sj=null;uj=Hi=Dg=0}\nfunction Sj(a,b){do{var c=Y;try{qg();vh.current=Gh;if(yh){for(var d=R.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}yh=!1}xh=0;T=S=R=null;zh=!1;pj.current=null;if(null===c||null===c.return){V=1;sj=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=W;h.flags|=2048;h.firstEffect=h.lastEffect=null;if(null!==k&&\"object\"===typeof k&&\"function\"===typeof k.then){var l=k;if(0===(h.mode&2)){var n=h.alternate;n?(h.updateQueue=n.updateQueue,h.memoizedState=n.memoizedState,h.lanes=n.lanes):\n(h.updateQueue=null,h.memoizedState=null)}var A=0!==(P.current&1),p=g;do{var C;if(C=13===p.tag){var x=p.memoizedState;if(null!==x)C=null!==x.dehydrated?!0:!1;else{var w=p.memoizedProps;C=void 0===w.fallback?!1:!0!==w.unstable_avoidThisFallback?!0:A?!1:!0}}if(C){var z=p.updateQueue;if(null===z){var u=new Set;u.add(l);p.updateQueue=u}else z.add(l);if(0===(p.mode&2)){p.flags|=64;h.flags|=16384;h.flags&=-2981;if(1===h.tag)if(null===h.alternate)h.tag=17;else{var t=zg(-1,1);t.tag=2;Ag(h,t)}h.lanes|=1;break a}k=\nvoid 0;h=b;var q=f.pingCache;null===q?(q=f.pingCache=new Oi,k=new Set,q.set(l,k)):(k=q.get(l),void 0===k&&(k=new Set,q.set(l,k)));if(!k.has(h)){k.add(h);var v=Yj.bind(null,f,l,h);l.then(v,v)}p.flags|=4096;p.lanes=b;break a}p=p.return}while(null!==p);k=Error((Ra(h.type)||\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\")}5!==V&&(V=2);k=Mi(k,h);p=\ng;do{switch(p.tag){case 3:f=k;p.flags|=4096;b&=-b;p.lanes|=b;var J=Pi(p,f,b);Bg(p,J);break a;case 1:f=k;var K=p.type,Q=p.stateNode;if(0===(p.flags&64)&&(\"function\"===typeof K.getDerivedStateFromError||null!==Q&&\"function\"===typeof Q.componentDidCatch&&(null===Ti||!Ti.has(Q)))){p.flags|=4096;b&=-b;p.lanes|=b;var L=Si(p,f,b);Bg(p,L);break a}}p=p.return}while(null!==p)}Zj(c)}catch(va){b=va;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}\nfunction Pj(){var a=oj.current;oj.current=Gh;return null===a?Gh:a}function Tj(a,b){var c=X;X|=16;var d=Pj();U===a&&W===b||Qj(a,b);do try{ak();break}catch(e){Sj(a,e)}while(1);qg();X=c;oj.current=d;if(null!==Y)throw Error(y(261));U=null;W=0;return V}function ak(){for(;null!==Y;)bk(Y)}function Rj(){for(;null!==Y&&!Qf();)bk(Y)}function bk(a){var b=ck(a.alternate,a,qj);a.memoizedProps=a.pendingProps;null===b?Zj(a):Y=b;pj.current=null}\nfunction Zj(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&2048)){c=Gi(c,b,qj);if(null!==c){Y=c;return}c=b;if(24!==c.tag&&23!==c.tag||null===c.memoizedState||0!==(qj&1073741824)||0===(c.mode&4)){for(var d=0,e=c.child;null!==e;)d|=e.lanes|e.childLanes,e=e.sibling;c.childLanes=d}null!==a&&0===(a.flags&2048)&&(null===a.firstEffect&&(a.firstEffect=b.firstEffect),null!==b.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=b.firstEffect),a.lastEffect=b.lastEffect),1<b.flags&&(null!==\na.lastEffect?a.lastEffect.nextEffect=b:a.firstEffect=b,a.lastEffect=b))}else{c=Li(b);if(null!==c){c.flags&=2047;Y=c;return}null!==a&&(a.firstEffect=a.lastEffect=null,a.flags|=2048)}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===V&&(V=5)}function Uj(a){var b=eg();gg(99,dk.bind(null,a,b));return null}\nfunction dk(a,b){do Oj();while(null!==yj);if(0!==(X&48))throw Error(y(327));var c=a.finishedWork;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(y(177));a.callbackNode=null;var d=c.lanes|c.childLanes,e=d,f=a.pendingLanes&~e;a.pendingLanes=e;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=e;a.mutableReadLanes&=e;a.entangledLanes&=e;e=a.entanglements;for(var g=a.eventTimes,h=a.expirationTimes;0<f;){var k=31-Vc(f),l=1<<k;e[k]=0;g[k]=-1;h[k]=-1;f&=~l}null!==\nCj&&0===(d&24)&&Cj.has(a)&&Cj.delete(a);a===U&&(Y=U=null,W=0);1<c.flags?null!==c.lastEffect?(c.lastEffect.nextEffect=c,d=c.firstEffect):d=c:d=c.firstEffect;if(null!==d){e=X;X|=32;pj.current=null;kf=fd;g=Ne();if(Oe(g)){if(\"selectionStart\"in g)h={start:g.selectionStart,end:g.selectionEnd};else a:if(h=(h=g.ownerDocument)&&h.defaultView||window,(l=h.getSelection&&h.getSelection())&&0!==l.rangeCount){h=l.anchorNode;f=l.anchorOffset;k=l.focusNode;l=l.focusOffset;try{h.nodeType,k.nodeType}catch(va){h=null;\nbreak a}var n=0,A=-1,p=-1,C=0,x=0,w=g,z=null;b:for(;;){for(var u;;){w!==h||0!==f&&3!==w.nodeType||(A=n+f);w!==k||0!==l&&3!==w.nodeType||(p=n+l);3===w.nodeType&&(n+=w.nodeValue.length);if(null===(u=w.firstChild))break;z=w;w=u}for(;;){if(w===g)break b;z===h&&++C===f&&(A=n);z===k&&++x===l&&(p=n);if(null!==(u=w.nextSibling))break;w=z;z=w.parentNode}w=u}h=-1===A||-1===p?null:{start:A,end:p}}else h=null;h=h||{start:0,end:0}}else h=null;lf={focusedElem:g,selectionRange:h};fd=!1;Ij=null;Jj=!1;Z=d;do try{ek()}catch(va){if(null===\nZ)throw Error(y(330));Wi(Z,va);Z=Z.nextEffect}while(null!==Z);Ij=null;Z=d;do try{for(g=a;null!==Z;){var t=Z.flags;t&16&&pb(Z.stateNode,\"\");if(t&128){var q=Z.alternate;if(null!==q){var v=q.ref;null!==v&&(\"function\"===typeof v?v(null):v.current=null)}}switch(t&1038){case 2:fj(Z);Z.flags&=-3;break;case 6:fj(Z);Z.flags&=-3;ij(Z.alternate,Z);break;case 1024:Z.flags&=-1025;break;case 1028:Z.flags&=-1025;ij(Z.alternate,Z);break;case 4:ij(Z.alternate,Z);break;case 8:h=Z;cj(g,h);var J=h.alternate;dj(h);null!==\nJ&&dj(J)}Z=Z.nextEffect}}catch(va){if(null===Z)throw Error(y(330));Wi(Z,va);Z=Z.nextEffect}while(null!==Z);v=lf;q=Ne();t=v.focusedElem;g=v.selectionRange;if(q!==t&&t&&t.ownerDocument&&Me(t.ownerDocument.documentElement,t)){null!==g&&Oe(t)&&(q=g.start,v=g.end,void 0===v&&(v=q),\"selectionStart\"in t?(t.selectionStart=q,t.selectionEnd=Math.min(v,t.value.length)):(v=(q=t.ownerDocument||document)&&q.defaultView||window,v.getSelection&&(v=v.getSelection(),h=t.textContent.length,J=Math.min(g.start,h),g=void 0===\ng.end?J:Math.min(g.end,h),!v.extend&&J>g&&(h=g,g=J,J=h),h=Le(t,J),f=Le(t,g),h&&f&&(1!==v.rangeCount||v.anchorNode!==h.node||v.anchorOffset!==h.offset||v.focusNode!==f.node||v.focusOffset!==f.offset)&&(q=q.createRange(),q.setStart(h.node,h.offset),v.removeAllRanges(),J>g?(v.addRange(q),v.extend(f.node,f.offset)):(q.setEnd(f.node,f.offset),v.addRange(q))))));q=[];for(v=t;v=v.parentNode;)1===v.nodeType&&q.push({element:v,left:v.scrollLeft,top:v.scrollTop});\"function\"===typeof t.focus&&t.focus();for(t=\n0;t<q.length;t++)v=q[t],v.element.scrollLeft=v.left,v.element.scrollTop=v.top}fd=!!kf;lf=kf=null;a.current=c;Z=d;do try{for(t=a;null!==Z;){var K=Z.flags;K&36&&Yi(t,Z.alternate,Z);if(K&128){q=void 0;var Q=Z.ref;if(null!==Q){var L=Z.stateNode;switch(Z.tag){case 5:q=L;break;default:q=L}\"function\"===typeof Q?Q(q):Q.current=q}}Z=Z.nextEffect}}catch(va){if(null===Z)throw Error(y(330));Wi(Z,va);Z=Z.nextEffect}while(null!==Z);Z=null;$f();X=e}else a.current=c;if(xj)xj=!1,yj=a,zj=b;else for(Z=d;null!==Z;)b=\nZ.nextEffect,Z.nextEffect=null,Z.flags&8&&(K=Z,K.sibling=null,K.stateNode=null),Z=b;d=a.pendingLanes;0===d&&(Ti=null);1===d?a===Ej?Dj++:(Dj=0,Ej=a):Dj=0;c=c.stateNode;if(Mf&&\"function\"===typeof Mf.onCommitFiberRoot)try{Mf.onCommitFiberRoot(Lf,c,void 0,64===(c.current.flags&64))}catch(va){}Mj(a,O());if(Qi)throw Qi=!1,a=Ri,Ri=null,a;if(0!==(X&8))return null;ig();return null}\nfunction ek(){for(;null!==Z;){var a=Z.alternate;Jj||null===Ij||(0!==(Z.flags&8)?dc(Z,Ij)&&(Jj=!0):13===Z.tag&&mj(a,Z)&&dc(Z,Ij)&&(Jj=!0));var b=Z.flags;0!==(b&256)&&Xi(a,Z);0===(b&512)||xj||(xj=!0,hg(97,function(){Oj();return null}));Z=Z.nextEffect}}function Oj(){if(90!==zj){var a=97<zj?97:zj;zj=90;return gg(a,fk)}return!1}function $i(a,b){Aj.push(b,a);xj||(xj=!0,hg(97,function(){Oj();return null}))}function Zi(a,b){Bj.push(b,a);xj||(xj=!0,hg(97,function(){Oj();return null}))}\nfunction fk(){if(null===yj)return!1;var a=yj;yj=null;if(0!==(X&48))throw Error(y(331));var b=X;X|=32;var c=Bj;Bj=[];for(var d=0;d<c.length;d+=2){var e=c[d],f=c[d+1],g=e.destroy;e.destroy=void 0;if(\"function\"===typeof g)try{g()}catch(k){if(null===f)throw Error(y(330));Wi(f,k)}}c=Aj;Aj=[];for(d=0;d<c.length;d+=2){e=c[d];f=c[d+1];try{var h=e.create;e.destroy=h()}catch(k){if(null===f)throw Error(y(330));Wi(f,k)}}for(h=a.current.firstEffect;null!==h;)a=h.nextEffect,h.nextEffect=null,h.flags&8&&(h.sibling=\nnull,h.stateNode=null),h=a;X=b;ig();return!0}function gk(a,b,c){b=Mi(c,b);b=Pi(a,b,1);Ag(a,b);b=Hg();a=Kj(a,1);null!==a&&($c(a,1,b),Mj(a,b))}\nfunction Wi(a,b){if(3===a.tag)gk(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){gk(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ti||!Ti.has(d))){a=Mi(b,a);var e=Si(c,a,1);Ag(c,e);e=Hg();c=Kj(c,1);if(null!==c)$c(c,1,e),Mj(c,e);else if(\"function\"===typeof d.componentDidCatch&&(null===Ti||!Ti.has(d)))try{d.componentDidCatch(b,a)}catch(f){}break}}c=c.return}}\nfunction Yj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=Hg();a.pingedLanes|=a.suspendedLanes&c;U===a&&(W&c)===c&&(4===V||3===V&&(W&62914560)===W&&500>O()-jj?Qj(a,0):uj|=c);Mj(a,b)}function lj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=a.mode,0===(b&2)?b=1:0===(b&4)?b=99===eg()?1:2:(0===Gj&&(Gj=tj),b=Yc(62914560&~Gj),0===b&&(b=4194304)));c=Hg();a=Kj(a,b);null!==a&&($c(a,b,c),Mj(a,c))}var ck;\nck=function(a,b,c){var d=b.lanes;if(null!==a)if(a.memoizedProps!==b.pendingProps||N.current)ug=!0;else if(0!==(c&d))ug=0!==(a.flags&16384)?!0:!1;else{ug=!1;switch(b.tag){case 3:ri(b);sh();break;case 5:gh(b);break;case 1:Ff(b.type)&&Jf(b);break;case 4:eh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;var e=b.type._context;I(mg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){if(0!==(c&b.child.childLanes))return ti(a,b,c);I(P,P.current&1);b=hi(a,b,c);return null!==\nb?b.sibling:null}I(P,P.current&1);break;case 19:d=0!==(c&b.childLanes);if(0!==(a.flags&64)){if(d)return Ai(a,b,c);b.flags|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);I(P,P.current);if(d)break;else return null;case 23:case 24:return b.lanes=0,mi(a,b,c)}return hi(a,b,c)}else ug=!1;b.lanes=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);a=b.pendingProps;e=Ef(b,M.current);tg(b,c);e=Ch(null,b,d,a,e,c);b.flags|=1;if(\"object\"===\ntypeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(Ff(d)){var f=!0;Jf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;xg(b);var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Gg(b,d,g,a);e.updater=Kg;b.stateNode=e;e._reactInternals=b;Og(b,d,a,c);b=qi(null,b,d,!0,f,c)}else b.tag=0,fi(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;a:{null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);\na=b.pendingProps;f=e._init;e=f(e._payload);b.type=e;f=b.tag=hk(e);a=lg(e,a);switch(f){case 0:b=li(null,b,e,a,c);break a;case 1:b=pi(null,b,e,a,c);break a;case 11:b=gi(null,b,e,a,c);break a;case 14:b=ii(null,b,e,lg(e.type,a),d,c);break a}throw Error(y(306,e,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),li(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),pi(a,b,d,e,c);case 3:ri(b);d=b.updateQueue;if(null===a||null===d)throw Error(y(282));\nd=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;yg(a,b);Cg(b,d,null,c);d=b.memoizedState.element;if(d===e)sh(),b=hi(a,b,c);else{e=b.stateNode;if(f=e.hydrate)kh=rf(b.stateNode.containerInfo.firstChild),jh=b,f=lh=!0;if(f){a=e.mutableSourceEagerHydrationData;if(null!=a)for(e=0;e<a.length;e+=2)f=a[e],f._workInProgressVersionPrimary=a[e+1],th.push(f);c=Zg(b,null,d,c);for(b.child=c;c;)c.flags=c.flags&-3|1024,c=c.sibling}else fi(a,b,d,c),sh();b=b.child}return b;case 5:return gh(b),null===a&&\nph(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,nf(d,e)?g=null:null!==f&&nf(d,f)&&(b.flags|=16),oi(a,b),fi(a,b,g,c),b.child;case 6:return null===a&&ph(b),null;case 13:return ti(a,b,c);case 4:return eh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Yg(b,null,d,c):fi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),gi(a,b,d,e,c);case 7:return fi(a,b,b.pendingProps,c),b.child;case 8:return fi(a,b,b.pendingProps.children,\nc),b.child;case 12:return fi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;I(mg,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=He(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!N.current){b=hi(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=\nk.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=zg(-1,c&-c),l.tag=2,Ag(h,l));h.lanes|=c;l=h.alternate;null!==l&&(l.lanes|=c);sg(h.return,c);k.lanes|=c;break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}fi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,tg(b,c),e=vg(e,\nf.unstable_observedBits),d=d(e),b.flags|=1,fi(a,b,d,c),b.child;case 14:return e=b.type,f=lg(e,b.pendingProps),f=lg(e.type,f),ii(a,b,e,f,d,c);case 15:return ki(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2),b.tag=1,Ff(d)?(a=!0,Jf(b)):a=!1,tg(b,c),Mg(b,d,e),Og(b,d,e,c),qi(null,b,d,!0,a,c);case 19:return Ai(a,b,c);case 23:return mi(a,b,c);case 24:return mi(a,b,c)}throw Error(y(156,b.tag));\n};function ik(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.flags=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childLanes=this.lanes=0;this.alternate=null}function nh(a,b,c,d){return new ik(a,b,c,d)}function ji(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction hk(a){if(\"function\"===typeof a)return ji(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Aa)return 11;if(a===Da)return 14}return 2}\nfunction Tg(a,b){var c=a.alternate;null===c?(c=nh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Vg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)ji(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ua:return Xg(c.children,e,f,b);case Ha:g=8;e|=16;break;case wa:g=8;e|=1;break;case xa:return a=nh(12,c,b,e|8),a.elementType=xa,a.type=xa,a.lanes=f,a;case Ba:return a=nh(13,c,b,e),a.type=Ba,a.elementType=Ba,a.lanes=f,a;case Ca:return a=nh(19,c,b,e),a.elementType=Ca,a.lanes=f,a;case Ia:return vi(c,e,f,b);case Ja:return a=nh(24,c,b,e),a.elementType=Ja,a.lanes=f,a;default:if(\"object\"===\ntypeof a&&null!==a)switch(a.$$typeof){case ya:g=10;break a;case za:g=9;break a;case Aa:g=11;break a;case Da:g=14;break a;case Ea:g=16;d=null;break a;case Fa:g=22;break a}throw Error(y(130,null==a?a:typeof a,\"\"));}b=nh(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Xg(a,b,c,d){a=nh(7,a,d,b);a.lanes=c;return a}function vi(a,b,c,d){a=nh(23,a,d,b);a.elementType=Ia;a.lanes=c;return a}function Ug(a,b,c){a=nh(6,a,null,b);a.lanes=c;return a}\nfunction Wg(a,b,c){b=nh(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction jk(a,b,c){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=0;this.eventTimes=Zc(0);this.expirationTimes=Zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=Zc(0);this.mutableSourceEagerHydrationData=null}\nfunction kk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:ta,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nfunction lk(a,b,c,d){var e=b.current,f=Hg(),g=Ig(e);a:if(c){c=c._reactInternals;b:{if(Zb(c)!==c||1!==c.tag)throw Error(y(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(Ff(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(y(171));}if(1===c.tag){var k=c.type;if(Ff(k)){c=If(c,k,h);break a}}c=h}else c=Cf;null===b.context?b.context=c:b.pendingContext=c;b=zg(f,g);b.payload={element:a};d=void 0===d?null:d;null!==\nd&&(b.callback=d);Ag(e,b);Jg(e,g,f);return g}function mk(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function nk(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function ok(a,b){nk(a,b);(a=a.alternate)&&nk(a,b)}function pk(){return null}\nfunction qk(a,b,c){var d=null!=c&&null!=c.hydrationOptions&&c.hydrationOptions.mutableSources||null;c=new jk(a,b,null!=c&&!0===c.hydrate);b=nh(3,null,null,2===b?7:1===b?3:0);c.current=b;b.stateNode=c;xg(b);a[ff]=c.current;cf(8===a.nodeType?a.parentNode:a);if(d)for(a=0;a<d.length;a++){b=d[a];var e=b._getVersion;e=e(b._source);null==c.mutableSourceEagerHydrationData?c.mutableSourceEagerHydrationData=[b,e]:c.mutableSourceEagerHydrationData.push(b,e)}this._internalRoot=c}\nqk.prototype.render=function(a){lk(a,this._internalRoot,null,null)};qk.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;lk(null,a,null,function(){b[ff]=null})};function rk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}\nfunction sk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new qk(a,0,b?{hydrate:!0}:void 0)}\nfunction tk(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=mk(g);h.call(a)}}lk(b,g,a,e)}else{f=c._reactRootContainer=sk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=mk(g);k.call(a)}}Xj(function(){lk(b,g,a,e)})}return mk(g)}ec=function(a){if(13===a.tag){var b=Hg();Jg(a,4,b);ok(a,4)}};fc=function(a){if(13===a.tag){var b=Hg();Jg(a,67108864,b);ok(a,67108864)}};\ngc=function(a){if(13===a.tag){var b=Hg(),c=Ig(a);Jg(a,c,b);ok(a,c)}};hc=function(a,b){return b()};\nyb=function(a,b,c){switch(b){case \"input\":ab(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(y(90));Wa(d);ab(d,e)}}}break;case \"textarea\":ib(a,c);break;case \"select\":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Wj;\nHb=function(a,b,c,d,e){var f=X;X|=4;try{return gg(98,a.bind(null,b,c,d,e))}finally{X=f,0===X&&(wj(),ig())}};Ib=function(){0===(X&49)&&(Vj(),Oj())};Jb=function(a,b){var c=X;X|=2;try{return a(b)}finally{X=c,0===X&&(wj(),ig())}};function uk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!rk(b))throw Error(y(200));return kk(a,b,null,c)}var vk={Events:[Cb,ue,Db,Eb,Fb,Oj,{current:!1}]},wk={findFiberByHostInstance:wc,bundleType:0,version:\"17.0.2\",rendererPackageName:\"react-dom\"};\nvar xk={bundleType:wk.bundleType,version:wk.version,rendererPackageName:wk.rendererPackageName,rendererConfig:wk.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ra.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=cc(a);return null===a?null:a.stateNode},findFiberByHostInstance:wk.findFiberByHostInstance||\npk,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if(\"undefined\"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var yk=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!yk.isDisabled&&yk.supportsFiber)try{Lf=yk.inject(xk),Mf=yk}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=vk;exports.createPortal=uk;\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if(\"function\"===typeof a.render)throw Error(y(188));throw Error(y(268,Object.keys(a)));}a=cc(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a,b){var c=X;if(0!==(c&48))return a(b);X|=1;try{if(a)return gg(99,a.bind(null,b))}finally{X=c,ig()}};exports.hydrate=function(a,b,c){if(!rk(b))throw Error(y(200));return tk(null,a,b,!0,c)};\nexports.render=function(a,b,c){if(!rk(b))throw Error(y(200));return tk(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!rk(a))throw Error(y(40));return a._reactRootContainer?(Xj(function(){tk(null,null,a,!1,function(){a._reactRootContainer=null;a[ff]=null})}),!0):!1};exports.unstable_batchedUpdates=Wj;exports.unstable_createPortal=function(a,b){return uk(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!rk(c))throw Error(y(200));if(null==a||void 0===a._reactInternals)throw Error(y(38));return tk(a,b,c,!1,d)};exports.version=\"17.0.2\";\n\n\n/***/ }),\n\n/***/ 8316:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (false) {}\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (true) {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = __webpack_require__(2967);\n} else {}\n\n\n/***/ }),\n\n/***/ 6866:\n/***/ ((__unused_webpack_module, exports) => {\n\n\"use strict\";\n/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n\n\n/***/ }),\n\n/***/ 8570:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nif (true) {\n  module.exports = __webpack_require__(6866);\n} else {}\n\n\n/***/ }),\n\n/***/ 8559:\n/***/ ((__unused_webpack_module, exports) => {\n\n\"use strict\";\nvar __webpack_unused_export__;\n/** @license React v17.0.2\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131;\nif(\"function\"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x(\"react.element\");c=x(\"react.portal\");d=x(\"react.fragment\");e=x(\"react.strict_mode\");f=x(\"react.profiler\");g=x(\"react.provider\");h=x(\"react.context\");k=x(\"react.forward_ref\");l=x(\"react.suspense\");m=x(\"react.suspense_list\");n=x(\"react.memo\");p=x(\"react.lazy\");q=x(\"react.block\");r=x(\"react.server.block\");u=x(\"react.fundamental\");v=x(\"react.debug_trace_mode\");w=x(\"react.legacy_hidden\")}\nfunction y(a){if(\"object\"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k,C=d,D=p,E=n,F=c,G=f,H=e,I=l;__webpack_unused_export__=h;__webpack_unused_export__=z;__webpack_unused_export__=A;__webpack_unused_export__=B;__webpack_unused_export__=C;__webpack_unused_export__=D;__webpack_unused_export__=E;__webpack_unused_export__=F;__webpack_unused_export__=G;__webpack_unused_export__=H;\n__webpack_unused_export__=I;__webpack_unused_export__=function(){return!1};__webpack_unused_export__=function(){return!1};__webpack_unused_export__=function(a){return y(a)===h};__webpack_unused_export__=function(a){return y(a)===g};__webpack_unused_export__=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};__webpack_unused_export__=function(a){return y(a)===k};__webpack_unused_export__=function(a){return y(a)===d};__webpack_unused_export__=function(a){return y(a)===p};__webpack_unused_export__=function(a){return y(a)===n};\n__webpack_unused_export__=function(a){return y(a)===c};__webpack_unused_export__=function(a){return y(a)===f};__webpack_unused_export__=function(a){return y(a)===e};__webpack_unused_export__=function(a){return y(a)===l};__webpack_unused_export__=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||\"object\"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k||a.$$typeof===u||a.$$typeof===q||a[0]===r)?!0:!1};\n__webpack_unused_export__=y;\n\n\n/***/ }),\n\n/***/ 3920:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nif (true) {\n  /* unused reexport */ __webpack_require__(8559);\n} else {}\n\n\n/***/ }),\n\n/***/ 1837:\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\"use strict\";\n/** @license React v17.0.2\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n__webpack_require__(7320);var f=__webpack_require__(2784),g=60103;exports.Fragment=60107;if(\"function\"===typeof Symbol&&Symbol.for){var h=Symbol.for;g=h(\"react.element\");exports.Fragment=h(\"react.fragment\")}var m=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,n=Object.prototype.hasOwnProperty,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,k){var b,d={},e=null,l=null;void 0!==k&&(e=\"\"+k);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(l=a.ref);for(b in a)n.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:g,type:c,key:e,ref:l,props:d,_owner:m.current}}exports.jsx=q;exports.jsxs=q;\n\n\n/***/ }),\n\n/***/ 3426:\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\"use strict\";\n/** @license React v17.0.2\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar l=__webpack_require__(7320),n=60103,p=60106;exports.Fragment=60107;exports.StrictMode=60108;exports.Profiler=60114;var q=60109,r=60110,t=60112;exports.Suspense=60113;var u=60115,v=60116;\nif(\"function\"===typeof Symbol&&Symbol.for){var w=Symbol.for;n=w(\"react.element\");p=w(\"react.portal\");exports.Fragment=w(\"react.fragment\");exports.StrictMode=w(\"react.strict_mode\");exports.Profiler=w(\"react.profiler\");q=w(\"react.provider\");r=w(\"react.context\");t=w(\"react.forward_ref\");exports.Suspense=w(\"react.suspense\");u=w(\"react.memo\");v=w(\"react.lazy\")}var x=\"function\"===typeof Symbol&&Symbol.iterator;\nfunction y(a){if(null===a||\"object\"!==typeof a)return null;a=x&&a[x]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}function z(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\nvar A={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B={};function C(a,b,c){this.props=a;this.context=b;this.refs=B;this.updater=c||A}C.prototype.isReactComponent={};C.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(z(85));this.updater.enqueueSetState(this,a,b,\"setState\")};C.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};\nfunction D(){}D.prototype=C.prototype;function E(a,b,c){this.props=a;this.context=b;this.refs=B;this.updater=c||A}var F=E.prototype=new D;F.constructor=E;l(F,C.prototype);F.isPureReactComponent=!0;var G={current:null},H=Object.prototype.hasOwnProperty,I={key:!0,ref:!0,__self:!0,__source:!0};\nfunction J(a,b,c){var e,d={},k=null,h=null;if(null!=b)for(e in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)H.call(b,e)&&!I.hasOwnProperty(e)&&(d[e]=b[e]);var g=arguments.length-2;if(1===g)d.children=c;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];d.children=f}if(a&&a.defaultProps)for(e in g=a.defaultProps,g)void 0===d[e]&&(d[e]=g[e]);return{$$typeof:n,type:a,key:k,ref:h,props:d,_owner:G.current}}\nfunction K(a,b){return{$$typeof:n,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function L(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===n}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var M=/\\/+/g;function N(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction O(a,b,c,e,d){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case n:case p:h=!0}}if(h)return h=a,d=d(h),a=\"\"===e?\".\"+N(h,0):e,Array.isArray(d)?(c=\"\",null!=a&&(c=a.replace(M,\"$&/\")+\"/\"),O(d,b,c,\"\",function(a){return a})):null!=d&&(L(d)&&(d=K(d,c+(!d.key||h&&h.key===d.key?\"\":(\"\"+d.key).replace(M,\"$&/\")+\"/\")+a)),b.push(d)),1;h=0;e=\"\"===e?\".\":e+\":\";if(Array.isArray(a))for(var g=\n0;g<a.length;g++){k=a[g];var f=e+N(k,g);h+=O(k,b,c,f,d)}else if(f=y(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=e+N(k,g++),h+=O(k,b,c,f,d);else if(\"object\"===k)throw b=\"\"+a,Error(z(31,\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b));return h}function P(a,b,c){if(null==a)return a;var e=[],d=0;O(a,e,\"\",\"\",function(a){return b.call(c,a,d++)});return e}\nfunction Q(a){if(-1===a._status){var b=a._result;b=b();a._status=0;a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}if(1===a._status)return a._result;throw a._result;}var R={current:null};function S(){var a=R.current;if(null===a)throw Error(z(321));return a}var T={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:G,IsSomeRendererActing:{current:!1},assign:l};\nexports.Children={map:P,forEach:function(a,b,c){P(a,function(){b.apply(this,arguments)},c)},count:function(a){var b=0;P(a,function(){b++});return b},toArray:function(a){return P(a,function(a){return a})||[]},only:function(a){if(!L(a))throw Error(z(143));return a}};exports.Component=C;exports.PureComponent=E;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=T;\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(z(267,a));var e=l({},a.props),d=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=G.current);void 0!==b.key&&(d=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)H.call(b,f)&&!I.hasOwnProperty(f)&&(e[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)e.children=c;else if(1<f){g=Array(f);for(var m=0;m<f;m++)g[m]=arguments[m+2];e.children=g}return{$$typeof:n,type:a.type,\nkey:d,ref:k,props:e,_owner:h}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:r,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:q,_context:a};return a.Consumer=a};exports.createElement=J;exports.createFactory=function(a){var b=J.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:t,render:a}};exports.isValidElement=L;\nexports.lazy=function(a){return{$$typeof:v,_payload:{_status:-1,_result:a},_init:Q}};exports.memo=function(a,b){return{$$typeof:u,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return S().useCallback(a,b)};exports.useContext=function(a,b){return S().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return S().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return S().useImperativeHandle(a,b,c)};\nexports.useLayoutEffect=function(a,b){return S().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return S().useMemo(a,b)};exports.useReducer=function(a,b,c){return S().useReducer(a,b,c)};exports.useRef=function(a){return S().useRef(a)};exports.useState=function(a){return S().useState(a)};exports.version=\"17.0.2\";\n\n\n/***/ }),\n\n/***/ 2784:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nif (true) {\n  module.exports = __webpack_require__(3426);\n} else {}\n\n\n/***/ }),\n\n/***/ 2322:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nif (true) {\n  module.exports = __webpack_require__(1837);\n} else {}\n\n\n/***/ }),\n\n/***/ 8267:\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\"use strict\";\nvar __webpack_unused_export__;\n\n\nvar compose = (__webpack_require__(4081)/* .compose */ .qC);\n\n__webpack_unused_export__ = true;\nexports.Uo =\n  typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n    ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n    : function () {\n        if (arguments.length === 0) return undefined;\n        if (typeof arguments[0] === 'object') return compose;\n        return compose.apply(null, arguments);\n      };\n\n__webpack_unused_export__ =\n  typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__\n    ? window.__REDUX_DEVTOOLS_EXTENSION__\n    : function () {\n        return function (noop) {\n          return noop;\n        };\n      };\n\n\n/***/ }),\n\n/***/ 4081:\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"md\": () => (/* binding */ applyMiddleware),\n  \"UY\": () => (/* binding */ combineReducers),\n  \"qC\": () => (/* binding */ compose),\n  \"MT\": () => (/* binding */ createStore)\n});\n\n// UNUSED EXPORTS: __DO_NOT_USE__ActionTypes, bindActionCreators, legacy_createStore\n\n// EXTERNAL MODULE: ../../node_modules/@babel/runtime/helpers/esm/defineProperty.js + 3 modules\nvar defineProperty = __webpack_require__(2601);\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js\n\nfunction ownKeys(e, r) {\n  var t = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    r && (o = o.filter(function (r) {\n      return Object.getOwnPropertyDescriptor(e, r).enumerable;\n    })), t.push.apply(t, o);\n  }\n  return t;\n}\nfunction _objectSpread2(e) {\n  for (var r = 1; r < arguments.length; r++) {\n    var t = null != arguments[r] ? arguments[r] : {};\n    r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n      (0,defineProperty/* default */.Z)(e, r, t[r]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n      Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n    });\n  }\n  return e;\n}\n;// CONCATENATED MODULE: ../../node_modules/redux/es/redux.js\n\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n  return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n  return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n  return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n  INIT: \"@@redux/INIT\" + randomString(),\n  REPLACE: \"@@redux/REPLACE\" + randomString(),\n  PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n    return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n  }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n  if (typeof obj !== 'object' || obj === null) return false;\n  var proto = obj;\n\n  while (Object.getPrototypeOf(proto) !== null) {\n    proto = Object.getPrototypeOf(proto);\n  }\n\n  return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n  if (val === void 0) return 'undefined';\n  if (val === null) return 'null';\n  var type = typeof val;\n\n  switch (type) {\n    case 'boolean':\n    case 'string':\n    case 'number':\n    case 'symbol':\n    case 'function':\n      {\n        return type;\n      }\n  }\n\n  if (Array.isArray(val)) return 'array';\n  if (isDate(val)) return 'date';\n  if (isError(val)) return 'error';\n  var constructorName = ctorName(val);\n\n  switch (constructorName) {\n    case 'Symbol':\n    case 'Promise':\n    case 'WeakMap':\n    case 'WeakSet':\n    case 'Map':\n    case 'Set':\n      return constructorName;\n  } // other\n\n\n  return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n  return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n  return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n  if (val instanceof Date) return true;\n  return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n  var typeOfVal = typeof val;\n\n  if (false) {}\n\n  return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n  var _ref2;\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n    throw new Error( true ? formatProdErrorMessage(0) : 0);\n  }\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n    enhancer = preloadedState;\n    preloadedState = undefined;\n  }\n\n  if (typeof enhancer !== 'undefined') {\n    if (typeof enhancer !== 'function') {\n      throw new Error( true ? formatProdErrorMessage(1) : 0);\n    }\n\n    return enhancer(createStore)(reducer, preloadedState);\n  }\n\n  if (typeof reducer !== 'function') {\n    throw new Error( true ? formatProdErrorMessage(2) : 0);\n  }\n\n  var currentReducer = reducer;\n  var currentState = preloadedState;\n  var currentListeners = [];\n  var nextListeners = currentListeners;\n  var isDispatching = false;\n  /**\n   * This makes a shallow copy of currentListeners so we can use\n   * nextListeners as a temporary list while dispatching.\n   *\n   * This prevents any bugs around consumers calling\n   * subscribe/unsubscribe in the middle of a dispatch.\n   */\n\n  function ensureCanMutateNextListeners() {\n    if (nextListeners === currentListeners) {\n      nextListeners = currentListeners.slice();\n    }\n  }\n  /**\n   * Reads the state tree managed by the store.\n   *\n   * @returns {any} The current state tree of your application.\n   */\n\n\n  function getState() {\n    if (isDispatching) {\n      throw new Error( true ? formatProdErrorMessage(3) : 0);\n    }\n\n    return currentState;\n  }\n  /**\n   * Adds a change listener. It will be called any time an action is dispatched,\n   * and some part of the state tree may potentially have changed. You may then\n   * call `getState()` to read the current state tree inside the callback.\n   *\n   * You may call `dispatch()` from a change listener, with the following\n   * caveats:\n   *\n   * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n   * If you subscribe or unsubscribe while the listeners are being invoked, this\n   * will not have any effect on the `dispatch()` that is currently in progress.\n   * However, the next `dispatch()` call, whether nested or not, will use a more\n   * recent snapshot of the subscription list.\n   *\n   * 2. The listener should not expect to see all state changes, as the state\n   * might have been updated multiple times during a nested `dispatch()` before\n   * the listener is called. It is, however, guaranteed that all subscribers\n   * registered before the `dispatch()` started will be called with the latest\n   * state by the time it exits.\n   *\n   * @param {Function} listener A callback to be invoked on every dispatch.\n   * @returns {Function} A function to remove this change listener.\n   */\n\n\n  function subscribe(listener) {\n    if (typeof listener !== 'function') {\n      throw new Error( true ? formatProdErrorMessage(4) : 0);\n    }\n\n    if (isDispatching) {\n      throw new Error( true ? formatProdErrorMessage(5) : 0);\n    }\n\n    var isSubscribed = true;\n    ensureCanMutateNextListeners();\n    nextListeners.push(listener);\n    return function unsubscribe() {\n      if (!isSubscribed) {\n        return;\n      }\n\n      if (isDispatching) {\n        throw new Error( true ? formatProdErrorMessage(6) : 0);\n      }\n\n      isSubscribed = false;\n      ensureCanMutateNextListeners();\n      var index = nextListeners.indexOf(listener);\n      nextListeners.splice(index, 1);\n      currentListeners = null;\n    };\n  }\n  /**\n   * Dispatches an action. It is the only way to trigger a state change.\n   *\n   * The `reducer` function, used to create the store, will be called with the\n   * current state tree and the given `action`. Its return value will\n   * be considered the **next** state of the tree, and the change listeners\n   * will be notified.\n   *\n   * The base implementation only supports plain object actions. If you want to\n   * dispatch a Promise, an Observable, a thunk, or something else, you need to\n   * wrap your store creating function into the corresponding middleware. For\n   * example, see the documentation for the `redux-thunk` package. Even the\n   * middleware will eventually dispatch plain object actions using this method.\n   *\n   * @param {Object} action A plain object representing “what changed”. It is\n   * a good idea to keep actions serializable so you can record and replay user\n   * sessions, or use the time travelling `redux-devtools`. An action must have\n   * a `type` property which may not be `undefined`. It is a good idea to use\n   * string constants for action types.\n   *\n   * @returns {Object} For convenience, the same action object you dispatched.\n   *\n   * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n   * return something else (for example, a Promise you can await).\n   */\n\n\n  function dispatch(action) {\n    if (!isPlainObject(action)) {\n      throw new Error( true ? formatProdErrorMessage(7) : 0);\n    }\n\n    if (typeof action.type === 'undefined') {\n      throw new Error( true ? formatProdErrorMessage(8) : 0);\n    }\n\n    if (isDispatching) {\n      throw new Error( true ? formatProdErrorMessage(9) : 0);\n    }\n\n    try {\n      isDispatching = true;\n      currentState = currentReducer(currentState, action);\n    } finally {\n      isDispatching = false;\n    }\n\n    var listeners = currentListeners = nextListeners;\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      listener();\n    }\n\n    return action;\n  }\n  /**\n   * Replaces the reducer currently used by the store to calculate the state.\n   *\n   * You might need this if your app implements code splitting and you want to\n   * load some of the reducers dynamically. You might also need this if you\n   * implement a hot reloading mechanism for Redux.\n   *\n   * @param {Function} nextReducer The reducer for the store to use instead.\n   * @returns {void}\n   */\n\n\n  function replaceReducer(nextReducer) {\n    if (typeof nextReducer !== 'function') {\n      throw new Error( true ? formatProdErrorMessage(10) : 0);\n    }\n\n    currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n    // Any reducers that existed in both the new and old rootReducer\n    // will receive the previous state. This effectively populates\n    // the new state tree with any relevant data from the old one.\n\n    dispatch({\n      type: ActionTypes.REPLACE\n    });\n  }\n  /**\n   * Interoperability point for observable/reactive libraries.\n   * @returns {observable} A minimal observable of state changes.\n   * For more information, see the observable proposal:\n   * https://github.com/tc39/proposal-observable\n   */\n\n\n  function observable() {\n    var _ref;\n\n    var outerSubscribe = subscribe;\n    return _ref = {\n      /**\n       * The minimal observable subscription method.\n       * @param {Object} observer Any object that can be used as an observer.\n       * The observer object should have a `next` method.\n       * @returns {subscription} An object with an `unsubscribe` method that can\n       * be used to unsubscribe the observable from the store, and prevent further\n       * emission of values from the observable.\n       */\n      subscribe: function subscribe(observer) {\n        if (typeof observer !== 'object' || observer === null) {\n          throw new Error( true ? formatProdErrorMessage(11) : 0);\n        }\n\n        function observeState() {\n          if (observer.next) {\n            observer.next(getState());\n          }\n        }\n\n        observeState();\n        var unsubscribe = outerSubscribe(observeState);\n        return {\n          unsubscribe: unsubscribe\n        };\n      }\n    }, _ref[$$observable] = function () {\n      return this;\n    }, _ref;\n  } // When a store is created, an \"INIT\" action is dispatched so that every\n  // reducer returns their initial state. This effectively populates\n  // the initial state tree.\n\n\n  dispatch({\n    type: ActionTypes.INIT\n  });\n  return _ref2 = {\n    dispatch: dispatch,\n    subscribe: subscribe,\n    getState: getState,\n    replaceReducer: replaceReducer\n  }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = (/* unused pure expression or super */ null && (createStore));\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n  /* eslint-disable no-console */\n  if (typeof console !== 'undefined' && typeof console.error === 'function') {\n    console.error(message);\n  }\n  /* eslint-enable no-console */\n\n\n  try {\n    // This error was thrown as a convenience so that if you enable\n    // \"break on all exceptions\" in your console,\n    // it would pause the execution at this line.\n    throw new Error(message);\n  } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n  var reducerKeys = Object.keys(reducers);\n  var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n  if (reducerKeys.length === 0) {\n    return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n  }\n\n  if (!isPlainObject(inputState)) {\n    return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n  }\n\n  var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n    return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n  });\n  unexpectedKeys.forEach(function (key) {\n    unexpectedKeyCache[key] = true;\n  });\n  if (action && action.type === ActionTypes.REPLACE) return;\n\n  if (unexpectedKeys.length > 0) {\n    return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n  }\n}\n\nfunction assertReducerShape(reducers) {\n  Object.keys(reducers).forEach(function (key) {\n    var reducer = reducers[key];\n    var initialState = reducer(undefined, {\n      type: ActionTypes.INIT\n    });\n\n    if (typeof initialState === 'undefined') {\n      throw new Error( true ? formatProdErrorMessage(12) : 0);\n    }\n\n    if (typeof reducer(undefined, {\n      type: ActionTypes.PROBE_UNKNOWN_ACTION()\n    }) === 'undefined') {\n      throw new Error( true ? formatProdErrorMessage(13) : 0);\n    }\n  });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n  var reducerKeys = Object.keys(reducers);\n  var finalReducers = {};\n\n  for (var i = 0; i < reducerKeys.length; i++) {\n    var key = reducerKeys[i];\n\n    if (false) {}\n\n    if (typeof reducers[key] === 'function') {\n      finalReducers[key] = reducers[key];\n    }\n  }\n\n  var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n  // keys multiple times.\n\n  var unexpectedKeyCache;\n\n  if (false) {}\n\n  var shapeAssertionError;\n\n  try {\n    assertReducerShape(finalReducers);\n  } catch (e) {\n    shapeAssertionError = e;\n  }\n\n  return function combination(state, action) {\n    if (state === void 0) {\n      state = {};\n    }\n\n    if (shapeAssertionError) {\n      throw shapeAssertionError;\n    }\n\n    if (false) { var warningMessage; }\n\n    var hasChanged = false;\n    var nextState = {};\n\n    for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n      var _key = finalReducerKeys[_i];\n      var reducer = finalReducers[_key];\n      var previousStateForKey = state[_key];\n      var nextStateForKey = reducer(previousStateForKey, action);\n\n      if (typeof nextStateForKey === 'undefined') {\n        var actionType = action && action.type;\n        throw new Error( true ? formatProdErrorMessage(14) : 0);\n      }\n\n      nextState[_key] = nextStateForKey;\n      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n    }\n\n    hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n    return hasChanged ? nextState : state;\n  };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n  return function () {\n    return dispatch(actionCreator.apply(this, arguments));\n  };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n  if (typeof actionCreators === 'function') {\n    return bindActionCreator(actionCreators, dispatch);\n  }\n\n  if (typeof actionCreators !== 'object' || actionCreators === null) {\n    throw new Error( true ? formatProdErrorMessage(16) : 0);\n  }\n\n  var boundActionCreators = {};\n\n  for (var key in actionCreators) {\n    var actionCreator = actionCreators[key];\n\n    if (typeof actionCreator === 'function') {\n      boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n    }\n  }\n\n  return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n  for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n    funcs[_key] = arguments[_key];\n  }\n\n  if (funcs.length === 0) {\n    return function (arg) {\n      return arg;\n    };\n  }\n\n  if (funcs.length === 1) {\n    return funcs[0];\n  }\n\n  return funcs.reduce(function (a, b) {\n    return function () {\n      return a(b.apply(void 0, arguments));\n    };\n  });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n  for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n    middlewares[_key] = arguments[_key];\n  }\n\n  return function (createStore) {\n    return function () {\n      var store = createStore.apply(void 0, arguments);\n\n      var _dispatch = function dispatch() {\n        throw new Error( true ? formatProdErrorMessage(15) : 0);\n      };\n\n      var middlewareAPI = {\n        getState: store.getState,\n        dispatch: function dispatch() {\n          return _dispatch.apply(void 0, arguments);\n        }\n      };\n      var chain = middlewares.map(function (middleware) {\n        return middleware(middlewareAPI);\n      });\n      _dispatch = compose.apply(void 0, chain)(store.dispatch);\n      return _objectSpread2(_objectSpread2({}, store), {}, {\n        dispatch: _dispatch\n      });\n    };\n  };\n}\n\n\n\n\n/***/ }),\n\n/***/ 4949:\n/***/ ((__unused_webpack_module, exports) => {\n\n\"use strict\";\nvar __webpack_unused_export__;\n\n\n__webpack_unused_export__ = true;\nexports.PW = defaultMemoize;\n__webpack_unused_export__ = createSelectorCreator;\n__webpack_unused_export__ = createStructuredSelector;\nfunction defaultEqualityCheck(a, b) {\n  return a === b;\n}\n\nfunction areArgumentsShallowlyEqual(equalityCheck, prev, next) {\n  if (prev === null || next === null || prev.length !== next.length) {\n    return false;\n  }\n\n  // Do this in a for loop (and not a `forEach` or an `every`) so we can determine equality as fast as possible.\n  var length = prev.length;\n  for (var i = 0; i < length; i++) {\n    if (!equalityCheck(prev[i], next[i])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction defaultMemoize(func) {\n  var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;\n\n  var lastArgs = null;\n  var lastResult = null;\n  // we reference arguments instead of spreading them for performance reasons\n  return function () {\n    if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {\n      // apply arguments instead of spreading for performance.\n      lastResult = func.apply(null, arguments);\n    }\n\n    lastArgs = arguments;\n    return lastResult;\n  };\n}\n\nfunction getDependencies(funcs) {\n  var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;\n\n  if (!dependencies.every(function (dep) {\n    return typeof dep === 'function';\n  })) {\n    var dependencyTypes = dependencies.map(function (dep) {\n      return typeof dep;\n    }).join(', ');\n    throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']'));\n  }\n\n  return dependencies;\n}\n\nfunction createSelectorCreator(memoize) {\n  for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    memoizeOptions[_key - 1] = arguments[_key];\n  }\n\n  return function () {\n    for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      funcs[_key2] = arguments[_key2];\n    }\n\n    var recomputations = 0;\n    var resultFunc = funcs.pop();\n    var dependencies = getDependencies(funcs);\n\n    var memoizedResultFunc = memoize.apply(undefined, [function () {\n      recomputations++;\n      // apply arguments instead of spreading for performance.\n      return resultFunc.apply(null, arguments);\n    }].concat(memoizeOptions));\n\n    // If a selector is called with the exact same arguments we don't need to traverse our dependencies again.\n    var selector = defaultMemoize(function () {\n      var params = [];\n      var length = dependencies.length;\n\n      for (var i = 0; i < length; i++) {\n        // apply arguments instead of spreading and mutate a local list of params for performance.\n        params.push(dependencies[i].apply(null, arguments));\n      }\n\n      // apply arguments instead of spreading for performance.\n      return memoizedResultFunc.apply(null, params);\n    });\n\n    selector.resultFunc = resultFunc;\n    selector.recomputations = function () {\n      return recomputations;\n    };\n    selector.resetRecomputations = function () {\n      return recomputations = 0;\n    };\n    return selector;\n  };\n}\n\nvar createSelector = exports.P1 = createSelectorCreator(defaultMemoize);\n\nfunction createStructuredSelector(selectors) {\n  var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector;\n\n  if (typeof selectors !== 'object') {\n    throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors));\n  }\n  var objectKeys = Object.keys(selectors);\n  return selectorCreator(objectKeys.map(function (key) {\n    return selectors[key];\n  }), function () {\n    for (var _len3 = arguments.length, values = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      values[_key3] = arguments[_key3];\n    }\n\n    return values.reduce(function (composition, value, index) {\n      composition[objectKeys[index]] = value;\n      return composition;\n    }, {});\n  });\n}\n\n/***/ }),\n\n/***/ 1343:\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"RIFFFile\": () => (/* binding */ RIFFFile)\n/* harmony export */ });\n/* harmony import */ var byte_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2394);\n/*\n * Copyright (c) 2017-2019 Rafael da Silva Rocha.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n/**\n * @fileoverview The RIFFFile class.\n * @see https://github.com/rochars/riff-file\n */\n\n/** @module riff-file */\n\n\n\n/**\n * A class to perform low-level reading of RIFF/RIFX files.\n */\nclass RIFFFile {\n\n  constructor() {\n    /**\n     * The container identifier.\n     * 'RIFF', 'RIFX' and 'RF64' are supported.\n     * @type {string}\n     */\n    this.container = '';\n    /**\n     * The main chunk size, in bytes.\n     * @type {number}\n     */\n    this.chunkSize = 0;\n    /**\n     * The format identifier.\n     * @type {string}\n     */\n    this.format = '';\n    /**\n     * An object representing the signature of all chunks in the file.\n     * @type {{\n      chunkId: string,\n      chunkSize: number,\n      format: string,\n      chunkData: {start: number, end: number},\n      subChunks: Array\n      }|null}\n     */\n    this.signature = null;\n    /**\n     * @type {number}\n     * @protected\n     */\n    this.head = 0;\n    /**\n     * @type {\n      {bits: number, be: boolean, signed: boolean, fp: boolean}\n     }\n     * @protected\n     */\n    this.uInt32 = { bits: 32, be: false, signed: false, fp: false };\n    /**\n     * The list of supported containers.\n     * Any format different from RIFX will be treated as RIFF.\n     * @type {!Array<string>}\n     * @protected\n     */\n    this.supported_containers = ['RIFF', 'RIFX'];\n  }\n\n  /**\n   * Read the signature of the chunks in a RIFF/RIFX file.\n   * @param {!Uint8Array} buffer The file bytes.\n   * @protected\n   */\n  setSignature(buffer) {\n      this.head = 0;\n      this.container = this.readString(buffer, 4);\n      if (this.supported_containers.indexOf(this.container) === -1) {\n        throw Error('Not a supported format.');\n      }\n      this.uInt32.be = this.container === 'RIFX';\n      this.chunkSize = this.readUInt32(buffer);\n      this.format = this.readString(buffer, 4);\n      // The RIFF file signature\n      this.signature = {\n          chunkId: this.container,\n          chunkSize: this.chunkSize,\n          format: this.format,\n          subChunks: this.getSubChunksIndex_(buffer),\n          chunkData: {start: 0, end: this.chunkSize}\n      };\n  }\n\n  /**\n    * Find a chunk by its fourCC_ in a array of RIFF chunks.\n    * @param {string} chunkId The chunk fourCC_.\n    * @param {boolean} multiple True if there may be multiple chunks\n    *    with the same chunkId.\n    * @return {Object}\n    * @protected\n    */\n  findChunk(chunkId, multiple=false) {\n    /** @type {!Array|null} */\n    let chunks = this.signature.subChunks;\n    /** @type {!Array<!Object>} */\n    let chunk = [];\n    for (let i=0; i<chunks.length; i++) {\n      if (chunks[i].chunkId == chunkId) {\n        if (multiple) {\n          chunk.push(chunks[i]);\n        } else {\n          return chunks[i];\n        }\n      }\n    }\n    if (chunkId == 'LIST') {\n      return chunk.length ? chunk : null;\n    }\n    return null;\n  }\n\n  /**\n   * Read bytes as a string from a RIFF chunk.\n   * @param {!Uint8Array} bytes The bytes.\n   * @param {number} maxSize the max size of the string.\n   * @return {string} The string.\n   * @protected\n   */\n  readString(bytes, maxSize) {\n    /** @type {string} */\n    let str = '';\n    str = (0,byte_data__WEBPACK_IMPORTED_MODULE_0__.unpackString)(bytes, this.head, this.head + maxSize);\n    this.head += maxSize;\n    return str;\n  }\n\n  /**\n   * Read a number from a chunk.\n   * @param {!Uint8Array} bytes The chunk bytes.\n   * @return {number} The number.\n   * @protected\n   */\n  readUInt32(bytes) {\n    /** @type {number} */\n    let value = (0,byte_data__WEBPACK_IMPORTED_MODULE_0__.unpack)(bytes, this.uInt32, this.head);\n    this.head += 4;\n    return value;\n  }\n\n  /**\n   * Return the sub chunks of a RIFF file.\n   * @param {!Uint8Array} buffer the RIFF file bytes.\n   * @return {!Array<Object>} The subchunks of a RIFF/RIFX or LIST chunk.\n   * @private\n   */\n  getSubChunksIndex_(buffer) {\n      /** @type {!Array<!Object>} */\n      let chunks = [];\n      /** @type {number} */\n      let i = this.head;\n      while(i <= buffer.length - 8) {\n          chunks.push(this.getSubChunkIndex_(buffer, i));\n          i += 8 + chunks[chunks.length - 1].chunkSize;\n          i = i % 2 ? i + 1 : i;\n      }\n      return chunks;\n  }\n\n  /**\n   * Return a sub chunk from a RIFF file.\n   * @param {!Uint8Array} buffer the RIFF file bytes.\n   * @param {number} index The start index of the chunk.\n   * @return {!Object} A subchunk of a RIFF/RIFX or LIST chunk.\n   * @private\n   */\n  getSubChunkIndex_(buffer, index) {\n      /** @type {!Object} */\n      let chunk = {\n          chunkId: this.getChunkId_(buffer, index),\n          chunkSize: this.getChunkSize_(buffer, index),\n      };\n      if (chunk.chunkId == 'LIST') {\n          chunk.format = (0,byte_data__WEBPACK_IMPORTED_MODULE_0__.unpackString)(buffer, index + 8, index + 12);\n          this.head += 4;\n          chunk.subChunks = this.getSubChunksIndex_(buffer);\n      } else {\n          /** @type {number} */\n          let realChunkSize = chunk.chunkSize % 2 ?\n              chunk.chunkSize + 1 : chunk.chunkSize;\n          this.head = index + 8 + realChunkSize;\n          chunk.chunkData = {\n              start: index + 8,\n              end: this.head\n          };\n      }\n      return chunk;\n  }\n\n  /**\n   * Return the fourCC_ of a chunk.\n   * @param {!Uint8Array} buffer the RIFF file bytes.\n   * @param {number} index The start index of the chunk.\n   * @return {string} The id of the chunk.\n   * @private\n   */\n  getChunkId_(buffer, index) {\n      this.head += 4;\n      return (0,byte_data__WEBPACK_IMPORTED_MODULE_0__.unpackString)(buffer, index, index + 4);\n  }\n\n  /**\n   * Return the size of a chunk.\n   * @param {!Uint8Array} buffer the RIFF file bytes.\n   * @param {number} index The start index of the chunk.\n   * @return {number} The size of the chunk without the id and size fields.\n   * @private\n   */\n  getChunkSize_(buffer, index) {\n      this.head += 4;\n      return (0,byte_data__WEBPACK_IMPORTED_MODULE_0__.unpack)(buffer, this.uInt32, index + 4);\n  }\n}\n\n\n/***/ }),\n\n/***/ 6475:\n/***/ ((__unused_webpack_module, exports) => {\n\n\"use strict\";\n/** @license React v0.20.2\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar f,g,h,k;if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}\nif(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var t=null,u=null,w=function(){if(null!==t)try{var a=exports.unstable_now();t(!0,a);t=null}catch(b){throw setTimeout(w,0),b;}};f=function(a){null!==t?setTimeout(f,0,a):(t=a,setTimeout(w,0))};g=function(a,b){u=setTimeout(a,b)};h=function(){clearTimeout(u)};exports.unstable_shouldYield=function(){return!1};k=exports.unstable_forceFrameRate=function(){}}else{var x=window.setTimeout,y=window.clearTimeout;if(\"undefined\"!==typeof console){var z=\nwindow.cancelAnimationFrame;\"function\"!==typeof window.requestAnimationFrame&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills\");\"function\"!==typeof z&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills\")}var A=!1,B=null,C=-1,D=5,E=0;exports.unstable_shouldYield=function(){return exports.unstable_now()>=\nE};k=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):D=0<a?Math.floor(1E3/a):5};var F=new MessageChannel,G=F.port2;F.port1.onmessage=function(){if(null!==B){var a=exports.unstable_now();E=a+D;try{B(!0,a)?G.postMessage(null):(A=!1,B=null)}catch(b){throw G.postMessage(null),b;}}else A=!1};f=function(a){B=a;A||(A=!0,G.postMessage(null))};g=function(a,b){C=\nx(function(){a(exports.unstable_now())},b)};h=function(){y(C);C=-1}}function H(a,b){var c=a.length;a.push(b);a:for(;;){var d=c-1>>>1,e=a[d];if(void 0!==e&&0<I(e,b))a[d]=b,a[c]=e,c=d;else break a}}function J(a){a=a[0];return void 0===a?null:a}\nfunction K(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>I(n,c))void 0!==r&&0>I(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>I(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function I(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var L=[],M=[],N=1,O=null,P=3,Q=!1,R=!1,S=!1;\nfunction T(a){for(var b=J(M);null!==b;){if(null===b.callback)K(M);else if(b.startTime<=a)K(M),b.sortIndex=b.expirationTime,H(L,b);else break;b=J(M)}}function U(a){S=!1;T(a);if(!R)if(null!==J(L))R=!0,f(V);else{var b=J(M);null!==b&&g(U,b.startTime-a)}}\nfunction V(a,b){R=!1;S&&(S=!1,h());Q=!0;var c=P;try{T(b);for(O=J(L);null!==O&&(!(O.expirationTime>b)||a&&!exports.unstable_shouldYield());){var d=O.callback;if(\"function\"===typeof d){O.callback=null;P=O.priorityLevel;var e=d(O.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?O.callback=e:O===J(L)&&K(L);T(b)}else K(L);O=J(L)}if(null!==O)var m=!0;else{var n=J(M);null!==n&&g(U,n.startTime-b);m=!1}return m}finally{O=null,P=c,Q=!1}}var W=k;exports.unstable_IdlePriority=5;\nexports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){R||Q||(R=!0,f(V))};exports.unstable_getCurrentPriorityLevel=function(){return P};exports.unstable_getFirstCallbackNode=function(){return J(L)};\nexports.unstable_next=function(a){switch(P){case 1:case 2:case 3:var b=3;break;default:b=P}var c=P;P=b;try{return a()}finally{P=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=W;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=P;P=a;try{return b()}finally{P=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();\"object\"===typeof c&&null!==c?(c=c.delay,c=\"number\"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:N++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,H(M,a),null===J(L)&&a===J(M)&&(S?h():S=!0,g(U,c-d))):(a.sortIndex=e,H(L,a),R||Q||(R=!0,f(V)));return a};\nexports.unstable_wrapCallback=function(a){var b=P;return function(){var c=P;P=b;try{return a.apply(this,arguments)}finally{P=c}}};\n\n\n/***/ }),\n\n/***/ 4616:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nif (true) {\n  module.exports = __webpack_require__(6475);\n} else {}\n\n\n/***/ }),\n\n/***/ 6704:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(6539);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 3234:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(4606);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 4522:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(7806);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 6237:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(5597);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 6289:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(2419);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 3362:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(7029);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 383:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(7886);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 9479:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\nvar content = __webpack_require__(8915);\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(2379)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 2379:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n\nvar stylesInDom = {};\n\nvar\tmemoize = function (fn) {\n\tvar memo;\n\n\treturn function () {\n\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\treturn memo;\n\t};\n};\n\nvar isOldIE = memoize(function () {\n\t// Test for IE <= 9 as proposed by Browserhacks\n\t// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n\t// Tests for existence of standard globals is to allow style-loader\n\t// to operate correctly into non-standard environments\n\t// @see https://github.com/webpack-contrib/style-loader/issues/177\n\treturn window && document && document.all && !window.atob;\n});\n\nvar getTarget = function (target, parent) {\n  if (parent){\n    return parent.querySelector(target);\n  }\n  return document.querySelector(target);\n};\n\nvar getElement = (function (fn) {\n\tvar memo = {};\n\n\treturn function(target, parent) {\n                // If passing function in options, then use it for resolve \"head\" element.\n                // Useful for Shadow Root style i.e\n                // {\n                //   insertInto: function () { return document.querySelector(\"#foo\").shadowRoot }\n                // }\n                if (typeof target === 'function') {\n                        return target();\n                }\n                if (typeof memo[target] === \"undefined\") {\n\t\t\tvar styleTarget = getTarget.call(this, target, parent);\n\t\t\t// Special case to return head of iframe instead of iframe itself\n\t\t\tif (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n\t\t\t\ttry {\n\t\t\t\t\t// This will throw an exception if access to iframe is blocked\n\t\t\t\t\t// due to cross-origin restrictions\n\t\t\t\t\tstyleTarget = styleTarget.contentDocument.head;\n\t\t\t\t} catch(e) {\n\t\t\t\t\tstyleTarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmemo[target] = styleTarget;\n\t\t}\n\t\treturn memo[target]\n\t};\n})();\n\nvar singleton = null;\nvar\tsingletonCounter = 0;\nvar\tstylesInsertedAtTop = [];\n\nvar\tfixUrls = __webpack_require__(9657);\n\nmodule.exports = function(list, options) {\n\tif (typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif (typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\n\toptions.attrs = typeof options.attrs === \"object\" ? options.attrs : {};\n\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n\t// tags it will allow on a page\n\tif (!options.singleton && typeof options.singleton !== \"boolean\") options.singleton = isOldIE();\n\n\t// By default, add <style> tags to the <head> element\n        if (!options.insertInto) options.insertInto = \"head\";\n\n\t// By default, add <style> tags to the bottom of the target\n\tif (!options.insertAt) options.insertAt = \"bottom\";\n\n\tvar styles = listToStyles(list, options);\n\n\taddStylesToDom(styles, options);\n\n\treturn function update (newList) {\n\t\tvar mayRemove = [];\n\n\t\tfor (var i = 0; i < styles.length; i++) {\n\t\t\tvar item = styles[i];\n\t\t\tvar domStyle = stylesInDom[item.id];\n\n\t\t\tdomStyle.refs--;\n\t\t\tmayRemove.push(domStyle);\n\t\t}\n\n\t\tif(newList) {\n\t\t\tvar newStyles = listToStyles(newList, options);\n\t\t\taddStylesToDom(newStyles, options);\n\t\t}\n\n\t\tfor (var i = 0; i < mayRemove.length; i++) {\n\t\t\tvar domStyle = mayRemove[i];\n\n\t\t\tif(domStyle.refs === 0) {\n\t\t\t\tfor (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();\n\n\t\t\t\tdelete stylesInDom[domStyle.id];\n\t\t\t}\n\t\t}\n\t};\n};\n\nfunction addStylesToDom (styles, options) {\n\tfor (var i = 0; i < styles.length; i++) {\n\t\tvar item = styles[i];\n\t\tvar domStyle = stylesInDom[item.id];\n\n\t\tif(domStyle) {\n\t\t\tdomStyle.refs++;\n\n\t\t\tfor(var j = 0; j < domStyle.parts.length; j++) {\n\t\t\t\tdomStyle.parts[j](item.parts[j]);\n\t\t\t}\n\n\t\t\tfor(; j < item.parts.length; j++) {\n\t\t\t\tdomStyle.parts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\t\t} else {\n\t\t\tvar parts = [];\n\n\t\t\tfor(var j = 0; j < item.parts.length; j++) {\n\t\t\t\tparts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\n\t\t\tstylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};\n\t\t}\n\t}\n}\n\nfunction listToStyles (list, options) {\n\tvar styles = [];\n\tvar newStyles = {};\n\n\tfor (var i = 0; i < list.length; i++) {\n\t\tvar item = list[i];\n\t\tvar id = options.base ? item[0] + options.base : item[0];\n\t\tvar css = item[1];\n\t\tvar media = item[2];\n\t\tvar sourceMap = item[3];\n\t\tvar part = {css: css, media: media, sourceMap: sourceMap};\n\n\t\tif(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});\n\t\telse newStyles[id].parts.push(part);\n\t}\n\n\treturn styles;\n}\n\nfunction insertStyleElement (options, style) {\n\tvar target = getElement(options.insertInto)\n\n\tif (!target) {\n\t\tthrow new Error(\"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\");\n\t}\n\n\tvar lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];\n\n\tif (options.insertAt === \"top\") {\n\t\tif (!lastStyleElementInsertedAtTop) {\n\t\t\ttarget.insertBefore(style, target.firstChild);\n\t\t} else if (lastStyleElementInsertedAtTop.nextSibling) {\n\t\t\ttarget.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);\n\t\t} else {\n\t\t\ttarget.appendChild(style);\n\t\t}\n\t\tstylesInsertedAtTop.push(style);\n\t} else if (options.insertAt === \"bottom\") {\n\t\ttarget.appendChild(style);\n\t} else if (typeof options.insertAt === \"object\" && options.insertAt.before) {\n\t\tvar nextSibling = getElement(options.insertAt.before, target);\n\t\ttarget.insertBefore(style, nextSibling);\n\t} else {\n\t\tthrow new Error(\"[Style Loader]\\n\\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\\n Must be 'top', 'bottom', or Object.\\n (https://github.com/webpack-contrib/style-loader#insertat)\\n\");\n\t}\n}\n\nfunction removeStyleElement (style) {\n\tif (style.parentNode === null) return false;\n\tstyle.parentNode.removeChild(style);\n\n\tvar idx = stylesInsertedAtTop.indexOf(style);\n\tif(idx >= 0) {\n\t\tstylesInsertedAtTop.splice(idx, 1);\n\t}\n}\n\nfunction createStyleElement (options) {\n\tvar style = document.createElement(\"style\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\n\tif(options.attrs.nonce === undefined) {\n\t\tvar nonce = getNonce();\n\t\tif (nonce) {\n\t\t\toptions.attrs.nonce = nonce;\n\t\t}\n\t}\n\n\taddAttrs(style, options.attrs);\n\tinsertStyleElement(options, style);\n\n\treturn style;\n}\n\nfunction createLinkElement (options) {\n\tvar link = document.createElement(\"link\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\toptions.attrs.rel = \"stylesheet\";\n\n\taddAttrs(link, options.attrs);\n\tinsertStyleElement(options, link);\n\n\treturn link;\n}\n\nfunction addAttrs (el, attrs) {\n\tObject.keys(attrs).forEach(function (key) {\n\t\tel.setAttribute(key, attrs[key]);\n\t});\n}\n\nfunction getNonce() {\n\tif (false) {}\n\n\treturn __webpack_require__.nc;\n}\n\nfunction addStyle (obj, options) {\n\tvar style, update, remove, result;\n\n\t// If a transform function was defined, run it on the css\n\tif (options.transform && obj.css) {\n\t    result = typeof options.transform === 'function'\n\t\t ? options.transform(obj.css) \n\t\t : options.transform.default(obj.css);\n\n\t    if (result) {\n\t    \t// If transform returns a value, use that instead of the original css.\n\t    \t// This allows running runtime transformations on the css.\n\t    \tobj.css = result;\n\t    } else {\n\t    \t// If the transform function returns a falsy value, don't add this css.\n\t    \t// This allows conditional loading of css\n\t    \treturn function() {\n\t    \t\t// noop\n\t    \t};\n\t    }\n\t}\n\n\tif (options.singleton) {\n\t\tvar styleIndex = singletonCounter++;\n\n\t\tstyle = singleton || (singleton = createStyleElement(options));\n\n\t\tupdate = applyToSingletonTag.bind(null, style, styleIndex, false);\n\t\tremove = applyToSingletonTag.bind(null, style, styleIndex, true);\n\n\t} else if (\n\t\tobj.sourceMap &&\n\t\ttypeof URL === \"function\" &&\n\t\ttypeof URL.createObjectURL === \"function\" &&\n\t\ttypeof URL.revokeObjectURL === \"function\" &&\n\t\ttypeof Blob === \"function\" &&\n\t\ttypeof btoa === \"function\"\n\t) {\n\t\tstyle = createLinkElement(options);\n\t\tupdate = updateLink.bind(null, style, options);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\n\t\t\tif(style.href) URL.revokeObjectURL(style.href);\n\t\t};\n\t} else {\n\t\tstyle = createStyleElement(options);\n\t\tupdate = applyToTag.bind(null, style);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\t\t};\n\t}\n\n\tupdate(obj);\n\n\treturn function updateStyle (newObj) {\n\t\tif (newObj) {\n\t\t\tif (\n\t\t\t\tnewObj.css === obj.css &&\n\t\t\t\tnewObj.media === obj.media &&\n\t\t\t\tnewObj.sourceMap === obj.sourceMap\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tupdate(obj = newObj);\n\t\t} else {\n\t\t\tremove();\n\t\t}\n\t};\n}\n\nvar replaceText = (function () {\n\tvar textStore = [];\n\n\treturn function (index, replacement) {\n\t\ttextStore[index] = replacement;\n\n\t\treturn textStore.filter(Boolean).join('\\n');\n\t};\n})();\n\nfunction applyToSingletonTag (style, index, remove, obj) {\n\tvar css = remove ? \"\" : obj.css;\n\n\tif (style.styleSheet) {\n\t\tstyle.styleSheet.cssText = replaceText(index, css);\n\t} else {\n\t\tvar cssNode = document.createTextNode(css);\n\t\tvar childNodes = style.childNodes;\n\n\t\tif (childNodes[index]) style.removeChild(childNodes[index]);\n\n\t\tif (childNodes.length) {\n\t\t\tstyle.insertBefore(cssNode, childNodes[index]);\n\t\t} else {\n\t\t\tstyle.appendChild(cssNode);\n\t\t}\n\t}\n}\n\nfunction applyToTag (style, obj) {\n\tvar css = obj.css;\n\tvar media = obj.media;\n\n\tif(media) {\n\t\tstyle.setAttribute(\"media\", media)\n\t}\n\n\tif(style.styleSheet) {\n\t\tstyle.styleSheet.cssText = css;\n\t} else {\n\t\twhile(style.firstChild) {\n\t\t\tstyle.removeChild(style.firstChild);\n\t\t}\n\n\t\tstyle.appendChild(document.createTextNode(css));\n\t}\n}\n\nfunction updateLink (link, options, obj) {\n\tvar css = obj.css;\n\tvar sourceMap = obj.sourceMap;\n\n\t/*\n\t\tIf convertToAbsoluteUrls isn't defined, but sourcemaps are enabled\n\t\tand there is no publicPath defined then lets turn convertToAbsoluteUrls\n\t\ton by default.  Otherwise default to the convertToAbsoluteUrls option\n\t\tdirectly\n\t*/\n\tvar autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;\n\n\tif (options.convertToAbsoluteUrls || autoFixUrls) {\n\t\tcss = fixUrls(css);\n\t}\n\n\tif (sourceMap) {\n\t\t// http://stackoverflow.com/a/26603875\n\t\tcss += \"\\n/*# sourceMappingURL=data:application/json;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + \" */\";\n\t}\n\n\tvar blob = new Blob([css], { type: \"text/css\" });\n\n\tvar oldSrc = link.href;\n\n\tlink.href = URL.createObjectURL(blob);\n\n\tif(oldSrc) URL.revokeObjectURL(oldSrc);\n}\n\n\n/***/ }),\n\n/***/ 9657:\n/***/ ((module) => {\n\n\n/**\n * When source maps are enabled, `style-loader` uses a link element with a data-uri to\n * embed the css on the page. This breaks all relative urls because now they are relative to a\n * bundle instead of the current page.\n *\n * One solution is to only use full urls, but that may be impossible.\n *\n * Instead, this function \"fixes\" the relative urls to be absolute according to the current page location.\n *\n * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.\n *\n */\n\nmodule.exports = function (css) {\n  // get current location\n  var location = typeof window !== \"undefined\" && window.location;\n\n  if (!location) {\n    throw new Error(\"fixUrls requires window.location\");\n  }\n\n\t// blank or null?\n\tif (!css || typeof css !== \"string\") {\n\t  return css;\n  }\n\n  var baseUrl = location.protocol + \"//\" + location.host;\n  var currentDir = baseUrl + location.pathname.replace(/\\/[^\\/]*$/, \"/\");\n\n\t// convert each url(...)\n\t/*\n\tThis regular expression is just a way to recursively match brackets within\n\ta string.\n\n\t /url\\s*\\(  = Match on the word \"url\" with any whitespace after it and then a parens\n\t   (  = Start a capturing group\n\t     (?:  = Start a non-capturing group\n\t         [^)(]  = Match anything that isn't a parentheses\n\t         |  = OR\n\t         \\(  = Match a start parentheses\n\t             (?:  = Start another non-capturing groups\n\t                 [^)(]+  = Match anything that isn't a parentheses\n\t                 |  = OR\n\t                 \\(  = Match a start parentheses\n\t                     [^)(]*  = Match anything that isn't a parentheses\n\t                 \\)  = Match a end parentheses\n\t             )  = End Group\n              *\\) = Match anything and then a close parens\n          )  = Close non-capturing group\n          *  = Match anything\n       )  = Close capturing group\n\t \\)  = Match a close parens\n\n\t /gi  = Get all matches, not the first.  Be case insensitive.\n\t */\n\tvar fixedCss = css.replace(/url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi, function(fullMatch, origUrl) {\n\t\t// strip quotes (if they exist)\n\t\tvar unquotedOrigUrl = origUrl\n\t\t\t.trim()\n\t\t\t.replace(/^\"(.*)\"$/, function(o, $1){ return $1; })\n\t\t\t.replace(/^'(.*)'$/, function(o, $1){ return $1; });\n\n\t\t// already a full url? no change\n\t\tif (/^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/|\\s*$)/i.test(unquotedOrigUrl)) {\n\t\t  return fullMatch;\n\t\t}\n\n\t\t// convert the url to a full url\n\t\tvar newUrl;\n\n\t\tif (unquotedOrigUrl.indexOf(\"//\") === 0) {\n\t\t  \t//TODO: should we add protocol?\n\t\t\tnewUrl = unquotedOrigUrl;\n\t\t} else if (unquotedOrigUrl.indexOf(\"/\") === 0) {\n\t\t\t// path should be relative to the base url\n\t\t\tnewUrl = baseUrl + unquotedOrigUrl; // already starts with '/'\n\t\t} else {\n\t\t\t// path should be relative to current directory\n\t\t\tnewUrl = currentDir + unquotedOrigUrl.replace(/^\\.\\//, \"\"); // Strip leading './'\n\t\t}\n\n\t\t// send back the fixed url(...)\n\t\treturn \"url(\" + JSON.stringify(newUrl) + \")\";\n\t});\n\n\t// send back the fixed css\n\treturn fixedCss;\n};\n\n\n/***/ }),\n\n/***/ 1195:\n/***/ ((module) => {\n\n\"use strict\";\n\n\nmodule.exports = TinyQueue;\nmodule.exports[\"default\"] = TinyQueue;\n\nfunction TinyQueue(data, compare) {\n    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);\n\n    this.data = data || [];\n    this.length = this.data.length;\n    this.compare = compare || defaultCompare;\n\n    if (this.length > 0) {\n        for (var i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n    }\n}\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nTinyQueue.prototype = {\n\n    push: function (item) {\n        this.data.push(item);\n        this.length++;\n        this._up(this.length - 1);\n    },\n\n    pop: function () {\n        if (this.length === 0) return undefined;\n\n        var top = this.data[0];\n        this.length--;\n\n        if (this.length > 0) {\n            this.data[0] = this.data[this.length];\n            this._down(0);\n        }\n        this.data.pop();\n\n        return top;\n    },\n\n    peek: function () {\n        return this.data[0];\n    },\n\n    _up: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var item = data[pos];\n\n        while (pos > 0) {\n            var parent = (pos - 1) >> 1;\n            var current = data[parent];\n            if (compare(item, current) >= 0) break;\n            data[pos] = current;\n            pos = parent;\n        }\n\n        data[pos] = item;\n    },\n\n    _down: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var halfLength = this.length >> 1;\n        var item = data[pos];\n\n        while (pos < halfLength) {\n            var left = (pos << 1) + 1;\n            var right = left + 1;\n            var best = data[left];\n\n            if (right < this.length && compare(data[right], best) < 0) {\n                left = right;\n                best = data[right];\n            }\n            if (compare(best, item) >= 0) break;\n\n            data[pos] = best;\n            pos = left;\n        }\n\n        data[pos] = item;\n    }\n};\n\n\n/***/ }),\n\n/***/ 2793:\n/***/ ((module) => {\n\nvar PRESET_VALUES = [\n  \"hz60\",\n  \"hz170\",\n  \"hz310\",\n  \"hz600\",\n  \"hz1000\",\n  \"hz3000\",\n  \"hz6000\",\n  \"hz12000\",\n  \"hz14000\",\n  \"hz16000\",\n  \"preamp\"\n];\n\nvar HEADER = \"Winamp EQ library file v1.1\";\n\nmodule.exports = {\n  PRESET_VALUES: PRESET_VALUES,\n  HEADER: HEADER\n};\n\n\n/***/ }),\n\n/***/ 7264:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar CONSTANTS = __webpack_require__(2793);\n\nvar FILL_SIZE = 4;\nvar PRESET_LENGTH = 257;\n\nfunction creator(data) {\n  var buffer = [];\n  for (var i = 0; i < CONSTANTS.HEADER.length; i++) {\n    buffer.push(CONSTANTS.HEADER.charCodeAt(i));\n  }\n  buffer.push(26); // <ctrl-z>\n  var ending = \"!--\";\n  for (var i = 0; i < ending.length; i++) {\n    buffer.push(ending.charCodeAt(i));\n  }\n  if (!data.presets) {\n    throw new Error(\"Eqf data is missing presets\");\n  }\n  data.presets.forEach(function(preset) {\n    var k = 0;\n    for (; k < preset.name.length; k++) {\n      buffer.push(preset.name.charCodeAt(k));\n    }\n    for (; k < PRESET_LENGTH; k++) {\n      buffer.push(0);\n    }\n\n    CONSTANTS.PRESET_VALUES.forEach(function(valueName) {\n      buffer.push(64 - preset[valueName]); // Adjust for inverse values\n    });\n  });\n  return new Uint8Array(buffer).buffer;\n}\n\nmodule.exports = creator;\n\n\n/***/ }),\n\n/***/ 2105:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar parser = __webpack_require__(3964);\nvar creator = __webpack_require__(7264);\n\nmodule.exports = {\n  parser: parser,\n  creator: creator\n};\n\n\n/***/ }),\n\n/***/ 3964:\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar CONSTANTS = __webpack_require__(2793);\n\nfunction parser(arrayBuffer) {\n  var data = {};\n  var i = 0;\n  var arr = new Int8Array(arrayBuffer);\n  // Parse header\n  data.type = String.fromCharCode.apply(\n    null,\n    arr.slice(i, CONSTANTS.HEADER.length)\n  );\n  if (data.type !== CONSTANTS.HEADER) {\n    throw new Error(\"Invalid .eqf file.\");\n  }\n  i += CONSTANTS.HEADER.length;\n  // Skip \"<ctrl-z>!--\"\n  i += 4;\n  // Get the presets\n  data.presets = [];\n  while (i < arr.length) {\n    var preset = {};\n    // Get the name\n    var nameStart = i;\n    var nameEnd = nameStart + 257; // Str is fixed length\n    // Str is null terminated\n    while (arr[i] !== 0 && i <= nameEnd) {\n      i++;\n    }\n    preset.name = String.fromCharCode.apply(null, arr.slice(nameStart, i));\n    i = nameEnd; // Skip over any unused bytes\n\n    // Get the levels\n    CONSTANTS.PRESET_VALUES.forEach(function(valueName) {\n      preset[valueName] = 64 - arr[i++]; // Adjust for inverse values\n    });\n    data.presets.push(preset);\n  }\n  return data;\n}\n\nmodule.exports = parser;\n\n\n/***/ }),\n\n/***/ 2601:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"Z\": () => (/* binding */ _defineProperty)\n});\n\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/typeof.js\nfunction _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, _typeof(o);\n}\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js\n\nfunction _toPrimitive(input, hint) {\n  if (_typeof(input) !== \"object\" || input === null) return input;\n  var prim = input[Symbol.toPrimitive];\n  if (prim !== undefined) {\n    var res = prim.call(input, hint || \"default\");\n    if (_typeof(res) !== \"object\") return res;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (hint === \"string\" ? String : Number)(input);\n}\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js\n\n\nfunction _toPropertyKey(arg) {\n  var key = _toPrimitive(arg, \"string\");\n  return _typeof(key) === \"symbol\" ? key : String(key);\n}\n;// CONCATENATED MODULE: ../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\n\nfunction _defineProperty(obj, key, value) {\n  key = _toPropertyKey(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\n\n/***/ }),\n\n/***/ 1150:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"Cb\": () => (/* binding */ InternalParserError),\n/* harmony export */   \"GG\": () => (/* binding */ CouldNotDetermineFileTypeError),\n/* harmony export */   \"f8\": () => (/* binding */ makeUnexpectedFileContentError),\n/* harmony export */   \"gV\": () => (/* binding */ FieldDecodingError),\n/* harmony export */   \"tw\": () => (/* binding */ UnsupportedFileTypeError)\n/* harmony export */ });\n/* unused harmony export makeParseError */\nconst makeParseError = (name) => {\n    return class ParseError extends Error {\n        constructor(message) {\n            super(message);\n            this.name = name;\n        }\n    };\n};\n// Concrete error class representing a file type determination failure.\nclass CouldNotDetermineFileTypeError extends makeParseError('CouldNotDetermineFileTypeError') {\n}\n// Concrete error class representing an unsupported file type.\nclass UnsupportedFileTypeError extends makeParseError('UnsupportedFileTypeError') {\n}\n// Concrete error class representing unexpected file content.\nclass UnexpectedFileContentError extends makeParseError('UnexpectedFileContentError') {\n    constructor(fileType, message) {\n        super(message);\n        this.fileType = fileType;\n    }\n    // Override toString to include file type information.\n    toString() {\n        return `${this.name} (FileType: ${this.fileType}): ${this.message}`;\n    }\n}\n// Concrete error class representing a field decoding error.\nclass FieldDecodingError extends makeParseError('FieldDecodingError') {\n}\nclass InternalParserError extends makeParseError('InternalParserError') {\n}\n// Factory function to create a specific type of UnexpectedFileContentError.\nconst makeUnexpectedFileContentError = (fileType) => {\n    return class extends UnexpectedFileContentError {\n        constructor(message) {\n            super(fileType, message);\n        }\n    };\n};\n//# sourceMappingURL=ParseError.js.map\n\n/***/ }),\n\n/***/ 7349:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"APEv2Parser\": () => (/* binding */ APEv2Parser),\n  \"ApeContentError\": () => (/* binding */ ApeContentError)\n});\n\n// EXTERNAL MODULE: ../../node_modules/music-metadata/node_modules/debug/src/browser.js\nvar browser = __webpack_require__(7260);\n// EXTERNAL MODULE: ../../node_modules/strtok3/lib/core.js + 11 modules\nvar core = __webpack_require__(8331);\n// EXTERNAL MODULE: ../../node_modules/token-types/lib/index.js\nvar lib = __webpack_require__(525);\n// EXTERNAL MODULE: ../../node_modules/uint8array-extras/index.js\nvar uint8array_extras = __webpack_require__(4624);\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/common/Util.js\nvar Util = __webpack_require__(7764);\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/common/BasicParser.js\nvar BasicParser = __webpack_require__(7123);\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/common/FourCC.js\nvar FourCC = __webpack_require__(9338);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/apev2/APEv2Token.js\n\n\nconst DataType = {\n    text_utf8: 0,\n    binary: 1,\n    external_info: 2,\n    reserved: 3\n};\n/**\n * APE_DESCRIPTOR: defines the sizes (and offsets) of all the pieces, as well as the MD5 checksum\n */\nconst DescriptorParser = {\n    len: 52,\n    get: (buf, off) => {\n        return {\n            // should equal 'MAC '\n            ID: FourCC/* FourCcToken.get */.A.get(buf, off),\n            // versionIndex number * 1000 (3.81 = 3810) (remember that 4-byte alignment causes this to take 4-bytes)\n            version: lib.UINT32_LE.get(buf, off + 4) / 1000,\n            // the number of descriptor bytes (allows later expansion of this header)\n            descriptorBytes: lib.UINT32_LE.get(buf, off + 8),\n            // the number of header APE_HEADER bytes\n            headerBytes: lib.UINT32_LE.get(buf, off + 12),\n            // the number of header APE_HEADER bytes\n            seekTableBytes: lib.UINT32_LE.get(buf, off + 16),\n            // the number of header data bytes (from original file)\n            headerDataBytes: lib.UINT32_LE.get(buf, off + 20),\n            // the number of bytes of APE frame data\n            apeFrameDataBytes: lib.UINT32_LE.get(buf, off + 24),\n            // the high order number of APE frame data bytes\n            apeFrameDataBytesHigh: lib.UINT32_LE.get(buf, off + 28),\n            // the terminating data of the file (not including tag data)\n            terminatingDataBytes: lib.UINT32_LE.get(buf, off + 32),\n            // the MD5 hash of the file (see notes for usage... it's a little tricky)\n            fileMD5: new lib.Uint8ArrayType(16).get(buf, off + 36)\n        };\n    }\n};\n/**\n * APE_HEADER: describes all of the necessary information about the APE file\n */\nconst Header = {\n    len: 24,\n    get: (buf, off) => {\n        return {\n            // the compression level (see defines I.E. COMPRESSION_LEVEL_FAST)\n            compressionLevel: lib.UINT16_LE.get(buf, off),\n            // any format flags (for future use)\n            formatFlags: lib.UINT16_LE.get(buf, off + 2),\n            // the number of audio blocks in one frame\n            blocksPerFrame: lib.UINT32_LE.get(buf, off + 4),\n            // the number of audio blocks in the final frame\n            finalFrameBlocks: lib.UINT32_LE.get(buf, off + 8),\n            // the total number of frames\n            totalFrames: lib.UINT32_LE.get(buf, off + 12),\n            // the bits per sample (typically 16)\n            bitsPerSample: lib.UINT16_LE.get(buf, off + 16),\n            // the number of channels (1 or 2)\n            channel: lib.UINT16_LE.get(buf, off + 18),\n            // the sample rate (typically 44100)\n            sampleRate: lib.UINT32_LE.get(buf, off + 20)\n        };\n    }\n};\n/**\n * APE Tag Header/Footer Version 2.0\n * TAG: describes all the properties of the file [optional]\n */\nconst TagFooter = {\n    len: 32,\n    get: (buf, off) => {\n        return {\n            // should equal 'APETAGEX'\n            ID: new lib.StringType(8, 'ascii').get(buf, off),\n            // equals CURRENT_APE_TAG_VERSION\n            version: lib.UINT32_LE.get(buf, off + 8),\n            // the complete size of the tag, including this footer (excludes header)\n            size: lib.UINT32_LE.get(buf, off + 12),\n            // the number of fields in the tag\n            fields: lib.UINT32_LE.get(buf, off + 16),\n            // reserved for later use (must be zero),\n            flags: parseTagFlags(lib.UINT32_LE.get(buf, off + 20))\n        };\n    }\n};\n/**\n * APE Tag v2.0 Item Header\n */\nconst TagItemHeader = {\n    len: 8,\n    get: (buf, off) => {\n        return {\n            // Length of assigned value in bytes\n            size: lib.UINT32_LE.get(buf, off),\n            // reserved for later use (must be zero),\n            flags: parseTagFlags(lib.UINT32_LE.get(buf, off + 4))\n        };\n    }\n};\nfunction parseTagFlags(flags) {\n    return {\n        containsHeader: isBitSet(flags, 31),\n        containsFooter: isBitSet(flags, 30),\n        isHeader: isBitSet(flags, 29),\n        readOnly: isBitSet(flags, 0),\n        dataType: (flags & 6) >> 1\n    };\n}\n/**\n * @param num {number}\n * @param bit 0 is least significant bit (LSB)\n * @return {boolean} true if bit is 1; otherwise false\n */\nfunction isBitSet(num, bit) {\n    return (num & 1 << bit) !== 0;\n}\n//# sourceMappingURL=APEv2Token.js.map\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/ParseError.js\nvar ParseError = __webpack_require__(1150);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/apev2/APEv2Parser.js\n\n\n\n\n\n\n\n\nconst debug = browser('music-metadata:parser:APEv2');\nconst tagFormat = 'APEv2';\nconst preamble = 'APETAGEX';\nclass ApeContentError extends (0,ParseError/* makeUnexpectedFileContentError */.f8)('APEv2') {\n}\nclass APEv2Parser extends BasicParser/* BasicParser */.g {\n    constructor() {\n        super(...arguments);\n        this.ape = {};\n    }\n    static tryParseApeHeader(metadata, tokenizer, options) {\n        const apeParser = new APEv2Parser(metadata, tokenizer, options);\n        return apeParser.tryParseApeHeader();\n    }\n    /**\n     * Calculate the media file duration\n     * @param ah ApeHeader\n     * @return {number} duration in seconds\n     */\n    static calculateDuration(ah) {\n        let duration = ah.totalFrames > 1 ? ah.blocksPerFrame * (ah.totalFrames - 1) : 0;\n        duration += ah.finalFrameBlocks;\n        return duration / ah.sampleRate;\n    }\n    /**\n     * Calculates the APEv1 / APEv2 first field offset\n     * @param tokenizer\n     * @param offset\n     */\n    static async findApeFooterOffset(tokenizer, offset) {\n        // Search for APE footer header at the end of the file\n        const apeBuf = new Uint8Array(TagFooter.len);\n        const position = tokenizer.position;\n        if (offset <= TagFooter.len) {\n            debug(`Offset is too small to read APE footer: offset=${offset}`);\n            return undefined;\n        }\n        if (offset > TagFooter.len) {\n            await tokenizer.readBuffer(apeBuf, { position: offset - TagFooter.len });\n            tokenizer.setPosition(position);\n            const tagFooter = TagFooter.get(apeBuf, 0);\n            if (tagFooter.ID === 'APETAGEX') {\n                if (tagFooter.flags.isHeader) {\n                    debug(`APE Header found at offset=${offset - TagFooter.len}`);\n                }\n                else {\n                    debug(`APE Footer found at offset=${offset - TagFooter.len}`);\n                    offset -= tagFooter.size;\n                }\n                return { footer: tagFooter, offset };\n            }\n        }\n    }\n    static parseTagFooter(metadata, buffer, options) {\n        const footer = TagFooter.get(buffer, buffer.length - TagFooter.len);\n        if (footer.ID !== preamble)\n            throw new ApeContentError('Unexpected APEv2 Footer ID preamble value');\n        core/* fromBuffer */.FY(buffer);\n        const apeParser = new APEv2Parser(metadata, core/* fromBuffer */.FY(buffer), options);\n        return apeParser.parseTags(footer);\n    }\n    /**\n     * Parse APEv1 / APEv2 header if header signature found\n     */\n    async tryParseApeHeader() {\n        if (this.tokenizer.fileInfo.size && this.tokenizer.fileInfo.size - this.tokenizer.position < TagFooter.len) {\n            debug(\"No APEv2 header found, end-of-file reached\");\n            return;\n        }\n        const footer = await this.tokenizer.peekToken(TagFooter);\n        if (footer.ID === preamble) {\n            await this.tokenizer.ignore(TagFooter.len);\n            return this.parseTags(footer);\n        }\n        debug(`APEv2 header not found at offset=${this.tokenizer.position}`);\n        if (this.tokenizer.fileInfo.size) {\n            // Try to read the APEv2 header using just the footer-header\n            const remaining = this.tokenizer.fileInfo.size - this.tokenizer.position; // ToDo: take ID3v1 into account\n            const buffer = new Uint8Array(remaining);\n            await this.tokenizer.readBuffer(buffer);\n            return APEv2Parser.parseTagFooter(this.metadata, buffer, this.options);\n        }\n    }\n    async parse() {\n        const descriptor = await this.tokenizer.readToken(DescriptorParser);\n        if (descriptor.ID !== 'MAC ')\n            throw new ApeContentError('Unexpected descriptor ID');\n        this.ape.descriptor = descriptor;\n        const lenExp = descriptor.descriptorBytes - DescriptorParser.len;\n        const header = await (lenExp > 0 ? this.parseDescriptorExpansion(lenExp) : this.parseHeader());\n        await this.tokenizer.ignore(header.forwardBytes);\n        return this.tryParseApeHeader();\n    }\n    async parseTags(footer) {\n        const keyBuffer = new Uint8Array(256); // maximum tag key length\n        let bytesRemaining = footer.size - TagFooter.len;\n        debug(`Parse APE tags at offset=${this.tokenizer.position}, size=${bytesRemaining}`);\n        for (let i = 0; i < footer.fields; i++) {\n            if (bytesRemaining < TagItemHeader.len) {\n                this.metadata.addWarning(`APEv2 Tag-header: ${footer.fields - i} items remaining, but no more tag data to read.`);\n                break;\n            }\n            // Only APEv2 tag has tag item headers\n            const tagItemHeader = await this.tokenizer.readToken(TagItemHeader);\n            bytesRemaining -= TagItemHeader.len + tagItemHeader.size;\n            await this.tokenizer.peekBuffer(keyBuffer, { length: Math.min(keyBuffer.length, bytesRemaining) });\n            let zero = Util/* findZero */.ul(keyBuffer, 0, keyBuffer.length);\n            const key = await this.tokenizer.readToken(new lib.StringType(zero, 'ascii'));\n            await this.tokenizer.ignore(1);\n            bytesRemaining -= key.length + 1;\n            switch (tagItemHeader.flags.dataType) {\n                case DataType.text_utf8: { // utf-8 text-string\n                    const value = await this.tokenizer.readToken(new lib.StringType(tagItemHeader.size, 'utf8'));\n                    const values = value.split(/\\x00/g);\n                    await Promise.all(values.map(val => this.metadata.addTag(tagFormat, key, val)));\n                    break;\n                }\n                case DataType.binary: // binary (probably artwork)\n                    if (this.options.skipCovers) {\n                        await this.tokenizer.ignore(tagItemHeader.size);\n                    }\n                    else {\n                        const picData = new Uint8Array(tagItemHeader.size);\n                        await this.tokenizer.readBuffer(picData);\n                        zero = Util/* findZero */.ul(picData, 0, picData.length);\n                        const description = (0,uint8array_extras/* uint8ArrayToString */.DA)(picData.slice(0, zero));\n                        const data = picData.slice(zero + 1);\n                        await this.metadata.addTag(tagFormat, key, {\n                            description,\n                            data\n                        });\n                    }\n                    break;\n                case DataType.external_info:\n                    debug(`Ignore external info ${key}`);\n                    await this.tokenizer.ignore(tagItemHeader.size);\n                    break;\n                case DataType.reserved:\n                    debug(`Ignore external info ${key}`);\n                    this.metadata.addWarning(`APEv2 header declares a reserved datatype for \"${key}\"`);\n                    await this.tokenizer.ignore(tagItemHeader.size);\n                    break;\n            }\n        }\n    }\n    async parseDescriptorExpansion(lenExp) {\n        await this.tokenizer.ignore(lenExp);\n        return this.parseHeader();\n    }\n    async parseHeader() {\n        const header = await this.tokenizer.readToken(Header);\n        // ToDo before\n        this.metadata.setFormat('lossless', true);\n        this.metadata.setFormat('container', 'Monkey\\'s Audio');\n        this.metadata.setFormat('bitsPerSample', header.bitsPerSample);\n        this.metadata.setFormat('sampleRate', header.sampleRate);\n        this.metadata.setFormat('numberOfChannels', header.channel);\n        this.metadata.setFormat('duration', APEv2Parser.calculateDuration(header));\n        if (!this.ape.descriptor) {\n            throw new ApeContentError('Missing APE descriptor');\n        }\n        return {\n            forwardBytes: this.ape.descriptor.seekTableBytes + this.ape.descriptor.headerDataBytes +\n                this.ape.descriptor.apeFrameDataBytes + this.ape.descriptor.terminatingDataBytes\n        };\n    }\n}\n//# sourceMappingURL=APEv2Parser.js.map\n\n/***/ }),\n\n/***/ 7123:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"g\": () => (/* binding */ BasicParser)\n/* harmony export */ });\nclass BasicParser {\n    /**\n     * Initialize parser with output (metadata), input (tokenizer) & parsing options (options).\n     * @param {INativeMetadataCollector} metadata Output\n     * @param {ITokenizer} tokenizer Input\n     * @param {IOptions} options Parsing options\n     */\n    constructor(metadata, tokenizer, options) {\n        this.metadata = metadata;\n        this.tokenizer = tokenizer;\n        this.options = options;\n    }\n}\n//# sourceMappingURL=BasicParser.js.map\n\n/***/ }),\n\n/***/ 9338:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"A\": () => (/* binding */ FourCcToken)\n/* harmony export */ });\n/* harmony import */ var uint8array_extras__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4624);\n/* harmony import */ var _Util_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7764);\n/* harmony import */ var _ParseError_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1150);\n\n\n\nconst validFourCC = /^[\\x21-\\x7e©][\\x20-\\x7e\\x00()]{3}/;\n/**\n * Token for read FourCC\n * Ref: https://en.wikipedia.org/wiki/FourCC\n */\nconst FourCcToken = {\n    len: 4,\n    get: (buf, off) => {\n        const id = (0,uint8array_extras__WEBPACK_IMPORTED_MODULE_0__/* .uint8ArrayToString */ .DA)(buf.slice(off, off + FourCcToken.len), 'latin1');\n        if (!id.match(validFourCC)) {\n            throw new _ParseError_js__WEBPACK_IMPORTED_MODULE_1__/* .FieldDecodingError */ .gV(`FourCC contains invalid characters: ${_Util_js__WEBPACK_IMPORTED_MODULE_2__/* .a2hex */ .WX(id)} \"${id}\"`);\n        }\n        return id;\n    },\n    put: (buffer, offset, id) => {\n        const str = (0,uint8array_extras__WEBPACK_IMPORTED_MODULE_0__/* .stringToUint8Array */ .sy)(id);\n        if (str.length !== 4)\n            throw new _ParseError_js__WEBPACK_IMPORTED_MODULE_1__/* .InternalParserError */ .Cb('Invalid length');\n        buffer.set(str, offset);\n        return offset + 4;\n    }\n};\n//# sourceMappingURL=FourCC.js.map\n\n/***/ }),\n\n/***/ 7764:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"WX\": () => (/* binding */ a2hex),\n/* harmony export */   \"dS\": () => (/* binding */ stripNulls),\n/* harmony export */   \"ej\": () => (/* binding */ toRatio),\n/* harmony export */   \"iu\": () => (/* binding */ getBitAllignedNumber),\n/* harmony export */   \"qD\": () => (/* binding */ getBit),\n/* harmony export */   \"qY\": () => (/* binding */ isBitSet),\n/* harmony export */   \"t6\": () => (/* binding */ trimRightNull),\n/* harmony export */   \"ul\": () => (/* binding */ findZero),\n/* harmony export */   \"v5\": () => (/* binding */ decodeString)\n/* harmony export */ });\n/* unused harmony exports ratioToDb, dbToRatio */\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(525);\n/* harmony import */ var _ParseError_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1150);\n\n\nfunction getBit(buf, off, bit) {\n    return (buf[off] & (1 << bit)) !== 0;\n}\n/**\n * Found delimiting zero in uint8Array\n * @param uint8Array Uint8Array to find the zero delimiter in\n * @param start Offset in uint8Array\n * @param end Last position to parse in uint8Array\n * @param encoding The string encoding used\n * @return Absolute position on uint8Array where zero found\n */\nfunction findZero(uint8Array, start, end, encoding) {\n    let i = start;\n    if (encoding === 'utf-16le') {\n        while (uint8Array[i] !== 0 || uint8Array[i + 1] !== 0) {\n            if (i >= end)\n                return end;\n            i += 2;\n        }\n        return i;\n    }\n    while (uint8Array[i] !== 0) {\n        if (i >= end)\n            return end;\n        i++;\n    }\n    return i;\n}\nfunction trimRightNull(x) {\n    const pos0 = x.indexOf('\\0');\n    return pos0 === -1 ? x : x.substr(0, pos0);\n}\nfunction swapBytes(uint8Array) {\n    const l = uint8Array.length;\n    if ((l & 1) !== 0)\n        throw new _ParseError_js__WEBPACK_IMPORTED_MODULE_1__/* .FieldDecodingError */ .gV('Buffer length must be even');\n    for (let i = 0; i < l; i += 2) {\n        const a = uint8Array[i];\n        uint8Array[i] = uint8Array[i + 1];\n        uint8Array[i + 1] = a;\n    }\n    return uint8Array;\n}\n/**\n * Decode string\n */\nfunction decodeString(uint8Array, encoding) {\n    // annoying workaround for a double BOM issue\n    // https://github.com/leetreveil/musicmetadata/issues/84\n    if (uint8Array[0] === 0xFF && uint8Array[1] === 0xFE) { // little endian\n        return decodeString(uint8Array.subarray(2), encoding);\n    }\n    if (encoding === 'utf-16le' && uint8Array[0] === 0xFE && uint8Array[1] === 0xFF) {\n        // BOM, indicating big endian decoding\n        if ((uint8Array.length & 1) !== 0)\n            throw new _ParseError_js__WEBPACK_IMPORTED_MODULE_1__/* .FieldDecodingError */ .gV('Expected even number of octets for 16-bit unicode string');\n        return decodeString(swapBytes(uint8Array), encoding);\n    }\n    return new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(uint8Array.length, encoding).get(uint8Array, 0);\n}\nfunction stripNulls(str) {\n    str = str.replace(/^\\x00+/g, '');\n    str = str.replace(/\\x00+$/g, '');\n    return str;\n}\n/**\n * Read bit-aligned number start from buffer\n * Total offset in bits = byteOffset * 8 + bitOffset\n * @param source Byte buffer\n * @param byteOffset Starting offset in bytes\n * @param bitOffset Starting offset in bits: 0 = lsb\n * @param len Length of number in bits\n * @return Decoded bit aligned number\n */\nfunction getBitAllignedNumber(source, byteOffset, bitOffset, len) {\n    const byteOff = byteOffset + ~~(bitOffset / 8);\n    const bitOff = bitOffset % 8;\n    let value = source[byteOff];\n    value &= 0xff >> bitOff;\n    const bitsRead = 8 - bitOff;\n    const bitsLeft = len - bitsRead;\n    if (bitsLeft < 0) {\n        value >>= (8 - bitOff - len);\n    }\n    else if (bitsLeft > 0) {\n        value <<= bitsLeft;\n        value |= getBitAllignedNumber(source, byteOffset, bitOffset + bitsRead, bitsLeft);\n    }\n    return value;\n}\n/**\n * Read bit-aligned number start from buffer\n * Total offset in bits = byteOffset * 8 + bitOffset\n * @param source Byte Uint8Array\n * @param byteOffset Starting offset in bytes\n * @param bitOffset Starting offset in bits: 0 = most significant bit, 7 is the least significant bit\n * @return True if bit is set\n */\nfunction isBitSet(source, byteOffset, bitOffset) {\n    return getBitAllignedNumber(source, byteOffset, bitOffset, 1) === 1;\n}\nfunction a2hex(str) {\n    const arr = [];\n    for (let i = 0, l = str.length; i < l; i++) {\n        const hex = Number(str.charCodeAt(i)).toString(16);\n        arr.push(hex.length === 1 ? `0${hex}` : hex);\n    }\n    return arr.join(' ');\n}\n/**\n * Convert power ratio to DB\n * ratio: [0..1]\n */\nfunction ratioToDb(ratio) {\n    return 10 * Math.log10(ratio);\n}\n/**\n * Convert dB to ratio\n * db Decibels\n */\nfunction dbToRatio(dB) {\n    return 10 ** (dB / 10);\n}\n/**\n * Convert replay gain to ratio and Decibel\n * @param value string holding a ratio like '0.034' or '-7.54 dB'\n */\nfunction toRatio(value) {\n    const ps = value.split(' ').map(p => p.trim().toLowerCase());\n    // @ts-ignore\n    if (ps.length >= 1) {\n        const v = Number.parseFloat(ps[0]);\n        return ps.length === 2 && ps[1] === 'db' ? {\n            dB: v,\n            ratio: dbToRatio(v)\n        } : {\n            dB: ratioToDb(v),\n            ratio: v\n        };\n    }\n}\n//# sourceMappingURL=Util.js.map\n\n/***/ }),\n\n/***/ 884:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"R0\": () => (/* binding */ ID3v1Parser),\n/* harmony export */   \"a9\": () => (/* binding */ Genres),\n/* harmony export */   \"gH\": () => (/* binding */ hasID3v1Header)\n/* harmony export */ });\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7260);\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(525);\n/* harmony import */ var _common_Util_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7764);\n/* harmony import */ var _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7123);\n/* harmony import */ var _apev2_APEv2Parser_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7349);\n\n\n\n\n\nconst debug = debug__WEBPACK_IMPORTED_MODULE_0__('music-metadata:parser:ID3v1');\n/**\n * ID3v1 Genre mappings\n * Ref: https://de.wikipedia.org/wiki/Liste_der_ID3v1-Genres\n */\nconst Genres = [\n    'Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-Hop',\n    'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop', 'R&B', 'Rap', 'Reggae', 'Rock',\n    'Techno', 'Industrial', 'Alternative', 'Ska', 'Death Metal', 'Pranks', 'Soundtrack',\n    'Euro-Techno', 'Ambient', 'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance',\n    'Classical', 'Instrumental', 'Acid', 'House', 'Game', 'Sound Clip', 'Gospel', 'Noise',\n    'Alt. Rock', 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental Pop',\n    'Instrumental Rock', 'Ethnic', 'Gothic', 'Darkwave', 'Techno-Industrial',\n    'Electronic', 'Pop-Folk', 'Eurodance', 'Dream', 'Southern Rock', 'Comedy', 'Cult',\n    'Gangsta Rap', 'Top 40', 'Christian Rap', 'Pop/Funk', 'Jungle', 'Native American',\n    'Cabaret', 'New Wave', 'Psychedelic', 'Rave', 'Showtunes', 'Trailer', 'Lo-Fi', 'Tribal',\n    'Acid Punk', 'Acid Jazz', 'Polka', 'Retro', 'Musical', 'Rock & Roll', 'Hard Rock',\n    'Folk', 'Folk/Rock', 'National Folk', 'Swing', 'Fast-Fusion', 'Bebob', 'Latin', 'Revival',\n    'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock', 'Psychedelic Rock',\n    'Symphonic Rock', 'Slow Rock', 'Big Band', 'Chorus', 'Easy Listening', 'Acoustic', 'Humour',\n    'Speech', 'Chanson', 'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass', 'Primus',\n    'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba', 'Folklore',\n    'Ballad', 'Power Ballad', 'Rhythmic Soul', 'Freestyle', 'Duet', 'Punk Rock', 'Drum Solo',\n    'A Cappella', 'Euro-House', 'Dance Hall', 'Goa', 'Drum & Bass', 'Club-House',\n    'Hardcore', 'Terror', 'Indie', 'BritPop', 'Negerpunk', 'Polsk Punk', 'Beat',\n    'Christian Gangsta Rap', 'Heavy Metal', 'Black Metal', 'Crossover', 'Contemporary Christian',\n    'Christian Rock', 'Merengue', 'Salsa', 'Thrash Metal', 'Anime', 'JPop', 'Synthpop',\n    'Abstract', 'Art Rock', 'Baroque', 'Bhangra', 'Big Beat', 'Breakbeat', 'Chillout',\n    'Downtempo', 'Dub', 'EBM', 'Eclectic', 'Electro', 'Electroclash', 'Emo', 'Experimental',\n    'Garage', 'Global', 'IDM', 'Illbient', 'Industro-Goth', 'Jam Band', 'Krautrock',\n    'Leftfield', 'Lounge', 'Math Rock', 'New Romantic', 'Nu-Breakz', 'Post-Punk', 'Post-Rock',\n    'Psytrance', 'Shoegaze', 'Space Rock', 'Trop Rock', 'World Music', 'Neoclassical', 'Audiobook',\n    'Audio Theatre', 'Neue Deutsche Welle', 'Podcast', 'Indie Rock', 'G-Funk', 'Dubstep',\n    'Garage Rock', 'Psybient'\n];\n/**\n * Spec: http://id3.org/ID3v1\n * Wiki: https://en.wikipedia.org/wiki/ID3\n */\nconst Iid3v1Token = {\n    len: 128,\n    /**\n     * @param buf Buffer possibly holding the 128 bytes ID3v1.1 metadata header\n     * @param off Offset in buffer in bytes\n     * @returns ID3v1.1 header if first 3 bytes equals 'TAG', otherwise null is returned\n     */\n    get: (buf, off) => {\n        const header = new Id3v1StringType(3).get(buf, off);\n        return header === 'TAG' ? {\n            header,\n            title: new Id3v1StringType(30).get(buf, off + 3),\n            artist: new Id3v1StringType(30).get(buf, off + 33),\n            album: new Id3v1StringType(30).get(buf, off + 63),\n            year: new Id3v1StringType(4).get(buf, off + 93),\n            comment: new Id3v1StringType(28).get(buf, off + 97),\n            // ID3v1.1 separator for track\n            zeroByte: token_types__WEBPACK_IMPORTED_MODULE_1__.UINT8.get(buf, off + 127),\n            // track: ID3v1.1 field added by Michael Mutschler\n            track: token_types__WEBPACK_IMPORTED_MODULE_1__.UINT8.get(buf, off + 126),\n            genre: token_types__WEBPACK_IMPORTED_MODULE_1__.UINT8.get(buf, off + 127)\n        } : null;\n    }\n};\nclass Id3v1StringType {\n    constructor(len) {\n        this.len = len;\n        this.stringType = new token_types__WEBPACK_IMPORTED_MODULE_1__.StringType(len, 'latin1');\n    }\n    get(buf, off) {\n        let value = this.stringType.get(buf, off);\n        value = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__/* .trimRightNull */ .t6(value);\n        value = value.trim();\n        return value.length > 0 ? value : undefined;\n    }\n}\nclass ID3v1Parser extends _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_3__/* .BasicParser */ .g {\n    constructor(metadata, tokenizer, options) {\n        super(metadata, tokenizer, options);\n        this.apeHeader = options.apeHeader;\n    }\n    static getGenre(genreIndex) {\n        if (genreIndex < Genres.length) {\n            return Genres[genreIndex];\n        }\n        return undefined; // ToDO: generate warning\n    }\n    async parse() {\n        if (!this.tokenizer.fileInfo.size) {\n            debug('Skip checking for ID3v1 because the file-size is unknown');\n            return;\n        }\n        if (this.apeHeader) {\n            this.tokenizer.ignore(this.apeHeader.offset - this.tokenizer.position);\n            const apeParser = new _apev2_APEv2Parser_js__WEBPACK_IMPORTED_MODULE_4__.APEv2Parser(this.metadata, this.tokenizer, this.options);\n            await apeParser.parseTags(this.apeHeader.footer);\n        }\n        const offset = this.tokenizer.fileInfo.size - Iid3v1Token.len;\n        if (this.tokenizer.position > offset) {\n            debug('Already consumed the last 128 bytes');\n            return;\n        }\n        const header = await this.tokenizer.readToken(Iid3v1Token, offset);\n        if (header) {\n            debug('ID3v1 header found at: pos=%s', this.tokenizer.fileInfo.size - Iid3v1Token.len);\n            const props = ['title', 'artist', 'album', 'comment', 'track', 'year'];\n            for (const id of props) {\n                if (header[id] && header[id] !== '')\n                    await this.addTag(id, header[id]);\n            }\n            const genre = ID3v1Parser.getGenre(header.genre);\n            if (genre)\n                await this.addTag('genre', genre);\n        }\n        else {\n            debug('ID3v1 header not found at: pos=%s', this.tokenizer.fileInfo.size - Iid3v1Token.len);\n        }\n    }\n    async addTag(id, value) {\n        await this.metadata.addTag('ID3v1', id, value);\n    }\n}\nasync function hasID3v1Header(tokenizer) {\n    if (tokenizer.fileInfo.size >= 128) {\n        const tag = new Uint8Array(3);\n        const position = tokenizer.position;\n        await tokenizer.readBuffer(tag, { position: tokenizer.fileInfo.size - 128 });\n        tokenizer.setPosition(position); // Restore tokenizer position\n        return new TextDecoder('latin1').decode(tag) === 'TAG';\n    }\n    return false;\n}\n//# sourceMappingURL=ID3v1Parser.js.map\n\n/***/ }),\n\n/***/ 1151:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"$2\": () => (/* binding */ ID3v2Header),\n/* harmony export */   \"B_\": () => (/* binding */ TimestampFormat),\n/* harmony export */   \"Is\": () => (/* binding */ TextEncodingToken),\n/* harmony export */   \"Q6\": () => (/* binding */ LyricsContentType),\n/* harmony export */   \"S2\": () => (/* binding */ ExtendedHeader),\n/* harmony export */   \"Y\": () => (/* binding */ TextHeader),\n/* harmony export */   \"fU\": () => (/* binding */ SyncTextHeader),\n/* harmony export */   \"n8\": () => (/* binding */ AttachedPictureType),\n/* harmony export */   \"rF\": () => (/* binding */ UINT32SYNCSAFE)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(525);\n/* harmony import */ var _common_Util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7764);\n\n\n/**\n * The picture type according to the ID3v2 APIC frame\n * Ref: http://id3.org/id3v2.3.0#Attached_picture\n */\nconst AttachedPictureType = {\n    0: 'Other',\n    1: \"32x32 pixels 'file icon' (PNG only)\",\n    2: 'Other file icon',\n    3: 'Cover (front)',\n    4: 'Cover (back)',\n    5: 'Leaflet page',\n    6: 'Media (e.g. label side of CD)',\n    7: 'Lead artist/lead performer/soloist',\n    8: 'Artist/performer',\n    9: 'Conductor',\n    10: 'Band/Orchestra',\n    11: 'Composer',\n    12: 'Lyricist/text writer',\n    13: 'Recording Location',\n    14: 'During recording',\n    15: 'During performance',\n    16: 'Movie/video screen capture',\n    17: 'A bright coloured fish',\n    18: 'Illustration',\n    19: 'Band/artist logotype',\n    20: 'Publisher/Studio logotype'\n};\n/**\n * https://id3.org/id3v2.3.0#Synchronised_lyrics.2Ftext\n */\nconst LyricsContentType = {\n    other: 0,\n    lyrics: 1,\n    text: 2,\n    movement_part: 3,\n    events: 4,\n    chord: 5,\n    trivia_pop: 6,\n};\nconst TimestampFormat = {\n    notSynchronized0: 0,\n    mpegFrameNumber: 1,\n    milliseconds: 2\n};\n/**\n * 28 bits (representing up to 256MB) integer, the msb is 0 to avoid 'false syncsignals'.\n * 4 * %0xxxxxxx\n */\nconst UINT32SYNCSAFE = {\n    get: (buf, off) => {\n        return buf[off + 3] & 0x7f | ((buf[off + 2]) << 7) |\n            ((buf[off + 1]) << 14) | ((buf[off]) << 21);\n    },\n    len: 4\n};\n/**\n * ID3v2 header\n * Ref: http://id3.org/id3v2.3.0#ID3v2_header\n * ToDo\n */\nconst ID3v2Header = {\n    len: 10,\n    get: (buf, off) => {\n        return {\n            // ID3v2/file identifier   \"ID3\"\n            fileIdentifier: new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(3, 'ascii').get(buf, off),\n            // ID3v2 versionIndex\n            version: {\n                major: token_types__WEBPACK_IMPORTED_MODULE_0__.INT8.get(buf, off + 3),\n                revision: token_types__WEBPACK_IMPORTED_MODULE_0__.INT8.get(buf, off + 4)\n            },\n            // ID3v2 flags\n            flags: {\n                // Unsynchronisation\n                unsynchronisation: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__/* .getBit */ .qD(buf, off + 5, 7),\n                // Extended header\n                isExtendedHeader: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__/* .getBit */ .qD(buf, off + 5, 6),\n                // Experimental indicator\n                expIndicator: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__/* .getBit */ .qD(buf, off + 5, 5),\n                footer: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__/* .getBit */ .qD(buf, off + 5, 4)\n            },\n            size: UINT32SYNCSAFE.get(buf, off + 6)\n        };\n    }\n};\nconst ExtendedHeader = {\n    len: 10,\n    get: (buf, off) => {\n        return {\n            // Extended header size\n            size: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buf, off),\n            // Extended Flags\n            extendedFlags: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_BE.get(buf, off + 4),\n            // Size of padding\n            sizeOfPadding: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buf, off + 6),\n            // CRC data present\n            crcDataPresent: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__/* .getBit */ .qD(buf, off + 4, 31)\n        };\n    }\n};\nconst TextEncodingToken = {\n    len: 1,\n    get: (uint8Array, off) => {\n        switch (uint8Array[off]) {\n            case 0x00:\n                return { encoding: 'latin1' }; // binary\n            case 0x01:\n                return { encoding: 'utf-16le', bom: true };\n            case 0x02:\n                return { encoding: 'utf-16le', bom: false };\n            case 0x03:\n                return { encoding: 'utf8', bom: false };\n            default:\n                return { encoding: 'utf8', bom: false };\n        }\n    }\n};\n/**\n * Used to read first portion of `SYLT` frame\n */\nconst TextHeader = {\n    len: 4,\n    get: (uint8Array, off) => {\n        return {\n            encoding: TextEncodingToken.get(uint8Array, off),\n            language: new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(3, 'latin1').get(uint8Array, off + 1)\n        };\n    }\n};\n/**\n * Used to read first portion of `SYLT` frame\n */\nconst SyncTextHeader = {\n    len: 6,\n    get: (uint8Array, off) => {\n        const text = TextHeader.get(uint8Array, off);\n        return {\n            encoding: text.encoding,\n            language: text.language,\n            timeStampFormat: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT8.get(uint8Array, off + 4),\n            contentType: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT8.get(uint8Array, off + 5)\n        };\n    }\n};\n//# sourceMappingURL=ID3v2Token.js.map\n\n/***/ }),\n\n/***/ 5981:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"Lm\": () => (/* binding */ TargetType),\n/* harmony export */   \"OY\": () => (/* binding */ TrackTypeValueToKeyMap),\n/* harmony export */   \"Vc\": () => (/* binding */ TrackType)\n/* harmony export */ });\nconst TargetType = {\n    10: 'shot',\n    20: 'scene',\n    30: 'track',\n    40: 'part',\n    50: 'album',\n    60: 'edition',\n    70: 'collection'\n};\nconst TrackType = {\n    video: 0x01,\n    audio: 0x02,\n    complex: 0x03,\n    logo: 0x04,\n    subtitle: 0x11,\n    button: 0x12,\n    control: 0x20\n};\nconst TrackTypeValueToKeyMap = {\n    [TrackType.video]: 'video',\n    [TrackType.audio]: 'audio',\n    [TrackType.complex]: 'complex',\n    [TrackType.logo]: 'logo',\n    [TrackType.subtitle]: 'subtitle',\n    [TrackType.button]: 'button',\n    [TrackType.control]: 'control'\n};\n//# sourceMappingURL=types.js.map\n\n/***/ }),\n\n/***/ 8331:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"dL\": () => (/* reexport */ EndOfStreamError),\n  \"FY\": () => (/* binding */ fromBuffer),\n  \"GC\": () => (/* binding */ fromWebStream)\n});\n\n// UNUSED EXPORTS: AbortError, AbstractTokenizer, fromStream\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/Errors.js\nconst defaultMessages = 'End-Of-Stream';\n/**\n * Thrown on read operation of the end of file or stream has been reached\n */\nclass EndOfStreamError extends Error {\n    constructor() {\n        super(defaultMessages);\n        this.name = \"EndOfStreamError\";\n    }\n}\nclass Errors_AbortError extends Error {\n    constructor(message = \"The operation was aborted\") {\n        super(message);\n        this.name = \"AbortError\";\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/AbstractStreamReader.js\n\nclass AbstractStreamReader_AbstractStreamReader {\n    constructor() {\n        this.endOfStream = false;\n        this.interrupted = false;\n        /**\n         * Store peeked data\n         * @type {Array}\n         */\n        this.peekQueue = [];\n    }\n    async peek(uint8Array, mayBeLess = false) {\n        const bytesRead = await this.read(uint8Array, mayBeLess);\n        this.peekQueue.push(uint8Array.subarray(0, bytesRead)); // Put read data back to peek buffer\n        return bytesRead;\n    }\n    async read(buffer, mayBeLess = false) {\n        if (buffer.length === 0) {\n            return 0;\n        }\n        let bytesRead = this.readFromPeekBuffer(buffer);\n        if (!this.endOfStream) {\n            bytesRead += await this.readRemainderFromStream(buffer.subarray(bytesRead), mayBeLess);\n        }\n        if (bytesRead === 0) {\n            throw new EndOfStreamError();\n        }\n        return bytesRead;\n    }\n    /**\n     * Read chunk from stream\n     * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n     * @returns Number of bytes read\n     */\n    readFromPeekBuffer(buffer) {\n        let remaining = buffer.length;\n        let bytesRead = 0;\n        // consume peeked data first\n        while (this.peekQueue.length > 0 && remaining > 0) {\n            const peekData = this.peekQueue.pop(); // Front of queue\n            if (!peekData)\n                throw new Error('peekData should be defined');\n            const lenCopy = Math.min(peekData.length, remaining);\n            buffer.set(peekData.subarray(0, lenCopy), bytesRead);\n            bytesRead += lenCopy;\n            remaining -= lenCopy;\n            if (lenCopy < peekData.length) {\n                // remainder back to queue\n                this.peekQueue.push(peekData.subarray(lenCopy));\n            }\n        }\n        return bytesRead;\n    }\n    async readRemainderFromStream(buffer, mayBeLess) {\n        let bytesRead = 0;\n        // Continue reading from stream if required\n        while (bytesRead < buffer.length && !this.endOfStream) {\n            if (this.interrupted) {\n                throw new Errors_AbortError();\n            }\n            const chunkLen = await this.readFromStream(buffer.subarray(bytesRead), mayBeLess);\n            if (chunkLen === 0)\n                break;\n            bytesRead += chunkLen;\n        }\n        if (!mayBeLess && bytesRead < buffer.length) {\n            throw new EndOfStreamError();\n        }\n        return bytesRead;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/StreamReader.js\n\n\n\n/**\n * Node.js Readable Stream Reader\n * Ref: https://nodejs.org/api/stream.html#readable-streams\n */\nclass StreamReader_StreamReader extends (/* unused pure expression or super */ null && (AbstractStreamReader)) {\n    constructor(s) {\n        super();\n        this.s = s;\n        /**\n         * Deferred used for postponed read request (as not data is yet available to read)\n         */\n        this.deferred = null;\n        if (!s.read || !s.once) {\n            throw new Error('Expected an instance of stream.Readable');\n        }\n        this.s.once('end', () => {\n            this.endOfStream = true;\n            if (this.deferred) {\n                this.deferred.resolve(0);\n            }\n        });\n        this.s.once('error', err => this.reject(err));\n        this.s.once('close', () => this.abort());\n    }\n    /**\n     * Read chunk from stream\n     * @param buffer Target Uint8Array (or Buffer) to store data read from stream in\n     * @param mayBeLess - If true, may fill the buffer partially\n     * @returns Number of bytes read\n     */\n    async readFromStream(buffer, mayBeLess) {\n        if (buffer.length === 0)\n            return 0;\n        const readBuffer = this.s.read(buffer.length);\n        if (readBuffer) {\n            buffer.set(readBuffer);\n            return readBuffer.length;\n        }\n        const request = {\n            buffer,\n            mayBeLess,\n            deferred: new Deferred()\n        };\n        this.deferred = request.deferred;\n        this.s.once('readable', () => {\n            this.readDeferred(request);\n        });\n        return request.deferred.promise;\n    }\n    /**\n     * Process deferred read request\n     * @param request Deferred read request\n     */\n    readDeferred(request) {\n        const readBuffer = this.s.read(request.buffer.length);\n        if (readBuffer) {\n            request.buffer.set(readBuffer);\n            request.deferred.resolve(readBuffer.length);\n            this.deferred = null;\n        }\n        else {\n            this.s.once('readable', () => {\n                this.readDeferred(request);\n            });\n        }\n    }\n    reject(err) {\n        this.interrupted = true;\n        if (this.deferred) {\n            this.deferred.reject(err);\n            this.deferred = null;\n        }\n    }\n    async abort() {\n        this.reject(new AbortError());\n    }\n    async close() {\n        return this.abort();\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/WebStreamReader.js\n\nclass WebStreamReader extends AbstractStreamReader_AbstractStreamReader {\n    constructor(reader) {\n        super();\n        this.reader = reader;\n    }\n    async abort() {\n        return this.close();\n    }\n    async close() {\n        this.reader.releaseLock();\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/WebStreamByobReader.js\n\n/**\n * Read from a WebStream using a BYOB reader\n * Reference: https://nodejs.org/api/webstreams.html#class-readablestreambyobreader\n */\nclass WebStreamByobReader extends WebStreamReader {\n    /**\n     * Read from stream\n     * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n     * @param mayBeLess - If true, may fill the buffer partially\n     * @protected Bytes read\n     */\n    async readFromStream(buffer, mayBeLess) {\n        if (buffer.length === 0)\n            return 0;\n        // @ts-ignore\n        const result = await this.reader.read(new Uint8Array(buffer.length), { min: mayBeLess ? undefined : buffer.length });\n        if (result.done) {\n            this.endOfStream = result.done;\n        }\n        if (result.value) {\n            buffer.set(result.value);\n            return result.value.length;\n        }\n        return 0;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/WebStreamDefaultReader.js\n\n\nclass WebStreamDefaultReader extends AbstractStreamReader_AbstractStreamReader {\n    constructor(reader) {\n        super();\n        this.reader = reader;\n        this.buffer = null; // Internal buffer to store excess data\n    }\n    /**\n     * Copy chunk to target, and store the remainder in this.buffer\n     */\n    writeChunk(target, chunk) {\n        const written = Math.min(chunk.length, target.length);\n        target.set(chunk.subarray(0, written));\n        // Adjust the remainder of the buffer\n        if (written < chunk.length) {\n            this.buffer = chunk.subarray(written);\n        }\n        else {\n            this.buffer = null;\n        }\n        return written;\n    }\n    /**\n     * Read from stream\n     * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n     * @param mayBeLess - If true, may fill the buffer partially\n     * @protected Bytes read\n     */\n    async readFromStream(buffer, mayBeLess) {\n        if (buffer.length === 0)\n            return 0;\n        let totalBytesRead = 0;\n        // Serve from the internal buffer first\n        if (this.buffer) {\n            totalBytesRead += this.writeChunk(buffer, this.buffer);\n        }\n        // Continue reading from the stream if more data is needed\n        while (totalBytesRead < buffer.length && !this.endOfStream) {\n            const result = await this.reader.read();\n            if (result.done) {\n                this.endOfStream = true;\n                break;\n            }\n            if (result.value) {\n                totalBytesRead += this.writeChunk(buffer.subarray(totalBytesRead), result.value);\n            }\n        }\n        if (totalBytesRead === 0 && this.endOfStream) {\n            throw new EndOfStreamError();\n        }\n        return totalBytesRead;\n    }\n    abort() {\n        this.interrupted = true;\n        return this.reader.cancel();\n    }\n    async close() {\n        await this.abort();\n        this.reader.releaseLock();\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/WebStreamReaderFactory.js\n\n\nfunction makeWebStreamReader(stream) {\n    try {\n        const reader = stream.getReader({ mode: \"byob\" });\n        if (reader instanceof ReadableStreamDefaultReader) {\n            // Fallback to default reader in case `mode: byob` is ignored\n            return new WebStreamDefaultReader(reader);\n        }\n        return new WebStreamByobReader(reader);\n    }\n    catch (error) {\n        if (error instanceof TypeError) {\n            // Fallback to default reader in case `mode: byob` rejected by a `TypeError`\n            return new WebStreamDefaultReader(stream.getReader());\n        }\n        throw error;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/peek-readable/lib/index.js\n\n\n\n\n\n\n;// CONCATENATED MODULE: ../../node_modules/strtok3/lib/AbstractTokenizer.js\n\n/**\n * Core tokenizer\n */\nclass AbstractTokenizer {\n    /**\n     * Constructor\n     * @param options Tokenizer options\n     * @protected\n     */\n    constructor(options) {\n        this.numBuffer = new Uint8Array(8);\n        /**\n         * Tokenizer-stream position\n         */\n        this.position = 0;\n        this.onClose = options?.onClose;\n        if (options?.abortSignal) {\n            options.abortSignal.addEventListener('abort', () => {\n                this.abort();\n            });\n        }\n    }\n    /**\n     * Read a token from the tokenizer-stream\n     * @param token - The token to read\n     * @param position - If provided, the desired position in the tokenizer-stream\n     * @returns Promise with token data\n     */\n    async readToken(token, position = this.position) {\n        const uint8Array = new Uint8Array(token.len);\n        const len = await this.readBuffer(uint8Array, { position });\n        if (len < token.len)\n            throw new EndOfStreamError();\n        return token.get(uint8Array, 0);\n    }\n    /**\n     * Peek a token from the tokenizer-stream.\n     * @param token - Token to peek from the tokenizer-stream.\n     * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.\n     * @returns Promise with token data\n     */\n    async peekToken(token, position = this.position) {\n        const uint8Array = new Uint8Array(token.len);\n        const len = await this.peekBuffer(uint8Array, { position });\n        if (len < token.len)\n            throw new EndOfStreamError();\n        return token.get(uint8Array, 0);\n    }\n    /**\n     * Read a numeric token from the stream\n     * @param token - Numeric token\n     * @returns Promise with number\n     */\n    async readNumber(token) {\n        const len = await this.readBuffer(this.numBuffer, { length: token.len });\n        if (len < token.len)\n            throw new EndOfStreamError();\n        return token.get(this.numBuffer, 0);\n    }\n    /**\n     * Read a numeric token from the stream\n     * @param token - Numeric token\n     * @returns Promise with number\n     */\n    async peekNumber(token) {\n        const len = await this.peekBuffer(this.numBuffer, { length: token.len });\n        if (len < token.len)\n            throw new EndOfStreamError();\n        return token.get(this.numBuffer, 0);\n    }\n    /**\n     * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n     * @param length - Number of bytes to ignore\n     * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available\n     */\n    async ignore(length) {\n        if (this.fileInfo.size !== undefined) {\n            const bytesLeft = this.fileInfo.size - this.position;\n            if (length > bytesLeft) {\n                this.position += bytesLeft;\n                return bytesLeft;\n            }\n        }\n        this.position += length;\n        return length;\n    }\n    async close() {\n        await this.abort();\n        await this.onClose?.();\n    }\n    normalizeOptions(uint8Array, options) {\n        if (!this.supportsRandomAccess() && options && options.position !== undefined && options.position < this.position) {\n            throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n        }\n        return {\n            ...{\n                mayBeLess: false,\n                offset: 0,\n                length: uint8Array.length,\n                position: this.position\n            }, ...options\n        };\n    }\n    abort() {\n        return Promise.resolve(); // Ignore abort signal\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/strtok3/lib/ReadStreamTokenizer.js\n\n\nconst maxBufferSize = 256000;\nclass ReadStreamTokenizer_ReadStreamTokenizer extends AbstractTokenizer {\n    /**\n     * Constructor\n     * @param streamReader stream-reader to read from\n     * @param options Tokenizer options\n     */\n    constructor(streamReader, options) {\n        super(options);\n        this.streamReader = streamReader;\n        this.fileInfo = options?.fileInfo ?? {};\n    }\n    /**\n     * Read buffer from tokenizer\n     * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream\n     * @param options - Read behaviour options\n     * @returns Promise with number of bytes read\n     */\n    async readBuffer(uint8Array, options) {\n        const normOptions = this.normalizeOptions(uint8Array, options);\n        const skipBytes = normOptions.position - this.position;\n        if (skipBytes > 0) {\n            await this.ignore(skipBytes);\n            return this.readBuffer(uint8Array, options);\n        }\n        if (skipBytes < 0) {\n            throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n        }\n        if (normOptions.length === 0) {\n            return 0;\n        }\n        const bytesRead = await this.streamReader.read(uint8Array.subarray(0, normOptions.length), normOptions.mayBeLess);\n        this.position += bytesRead;\n        if ((!options || !options.mayBeLess) && bytesRead < normOptions.length) {\n            throw new EndOfStreamError();\n        }\n        return bytesRead;\n    }\n    /**\n     * Peek (read ahead) buffer from tokenizer\n     * @param uint8Array - Uint8Array (or Buffer) to write data to\n     * @param options - Read behaviour options\n     * @returns Promise with number of bytes peeked\n     */\n    async peekBuffer(uint8Array, options) {\n        const normOptions = this.normalizeOptions(uint8Array, options);\n        let bytesRead = 0;\n        if (normOptions.position) {\n            const skipBytes = normOptions.position - this.position;\n            if (skipBytes > 0) {\n                const skipBuffer = new Uint8Array(normOptions.length + skipBytes);\n                bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: normOptions.mayBeLess });\n                uint8Array.set(skipBuffer.subarray(skipBytes));\n                return bytesRead - skipBytes;\n            }\n            if (skipBytes < 0) {\n                throw new Error('Cannot peek from a negative offset in a stream');\n            }\n        }\n        if (normOptions.length > 0) {\n            try {\n                bytesRead = await this.streamReader.peek(uint8Array.subarray(0, normOptions.length), normOptions.mayBeLess);\n            }\n            catch (err) {\n                if (options?.mayBeLess && err instanceof EndOfStreamError) {\n                    return 0;\n                }\n                throw err;\n            }\n            if ((!normOptions.mayBeLess) && bytesRead < normOptions.length) {\n                throw new EndOfStreamError();\n            }\n        }\n        return bytesRead;\n    }\n    async ignore(length) {\n        // debug(`ignore ${this.position}...${this.position + length - 1}`);\n        const bufSize = Math.min(maxBufferSize, length);\n        const buf = new Uint8Array(bufSize);\n        let totBytesRead = 0;\n        while (totBytesRead < length) {\n            const remaining = length - totBytesRead;\n            const bytesRead = await this.readBuffer(buf, { length: Math.min(bufSize, remaining) });\n            if (bytesRead < 0) {\n                return bytesRead;\n            }\n            totBytesRead += bytesRead;\n        }\n        return totBytesRead;\n    }\n    abort() {\n        return this.streamReader.abort();\n    }\n    async close() {\n        return this.streamReader.close();\n    }\n    supportsRandomAccess() {\n        return false;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/strtok3/lib/BufferTokenizer.js\n\n\nclass BufferTokenizer extends AbstractTokenizer {\n    /**\n     * Construct BufferTokenizer\n     * @param uint8Array - Uint8Array to tokenize\n     * @param options Tokenizer options\n     */\n    constructor(uint8Array, options) {\n        super(options);\n        this.uint8Array = uint8Array;\n        this.fileInfo = { ...options?.fileInfo ?? {}, ...{ size: uint8Array.length } };\n    }\n    /**\n     * Read buffer from tokenizer\n     * @param uint8Array - Uint8Array to tokenize\n     * @param options - Read behaviour options\n     * @returns {Promise<number>}\n     */\n    async readBuffer(uint8Array, options) {\n        if (options?.position) {\n            this.position = options.position;\n        }\n        const bytesRead = await this.peekBuffer(uint8Array, options);\n        this.position += bytesRead;\n        return bytesRead;\n    }\n    /**\n     * Peek (read ahead) buffer from tokenizer\n     * @param uint8Array\n     * @param options - Read behaviour options\n     * @returns {Promise<number>}\n     */\n    async peekBuffer(uint8Array, options) {\n        const normOptions = this.normalizeOptions(uint8Array, options);\n        const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);\n        if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {\n            throw new EndOfStreamError();\n        }\n        uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read));\n        return bytes2read;\n    }\n    close() {\n        return super.close();\n    }\n    supportsRandomAccess() {\n        return true;\n    }\n    setPosition(position) {\n        this.position = position;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/strtok3/lib/core.js\n\n\n\n\n\n/**\n * Construct ReadStreamTokenizer from given Stream.\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param stream - Read from Node.js Stream.Readable\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nfunction fromStream(stream, options) {\n    const streamReader = new StreamReader(stream);\n    const _options = options ?? {};\n    const chainedClose = _options.onClose;\n    _options.onClose = async () => {\n        await streamReader.close();\n        if (chainedClose) {\n            return chainedClose();\n        }\n    };\n    return new ReadStreamTokenizer(streamReader, _options);\n}\n/**\n * Construct ReadStreamTokenizer from given ReadableStream (WebStream API).\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param webStream - Read from Node.js Stream.Readable (must be a byte stream)\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nfunction fromWebStream(webStream, options) {\n    const webStreamReader = makeWebStreamReader(webStream);\n    const _options = options ?? {};\n    const chainedClose = _options.onClose;\n    _options.onClose = async () => {\n        await webStreamReader.close();\n        if (chainedClose) {\n            return chainedClose();\n        }\n    };\n    return new ReadStreamTokenizer_ReadStreamTokenizer(webStreamReader, _options);\n}\n/**\n * Construct ReadStreamTokenizer from given Buffer.\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Tokenizer options\n * @returns BufferTokenizer\n */\nfunction fromBuffer(uint8Array, options) {\n    return new BufferTokenizer(uint8Array, options);\n}\n\n\n/***/ }),\n\n/***/ 525:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"AnsiStringType\": () => (/* binding */ AnsiStringType),\n/* harmony export */   \"Float16_BE\": () => (/* binding */ Float16_BE),\n/* harmony export */   \"Float16_LE\": () => (/* binding */ Float16_LE),\n/* harmony export */   \"Float32_BE\": () => (/* binding */ Float32_BE),\n/* harmony export */   \"Float32_LE\": () => (/* binding */ Float32_LE),\n/* harmony export */   \"Float64_BE\": () => (/* binding */ Float64_BE),\n/* harmony export */   \"Float64_LE\": () => (/* binding */ Float64_LE),\n/* harmony export */   \"Float80_BE\": () => (/* binding */ Float80_BE),\n/* harmony export */   \"Float80_LE\": () => (/* binding */ Float80_LE),\n/* harmony export */   \"INT16_BE\": () => (/* binding */ INT16_BE),\n/* harmony export */   \"INT16_LE\": () => (/* binding */ INT16_LE),\n/* harmony export */   \"INT24_BE\": () => (/* binding */ INT24_BE),\n/* harmony export */   \"INT24_LE\": () => (/* binding */ INT24_LE),\n/* harmony export */   \"INT32_BE\": () => (/* binding */ INT32_BE),\n/* harmony export */   \"INT32_LE\": () => (/* binding */ INT32_LE),\n/* harmony export */   \"INT64_BE\": () => (/* binding */ INT64_BE),\n/* harmony export */   \"INT64_LE\": () => (/* binding */ INT64_LE),\n/* harmony export */   \"INT8\": () => (/* binding */ INT8),\n/* harmony export */   \"IgnoreType\": () => (/* binding */ IgnoreType),\n/* harmony export */   \"StringType\": () => (/* binding */ StringType),\n/* harmony export */   \"UINT16_BE\": () => (/* binding */ UINT16_BE),\n/* harmony export */   \"UINT16_LE\": () => (/* binding */ UINT16_LE),\n/* harmony export */   \"UINT24_BE\": () => (/* binding */ UINT24_BE),\n/* harmony export */   \"UINT24_LE\": () => (/* binding */ UINT24_LE),\n/* harmony export */   \"UINT32_BE\": () => (/* binding */ UINT32_BE),\n/* harmony export */   \"UINT32_LE\": () => (/* binding */ UINT32_LE),\n/* harmony export */   \"UINT64_BE\": () => (/* binding */ UINT64_BE),\n/* harmony export */   \"UINT64_LE\": () => (/* binding */ UINT64_LE),\n/* harmony export */   \"UINT8\": () => (/* binding */ UINT8),\n/* harmony export */   \"Uint8ArrayType\": () => (/* binding */ Uint8ArrayType)\n/* harmony export */ });\n/* harmony import */ var ieee754__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2333);\n\n// Primitive types\nfunction dv(array) {\n    return new DataView(array.buffer, array.byteOffset);\n}\n/**\n * 8-bit unsigned integer\n */\nconst UINT8 = {\n    len: 1,\n    get(array, offset) {\n        return dv(array).getUint8(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setUint8(offset, value);\n        return offset + 1;\n    }\n};\n/**\n * 16-bit unsigned integer, Little Endian byte order\n */\nconst UINT16_LE = {\n    len: 2,\n    get(array, offset) {\n        return dv(array).getUint16(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setUint16(offset, value, true);\n        return offset + 2;\n    }\n};\n/**\n * 16-bit unsigned integer, Big Endian byte order\n */\nconst UINT16_BE = {\n    len: 2,\n    get(array, offset) {\n        return dv(array).getUint16(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setUint16(offset, value);\n        return offset + 2;\n    }\n};\n/**\n * 24-bit unsigned integer, Little Endian byte order\n */\nconst UINT24_LE = {\n    len: 3,\n    get(array, offset) {\n        const dataView = dv(array);\n        return dataView.getUint8(offset) + (dataView.getUint16(offset + 1, true) << 8);\n    },\n    put(array, offset, value) {\n        const dataView = dv(array);\n        dataView.setUint8(offset, value & 0xff);\n        dataView.setUint16(offset + 1, value >> 8, true);\n        return offset + 3;\n    }\n};\n/**\n * 24-bit unsigned integer, Big Endian byte order\n */\nconst UINT24_BE = {\n    len: 3,\n    get(array, offset) {\n        const dataView = dv(array);\n        return (dataView.getUint16(offset) << 8) + dataView.getUint8(offset + 2);\n    },\n    put(array, offset, value) {\n        const dataView = dv(array);\n        dataView.setUint16(offset, value >> 8);\n        dataView.setUint8(offset + 2, value & 0xff);\n        return offset + 3;\n    }\n};\n/**\n * 32-bit unsigned integer, Little Endian byte order\n */\nconst UINT32_LE = {\n    len: 4,\n    get(array, offset) {\n        return dv(array).getUint32(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setUint32(offset, value, true);\n        return offset + 4;\n    }\n};\n/**\n * 32-bit unsigned integer, Big Endian byte order\n */\nconst UINT32_BE = {\n    len: 4,\n    get(array, offset) {\n        return dv(array).getUint32(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setUint32(offset, value);\n        return offset + 4;\n    }\n};\n/**\n * 8-bit signed integer\n */\nconst INT8 = {\n    len: 1,\n    get(array, offset) {\n        return dv(array).getInt8(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setInt8(offset, value);\n        return offset + 1;\n    }\n};\n/**\n * 16-bit signed integer, Big Endian byte order\n */\nconst INT16_BE = {\n    len: 2,\n    get(array, offset) {\n        return dv(array).getInt16(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setInt16(offset, value);\n        return offset + 2;\n    }\n};\n/**\n * 16-bit signed integer, Little Endian byte order\n */\nconst INT16_LE = {\n    len: 2,\n    get(array, offset) {\n        return dv(array).getInt16(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setInt16(offset, value, true);\n        return offset + 2;\n    }\n};\n/**\n * 24-bit signed integer, Little Endian byte order\n */\nconst INT24_LE = {\n    len: 3,\n    get(array, offset) {\n        const unsigned = UINT24_LE.get(array, offset);\n        return unsigned > 0x7fffff ? unsigned - 0x1000000 : unsigned;\n    },\n    put(array, offset, value) {\n        const dataView = dv(array);\n        dataView.setUint8(offset, value & 0xff);\n        dataView.setUint16(offset + 1, value >> 8, true);\n        return offset + 3;\n    }\n};\n/**\n * 24-bit signed integer, Big Endian byte order\n */\nconst INT24_BE = {\n    len: 3,\n    get(array, offset) {\n        const unsigned = UINT24_BE.get(array, offset);\n        return unsigned > 0x7fffff ? unsigned - 0x1000000 : unsigned;\n    },\n    put(array, offset, value) {\n        const dataView = dv(array);\n        dataView.setUint16(offset, value >> 8);\n        dataView.setUint8(offset + 2, value & 0xff);\n        return offset + 3;\n    }\n};\n/**\n * 32-bit signed integer, Big Endian byte order\n */\nconst INT32_BE = {\n    len: 4,\n    get(array, offset) {\n        return dv(array).getInt32(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setInt32(offset, value);\n        return offset + 4;\n    }\n};\n/**\n * 32-bit signed integer, Big Endian byte order\n */\nconst INT32_LE = {\n    len: 4,\n    get(array, offset) {\n        return dv(array).getInt32(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setInt32(offset, value, true);\n        return offset + 4;\n    }\n};\n/**\n * 64-bit unsigned integer, Little Endian byte order\n */\nconst UINT64_LE = {\n    len: 8,\n    get(array, offset) {\n        return dv(array).getBigUint64(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setBigUint64(offset, value, true);\n        return offset + 8;\n    }\n};\n/**\n * 64-bit signed integer, Little Endian byte order\n */\nconst INT64_LE = {\n    len: 8,\n    get(array, offset) {\n        return dv(array).getBigInt64(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setBigInt64(offset, value, true);\n        return offset + 8;\n    }\n};\n/**\n * 64-bit unsigned integer, Big Endian byte order\n */\nconst UINT64_BE = {\n    len: 8,\n    get(array, offset) {\n        return dv(array).getBigUint64(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setBigUint64(offset, value);\n        return offset + 8;\n    }\n};\n/**\n * 64-bit signed integer, Big Endian byte order\n */\nconst INT64_BE = {\n    len: 8,\n    get(array, offset) {\n        return dv(array).getBigInt64(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setBigInt64(offset, value);\n        return offset + 8;\n    }\n};\n/**\n * IEEE 754 16-bit (half precision) float, big endian\n */\nconst Float16_BE = {\n    len: 2,\n    get(dataView, offset) {\n        return ieee754__WEBPACK_IMPORTED_MODULE_0__/* .read */ .i(dataView, offset, false, 10, this.len);\n    },\n    put(dataView, offset, value) {\n        ieee754__WEBPACK_IMPORTED_MODULE_0__/* .write */ .c(dataView, value, offset, false, 10, this.len);\n        return offset + this.len;\n    }\n};\n/**\n * IEEE 754 16-bit (half precision) float, little endian\n */\nconst Float16_LE = {\n    len: 2,\n    get(array, offset) {\n        return ieee754__WEBPACK_IMPORTED_MODULE_0__/* .read */ .i(array, offset, true, 10, this.len);\n    },\n    put(array, offset, value) {\n        ieee754__WEBPACK_IMPORTED_MODULE_0__/* .write */ .c(array, value, offset, true, 10, this.len);\n        return offset + this.len;\n    }\n};\n/**\n * IEEE 754 32-bit (single precision) float, big endian\n */\nconst Float32_BE = {\n    len: 4,\n    get(array, offset) {\n        return dv(array).getFloat32(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setFloat32(offset, value);\n        return offset + 4;\n    }\n};\n/**\n * IEEE 754 32-bit (single precision) float, little endian\n */\nconst Float32_LE = {\n    len: 4,\n    get(array, offset) {\n        return dv(array).getFloat32(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setFloat32(offset, value, true);\n        return offset + 4;\n    }\n};\n/**\n * IEEE 754 64-bit (double precision) float, big endian\n */\nconst Float64_BE = {\n    len: 8,\n    get(array, offset) {\n        return dv(array).getFloat64(offset);\n    },\n    put(array, offset, value) {\n        dv(array).setFloat64(offset, value);\n        return offset + 8;\n    }\n};\n/**\n * IEEE 754 64-bit (double precision) float, little endian\n */\nconst Float64_LE = {\n    len: 8,\n    get(array, offset) {\n        return dv(array).getFloat64(offset, true);\n    },\n    put(array, offset, value) {\n        dv(array).setFloat64(offset, value, true);\n        return offset + 8;\n    }\n};\n/**\n * IEEE 754 80-bit (extended precision) float, big endian\n */\nconst Float80_BE = {\n    len: 10,\n    get(array, offset) {\n        return ieee754__WEBPACK_IMPORTED_MODULE_0__/* .read */ .i(array, offset, false, 63, this.len);\n    },\n    put(array, offset, value) {\n        ieee754__WEBPACK_IMPORTED_MODULE_0__/* .write */ .c(array, value, offset, false, 63, this.len);\n        return offset + this.len;\n    }\n};\n/**\n * IEEE 754 80-bit (extended precision) float, little endian\n */\nconst Float80_LE = {\n    len: 10,\n    get(array, offset) {\n        return ieee754__WEBPACK_IMPORTED_MODULE_0__/* .read */ .i(array, offset, true, 63, this.len);\n    },\n    put(array, offset, value) {\n        ieee754__WEBPACK_IMPORTED_MODULE_0__/* .write */ .c(array, value, offset, true, 63, this.len);\n        return offset + this.len;\n    }\n};\n/**\n * Ignore a given number of bytes\n */\nclass IgnoreType {\n    /**\n     * @param len number of bytes to ignore\n     */\n    constructor(len) {\n        this.len = len;\n    }\n    // ToDo: don't read, but skip data\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    get(array, off) {\n    }\n}\nclass Uint8ArrayType {\n    constructor(len) {\n        this.len = len;\n    }\n    get(array, offset) {\n        return array.subarray(offset, offset + this.len);\n    }\n}\n/**\n * Consume a fixed number of bytes from the stream and return a string with a specified encoding.\n */\nclass StringType {\n    constructor(len, encoding) {\n        this.len = len;\n        this.encoding = encoding;\n        this.textDecoder = new TextDecoder(encoding);\n    }\n    get(uint8Array, offset) {\n        return this.textDecoder.decode(uint8Array.subarray(offset, offset + this.len));\n    }\n}\n/**\n * ANSI Latin 1 String\n * Using windows-1252 / ISO 8859-1 decoding\n */\nclass AnsiStringType {\n    constructor(len) {\n        this.len = len;\n        this.textDecoder = new TextDecoder('windows-1252');\n    }\n    get(uint8Array, offset = 0) {\n        return this.textDecoder.decode(uint8Array.subarray(offset, offset + this.len));\n    }\n}\n\n\n/***/ }),\n\n/***/ 4624:\n/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"DA\": () => (/* binding */ uint8ArrayToString),\n/* harmony export */   \"GZ\": () => (/* binding */ hexToUint8Array),\n/* harmony export */   \"V_\": () => (/* binding */ getUintBE),\n/* harmony export */   \"cq\": () => (/* binding */ indexOf),\n/* harmony export */   \"dg\": () => (/* binding */ uint8ArrayToHex),\n/* harmony export */   \"q9\": () => (/* binding */ includes),\n/* harmony export */   \"sy\": () => (/* binding */ stringToUint8Array)\n/* harmony export */ });\n/* unused harmony exports isUint8Array, assertUint8Array, assertUint8ArrayOrArrayBuffer, toUint8Array, concatUint8Arrays, areUint8ArraysEqual, compareUint8Arrays, uint8ArrayToBase64, base64ToUint8Array, stringToBase64, base64ToString */\nconst objectToString = Object.prototype.toString;\nconst uint8ArrayStringified = '[object Uint8Array]';\nconst arrayBufferStringified = '[object ArrayBuffer]';\n\nfunction isType(value, typeConstructor, typeStringified) {\n\tif (!value) {\n\t\treturn false;\n\t}\n\n\tif (value.constructor === typeConstructor) {\n\t\treturn true;\n\t}\n\n\treturn objectToString.call(value) === typeStringified;\n}\n\nfunction isUint8Array(value) {\n\treturn isType(value, Uint8Array, uint8ArrayStringified);\n}\n\nfunction isArrayBuffer(value) {\n\treturn isType(value, ArrayBuffer, arrayBufferStringified);\n}\n\nfunction isUint8ArrayOrArrayBuffer(value) {\n\treturn isUint8Array(value) || isArrayBuffer(value);\n}\n\nfunction assertUint8Array(value) {\n\tif (!isUint8Array(value)) {\n\t\tthrow new TypeError(`Expected \\`Uint8Array\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nfunction assertUint8ArrayOrArrayBuffer(value) {\n\tif (!isUint8ArrayOrArrayBuffer(value)) {\n\t\tthrow new TypeError(`Expected \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nfunction toUint8Array(value) {\n\tif (value instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(value);\n\t}\n\n\tif (ArrayBuffer.isView(value)) {\n\t\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n\t}\n\n\tthrow new TypeError(`Unsupported value, got \\`${typeof value}\\`.`);\n}\n\nfunction concatUint8Arrays(arrays, totalLength) {\n\tif (arrays.length === 0) {\n\t\treturn new Uint8Array(0);\n\t}\n\n\ttotalLength ??= arrays.reduce((accumulator, currentValue) => accumulator + currentValue.length, 0);\n\n\tconst returnValue = new Uint8Array(totalLength);\n\n\tlet offset = 0;\n\tfor (const array of arrays) {\n\t\tassertUint8Array(array);\n\t\treturnValue.set(array, offset);\n\t\toffset += array.length;\n\t}\n\n\treturn returnValue;\n}\n\nfunction areUint8ArraysEqual(a, b) {\n\tassertUint8Array(a);\n\tassertUint8Array(b);\n\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a.length !== b.length) {\n\t\treturn false;\n\t}\n\n\t// eslint-disable-next-line unicorn/no-for-loop\n\tfor (let index = 0; index < a.length; index++) {\n\t\tif (a[index] !== b[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction compareUint8Arrays(a, b) {\n\tassertUint8Array(a);\n\tassertUint8Array(b);\n\n\tconst length = Math.min(a.length, b.length);\n\n\tfor (let index = 0; index < length; index++) {\n\t\tconst diff = a[index] - b[index];\n\t\tif (diff !== 0) {\n\t\t\treturn Math.sign(diff);\n\t\t}\n\t}\n\n\t// At this point, all the compared elements are equal.\n\t// The shorter array should come first if the arrays are of different lengths.\n\treturn Math.sign(a.length - b.length);\n}\n\nconst cachedDecoders = {\n\tutf8: new globalThis.TextDecoder('utf8'),\n};\n\nfunction uint8ArrayToString(array, encoding = 'utf8') {\n\tassertUint8ArrayOrArrayBuffer(array);\n\tcachedDecoders[encoding] ??= new globalThis.TextDecoder(encoding);\n\treturn cachedDecoders[encoding].decode(array);\n}\n\nfunction assertString(value) {\n\tif (typeof value !== 'string') {\n\t\tthrow new TypeError(`Expected \\`string\\`, got \\`${typeof value}\\``);\n\t}\n}\n\nconst cachedEncoder = new globalThis.TextEncoder();\n\nfunction stringToUint8Array(string) {\n\tassertString(string);\n\treturn cachedEncoder.encode(string);\n}\n\nfunction base64ToBase64Url(base64) {\n\treturn base64.replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');\n}\n\nfunction base64UrlToBase64(base64url) {\n\treturn base64url.replaceAll('-', '+').replaceAll('_', '/');\n}\n\n// Reference: https://phuoc.ng/collection/this-vs-that/concat-vs-push/\nconst MAX_BLOCK_SIZE = 65_535;\n\nfunction uint8ArrayToBase64(array, {urlSafe = false} = {}) {\n\tassertUint8Array(array);\n\n\tlet base64;\n\n\tif (array.length < MAX_BLOCK_SIZE) {\n\t// Required as `btoa` and `atob` don't properly support Unicode: https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\n\t\tbase64 = globalThis.btoa(String.fromCodePoint.apply(this, array));\n\t} else {\n\t\tbase64 = '';\n\t\tfor (const value of array) {\n\t\t\tbase64 += String.fromCodePoint(value);\n\t\t}\n\n\t\tbase64 = globalThis.btoa(base64);\n\t}\n\n\treturn urlSafe ? base64ToBase64Url(base64) : base64;\n}\n\nfunction base64ToUint8Array(base64String) {\n\tassertString(base64String);\n\treturn Uint8Array.from(globalThis.atob(base64UrlToBase64(base64String)), x => x.codePointAt(0));\n}\n\nfunction stringToBase64(string, {urlSafe = false} = {}) {\n\tassertString(string);\n\treturn uint8ArrayToBase64(stringToUint8Array(string), {urlSafe});\n}\n\nfunction base64ToString(base64String) {\n\tassertString(base64String);\n\treturn uint8ArrayToString(base64ToUint8Array(base64String));\n}\n\nconst byteToHexLookupTable = Array.from({length: 256}, (_, index) => index.toString(16).padStart(2, '0'));\n\nfunction uint8ArrayToHex(array) {\n\tassertUint8Array(array);\n\n\t// Concatenating a string is faster than using an array.\n\tlet hexString = '';\n\n\t// eslint-disable-next-line unicorn/no-for-loop -- Max performance is critical.\n\tfor (let index = 0; index < array.length; index++) {\n\t\thexString += byteToHexLookupTable[array[index]];\n\t}\n\n\treturn hexString;\n}\n\nconst hexToDecimalLookupTable = {\n\t0: 0,\n\t1: 1,\n\t2: 2,\n\t3: 3,\n\t4: 4,\n\t5: 5,\n\t6: 6,\n\t7: 7,\n\t8: 8,\n\t9: 9,\n\ta: 10,\n\tb: 11,\n\tc: 12,\n\td: 13,\n\te: 14,\n\tf: 15,\n\tA: 10,\n\tB: 11,\n\tC: 12,\n\tD: 13,\n\tE: 14,\n\tF: 15,\n};\n\nfunction hexToUint8Array(hexString) {\n\tassertString(hexString);\n\n\tif (hexString.length % 2 !== 0) {\n\t\tthrow new Error('Invalid Hex string length.');\n\t}\n\n\tconst resultLength = hexString.length / 2;\n\tconst bytes = new Uint8Array(resultLength);\n\n\tfor (let index = 0; index < resultLength; index++) {\n\t\tconst highNibble = hexToDecimalLookupTable[hexString[index * 2]];\n\t\tconst lowNibble = hexToDecimalLookupTable[hexString[(index * 2) + 1]];\n\n\t\tif (highNibble === undefined || lowNibble === undefined) {\n\t\t\tthrow new Error(`Invalid Hex character encountered at position ${index * 2}`);\n\t\t}\n\n\t\tbytes[index] = (highNibble << 4) | lowNibble; // eslint-disable-line no-bitwise\n\t}\n\n\treturn bytes;\n}\n\n/**\n@param {DataView} view\n@returns {number}\n*/\nfunction getUintBE(view) {\n\tconst {byteLength} = view;\n\n\tif (byteLength === 6) {\n\t\treturn (view.getUint16(0) * (2 ** 32)) + view.getUint32(2);\n\t}\n\n\tif (byteLength === 5) {\n\t\treturn (view.getUint8(0) * (2 ** 32)) + view.getUint32(1);\n\t}\n\n\tif (byteLength === 4) {\n\t\treturn view.getUint32(0);\n\t}\n\n\tif (byteLength === 3) {\n\t\treturn (view.getUint8(0) * (2 ** 16)) + view.getUint16(1);\n\t}\n\n\tif (byteLength === 2) {\n\t\treturn view.getUint16(0);\n\t}\n\n\tif (byteLength === 1) {\n\t\treturn view.getUint8(0);\n\t}\n}\n\n/**\n@param {Uint8Array} array\n@param {Uint8Array} value\n@returns {number}\n*/\nfunction indexOf(array, value) {\n\tconst arrayLength = array.length;\n\tconst valueLength = value.length;\n\n\tif (valueLength === 0) {\n\t\treturn -1;\n\t}\n\n\tif (valueLength > arrayLength) {\n\t\treturn -1;\n\t}\n\n\tconst validOffsetLength = arrayLength - valueLength;\n\n\tfor (let index = 0; index <= validOffsetLength; index++) {\n\t\tlet isMatch = true;\n\t\tfor (let index2 = 0; index2 < valueLength; index2++) {\n\t\t\tif (array[index + index2] !== value[index2]) {\n\t\t\t\tisMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (isMatch) {\n\t\t\treturn index;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n@param {Uint8Array} array\n@param {Uint8Array} value\n@returns {boolean}\n*/\nfunction includes(array, value) {\n\treturn indexOf(array, value) !== -1;\n}\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = __webpack_modules__;\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/ensure chunk */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.f = {};\n/******/ \t\t// This file contains only the entry chunk.\n/******/ \t\t// The chunk loading function for additional chunks\n/******/ \t\t__webpack_require__.e = (chunkId) => {\n/******/ \t\t\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n/******/ \t\t\t\t__webpack_require__.f[key](chunkId, promises);\n/******/ \t\t\t\treturn promises;\n/******/ \t\t\t}, []));\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/get javascript chunk filename */\n/******/ \t(() => {\n/******/ \t\t// This function allow to reference async chunks\n/******/ \t\t__webpack_require__.u = (chunkId) => {\n/******/ \t\t\t// return url for filenames based on template\n/******/ \t\t\treturn \"webamp.\" + chunkId + \".js\";\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/load script */\n/******/ \t(() => {\n/******/ \t\tvar inProgress = {};\n/******/ \t\tvar dataWebpackPrefix = \"Webamp:\";\n/******/ \t\t// loadScript function to load a script via script tag\n/******/ \t\t__webpack_require__.l = (url, done, key, chunkId) => {\n/******/ \t\t\tif(inProgress[url]) { inProgress[url].push(done); return; }\n/******/ \t\t\tvar script, needAttach;\n/******/ \t\t\tif(key !== undefined) {\n/******/ \t\t\t\tvar scripts = document.getElementsByTagName(\"script\");\n/******/ \t\t\t\tfor(var i = 0; i < scripts.length; i++) {\n/******/ \t\t\t\t\tvar s = scripts[i];\n/******/ \t\t\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t\tif(!script) {\n/******/ \t\t\t\tneedAttach = true;\n/******/ \t\t\t\tscript = document.createElement('script');\n/******/ \t\t\n/******/ \t\t\t\tscript.charset = 'utf-8';\n/******/ \t\t\t\tscript.timeout = 120;\n/******/ \t\t\t\tif (__webpack_require__.nc) {\n/******/ \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n/******/ \t\t\t\t}\n/******/ \t\t\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n/******/ \t\t\t\tscript.src = url;\n/******/ \t\t\t}\n/******/ \t\t\tinProgress[url] = [done];\n/******/ \t\t\tvar onScriptComplete = (prev, event) => {\n/******/ \t\t\t\t// avoid mem leaks in IE.\n/******/ \t\t\t\tscript.onerror = script.onload = null;\n/******/ \t\t\t\tclearTimeout(timeout);\n/******/ \t\t\t\tvar doneFns = inProgress[url];\n/******/ \t\t\t\tdelete inProgress[url];\n/******/ \t\t\t\tscript.parentNode && script.parentNode.removeChild(script);\n/******/ \t\t\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n/******/ \t\t\t\tif(prev) return prev(event);\n/******/ \t\t\t}\n/******/ \t\t\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n/******/ \t\t\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n/******/ \t\t\tscript.onload = onScriptComplete.bind(null, script.onload);\n/******/ \t\t\tneedAttach && document.head.appendChild(script);\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/node module decorator */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.nmd = (module) => {\n/******/ \t\t\tmodule.paths = [];\n/******/ \t\t\tif (!module.children) module.children = [];\n/******/ \t\t\treturn module;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/publicPath */\n/******/ \t(() => {\n/******/ \t\tvar scriptUrl;\n/******/ \t\tif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\n/******/ \t\tvar document = __webpack_require__.g.document;\n/******/ \t\tif (!scriptUrl && document) {\n/******/ \t\t\tif (document.currentScript)\n/******/ \t\t\t\tscriptUrl = document.currentScript.src;\n/******/ \t\t\tif (!scriptUrl) {\n/******/ \t\t\t\tvar scripts = document.getElementsByTagName(\"script\");\n/******/ \t\t\t\tif(scripts.length) {\n/******/ \t\t\t\t\tvar i = scripts.length - 1;\n/******/ \t\t\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\t// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n/******/ \t\t// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\n/******/ \t\tif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\n/******/ \t\tscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n/******/ \t\t__webpack_require__.p = scriptUrl;\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/jsonp chunk loading */\n/******/ \t(() => {\n/******/ \t\t// no baseURI\n/******/ \t\t\n/******/ \t\t// object to store loaded and loading chunks\n/******/ \t\t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n/******/ \t\t// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n/******/ \t\tvar installedChunks = {\n/******/ \t\t\t296: 0,\n/******/ \t\t\t913: 0,\n/******/ \t\t\t214: 0,\n/******/ \t\t\t197: 0\n/******/ \t\t};\n/******/ \t\t\n/******/ \t\t__webpack_require__.f.j = (chunkId, promises) => {\n/******/ \t\t\t\t// JSONP chunk loading for javascript\n/******/ \t\t\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n/******/ \t\t\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n/******/ \t\t\n/******/ \t\t\t\t\t// a Promise means \"currently loading\".\n/******/ \t\t\t\t\tif(installedChunkData) {\n/******/ \t\t\t\t\t\tpromises.push(installedChunkData[2]);\n/******/ \t\t\t\t\t} else {\n/******/ \t\t\t\t\t\tif(true) { // all chunks have JS\n/******/ \t\t\t\t\t\t\t// setup Promise in chunk cache\n/******/ \t\t\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n/******/ \t\t\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n/******/ \t\t\n/******/ \t\t\t\t\t\t\t// start chunk loading\n/******/ \t\t\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n/******/ \t\t\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n/******/ \t\t\t\t\t\t\tvar error = new Error();\n/******/ \t\t\t\t\t\t\tvar loadingEnded = (event) => {\n/******/ \t\t\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n/******/ \t\t\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n/******/ \t\t\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n/******/ \t\t\t\t\t\t\t\t\tif(installedChunkData) {\n/******/ \t\t\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n/******/ \t\t\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n/******/ \t\t\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n/******/ \t\t\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n/******/ \t\t\t\t\t\t\t\t\t\terror.type = errorType;\n/******/ \t\t\t\t\t\t\t\t\t\terror.request = realSrc;\n/******/ \t\t\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n/******/ \t\t\t\t\t\t\t\t\t}\n/******/ \t\t\t\t\t\t\t\t}\n/******/ \t\t\t\t\t\t\t};\n/******/ \t\t\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n/******/ \t\t\t\t\t\t} else installedChunks[chunkId] = 0;\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t};\n/******/ \t\t\n/******/ \t\t// no prefetching\n/******/ \t\t\n/******/ \t\t// no preloaded\n/******/ \t\t\n/******/ \t\t// no HMR\n/******/ \t\t\n/******/ \t\t// no HMR manifest\n/******/ \t\t\n/******/ \t\t// no on chunks loaded\n/******/ \t\t\n/******/ \t\t// install a JSONP callback for chunk loading\n/******/ \t\tvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n/******/ \t\t\tvar [chunkIds, moreModules, runtime] = data;\n/******/ \t\t\t// add \"moreModules\" to the modules object,\n/******/ \t\t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\t\tvar moduleId, chunkId, i = 0;\n/******/ \t\t\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n/******/ \t\t\t\tfor(moduleId in moreModules) {\n/******/ \t\t\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n/******/ \t\t\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t\t\tif(runtime) var result = runtime(__webpack_require__);\n/******/ \t\t\t}\n/******/ \t\t\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n/******/ \t\t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\t\tchunkId = chunkIds[i];\n/******/ \t\t\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n/******/ \t\t\t\t\tinstalledChunks[chunkId][0]();\n/******/ \t\t\t\t}\n/******/ \t\t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t\t}\n/******/ \t\t\n/******/ \t\t}\n/******/ \t\t\n/******/ \t\tvar chunkLoadingGlobal = self[\"webpackChunkWebamp\"] = self[\"webpackChunkWebamp\"] || [];\n/******/ \t\tchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\n/******/ \t\tchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/nonce */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.nc = undefined;\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be in strict mode.\n(() => {\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"default\": () => (/* binding */ Webamp)\n});\n\n// NAMESPACE OBJECT: ../../node_modules/music-metadata/lib/core.js\nvar lib_core_namespaceObject = {};\n__webpack_require__.r(lib_core_namespaceObject);\n__webpack_require__.d(lib_core_namespaceObject, {\n  \"CouldNotDetermineFileTypeError\": () => (ParseError/* CouldNotDetermineFileTypeError */.GG),\n  \"LyricsContentType\": () => (ID3v2Token/* LyricsContentType */.Q6),\n  \"TimestampFormat\": () => (ID3v2Token/* TimestampFormat */.B_),\n  \"UnsupportedFileTypeError\": () => (ParseError/* UnsupportedFileTypeError */.tw),\n  \"orderTags\": () => (orderTags),\n  \"parseBlob\": () => (parseBlob),\n  \"parseBuffer\": () => (parseBuffer),\n  \"parseFile\": () => (parseFile),\n  \"parseFromTokenizer\": () => (parseFromTokenizer),\n  \"parseWebStream\": () => (parseWebStream),\n  \"ratingToStars\": () => (ratingToStars),\n  \"scanAppendingHeaders\": () => (scanAppendingHeaders),\n  \"selectCover\": () => (selectCover)\n});\n\n// EXTERNAL MODULE: ../../node_modules/@babel/runtime/helpers/esm/defineProperty.js + 3 modules\nvar defineProperty = __webpack_require__(2601);\n// EXTERNAL MODULE: ../../node_modules/jszip/dist/jszip.min.js\nvar jszip_min = __webpack_require__(1297);\nvar jszip_min_default = /*#__PURE__*/__webpack_require__.n(jszip_min);\n// EXTERNAL MODULE: ../../node_modules/strtok3/lib/core.js + 11 modules\nvar core = __webpack_require__(8331);\n// EXTERNAL MODULE: ../../node_modules/token-types/lib/index.js\nvar lib = __webpack_require__(525);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/peek-readable/lib/EndOfStreamError.js\nconst defaultMessages = 'End-Of-Stream';\n/**\n * Thrown on read operation of the end of file or stream has been reached\n */\nclass EndOfStreamError_EndOfStreamError extends Error {\n    constructor() {\n        super(defaultMessages);\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/peek-readable/lib/AbstractStreamReader.js\n\nclass AbstractStreamReader_AbstractStreamReader {\n    constructor() {\n        /**\n         * Maximum request length on read-stream operation\n         */\n        this.maxStreamReadSize = 1 * 1024 * 1024;\n        this.endOfStream = false;\n        /**\n         * Store peeked data\n         * @type {Array}\n         */\n        this.peekQueue = [];\n    }\n    async peek(uint8Array, offset, length) {\n        const bytesRead = await this.read(uint8Array, offset, length);\n        this.peekQueue.push(uint8Array.subarray(offset, offset + bytesRead)); // Put read data back to peek buffer\n        return bytesRead;\n    }\n    async read(buffer, offset, length) {\n        if (length === 0) {\n            return 0;\n        }\n        let bytesRead = this.readFromPeekBuffer(buffer, offset, length);\n        bytesRead += await this.readRemainderFromStream(buffer, offset + bytesRead, length - bytesRead);\n        if (bytesRead === 0) {\n            throw new EndOfStreamError_EndOfStreamError();\n        }\n        return bytesRead;\n    }\n    /**\n     * Read chunk from stream\n     * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n     * @param offset - Offset target\n     * @param length - Number of bytes to read\n     * @returns Number of bytes read\n     */\n    readFromPeekBuffer(buffer, offset, length) {\n        let remaining = length;\n        let bytesRead = 0;\n        // consume peeked data first\n        while (this.peekQueue.length > 0 && remaining > 0) {\n            const peekData = this.peekQueue.pop(); // Front of queue\n            if (!peekData)\n                throw new Error('peekData should be defined');\n            const lenCopy = Math.min(peekData.length, remaining);\n            buffer.set(peekData.subarray(0, lenCopy), offset + bytesRead);\n            bytesRead += lenCopy;\n            remaining -= lenCopy;\n            if (lenCopy < peekData.length) {\n                // remainder back to queue\n                this.peekQueue.push(peekData.subarray(lenCopy));\n            }\n        }\n        return bytesRead;\n    }\n    async readRemainderFromStream(buffer, offset, initialRemaining) {\n        let remaining = initialRemaining;\n        let bytesRead = 0;\n        // Continue reading from stream if required\n        while (remaining > 0 && !this.endOfStream) {\n            const reqLen = Math.min(remaining, this.maxStreamReadSize);\n            const chunkLen = await this.readFromStream(buffer, offset + bytesRead, reqLen);\n            if (chunkLen === 0)\n                break;\n            bytesRead += chunkLen;\n            remaining -= chunkLen;\n        }\n        return bytesRead;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/peek-readable/lib/StreamReader.js\n\n\n\n\n/**\n * Node.js Readable Stream Reader\n * Ref: https://nodejs.org/api/stream.html#readable-streams\n */\nclass StreamReader_StreamReader extends (/* unused pure expression or super */ null && (AbstractStreamReader)) {\n    constructor(s) {\n        super();\n        this.s = s;\n        /**\n         * Deferred used for postponed read request (as not data is yet available to read)\n         */\n        this.deferred = null;\n        if (!s.read || !s.once) {\n            throw new Error('Expected an instance of stream.Readable');\n        }\n        this.s.once('end', () => this.reject(new EndOfStreamError()));\n        this.s.once('error', err => this.reject(err));\n        this.s.once('close', () => this.reject(new Error('Stream closed')));\n    }\n    /**\n     * Read chunk from stream\n     * @param buffer Target Uint8Array (or Buffer) to store data read from stream in\n     * @param offset Offset target\n     * @param length Number of bytes to read\n     * @returns Number of bytes read\n     */\n    async readFromStream(buffer, offset, length) {\n        if (this.endOfStream) {\n            return 0;\n        }\n        const readBuffer = this.s.read(length);\n        if (readBuffer) {\n            buffer.set(readBuffer, offset);\n            return readBuffer.length;\n        }\n        const request = {\n            buffer,\n            offset,\n            length,\n            deferred: new Deferred()\n        };\n        this.deferred = request.deferred;\n        this.s.once('readable', () => {\n            this.readDeferred(request);\n        });\n        return request.deferred.promise;\n    }\n    /**\n     * Process deferred read request\n     * @param request Deferred read request\n     */\n    readDeferred(request) {\n        const readBuffer = this.s.read(request.length);\n        if (readBuffer) {\n            request.buffer.set(readBuffer, request.offset);\n            request.deferred.resolve(readBuffer.length);\n            this.deferred = null;\n        }\n        else {\n            this.s.once('readable', () => {\n                this.readDeferred(request);\n            });\n        }\n    }\n    reject(err) {\n        this.endOfStream = true;\n        if (this.deferred) {\n            this.deferred.reject(err);\n            this.deferred = null;\n        }\n    }\n    async abort() {\n        this.reject(new Error('abort'));\n    }\n    async close() {\n        return this.abort();\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/peek-readable/lib/WebStreamReader.js\n\n\n\n/**\n * Read from a WebStream\n * Reference: https://nodejs.org/api/webstreams.html#class-readablestreambyobreader\n */\nclass WebStreamReader extends AbstractStreamReader_AbstractStreamReader {\n    constructor(stream) {\n        super();\n        this.reader = stream.getReader({ mode: 'byob' });\n    }\n    async readFromStream(buffer, offset, length) {\n        if (this.endOfStream) {\n            throw new EndOfStreamError_EndOfStreamError();\n        }\n        const result = await this.reader.read(new Uint8Array(length));\n        if (result.done) {\n            this.endOfStream = result.done;\n        }\n        if (result.value) {\n            buffer.set(result.value, offset);\n            return result.value.byteLength;\n        }\n        return 0;\n    }\n    abort() {\n        return this.reader.cancel(); // Signals a loss of interest in the stream by a consumer\n    }\n    async close() {\n        await this.abort();\n        this.reader.releaseLock();\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/peek-readable/lib/index.js\n\n\n\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/file-type/node_modules/strtok3/lib/AbstractTokenizer.js\n\n/**\n * Core tokenizer\n */\nclass AbstractTokenizer {\n    /**\n     * Constructor\n     * @param options Tokenizer options\n     * @protected\n     */\n    constructor(options) {\n        this.numBuffer = new Uint8Array(8);\n        /**\n         * Tokenizer-stream position\n         */\n        this.position = 0;\n        this.onClose = options?.onClose;\n        if (options?.abortSignal) {\n            options.abortSignal.addEventListener('abort', () => {\n                this.abort();\n            });\n        }\n    }\n    /**\n     * Read a token from the tokenizer-stream\n     * @param token - The token to read\n     * @param position - If provided, the desired position in the tokenizer-stream\n     * @returns Promise with token data\n     */\n    async readToken(token, position = this.position) {\n        const uint8Array = new Uint8Array(token.len);\n        const len = await this.readBuffer(uint8Array, { position });\n        if (len < token.len)\n            throw new EndOfStreamError_EndOfStreamError();\n        return token.get(uint8Array, 0);\n    }\n    /**\n     * Peek a token from the tokenizer-stream.\n     * @param token - Token to peek from the tokenizer-stream.\n     * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.\n     * @returns Promise with token data\n     */\n    async peekToken(token, position = this.position) {\n        const uint8Array = new Uint8Array(token.len);\n        const len = await this.peekBuffer(uint8Array, { position });\n        if (len < token.len)\n            throw new EndOfStreamError_EndOfStreamError();\n        return token.get(uint8Array, 0);\n    }\n    /**\n     * Read a numeric token from the stream\n     * @param token - Numeric token\n     * @returns Promise with number\n     */\n    async readNumber(token) {\n        const len = await this.readBuffer(this.numBuffer, { length: token.len });\n        if (len < token.len)\n            throw new EndOfStreamError_EndOfStreamError();\n        return token.get(this.numBuffer, 0);\n    }\n    /**\n     * Read a numeric token from the stream\n     * @param token - Numeric token\n     * @returns Promise with number\n     */\n    async peekNumber(token) {\n        const len = await this.peekBuffer(this.numBuffer, { length: token.len });\n        if (len < token.len)\n            throw new EndOfStreamError_EndOfStreamError();\n        return token.get(this.numBuffer, 0);\n    }\n    /**\n     * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n     * @param length - Number of bytes to ignore\n     * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available\n     */\n    async ignore(length) {\n        if (this.fileInfo.size !== undefined) {\n            const bytesLeft = this.fileInfo.size - this.position;\n            if (length > bytesLeft) {\n                this.position += bytesLeft;\n                return bytesLeft;\n            }\n        }\n        this.position += length;\n        return length;\n    }\n    async close() {\n        await this.abort();\n        await this.onClose?.();\n    }\n    normalizeOptions(uint8Array, options) {\n        if (options && options.position !== undefined && options.position < this.position) {\n            throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n        }\n        if (options) {\n            return {\n                mayBeLess: options.mayBeLess === true,\n                offset: options.offset ? options.offset : 0,\n                length: options.length ? options.length : (uint8Array.length - (options.offset ? options.offset : 0)),\n                position: options.position ? options.position : this.position\n            };\n        }\n        return {\n            mayBeLess: false,\n            offset: 0,\n            length: uint8Array.length,\n            position: this.position\n        };\n    }\n    abort() {\n        return Promise.resolve(); // Ignore abort signal\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/file-type/node_modules/strtok3/lib/ReadStreamTokenizer.js\n\n\nconst maxBufferSize = 256000;\nclass ReadStreamTokenizer_ReadStreamTokenizer extends AbstractTokenizer {\n    /**\n     * Constructor\n     * @param streamReader stream-reader to read from\n     * @param options Tokenizer options\n     */\n    constructor(streamReader, options) {\n        super(options);\n        this.streamReader = streamReader;\n        this.fileInfo = options?.fileInfo ?? {};\n    }\n    /**\n     * Read buffer from tokenizer\n     * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream\n     * @param options - Read behaviour options\n     * @returns Promise with number of bytes read\n     */\n    async readBuffer(uint8Array, options) {\n        const normOptions = this.normalizeOptions(uint8Array, options);\n        const skipBytes = normOptions.position - this.position;\n        if (skipBytes > 0) {\n            await this.ignore(skipBytes);\n            return this.readBuffer(uint8Array, options);\n        }\n        if (skipBytes < 0) {\n            throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n        }\n        if (normOptions.length === 0) {\n            return 0;\n        }\n        const bytesRead = await this.streamReader.read(uint8Array, normOptions.offset, normOptions.length);\n        this.position += bytesRead;\n        if ((!options || !options.mayBeLess) && bytesRead < normOptions.length) {\n            throw new EndOfStreamError_EndOfStreamError();\n        }\n        return bytesRead;\n    }\n    /**\n     * Peek (read ahead) buffer from tokenizer\n     * @param uint8Array - Uint8Array (or Buffer) to write data to\n     * @param options - Read behaviour options\n     * @returns Promise with number of bytes peeked\n     */\n    async peekBuffer(uint8Array, options) {\n        const normOptions = this.normalizeOptions(uint8Array, options);\n        let bytesRead = 0;\n        if (normOptions.position) {\n            const skipBytes = normOptions.position - this.position;\n            if (skipBytes > 0) {\n                const skipBuffer = new Uint8Array(normOptions.length + skipBytes);\n                bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: normOptions.mayBeLess });\n                uint8Array.set(skipBuffer.subarray(skipBytes), normOptions.offset);\n                return bytesRead - skipBytes;\n            }\n            if (skipBytes < 0) {\n                throw new Error('Cannot peek from a negative offset in a stream');\n            }\n        }\n        if (normOptions.length > 0) {\n            try {\n                bytesRead = await this.streamReader.peek(uint8Array, normOptions.offset, normOptions.length);\n            }\n            catch (err) {\n                if (options?.mayBeLess && err instanceof EndOfStreamError_EndOfStreamError) {\n                    return 0;\n                }\n                throw err;\n            }\n            if ((!normOptions.mayBeLess) && bytesRead < normOptions.length) {\n                throw new EndOfStreamError_EndOfStreamError();\n            }\n        }\n        return bytesRead;\n    }\n    async ignore(length) {\n        // debug(`ignore ${this.position}...${this.position + length - 1}`);\n        const bufSize = Math.min(maxBufferSize, length);\n        const buf = new Uint8Array(bufSize);\n        let totBytesRead = 0;\n        while (totBytesRead < length) {\n            const remaining = length - totBytesRead;\n            const bytesRead = await this.readBuffer(buf, { length: Math.min(bufSize, remaining) });\n            if (bytesRead < 0) {\n                return bytesRead;\n            }\n            totBytesRead += bytesRead;\n        }\n        return totBytesRead;\n    }\n    abort() {\n        return this.streamReader.abort();\n    }\n    supportsRandomAccess() {\n        return false;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/file-type/node_modules/strtok3/lib/BufferTokenizer.js\n\n\nclass BufferTokenizer extends AbstractTokenizer {\n    /**\n     * Construct BufferTokenizer\n     * @param uint8Array - Uint8Array to tokenize\n     * @param options Tokenizer options\n     */\n    constructor(uint8Array, options) {\n        super(options);\n        this.uint8Array = uint8Array;\n        this.fileInfo = { ...options?.fileInfo ?? {}, ...{ size: uint8Array.length } };\n    }\n    /**\n     * Read buffer from tokenizer\n     * @param uint8Array - Uint8Array to tokenize\n     * @param options - Read behaviour options\n     * @returns {Promise<number>}\n     */\n    async readBuffer(uint8Array, options) {\n        if (options?.position) {\n            if (options.position < this.position) {\n                throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n            }\n            this.position = options.position;\n        }\n        const bytesRead = await this.peekBuffer(uint8Array, options);\n        this.position += bytesRead;\n        return bytesRead;\n    }\n    /**\n     * Peek (read ahead) buffer from tokenizer\n     * @param uint8Array\n     * @param options - Read behaviour options\n     * @returns {Promise<number>}\n     */\n    async peekBuffer(uint8Array, options) {\n        const normOptions = this.normalizeOptions(uint8Array, options);\n        const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);\n        if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {\n            throw new EndOfStreamError_EndOfStreamError();\n        }\n        uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read), normOptions.offset);\n        return bytes2read;\n    }\n    close() {\n        return super.close();\n    }\n    supportsRandomAccess() {\n        return true;\n    }\n    setPosition(position) {\n        this.position = position;\n    }\n}\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/file-type/node_modules/strtok3/lib/core.js\n\n\n\n\n\n/**\n * Construct ReadStreamTokenizer from given Stream.\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param stream - Read from Node.js Stream.Readable\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nfunction fromStream(stream, options) {\n    return new ReadStreamTokenizer(new StreamReader(stream), options);\n}\n/**\n * Construct ReadStreamTokenizer from given ReadableStream (WebStream API).\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param webStream - Read from Node.js Stream.Readable (must be a byte stream)\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nfunction fromWebStream(webStream, options) {\n    return new ReadStreamTokenizer_ReadStreamTokenizer(new WebStreamReader(webStream), options);\n}\n/**\n * Construct ReadStreamTokenizer from given Buffer.\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Tokenizer options\n * @returns BufferTokenizer\n */\nfunction fromBuffer(uint8Array, options) {\n    return new BufferTokenizer(uint8Array, options);\n}\n\n// EXTERNAL MODULE: ../../node_modules/uint8array-extras/index.js\nvar uint8array_extras = __webpack_require__(4624);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/file-type/util.js\n\n\nfunction stringToBytes(string) {\n\treturn [...string].map(character => character.charCodeAt(0)); // eslint-disable-line unicorn/prefer-code-point\n}\n\n/**\nChecks whether the TAR checksum is valid.\n\n@param {Uint8Array} arrayBuffer - The TAR header `[offset ... offset + 512]`.\n@param {number} offset - TAR header offset.\n@returns {boolean} `true` if the TAR checksum is valid, otherwise `false`.\n*/\nfunction tarHeaderChecksumMatches(arrayBuffer, offset = 0) {\n\tconst readSum = Number.parseInt(new lib.StringType(6).get(arrayBuffer, 148).replace(/\\0.*$/, '').trim(), 8); // Read sum in header\n\tif (Number.isNaN(readSum)) {\n\t\treturn false;\n\t}\n\n\tlet sum = 8 * 0x20; // Initialize signed bit sum\n\n\tfor (let index = offset; index < offset + 148; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\tfor (let index = offset + 156; index < offset + 512; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\treturn readSum === sum;\n}\n\n/**\nID3 UINT32 sync-safe tokenizer token.\n28 bits (representing up to 256MB) integer, the msb is 0 to avoid \"false syncsignals\".\n*/\nconst uint32SyncSafeToken = {\n\tget: (buffer, offset) => (buffer[offset + 3] & 0x7F) | ((buffer[offset + 2]) << 7) | ((buffer[offset + 1]) << 14) | ((buffer[offset]) << 21),\n\tlen: 4,\n};\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/file-type/supported.js\nconst extensions = [\n\t'jpg',\n\t'png',\n\t'apng',\n\t'gif',\n\t'webp',\n\t'flif',\n\t'xcf',\n\t'cr2',\n\t'cr3',\n\t'orf',\n\t'arw',\n\t'dng',\n\t'nef',\n\t'rw2',\n\t'raf',\n\t'tif',\n\t'bmp',\n\t'icns',\n\t'jxr',\n\t'psd',\n\t'indd',\n\t'zip',\n\t'tar',\n\t'rar',\n\t'gz',\n\t'bz2',\n\t'7z',\n\t'dmg',\n\t'mp4',\n\t'mid',\n\t'mkv',\n\t'webm',\n\t'mov',\n\t'avi',\n\t'mpg',\n\t'mp2',\n\t'mp3',\n\t'm4a',\n\t'oga',\n\t'ogg',\n\t'ogv',\n\t'opus',\n\t'flac',\n\t'wav',\n\t'spx',\n\t'amr',\n\t'pdf',\n\t'epub',\n\t'elf',\n\t'macho',\n\t'exe',\n\t'swf',\n\t'rtf',\n\t'wasm',\n\t'woff',\n\t'woff2',\n\t'eot',\n\t'ttf',\n\t'otf',\n\t'ico',\n\t'flv',\n\t'ps',\n\t'xz',\n\t'sqlite',\n\t'nes',\n\t'crx',\n\t'xpi',\n\t'cab',\n\t'deb',\n\t'ar',\n\t'rpm',\n\t'Z',\n\t'lz',\n\t'cfb',\n\t'mxf',\n\t'mts',\n\t'blend',\n\t'bpg',\n\t'docx',\n\t'pptx',\n\t'xlsx',\n\t'3gp',\n\t'3g2',\n\t'j2c',\n\t'jp2',\n\t'jpm',\n\t'jpx',\n\t'mj2',\n\t'aif',\n\t'qcp',\n\t'odt',\n\t'ods',\n\t'odp',\n\t'xml',\n\t'mobi',\n\t'heic',\n\t'cur',\n\t'ktx',\n\t'ape',\n\t'wv',\n\t'dcm',\n\t'ics',\n\t'glb',\n\t'pcap',\n\t'dsf',\n\t'lnk',\n\t'alias',\n\t'voc',\n\t'ac3',\n\t'm4v',\n\t'm4p',\n\t'm4b',\n\t'f4v',\n\t'f4p',\n\t'f4b',\n\t'f4a',\n\t'mie',\n\t'asf',\n\t'ogm',\n\t'ogx',\n\t'mpc',\n\t'arrow',\n\t'shp',\n\t'aac',\n\t'mp1',\n\t'it',\n\t's3m',\n\t'xm',\n\t'ai',\n\t'skp',\n\t'avif',\n\t'eps',\n\t'lzh',\n\t'pgp',\n\t'asar',\n\t'stl',\n\t'chm',\n\t'3mf',\n\t'zst',\n\t'jxl',\n\t'vcf',\n\t'jls',\n\t'pst',\n\t'dwg',\n\t'parquet',\n\t'class',\n\t'arj',\n\t'cpio',\n\t'ace',\n\t'avro',\n\t'icc',\n\t'fbx',\n\t'vsdx',\n\t'vtt',\n\t'apk',\n];\n\nconst supported_mimeTypes = [\n\t'image/jpeg',\n\t'image/png',\n\t'image/gif',\n\t'image/webp',\n\t'image/flif',\n\t'image/x-xcf',\n\t'image/x-canon-cr2',\n\t'image/x-canon-cr3',\n\t'image/tiff',\n\t'image/bmp',\n\t'image/vnd.ms-photo',\n\t'image/vnd.adobe.photoshop',\n\t'application/x-indesign',\n\t'application/epub+zip',\n\t'application/x-xpinstall',\n\t'application/vnd.oasis.opendocument.text',\n\t'application/vnd.oasis.opendocument.spreadsheet',\n\t'application/vnd.oasis.opendocument.presentation',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t'application/zip',\n\t'application/x-tar',\n\t'application/x-rar-compressed',\n\t'application/gzip',\n\t'application/x-bzip2',\n\t'application/x-7z-compressed',\n\t'application/x-apple-diskimage',\n\t'application/x-apache-arrow',\n\t'video/mp4',\n\t'audio/midi',\n\t'video/x-matroska',\n\t'video/webm',\n\t'video/quicktime',\n\t'video/vnd.avi',\n\t'audio/wav',\n\t'audio/qcelp',\n\t'audio/x-ms-asf',\n\t'video/x-ms-asf',\n\t'application/vnd.ms-asf',\n\t'video/mpeg',\n\t'video/3gpp',\n\t'audio/mpeg',\n\t'audio/mp4', // RFC 4337\n\t'video/ogg',\n\t'audio/ogg',\n\t'audio/ogg; codecs=opus',\n\t'application/ogg',\n\t'audio/x-flac',\n\t'audio/ape',\n\t'audio/wavpack',\n\t'audio/amr',\n\t'application/pdf',\n\t'application/x-elf',\n\t'application/x-mach-binary',\n\t'application/x-msdownload',\n\t'application/x-shockwave-flash',\n\t'application/rtf',\n\t'application/wasm',\n\t'font/woff',\n\t'font/woff2',\n\t'application/vnd.ms-fontobject',\n\t'font/ttf',\n\t'font/otf',\n\t'image/x-icon',\n\t'video/x-flv',\n\t'application/postscript',\n\t'application/eps',\n\t'application/x-xz',\n\t'application/x-sqlite3',\n\t'application/x-nintendo-nes-rom',\n\t'application/x-google-chrome-extension',\n\t'application/vnd.ms-cab-compressed',\n\t'application/x-deb',\n\t'application/x-unix-archive',\n\t'application/x-rpm',\n\t'application/x-compress',\n\t'application/x-lzip',\n\t'application/x-cfb',\n\t'application/x-mie',\n\t'application/mxf',\n\t'video/mp2t',\n\t'application/x-blender',\n\t'image/bpg',\n\t'image/j2c',\n\t'image/jp2',\n\t'image/jpx',\n\t'image/jpm',\n\t'image/mj2',\n\t'audio/aiff',\n\t'application/xml',\n\t'application/x-mobipocket-ebook',\n\t'image/heif',\n\t'image/heif-sequence',\n\t'image/heic',\n\t'image/heic-sequence',\n\t'image/icns',\n\t'image/ktx',\n\t'application/dicom',\n\t'audio/x-musepack',\n\t'text/calendar',\n\t'text/vcard',\n\t'text/vtt',\n\t'model/gltf-binary',\n\t'application/vnd.tcpdump.pcap',\n\t'audio/x-dsf', // Non-standard\n\t'application/x.ms.shortcut', // Invented by us\n\t'application/x.apple.alias', // Invented by us\n\t'audio/x-voc',\n\t'audio/vnd.dolby.dd-raw',\n\t'audio/x-m4a',\n\t'image/apng',\n\t'image/x-olympus-orf',\n\t'image/x-sony-arw',\n\t'image/x-adobe-dng',\n\t'image/x-nikon-nef',\n\t'image/x-panasonic-rw2',\n\t'image/x-fujifilm-raf',\n\t'video/x-m4v',\n\t'video/3gpp2',\n\t'application/x-esri-shape',\n\t'audio/aac',\n\t'audio/x-it',\n\t'audio/x-s3m',\n\t'audio/x-xm',\n\t'video/MP1S',\n\t'video/MP2P',\n\t'application/vnd.sketchup.skp',\n\t'image/avif',\n\t'application/x-lzh-compressed',\n\t'application/pgp-encrypted',\n\t'application/x-asar',\n\t'model/stl',\n\t'application/vnd.ms-htmlhelp',\n\t'model/3mf',\n\t'image/jxl',\n\t'application/zstd',\n\t'image/jls',\n\t'application/vnd.ms-outlook',\n\t'image/vnd.dwg',\n\t'application/x-parquet',\n\t'application/java-vm',\n\t'application/x-arj',\n\t'application/x-cpio',\n\t'application/x-ace-compressed',\n\t'application/avro',\n\t'application/vnd.iccprofile',\n\t'application/x.autodesk.fbx', // Invented by us\n\t'application/vnd.visio',\n\t'application/vnd.android.package-archive',\n];\n\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/node_modules/file-type/core.js\n/**\nPrimary entry point, Node.js specific entry point is index.js\n*/\n\n\n\n\n\n\n\nconst reasonableDetectionSizeInBytes = 4100; // A fair amount of file-types are detectable within this range.\n\nasync function fileTypeFromStream(stream) {\n\treturn new FileTypeParser().fromStream(stream);\n}\n\nasync function fileTypeFromBuffer(input) {\n\treturn new FileTypeParser().fromBuffer(input);\n}\n\nasync function fileTypeFromBlob(blob) {\n\treturn new FileTypeParser().fromBlob(blob);\n}\n\nfunction _check(buffer, headers, options) {\n\toptions = {\n\t\toffset: 0,\n\t\t...options,\n\t};\n\n\tfor (const [index, header] of headers.entries()) {\n\t\t// If a bitmask is set\n\t\tif (options.mask) {\n\t\t\t// If header doesn't equal `buf` with bits masked off\n\t\t\tif (header !== (options.mask[index] & buffer[index + options.offset])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (header !== buffer[index + options.offset]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nasync function fileTypeFromTokenizer(tokenizer) {\n\treturn new FileTypeParser().fromTokenizer(tokenizer);\n}\n\nasync function fileTypeStream(webStream, options) {\n\treturn new FileTypeParser(options).toDetectionStream(webStream, options);\n}\n\nclass FileTypeParser {\n\tconstructor(options) {\n\t\tthis.detectors = options?.customDetectors;\n\t\tthis.tokenizerOptions = {\n\t\t\tabortSignal: options?.signal,\n\t\t};\n\t\tthis.fromTokenizer = this.fromTokenizer.bind(this);\n\t\tthis.fromBuffer = this.fromBuffer.bind(this);\n\t\tthis.parse = this.parse.bind(this);\n\t}\n\n\tasync fromTokenizer(tokenizer) {\n\t\tconst initialPosition = tokenizer.position;\n\n\t\tfor (const detector of this.detectors || []) {\n\t\t\tconst fileType = await detector(tokenizer);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\n\t\t\tif (initialPosition !== tokenizer.position) {\n\t\t\t\treturn undefined; // Cannot proceed scanning of the tokenizer is at an arbitrary position\n\t\t\t}\n\t\t}\n\n\t\treturn this.parse(tokenizer);\n\t}\n\n\tasync fromBuffer(input) {\n\t\tif (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) {\n\t\t\tthrow new TypeError(`Expected the \\`input\\` argument to be of type \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof input}\\``);\n\t\t}\n\n\t\tconst buffer = input instanceof Uint8Array ? input : new Uint8Array(input);\n\n\t\tif (!(buffer?.length > 1)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.fromTokenizer(fromBuffer(buffer, this.tokenizerOptions));\n\t}\n\n\tasync fromBlob(blob) {\n\t\treturn this.fromStream(blob.stream());\n\t}\n\n\tasync fromStream(stream) {\n\t\tconst tokenizer = await fromWebStream(stream, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync toDetectionStream(stream, options) {\n\t\tconst {sampleSize = reasonableDetectionSizeInBytes} = options;\n\t\tlet detectedFileType;\n\t\tlet firstChunk;\n\n\t\tconst reader = stream.getReader({mode: 'byob'});\n\t\ttry {\n\t\t\t// Read the first chunk from the stream\n\t\t\tconst {value: chunk, done} = await reader.read(new Uint8Array(sampleSize));\n\t\t\tfirstChunk = chunk;\n\t\t\tif (!done && chunk) {\n\t\t\t\ttry {\n\t\t\t\t\t// Attempt to detect the file type from the chunk\n\t\t\t\t\tdetectedFileType = await this.fromBuffer(chunk.slice(0, sampleSize));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof EndOfStreamError_EndOfStreamError)) {\n\t\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedFileType = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirstChunk = chunk;\n\t\t} finally {\n\t\t\treader.releaseLock(); // Ensure the reader is released\n\t\t}\n\n\t\t// Create a new ReadableStream to manage locking issues\n\t\tconst transformStream = new TransformStream({\n\t\t\tasync start(controller) {\n\t\t\t\tcontroller.enqueue(firstChunk); // Enqueue the initial chunk\n\t\t\t},\n\t\t\ttransform(chunk, controller) {\n\t\t\t\t// Pass through the chunks without modification\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t},\n\t\t});\n\n\t\tconst newStream = stream.pipeThrough(transformStream);\n\t\tnewStream.fileType = detectedFileType;\n\n\t\treturn newStream;\n\t}\n\n\tcheck(header, options) {\n\t\treturn _check(this.buffer, header, options);\n\t}\n\n\tcheckString(header, options) {\n\t\treturn this.check(stringToBytes(header), options);\n\t}\n\n\tasync parse(tokenizer) {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Keep reading until EOF if the file size is unknown.\n\t\tif (tokenizer.fileInfo.size === undefined) {\n\t\t\ttokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;\n\t\t}\n\n\t\tthis.tokenizer = tokenizer;\n\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: 12, mayBeLess: true});\n\n\t\t// -- 2-byte signatures --\n\n\t\tif (this.check([0x42, 0x4D])) {\n\t\t\treturn {\n\t\t\t\text: 'bmp',\n\t\t\t\tmime: 'image/bmp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x0B, 0x77])) {\n\t\t\treturn {\n\t\t\t\text: 'ac3',\n\t\t\t\tmime: 'audio/vnd.dolby.dd-raw',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x78, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'dmg',\n\t\t\t\tmime: 'application/x-apple-diskimage',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4D, 0x5A])) {\n\t\t\treturn {\n\t\t\t\text: 'exe',\n\t\t\t\tmime: 'application/x-msdownload',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x25, 0x21])) {\n\t\t\tawait tokenizer.peekBuffer(this.buffer, {length: 24, mayBeLess: true});\n\n\t\t\tif (\n\t\t\t\tthis.checkString('PS-Adobe-', {offset: 2})\n\t\t\t\t&& this.checkString(' EPSF-', {offset: 14})\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'eps',\n\t\t\t\t\tmime: 'application/eps',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ps',\n\t\t\t\tmime: 'application/postscript',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x1F, 0xA0])\n\t\t\t|| this.check([0x1F, 0x9D])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'Z',\n\t\t\t\tmime: 'application/x-compress',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC7, 0x71])) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x60, 0xEA])) {\n\t\t\treturn {\n\t\t\t\text: 'arj',\n\t\t\t\tmime: 'application/x-arj',\n\t\t\t};\n\t\t}\n\n\t\t// -- 3-byte signatures --\n\n\t\tif (this.check([0xEF, 0xBB, 0xBF])) { // UTF-8-BOM\n\t\t\t// Strip off UTF-8-BOM\n\t\t\tthis.tokenizer.ignore(3);\n\t\t\treturn this.parse(tokenizer);\n\t\t}\n\n\t\tif (this.check([0x47, 0x49, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'gif',\n\t\t\t\tmime: 'image/gif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0xBC])) {\n\t\t\treturn {\n\t\t\t\text: 'jxr',\n\t\t\t\tmime: 'image/vnd.ms-photo',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x1F, 0x8B, 0x8])) {\n\t\t\treturn {\n\t\t\t\text: 'gz',\n\t\t\t\tmime: 'application/gzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x5A, 0x68])) {\n\t\t\treturn {\n\t\t\t\text: 'bz2',\n\t\t\t\tmime: 'application/x-bzip2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ID3')) {\n\t\t\tawait tokenizer.ignore(6); // Skip ID3 header until the header size\n\t\t\tconst id3HeaderLength = await tokenizer.readToken(uint32SyncSafeToken);\n\t\t\tif (tokenizer.position + id3HeaderLength > tokenizer.fileInfo.size) {\n\t\t\t\t// Guess file type based on ID3 header for backward compatibility\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(id3HeaderLength);\n\t\t\treturn this.fromTokenizer(tokenizer); // Skip ID3 header, recursion\n\t\t}\n\n\t\t// Musepack, SV7\n\t\tif (this.checkString('MP+')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\t(this.buffer[0] === 0x43 || this.buffer[0] === 0x46)\n\t\t\t&& this.check([0x57, 0x53], {offset: 1})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'swf',\n\t\t\t\tmime: 'application/x-shockwave-flash',\n\t\t\t};\n\t\t}\n\n\t\t// -- 4-byte signatures --\n\n\t\t// Requires a sample size of 4 bytes\n\t\tif (this.check([0xFF, 0xD8, 0xFF])) {\n\t\t\tif (this.check([0xF7], {offset: 3})) { // JPG7/SOF55, indicating a ISO/IEC 14495 / JPEG-LS file\n\t\t\t\treturn {\n\t\t\t\t\text: 'jls',\n\t\t\t\t\tmime: 'image/jls',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'jpg',\n\t\t\t\tmime: 'image/jpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4F, 0x62, 0x6A, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'avro',\n\t\t\t\tmime: 'application/avro',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FLIF')) {\n\t\t\treturn {\n\t\t\t\text: 'flif',\n\t\t\t\tmime: 'image/flif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('8BPS')) {\n\t\t\treturn {\n\t\t\t\text: 'psd',\n\t\t\t\tmime: 'image/vnd.adobe.photoshop',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('WEBP', {offset: 8})) {\n\t\t\treturn {\n\t\t\t\text: 'webp',\n\t\t\t\tmime: 'image/webp',\n\t\t\t};\n\t\t}\n\n\t\t// Musepack, SV8\n\t\tif (this.checkString('MPCK')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FORM')) {\n\t\t\treturn {\n\t\t\t\text: 'aif',\n\t\t\t\tmime: 'audio/aiff',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('icns', {offset: 0})) {\n\t\t\treturn {\n\t\t\t\text: 'icns',\n\t\t\t\tmime: 'image/icns',\n\t\t\t};\n\t\t}\n\n\t\t// Zip-based file formats\n\t\t// Need to be before the `zip` check\n\t\tif (this.check([0x50, 0x4B, 0x3, 0x4])) { // Local file header signature\n\t\t\ttry {\n\t\t\t\twhile (tokenizer.position + 30 < tokenizer.fileInfo.size) {\n\t\t\t\t\tawait tokenizer.readBuffer(this.buffer, {length: 30});\n\n\t\t\t\t\tconst view = new DataView(this.buffer.buffer);\n\n\t\t\t\t\t// https://en.wikipedia.org/wiki/Zip_(file_format)#File_headers\n\t\t\t\t\tconst zipHeader = {\n\t\t\t\t\t\tcompressedSize: view.getUint32(18, true),\n\t\t\t\t\t\tuncompressedSize: view.getUint32(22, true),\n\t\t\t\t\t\tfilenameLength: view.getUint16(26, true),\n\t\t\t\t\t\textraFieldLength: view.getUint16(28, true),\n\t\t\t\t\t};\n\n\t\t\t\t\tzipHeader.filename = await tokenizer.readToken(new lib.StringType(zipHeader.filenameLength, 'utf-8'));\n\t\t\t\t\tawait tokenizer.ignore(zipHeader.extraFieldLength);\n\n\t\t\t\t\tif (/classes\\d*\\.dex/.test(zipHeader.filename)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'apk',\n\t\t\t\t\t\t\tmime: 'application/vnd.android.package-archive',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Assumes signed `.xpi` from addons.mozilla.org\n\t\t\t\t\tif (zipHeader.filename === 'META-INF/mozilla.rsa') {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'xpi',\n\t\t\t\t\t\t\tmime: 'application/x-xpinstall',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (zipHeader.filename.endsWith('.rels') || zipHeader.filename.endsWith('.xml')) {\n\t\t\t\t\t\tconst type = zipHeader.filename.split('/')[0];\n\t\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\t\tcase '_rels':\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'word':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'docx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'ppt':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'pptx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'xl':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'xlsx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'visio':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'vsdx',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.visio',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (zipHeader.filename.startsWith('xl/')) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'xlsx',\n\t\t\t\t\t\t\tmime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (zipHeader.filename.startsWith('3D/') && zipHeader.filename.endsWith('.model')) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: '3mf',\n\t\t\t\t\t\t\tmime: 'model/3mf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// The docx, xlsx and pptx file types extend the Office Open XML file format:\n\t\t\t\t\t// https://en.wikipedia.org/wiki/Office_Open_XML_file_formats\n\t\t\t\t\t// We look for:\n\t\t\t\t\t// - one entry named '[Content_Types].xml' or '_rels/.rels',\n\t\t\t\t\t// - one entry indicating specific type of file.\n\t\t\t\t\t// MS Office, OpenOffice and LibreOffice may put the parts in different order, so the check should not rely on it.\n\t\t\t\t\tif (zipHeader.filename === 'mimetype' && zipHeader.compressedSize === zipHeader.uncompressedSize) {\n\t\t\t\t\t\tlet mimeType = await tokenizer.readToken(new lib.StringType(zipHeader.compressedSize, 'utf-8'));\n\t\t\t\t\t\tmimeType = mimeType.trim();\n\n\t\t\t\t\t\tswitch (mimeType) {\n\t\t\t\t\t\t\tcase 'application/epub+zip':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'epub',\n\t\t\t\t\t\t\t\t\tmime: 'application/epub+zip',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'application/vnd.oasis.opendocument.text':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'odt',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.oasis.opendocument.text',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'application/vnd.oasis.opendocument.spreadsheet':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'ods',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.oasis.opendocument.spreadsheet',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase 'application/vnd.oasis.opendocument.presentation':\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\text: 'odp',\n\t\t\t\t\t\t\t\t\tmime: 'application/vnd.oasis.opendocument.presentation',\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Try to find next header manually when current one is corrupted\n\t\t\t\t\tif (zipHeader.compressedSize === 0) {\n\t\t\t\t\t\tlet nextHeaderIndex = -1;\n\n\t\t\t\t\t\twhile (nextHeaderIndex < 0 && (tokenizer.position < tokenizer.fileInfo.size)) {\n\t\t\t\t\t\t\tawait tokenizer.peekBuffer(this.buffer, {mayBeLess: true});\n\n\t\t\t\t\t\t\tnextHeaderIndex = (0,uint8array_extras/* indexOf */.cq)(this.buffer, new Uint8Array([0x50, 0x4B, 0x03, 0x04]));\n\n\t\t\t\t\t\t\t// Move position to the next header if found, skip the whole buffer otherwise\n\t\t\t\t\t\t\tawait tokenizer.ignore(nextHeaderIndex >= 0 ? nextHeaderIndex : this.buffer.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait tokenizer.ignore(zipHeader.compressedSize);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof EndOfStreamError_EndOfStreamError)) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('OggS')) {\n\t\t\t// This is an OGG container\n\t\t\tawait tokenizer.ignore(28);\n\t\t\tconst type = new Uint8Array(8);\n\t\t\tawait tokenizer.readBuffer(type);\n\n\t\t\t// Needs to be before `ogg` check\n\t\t\tif (_check(type, [0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'opus',\n\t\t\t\t\tmime: 'audio/ogg; codecs=opus',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' theora' in header.\n\t\t\tif (_check(type, [0x80, 0x74, 0x68, 0x65, 0x6F, 0x72, 0x61])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogv',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01video' in header.\n\t\t\tif (_check(type, [0x01, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x00])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogm',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' FLAC' in header  https://xiph.org/flac/faq.html\n\t\t\tif (_check(type, [0x7F, 0x46, 0x4C, 0x41, 0x43])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'oga',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// 'Speex  ' in header https://en.wikipedia.org/wiki/Speex\n\t\t\tif (_check(type, [0x53, 0x70, 0x65, 0x65, 0x78, 0x20, 0x20])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'spx',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01vorbis' in header\n\t\t\tif (_check(type, [0x01, 0x76, 0x6F, 0x72, 0x62, 0x69, 0x73])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogg',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Default OGG container https://www.iana.org/assignments/media-types/application/ogg\n\t\t\treturn {\n\t\t\t\text: 'ogx',\n\t\t\t\tmime: 'application/ogg',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x50, 0x4B])\n\t\t\t&& (this.buffer[2] === 0x3 || this.buffer[2] === 0x5 || this.buffer[2] === 0x7)\n\t\t\t&& (this.buffer[3] === 0x4 || this.buffer[3] === 0x6 || this.buffer[3] === 0x8)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\t//\n\n\t\t// File Type Box (https://en.wikipedia.org/wiki/ISO_base_media_file_format)\n\t\t// It's not required to be first, but it's recommended to be. Almost all ISO base media files start with `ftyp` box.\n\t\t// `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.\n\t\t// Here we check for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).\n\t\tif (\n\t\t\tthis.checkString('ftyp', {offset: 4})\n\t\t\t&& (this.buffer[8] & 0x60) !== 0x00 // Brand major, first character ASCII?\n\t\t) {\n\t\t\t// They all can have MIME `video/mp4` except `application/mp4` special-case which is hard to detect.\n\t\t\t// For some cases, we're specific, everything else falls to `video/mp4` with `mp4` extension.\n\t\t\tconst brandMajor = new lib.StringType(4, 'latin1').get(this.buffer, 8).replace('\\0', ' ').trim();\n\t\t\tswitch (brandMajor) {\n\t\t\t\tcase 'avif':\n\t\t\t\tcase 'avis':\n\t\t\t\t\treturn {ext: 'avif', mime: 'image/avif'};\n\t\t\t\tcase 'mif1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif'};\n\t\t\t\tcase 'msf1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif-sequence'};\n\t\t\t\tcase 'heic':\n\t\t\t\tcase 'heix':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic'};\n\t\t\t\tcase 'hevc':\n\t\t\t\tcase 'hevx':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic-sequence'};\n\t\t\t\tcase 'qt':\n\t\t\t\t\treturn {ext: 'mov', mime: 'video/quicktime'};\n\t\t\t\tcase 'M4V':\n\t\t\t\tcase 'M4VH':\n\t\t\t\tcase 'M4VP':\n\t\t\t\t\treturn {ext: 'm4v', mime: 'video/x-m4v'};\n\t\t\t\tcase 'M4P':\n\t\t\t\t\treturn {ext: 'm4p', mime: 'video/mp4'};\n\t\t\t\tcase 'M4B':\n\t\t\t\t\treturn {ext: 'm4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'M4A':\n\t\t\t\t\treturn {ext: 'm4a', mime: 'audio/x-m4a'};\n\t\t\t\tcase 'F4V':\n\t\t\t\t\treturn {ext: 'f4v', mime: 'video/mp4'};\n\t\t\t\tcase 'F4P':\n\t\t\t\t\treturn {ext: 'f4p', mime: 'video/mp4'};\n\t\t\t\tcase 'F4A':\n\t\t\t\t\treturn {ext: 'f4a', mime: 'audio/mp4'};\n\t\t\t\tcase 'F4B':\n\t\t\t\t\treturn {ext: 'f4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'crx':\n\t\t\t\t\treturn {ext: 'cr3', mime: 'image/x-canon-cr3'};\n\t\t\t\tdefault:\n\t\t\t\t\tif (brandMajor.startsWith('3g')) {\n\t\t\t\t\t\tif (brandMajor.startsWith('3g2')) {\n\t\t\t\t\t\t\treturn {ext: '3g2', mime: 'video/3gpp2'};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {ext: '3gp', mime: 'video/3gpp'};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {ext: 'mp4', mime: 'video/mp4'};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('MThd')) {\n\t\t\treturn {\n\t\t\t\text: 'mid',\n\t\t\t\tmime: 'audio/midi',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOFF')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff',\n\t\t\t\tmime: 'font/woff',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOF2')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff2',\n\t\t\t\tmime: 'font/woff2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xD4, 0xC3, 0xB2, 0xA1]) || this.check([0xA1, 0xB2, 0xC3, 0xD4])) {\n\t\t\treturn {\n\t\t\t\text: 'pcap',\n\t\t\t\tmime: 'application/vnd.tcpdump.pcap',\n\t\t\t};\n\t\t}\n\n\t\t// Sony DSD Stream File (DSF)\n\t\tif (this.checkString('DSD ')) {\n\t\t\treturn {\n\t\t\t\text: 'dsf',\n\t\t\t\tmime: 'audio/x-dsf', // Non-standard\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('LZIP')) {\n\t\t\treturn {\n\t\t\t\text: 'lz',\n\t\t\t\tmime: 'application/x-lzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('fLaC')) {\n\t\t\treturn {\n\t\t\t\text: 'flac',\n\t\t\t\tmime: 'audio/x-flac',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x50, 0x47, 0xFB])) {\n\t\t\treturn {\n\t\t\t\text: 'bpg',\n\t\t\t\tmime: 'image/bpg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('wvpk')) {\n\t\t\treturn {\n\t\t\t\text: 'wv',\n\t\t\t\tmime: 'audio/wavpack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('%PDF')) {\n\t\t\ttry {\n\t\t\t\tawait tokenizer.ignore(1350);\n\t\t\t\tconst maxBufferSize = 10 * 1024 * 1024;\n\t\t\t\tconst buffer = new Uint8Array(Math.min(maxBufferSize, tokenizer.fileInfo.size));\n\t\t\t\tawait tokenizer.readBuffer(buffer, {mayBeLess: true});\n\n\t\t\t\t// Check if this is an Adobe Illustrator file\n\t\t\t\tif ((0,uint8array_extras/* includes */.q9)(buffer, new TextEncoder().encode('AIPrivateData'))) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'ai',\n\t\t\t\t\t\tmime: 'application/postscript',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Swallow end of stream error if file is too small for the Adobe AI check\n\t\t\t\tif (!(error instanceof EndOfStreamError_EndOfStreamError)) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Assume this is just a normal PDF\n\t\t\treturn {\n\t\t\t\text: 'pdf',\n\t\t\t\tmime: 'application/pdf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x61, 0x73, 0x6D])) {\n\t\t\treturn {\n\t\t\t\text: 'wasm',\n\t\t\t\tmime: 'application/wasm',\n\t\t\t};\n\t\t}\n\n\t\t// TIFF, little-endian type\n\t\tif (this.check([0x49, 0x49])) {\n\t\t\tconst fileType = await this.readTiffHeader(false);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\t// TIFF, big-endian type\n\t\tif (this.check([0x4D, 0x4D])) {\n\t\t\tconst fileType = await this.readTiffHeader(true);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('MAC ')) {\n\t\t\treturn {\n\t\t\t\text: 'ape',\n\t\t\t\tmime: 'audio/ape',\n\t\t\t};\n\t\t}\n\n\t\t// https://github.com/file/file/blob/master/magic/Magdir/matroska\n\t\tif (this.check([0x1A, 0x45, 0xDF, 0xA3])) { // Root element: EBML\n\t\t\tasync function readField() {\n\t\t\t\tconst msb = await tokenizer.peekNumber(lib.UINT8);\n\t\t\t\tlet mask = 0x80;\n\t\t\t\tlet ic = 0; // 0 = A, 1 = B, 2 = C, 3 = D\n\n\t\t\t\twhile ((msb & mask) === 0 && mask !== 0) {\n\t\t\t\t\t++ic;\n\t\t\t\t\tmask >>= 1;\n\t\t\t\t}\n\n\t\t\t\tconst id = new Uint8Array(ic + 1);\n\t\t\t\tawait tokenizer.readBuffer(id);\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tasync function readElement() {\n\t\t\t\tconst idField = await readField();\n\t\t\t\tconst lengthField = await readField();\n\n\t\t\t\tlengthField[0] ^= 0x80 >> (lengthField.length - 1);\n\t\t\t\tconst nrLength = Math.min(6, lengthField.length); // JavaScript can max read 6 bytes integer\n\n\t\t\t\tconst idView = new DataView(idField.buffer);\n\t\t\t\tconst lengthView = new DataView(lengthField.buffer, lengthField.length - nrLength, nrLength);\n\n\t\t\t\treturn {\n\t\t\t\t\tid: (0,uint8array_extras/* getUintBE */.V_)(idView),\n\t\t\t\t\tlen: (0,uint8array_extras/* getUintBE */.V_)(lengthView),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tasync function readChildren(children) {\n\t\t\t\twhile (children > 0) {\n\t\t\t\t\tconst element = await readElement();\n\t\t\t\t\tif (element.id === 0x42_82) {\n\t\t\t\t\t\tconst rawValue = await tokenizer.readToken(new lib.StringType(element.len));\n\t\t\t\t\t\treturn rawValue.replaceAll(/\\00.*$/g, ''); // Return DocType\n\t\t\t\t\t}\n\n\t\t\t\t\tawait tokenizer.ignore(element.len); // ignore payload\n\t\t\t\t\t--children;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst re = await readElement();\n\t\t\tconst docType = await readChildren(re.len);\n\n\t\t\tswitch (docType) {\n\t\t\t\tcase 'webm':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'webm',\n\t\t\t\t\t\tmime: 'video/webm',\n\t\t\t\t\t};\n\n\t\t\t\tcase 'matroska':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mkv',\n\t\t\t\t\t\tmime: 'video/x-matroska',\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// RIFF file format which might be AVI, WAV, QCP, etc\n\t\tif (this.check([0x52, 0x49, 0x46, 0x46])) {\n\t\t\tif (this.check([0x41, 0x56, 0x49], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'avi',\n\t\t\t\t\tmime: 'video/vnd.avi',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x57, 0x41, 0x56, 0x45], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'wav',\n\t\t\t\t\tmime: 'audio/wav',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// QLCM, QCP file\n\t\t\tif (this.check([0x51, 0x4C, 0x43, 0x4D], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'qcp',\n\t\t\t\t\tmime: 'audio/qcelp',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('SQLi')) {\n\t\t\treturn {\n\t\t\t\text: 'sqlite',\n\t\t\t\tmime: 'application/x-sqlite3',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4E, 0x45, 0x53, 0x1A])) {\n\t\t\treturn {\n\t\t\t\text: 'nes',\n\t\t\t\tmime: 'application/x-nintendo-nes-rom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Cr24')) {\n\t\t\treturn {\n\t\t\t\text: 'crx',\n\t\t\t\tmime: 'application/x-google-chrome-extension',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('MSCF')\n\t\t\t|| this.checkString('ISc(')\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'cab',\n\t\t\t\tmime: 'application/vnd.ms-cab-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xED, 0xAB, 0xEE, 0xDB])) {\n\t\t\treturn {\n\t\t\t\text: 'rpm',\n\t\t\t\tmime: 'application/x-rpm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC5, 0xD0, 0xD3, 0xC6])) {\n\t\t\treturn {\n\t\t\t\text: 'eps',\n\t\t\t\tmime: 'application/eps',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x28, 0xB5, 0x2F, 0xFD])) {\n\t\t\treturn {\n\t\t\t\text: 'zst',\n\t\t\t\tmime: 'application/zstd',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x7F, 0x45, 0x4C, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'elf',\n\t\t\t\tmime: 'application/x-elf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x21, 0x42, 0x44, 0x4E])) {\n\t\t\treturn {\n\t\t\t\text: 'pst',\n\t\t\t\tmime: 'application/vnd.ms-outlook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('PAR1')) {\n\t\t\treturn {\n\t\t\t\text: 'parquet',\n\t\t\t\tmime: 'application/x-parquet',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCF, 0xFA, 0xED, 0xFE])) {\n\t\t\treturn {\n\t\t\t\text: 'macho',\n\t\t\t\tmime: 'application/x-mach-binary',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.check([0x4F, 0x54, 0x54, 0x4F, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'otf',\n\t\t\t\tmime: 'font/otf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('#!AMR')) {\n\t\t\treturn {\n\t\t\t\text: 'amr',\n\t\t\t\tmime: 'audio/amr',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('{\\\\rtf')) {\n\t\t\treturn {\n\t\t\t\text: 'rtf',\n\t\t\t\tmime: 'application/rtf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x46, 0x4C, 0x56, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'flv',\n\t\t\t\tmime: 'video/x-flv',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('IMPM')) {\n\t\t\treturn {\n\t\t\t\text: 'it',\n\t\t\t\tmime: 'audio/x-it',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('-lh0-', {offset: 2})\n\t\t\t|| this.checkString('-lh1-', {offset: 2})\n\t\t\t|| this.checkString('-lh2-', {offset: 2})\n\t\t\t|| this.checkString('-lh3-', {offset: 2})\n\t\t\t|| this.checkString('-lh4-', {offset: 2})\n\t\t\t|| this.checkString('-lh5-', {offset: 2})\n\t\t\t|| this.checkString('-lh6-', {offset: 2})\n\t\t\t|| this.checkString('-lh7-', {offset: 2})\n\t\t\t|| this.checkString('-lzs-', {offset: 2})\n\t\t\t|| this.checkString('-lz4-', {offset: 2})\n\t\t\t|| this.checkString('-lz5-', {offset: 2})\n\t\t\t|| this.checkString('-lhd-', {offset: 2})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'lzh',\n\t\t\t\tmime: 'application/x-lzh-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// MPEG program stream (PS or MPEG-PS)\n\t\tif (this.check([0x00, 0x00, 0x01, 0xBA])) {\n\t\t\t//  MPEG-PS, MPEG-1 Part 1\n\t\t\tif (this.check([0x21], {offset: 4, mask: [0xF1]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .ps, .mpeg\n\t\t\t\t\tmime: 'video/MP1S',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG-PS, MPEG-2 Part 1\n\t\t\tif (this.check([0x44], {offset: 4, mask: [0xC4]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .mpg, .m2p, .vob or .sub\n\t\t\t\t\tmime: 'video/MP2P',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('ITSF')) {\n\t\t\treturn {\n\t\t\t\text: 'chm',\n\t\t\t\tmime: 'application/vnd.ms-htmlhelp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCA, 0xFE, 0xBA, 0xBE])) {\n\t\t\treturn {\n\t\t\t\text: 'class',\n\t\t\t\tmime: 'application/java-vm',\n\t\t\t};\n\t\t}\n\n\t\t// -- 6-byte signatures --\n\n\t\tif (this.check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'xz',\n\t\t\t\tmime: 'application/x-xz',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('<?xml ')) {\n\t\t\treturn {\n\t\t\t\text: 'xml',\n\t\t\t\tmime: 'application/xml',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) {\n\t\t\treturn {\n\t\t\t\text: '7z',\n\t\t\t\tmime: 'application/x-7z-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x52, 0x61, 0x72, 0x21, 0x1A, 0x7])\n\t\t\t&& (this.buffer[6] === 0x0 || this.buffer[6] === 0x1)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'rar',\n\t\t\t\tmime: 'application/x-rar-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('solid ')) {\n\t\t\treturn {\n\t\t\t\text: 'stl',\n\t\t\t\tmime: 'model/stl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('AC')) {\n\t\t\tconst version = new lib.StringType(4, 'latin1').get(this.buffer, 2);\n\t\t\tif (version.match('^d*') && version >= 1000 && version <= 1050) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'dwg',\n\t\t\t\t\tmime: 'image/vnd.dwg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('070707')) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\t// -- 7-byte signatures --\n\n\t\tif (this.checkString('BLENDER')) {\n\t\t\treturn {\n\t\t\t\text: 'blend',\n\t\t\t\tmime: 'application/x-blender',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('!<arch>')) {\n\t\t\tawait tokenizer.ignore(8);\n\t\t\tconst string = await tokenizer.readToken(new lib.StringType(13, 'ascii'));\n\t\t\tif (string === 'debian-binary') {\n\t\t\t\treturn {\n\t\t\t\t\text: 'deb',\n\t\t\t\t\tmime: 'application/x-deb',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ar',\n\t\t\t\tmime: 'application/x-unix-archive',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('WEBVTT')\n\t\t\t&&\t(\n\t\t\t\t// One of LF, CR, tab, space, or end of file must follow \"WEBVTT\" per the spec (see `fixture/fixture-vtt-*.vtt` for examples). Note that `\\0` is technically the null character (there is no such thing as an EOF character). However, checking for `\\0` gives us the same result as checking for the end of the stream.\n\t\t\t\t(['\\n', '\\r', '\\t', ' ', '\\0'].some(char7 => this.checkString(char7, {offset: 6}))))\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'vtt',\n\t\t\t\tmime: 'text/vtt',\n\t\t\t};\n\t\t}\n\n\t\t// -- 8-byte signatures --\n\n\t\tif (this.check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\t// APNG format (https://wiki.mozilla.org/APNG_Specification)\n\t\t\t// 1. Find the first IDAT (image data) chunk (49 44 41 54)\n\t\t\t// 2. Check if there is an \"acTL\" chunk before the IDAT one (61 63 54 4C)\n\n\t\t\t// Offset calculated as follows:\n\t\t\t// - 8 bytes: PNG signature\n\t\t\t// - 4 (length) + 4 (chunk type) + 13 (chunk data) + 4 (CRC): IHDR chunk\n\n\t\t\tawait tokenizer.ignore(8); // ignore PNG signature\n\n\t\t\tasync function readChunkHeader() {\n\t\t\t\treturn {\n\t\t\t\t\tlength: await tokenizer.readToken(lib.INT32_BE),\n\t\t\t\t\ttype: await tokenizer.readToken(new lib.StringType(4, 'latin1')),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tconst chunk = await readChunkHeader();\n\t\t\t\tif (chunk.length < 0) {\n\t\t\t\t\treturn; // Invalid chunk length\n\t\t\t\t}\n\n\t\t\t\tswitch (chunk.type) {\n\t\t\t\t\tcase 'IDAT':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'png',\n\t\t\t\t\t\t\tmime: 'image/png',\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'acTL':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'apng',\n\t\t\t\t\t\t\tmime: 'image/apng',\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tawait tokenizer.ignore(chunk.length + 4); // Ignore chunk-data + CRC\n\t\t\t\t}\n\t\t\t} while (tokenizer.position + 8 < tokenizer.fileInfo.size);\n\n\t\t\treturn {\n\t\t\t\text: 'png',\n\t\t\t\tmime: 'image/png',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x41, 0x52, 0x52, 0x4F, 0x57, 0x31, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'arrow',\n\t\t\t\tmime: 'application/x-apache-arrow',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x67, 0x6C, 0x54, 0x46, 0x02, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'glb',\n\t\t\t\tmime: 'model/gltf-binary',\n\t\t\t};\n\t\t}\n\n\t\t// `mov` format variants\n\t\tif (\n\t\t\tthis.check([0x66, 0x72, 0x65, 0x65], {offset: 4}) // `free`\n\t\t\t|| this.check([0x6D, 0x64, 0x61, 0x74], {offset: 4}) // `mdat` MJPEG\n\t\t\t|| this.check([0x6D, 0x6F, 0x6F, 0x76], {offset: 4}) // `moov`\n\t\t\t|| this.check([0x77, 0x69, 0x64, 0x65], {offset: 4}) // `wide`\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mov',\n\t\t\t\tmime: 'video/quicktime',\n\t\t\t};\n\t\t}\n\n\t\t// -- 9-byte signatures --\n\n\t\tif (this.check([0x49, 0x49, 0x52, 0x4F, 0x08, 0x00, 0x00, 0x00, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'orf',\n\t\t\t\tmime: 'image/x-olympus-orf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('gimp xcf ')) {\n\t\t\treturn {\n\t\t\t\text: 'xcf',\n\t\t\t\tmime: 'image/x-xcf',\n\t\t\t};\n\t\t}\n\n\t\t// -- 12-byte signatures --\n\n\t\tif (this.check([0x49, 0x49, 0x55, 0x00, 0x18, 0x00, 0x00, 0x00, 0x88, 0xE7, 0x74, 0xD8])) {\n\t\t\treturn {\n\t\t\t\text: 'rw2',\n\t\t\t\tmime: 'image/x-panasonic-rw2',\n\t\t\t};\n\t\t}\n\n\t\t// ASF_Header_Object first 80 bytes\n\t\tif (this.check([0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9])) {\n\t\t\tasync function readHeader() {\n\t\t\t\tconst guid = new Uint8Array(16);\n\t\t\t\tawait tokenizer.readBuffer(guid);\n\t\t\t\treturn {\n\t\t\t\t\tid: guid,\n\t\t\t\t\tsize: Number(await tokenizer.readToken(lib.UINT64_LE)),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(30);\n\t\t\t// Search for header should be in first 1KB of file.\n\t\t\twhile (tokenizer.position + 24 < tokenizer.fileInfo.size) {\n\t\t\t\tconst header = await readHeader();\n\t\t\t\tlet payload = header.size - 24;\n\t\t\t\tif (_check(header.id, [0x91, 0x07, 0xDC, 0xB7, 0xB7, 0xA9, 0xCF, 0x11, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65])) {\n\t\t\t\t\t// Sync on Stream-Properties-Object (B7DC0791-A9B7-11CF-8EE6-00C00C205365)\n\t\t\t\t\tconst typeId = new Uint8Array(16);\n\t\t\t\t\tpayload -= await tokenizer.readBuffer(typeId);\n\n\t\t\t\t\tif (_check(typeId, [0x40, 0x9E, 0x69, 0xF8, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found audio:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'audio/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_check(typeId, [0xC0, 0xEF, 0x19, 0xBC, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found video:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'video/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait tokenizer.ignore(payload);\n\t\t\t}\n\n\t\t\t// Default to ASF generic extension\n\t\t\treturn {\n\t\t\t\text: 'asf',\n\t\t\t\tmime: 'application/vnd.ms-asf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\treturn {\n\t\t\t\text: 'ktx',\n\t\t\t\tmime: 'image/ktx',\n\t\t\t};\n\t\t}\n\n\t\tif ((this.check([0x7E, 0x10, 0x04]) || this.check([0x7E, 0x18, 0x04])) && this.check([0x30, 0x4D, 0x49, 0x45], {offset: 4})) {\n\t\t\treturn {\n\t\t\t\text: 'mie',\n\t\t\t\tmime: 'application/x-mie',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], {offset: 2})) {\n\t\t\treturn {\n\t\t\t\text: 'shp',\n\t\t\t\tmime: 'application/x-esri-shape',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0x4F, 0xFF, 0x51])) {\n\t\t\treturn {\n\t\t\t\text: 'j2c',\n\t\t\t\tmime: 'image/j2c',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A])) {\n\t\t\t// JPEG-2000 family\n\n\t\t\tawait tokenizer.ignore(20);\n\t\t\tconst type = await tokenizer.readToken(new lib.StringType(4, 'ascii'));\n\t\t\tswitch (type) {\n\t\t\t\tcase 'jp2 ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jp2',\n\t\t\t\t\t\tmime: 'image/jp2',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpx ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpx',\n\t\t\t\t\t\tmime: 'image/jpx',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpm ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpm',\n\t\t\t\t\t\tmime: 'image/jpm',\n\t\t\t\t\t};\n\t\t\t\tcase 'mjp2':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mj2',\n\t\t\t\t\t\tmime: 'image/mj2',\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0xFF, 0x0A])\n\t\t\t|| this.check([0x00, 0x00, 0x00, 0x0C, 0x4A, 0x58, 0x4C, 0x20, 0x0D, 0x0A, 0x87, 0x0A])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'jxl',\n\t\t\t\tmime: 'image/jxl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFE, 0xFF])) { // UTF-16-BOM-LE\n\t\t\tif (this.check([0, 60, 0, 63, 0, 120, 0, 109, 0, 108], {offset: 2})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some unknown text based format\n\t\t}\n\n\t\t// -- Unsafe signatures --\n\n\t\tif (\n\t\t\tthis.check([0x0, 0x0, 0x1, 0xBA])\n\t\t\t|| this.check([0x0, 0x0, 0x1, 0xB3])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mpg',\n\t\t\t\tmime: 'video/mpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x01, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ttf',\n\t\t\t\tmime: 'font/ttf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x01, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ico',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x02, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'cur',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) {\n\t\t\t// Detected Microsoft Compound File Binary File (MS-CFB) Format.\n\t\t\treturn {\n\t\t\t\text: 'cfb',\n\t\t\t\tmime: 'application/x-cfb',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 12 to 256.\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (this.check([0x61, 0x63, 0x73, 0x70], {offset: 36})) {\n\t\t\treturn {\n\t\t\t\text: 'icc',\n\t\t\t\tmime: 'application/vnd.iccprofile',\n\t\t\t};\n\t\t}\n\n\t\t// ACE: requires 14 bytes in the buffer\n\t\tif (this.checkString('**ACE', {offset: 7}) && this.checkString('**', {offset: 12})) {\n\t\t\treturn {\n\t\t\t\text: 'ace',\n\t\t\t\tmime: 'application/x-ace-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// -- 15-byte signatures --\n\n\t\tif (this.checkString('BEGIN:')) {\n\t\t\tif (this.checkString('VCARD', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'vcf',\n\t\t\t\t\tmime: 'text/vcard',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('VCALENDAR', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ics',\n\t\t\t\t\tmime: 'text/calendar',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// `raf` is here just to keep all the raw image detectors together.\n\t\tif (this.checkString('FUJIFILMCCD-RAW')) {\n\t\t\treturn {\n\t\t\t\text: 'raf',\n\t\t\t\tmime: 'image/x-fujifilm-raf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Extended Module:')) {\n\t\t\treturn {\n\t\t\t\text: 'xm',\n\t\t\t\tmime: 'audio/x-xm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Creative Voice File')) {\n\t\t\treturn {\n\t\t\t\text: 'voc',\n\t\t\t\tmime: 'audio/x-voc',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x00, 0x00, 0x00]) && this.buffer.length >= 16) { // Rough & quick check Pickle/ASAR\n\t\t\tconst jsonSize = new DataView(this.buffer.buffer).getUint32(12, true);\n\n\t\t\tif (jsonSize > 12 && this.buffer.length >= jsonSize + 16) {\n\t\t\t\ttry {\n\t\t\t\t\tconst header = new TextDecoder().decode(this.buffer.slice(16, jsonSize + 16));\n\t\t\t\t\tconst json = JSON.parse(header);\n\t\t\t\t\t// Check if Pickle is ASAR\n\t\t\t\t\tif (json.files) { // Final check, assuring Pickle/ASAR format\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asar',\n\t\t\t\t\t\t\tmime: 'application/x-asar',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x06, 0x0E, 0x2B, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x02])) {\n\t\t\treturn {\n\t\t\t\text: 'mxf',\n\t\t\t\tmime: 'application/mxf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('SCRM', {offset: 44})) {\n\t\t\treturn {\n\t\t\t\text: 's3m',\n\t\t\t\tmime: 'audio/x-s3m',\n\t\t\t};\n\t\t}\n\n\t\t// Raw MPEG-2 transport stream (188-byte packets)\n\t\tif (this.check([0x47]) && this.check([0x47], {offset: 188})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\t// Blu-ray Disc Audio-Video (BDAV) MPEG-2 transport stream has 4-byte TP_extra_header before each 188-byte packet\n\t\tif (this.check([0x47], {offset: 4}) && this.check([0x47], {offset: 196})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x4F, 0x4F, 0x4B, 0x4D, 0x4F, 0x42, 0x49], {offset: 60})) {\n\t\t\treturn {\n\t\t\t\text: 'mobi',\n\t\t\t\tmime: 'application/x-mobipocket-ebook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x44, 0x49, 0x43, 0x4D], {offset: 128})) {\n\t\t\treturn {\n\t\t\t\text: 'dcm',\n\t\t\t\tmime: 'application/dicom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'lnk',\n\t\t\t\tmime: 'application/x.ms.shortcut', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x62, 0x6F, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x72, 0x6B, 0x00, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'alias',\n\t\t\t\tmime: 'application/x.apple.alias', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Kaydara FBX Binary  \\u0000')) {\n\t\t\treturn {\n\t\t\t\text: 'fbx',\n\t\t\t\tmime: 'application/x.autodesk.fbx', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x4C, 0x50], {offset: 34})\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x00, 0x01], {offset: 8})\n\t\t\t\t|| this.check([0x01, 0x00, 0x02], {offset: 8})\n\t\t\t\t|| this.check([0x02, 0x00, 0x02], {offset: 8})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'eot',\n\t\t\t\tmime: 'application/vnd.ms-fontobject',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D])) {\n\t\t\treturn {\n\t\t\t\text: 'indd',\n\t\t\t\tmime: 'application/x-indesign',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 256 to 512\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Requires a buffer size of 512 bytes\n\t\tif (tarHeaderChecksumMatches(this.buffer)) {\n\t\t\treturn {\n\t\t\t\text: 'tar',\n\t\t\t\tmime: 'application/x-tar',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0xFE])) { // UTF-16-BOM-BE\n\t\t\tif (this.check([60, 0, 63, 0, 120, 0, 109, 0, 108, 0], {offset: 2})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0xFF, 0x0E, 0x53, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x55, 0x00, 0x70, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6C, 0x00], {offset: 2})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'skp',\n\t\t\t\t\tmime: 'application/vnd.sketchup.skp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some text based format\n\t\t}\n\n\t\tif (this.checkString('-----BEGIN PGP MESSAGE-----')) {\n\t\t\treturn {\n\t\t\t\text: 'pgp',\n\t\t\t\tmime: 'application/pgp-encrypted',\n\t\t\t};\n\t\t}\n\n\t\t// Check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE)\n\t\tif (this.buffer.length >= 2 && this.check([0xFF, 0xE0], {offset: 0, mask: [0xFF, 0xE0]})) {\n\t\t\tif (this.check([0x10], {offset: 1, mask: [0x16]})) {\n\t\t\t\t// Check for (ADTS) MPEG-2\n\t\t\t\tif (this.check([0x08], {offset: 1, mask: [0x08]})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'aac',\n\t\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Must be (ADTS) MPEG-4\n\t\t\t\treturn {\n\t\t\t\t\text: 'aac',\n\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG 1 or 2 Layer 3 header\n\t\t\t// Check for MPEG layer 3\n\t\t\tif (this.check([0x02], {offset: 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 2\n\t\t\tif (this.check([0x04], {offset: 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp2',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 1\n\t\t\tif (this.check([0x06], {offset: 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp1',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readTiffTag(bigEndian) {\n\t\tconst tagId = await this.tokenizer.readToken(bigEndian ? lib.UINT16_BE : lib.UINT16_LE);\n\t\tthis.tokenizer.ignore(10);\n\t\tswitch (tagId) {\n\t\t\tcase 50_341:\n\t\t\t\treturn {\n\t\t\t\t\text: 'arw',\n\t\t\t\t\tmime: 'image/x-sony-arw',\n\t\t\t\t};\n\t\t\tcase 50_706:\n\t\t\t\treturn {\n\t\t\t\t\text: 'dng',\n\t\t\t\t\tmime: 'image/x-adobe-dng',\n\t\t\t\t};\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tasync readTiffIFD(bigEndian) {\n\t\tconst numberOfTags = await this.tokenizer.readToken(bigEndian ? lib.UINT16_BE : lib.UINT16_LE);\n\t\tfor (let n = 0; n < numberOfTags; ++n) {\n\t\t\tconst fileType = await this.readTiffTag(bigEndian);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readTiffHeader(bigEndian) {\n\t\tconst version = (bigEndian ? lib.UINT16_BE : lib.UINT16_LE).get(this.buffer, 2);\n\t\tconst ifdOffset = (bigEndian ? lib.UINT32_BE : lib.UINT32_LE).get(this.buffer, 4);\n\n\t\tif (version === 42) {\n\t\t\t// TIFF file header\n\t\t\tif (ifdOffset >= 6) {\n\t\t\t\tif (this.checkString('CR', {offset: 8})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'cr2',\n\t\t\t\t\t\tmime: 'image/x-canon-cr2',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (ifdOffset >= 8 && (this.check([0x1C, 0x00, 0xFE, 0x00], {offset: 8}) || this.check([0x1F, 0x00, 0x0B, 0x00], {offset: 8}))) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'nef',\n\t\t\t\t\t\tmime: 'image/x-nikon-nef',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.tokenizer.ignore(ifdOffset);\n\t\t\tconst fileType = await this.readTiffIFD(bigEndian);\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\n\t\tif (version === 43) {\t// Big TIFF file header\n\t\t\treturn {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\t}\n}\n\nconst supportedExtensions = new Set(extensions);\nconst supportedMimeTypes = new Set(supported_mimeTypes);\n\n// EXTERNAL MODULE: ../../node_modules/content-type/index.js\nvar content_type = __webpack_require__(5388);\n// EXTERNAL MODULE: ../../node_modules/media-typer/index.js\nvar media_typer = __webpack_require__(8137);\n// EXTERNAL MODULE: ../../node_modules/music-metadata/node_modules/debug/src/browser.js\nvar browser = __webpack_require__(7260);\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/matroska/types.js\nvar types = __webpack_require__(5981);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/common/GenericTagTypes.js\nconst defaultTagInfo = {\n    multiple: false,\n};\nconst commonTags = {\n    year: defaultTagInfo,\n    track: defaultTagInfo,\n    disk: defaultTagInfo,\n    title: defaultTagInfo,\n    artist: defaultTagInfo,\n    artists: { multiple: true, unique: true },\n    albumartist: defaultTagInfo,\n    album: defaultTagInfo,\n    date: defaultTagInfo,\n    originaldate: defaultTagInfo,\n    originalyear: defaultTagInfo,\n    releasedate: defaultTagInfo,\n    comment: { multiple: true, unique: false },\n    genre: { multiple: true, unique: true },\n    picture: { multiple: true, unique: true },\n    composer: { multiple: true, unique: true },\n    lyrics: { multiple: true, unique: false },\n    albumsort: { multiple: false, unique: true },\n    titlesort: { multiple: false, unique: true },\n    work: { multiple: false, unique: true },\n    artistsort: { multiple: false, unique: true },\n    albumartistsort: { multiple: false, unique: true },\n    composersort: { multiple: false, unique: true },\n    lyricist: { multiple: true, unique: true },\n    writer: { multiple: true, unique: true },\n    conductor: { multiple: true, unique: true },\n    remixer: { multiple: true, unique: true },\n    arranger: { multiple: true, unique: true },\n    engineer: { multiple: true, unique: true },\n    producer: { multiple: true, unique: true },\n    technician: { multiple: true, unique: true },\n    djmixer: { multiple: true, unique: true },\n    mixer: { multiple: true, unique: true },\n    label: { multiple: true, unique: true },\n    grouping: defaultTagInfo,\n    subtitle: { multiple: true },\n    discsubtitle: defaultTagInfo,\n    totaltracks: defaultTagInfo,\n    totaldiscs: defaultTagInfo,\n    compilation: defaultTagInfo,\n    rating: { multiple: true },\n    bpm: defaultTagInfo,\n    mood: defaultTagInfo,\n    media: defaultTagInfo,\n    catalognumber: { multiple: true, unique: true },\n    tvShow: defaultTagInfo,\n    tvShowSort: defaultTagInfo,\n    tvSeason: defaultTagInfo,\n    tvEpisode: defaultTagInfo,\n    tvEpisodeId: defaultTagInfo,\n    tvNetwork: defaultTagInfo,\n    podcast: defaultTagInfo,\n    podcasturl: defaultTagInfo,\n    releasestatus: defaultTagInfo,\n    releasetype: { multiple: true },\n    releasecountry: defaultTagInfo,\n    script: defaultTagInfo,\n    language: defaultTagInfo,\n    copyright: defaultTagInfo,\n    license: defaultTagInfo,\n    encodedby: defaultTagInfo,\n    encodersettings: defaultTagInfo,\n    gapless: defaultTagInfo,\n    barcode: defaultTagInfo,\n    isrc: { multiple: true },\n    asin: defaultTagInfo,\n    musicbrainz_recordingid: defaultTagInfo,\n    musicbrainz_trackid: defaultTagInfo,\n    musicbrainz_albumid: defaultTagInfo,\n    musicbrainz_artistid: { multiple: true },\n    musicbrainz_albumartistid: { multiple: true },\n    musicbrainz_releasegroupid: defaultTagInfo,\n    musicbrainz_workid: defaultTagInfo,\n    musicbrainz_trmid: defaultTagInfo,\n    musicbrainz_discid: defaultTagInfo,\n    acoustid_id: defaultTagInfo,\n    acoustid_fingerprint: defaultTagInfo,\n    musicip_puid: defaultTagInfo,\n    musicip_fingerprint: defaultTagInfo,\n    website: defaultTagInfo,\n    'performer:instrument': { multiple: true, unique: true },\n    averageLevel: defaultTagInfo,\n    peakLevel: defaultTagInfo,\n    notes: { multiple: true, unique: false },\n    key: defaultTagInfo,\n    originalalbum: defaultTagInfo,\n    originalartist: defaultTagInfo,\n    discogs_artist_id: { multiple: true, unique: true },\n    discogs_release_id: defaultTagInfo,\n    discogs_label_id: defaultTagInfo,\n    discogs_master_release_id: defaultTagInfo,\n    discogs_votes: defaultTagInfo,\n    discogs_rating: defaultTagInfo,\n    replaygain_track_peak: defaultTagInfo,\n    replaygain_track_gain: defaultTagInfo,\n    replaygain_album_peak: defaultTagInfo,\n    replaygain_album_gain: defaultTagInfo,\n    replaygain_track_minmax: defaultTagInfo,\n    replaygain_album_minmax: defaultTagInfo,\n    replaygain_undo: defaultTagInfo,\n    description: { multiple: true },\n    longDescription: defaultTagInfo,\n    category: { multiple: true },\n    hdVideo: defaultTagInfo,\n    keywords: { multiple: true },\n    movement: defaultTagInfo,\n    movementIndex: defaultTagInfo,\n    movementTotal: defaultTagInfo,\n    podcastId: defaultTagInfo,\n    showMovement: defaultTagInfo,\n    stik: defaultTagInfo\n};\nconst commonTagsKeys = /* @__PURE__ */ (/* unused pure expression or super */ null && (Object.keys(commonTags)));\n/**\n * @param alias Name of common tag\n * @returns {boolean|*} true if given alias is mapped as a singleton', otherwise false\n */\nfunction isSingleton(alias) {\n    return commonTags[alias] && !commonTags[alias].multiple;\n}\n/**\n * @param alias Common (generic) tag\n * @returns {boolean|*} true if given alias is a singleton or explicitly marked as unique\n */\nfunction isUnique(alias) {\n    return !commonTags[alias].multiple || commonTags[alias].unique || false;\n}\n//# sourceMappingURL=GenericTagTypes.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/common/GenericTagMapper.js\nclass CommonTagMapper {\n    static toIntOrNull(str) {\n        const cleaned = Number.parseInt(str, 10);\n        return Number.isNaN(cleaned) ? null : cleaned;\n    }\n    // TODO: a string of 1of1 would fail to be converted\n    // converts 1/10 to no : 1, of : 10\n    // or 1 to no : 1, of : 0\n    static normalizeTrack(origVal) {\n        const split = origVal.toString().split('/');\n        return {\n            no: Number.parseInt(split[0], 10) || null,\n            of: Number.parseInt(split[1], 10) || null\n        };\n    }\n    constructor(tagTypes, tagMap) {\n        this.tagTypes = tagTypes;\n        this.tagMap = tagMap;\n    }\n    /**\n     * Process and set common tags\n     * write common tags to\n     * @param tag Native tag\n     * @param warnings Register warnings\n     * @return common name\n     */\n    mapGenericTag(tag, warnings) {\n        tag = { id: tag.id, value: tag.value }; // clone object\n        this.postMap(tag, warnings);\n        // Convert native tag event to generic 'alias' tag\n        const id = this.getCommonName(tag.id);\n        return id ? { id, value: tag.value } : null;\n    }\n    /**\n     * Convert native tag key to common tag key\n     * @param tag Native header tag\n     * @return common tag name (alias)\n     */\n    getCommonName(tag) {\n        return this.tagMap[tag];\n    }\n    /**\n     * Handle post mapping exceptions / correction\n     * @param tag Tag e.g. {\"©alb\", \"Buena Vista Social Club\")\n     * @param warnings Used to register warnings\n     */\n    postMap(tag, warnings) {\n        return;\n    }\n}\nCommonTagMapper.maxRatingScore = 1;\n//# sourceMappingURL=GenericTagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/id3v1/ID3v1TagMap.js\n\n/**\n * ID3v1 tag mappings\n */\nconst id3v1TagMap = {\n    title: 'title',\n    artist: 'artist',\n    album: 'album',\n    year: 'year',\n    comment: 'comment',\n    track: 'track',\n    genre: 'genre'\n};\nclass ID3v1TagMapper extends CommonTagMapper {\n    constructor() {\n        super(['ID3v1'], id3v1TagMap);\n    }\n}\n//# sourceMappingURL=ID3v1TagMap.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/common/CaseInsensitiveTagMap.js\n\nclass CaseInsensitiveTagMap extends CommonTagMapper {\n    constructor(tagTypes, tagMap) {\n        const upperCaseMap = {};\n        for (const tag of Object.keys(tagMap)) {\n            upperCaseMap[tag.toUpperCase()] = tagMap[tag];\n        }\n        super(tagTypes, upperCaseMap);\n    }\n    /**\n     * @tag  Native header tag\n     * @return common tag name (alias)\n     */\n    getCommonName(tag) {\n        return this.tagMap[tag.toUpperCase()];\n    }\n}\n//# sourceMappingURL=CaseInsensitiveTagMap.js.map\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/common/Util.js\nvar Util = __webpack_require__(7764);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/id3v2/ID3v24TagMapper.js\n\n\n\n\n/**\n * ID3v2.3/ID3v2.4 tag mappings\n */\nconst id3v24TagMap = {\n    // id3v2.3\n    TIT2: 'title',\n    TPE1: 'artist',\n    'TXXX:Artists': 'artists',\n    TPE2: 'albumartist',\n    TALB: 'album',\n    TDRV: 'date', // [ 'date', 'year' ] ToDo: improve 'year' mapping\n    /**\n     * Original release year\n     */\n    TORY: 'originalyear',\n    TPOS: 'disk',\n    TCON: 'genre',\n    APIC: 'picture',\n    TCOM: 'composer',\n    USLT: 'lyrics',\n    TSOA: 'albumsort',\n    TSOT: 'titlesort',\n    TOAL: 'originalalbum',\n    TSOP: 'artistsort',\n    TSO2: 'albumartistsort',\n    TSOC: 'composersort',\n    TEXT: 'lyricist',\n    'TXXX:Writer': 'writer',\n    TPE3: 'conductor',\n    // 'IPLS:instrument': 'performer:instrument', // ToDo\n    TPE4: 'remixer',\n    'IPLS:arranger': 'arranger',\n    'IPLS:engineer': 'engineer',\n    'IPLS:producer': 'producer',\n    'IPLS:DJ-mix': 'djmixer',\n    'IPLS:mix': 'mixer',\n    TPUB: 'label',\n    TIT1: 'grouping',\n    TIT3: 'subtitle',\n    TRCK: 'track',\n    TCMP: 'compilation',\n    POPM: 'rating',\n    TBPM: 'bpm',\n    TMED: 'media',\n    'TXXX:CATALOGNUMBER': 'catalognumber',\n    'TXXX:MusicBrainz Album Status': 'releasestatus',\n    'TXXX:MusicBrainz Album Type': 'releasetype',\n    /**\n     * Release country as documented: https://picard.musicbrainz.org/docs/mappings/#cite_note-0\n     */\n    'TXXX:MusicBrainz Album Release Country': 'releasecountry',\n    /**\n     * Release country as implemented // ToDo: report\n     */\n    'TXXX:RELEASECOUNTRY': 'releasecountry',\n    'TXXX:SCRIPT': 'script',\n    TLAN: 'language',\n    TCOP: 'copyright',\n    WCOP: 'license',\n    TENC: 'encodedby',\n    TSSE: 'encodersettings',\n    'TXXX:BARCODE': 'barcode',\n    'TXXX:ISRC': 'isrc',\n    TSRC: 'isrc',\n    'TXXX:ASIN': 'asin',\n    'TXXX:originalyear': 'originalyear',\n    'UFID:http://musicbrainz.org': 'musicbrainz_recordingid',\n    'TXXX:MusicBrainz Release Track Id': 'musicbrainz_trackid',\n    'TXXX:MusicBrainz Album Id': 'musicbrainz_albumid',\n    'TXXX:MusicBrainz Artist Id': 'musicbrainz_artistid',\n    'TXXX:MusicBrainz Album Artist Id': 'musicbrainz_albumartistid',\n    'TXXX:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid',\n    'TXXX:MusicBrainz Work Id': 'musicbrainz_workid',\n    'TXXX:MusicBrainz TRM Id': 'musicbrainz_trmid',\n    'TXXX:MusicBrainz Disc Id': 'musicbrainz_discid',\n    'TXXX:ACOUSTID_ID': 'acoustid_id',\n    'TXXX:Acoustid Id': 'acoustid_id',\n    'TXXX:Acoustid Fingerprint': 'acoustid_fingerprint',\n    'TXXX:MusicIP PUID': 'musicip_puid',\n    'TXXX:MusicMagic Fingerprint': 'musicip_fingerprint',\n    WOAR: 'website',\n    // id3v2.4\n    // ToDo: In same sequence as defined at http://id3.org/id3v2.4.0-frames\n    TDRC: 'date', // date YYYY-MM-DD\n    TYER: 'year',\n    TDOR: 'originaldate',\n    // 'TMCL:instrument': 'performer:instrument',\n    'TIPL:arranger': 'arranger',\n    'TIPL:engineer': 'engineer',\n    'TIPL:producer': 'producer',\n    'TIPL:DJ-mix': 'djmixer',\n    'TIPL:mix': 'mixer',\n    TMOO: 'mood',\n    // additional mappings:\n    SYLT: 'lyrics',\n    TSST: 'discsubtitle',\n    TKEY: 'key',\n    COMM: 'comment',\n    TOPE: 'originalartist',\n    // Windows Media Player\n    'PRIV:AverageLevel': 'averageLevel',\n    'PRIV:PeakLevel': 'peakLevel',\n    // Discogs\n    'TXXX:DISCOGS_ARTIST_ID': 'discogs_artist_id',\n    'TXXX:DISCOGS_ARTISTS': 'artists',\n    'TXXX:DISCOGS_ARTIST_NAME': 'artists',\n    'TXXX:DISCOGS_ALBUM_ARTISTS': 'albumartist',\n    'TXXX:DISCOGS_CATALOG': 'catalognumber',\n    'TXXX:DISCOGS_COUNTRY': 'releasecountry',\n    'TXXX:DISCOGS_DATE': 'originaldate',\n    'TXXX:DISCOGS_LABEL': 'label',\n    'TXXX:DISCOGS_LABEL_ID': 'discogs_label_id',\n    'TXXX:DISCOGS_MASTER_RELEASE_ID': 'discogs_master_release_id',\n    'TXXX:DISCOGS_RATING': 'discogs_rating',\n    'TXXX:DISCOGS_RELEASED': 'date',\n    'TXXX:DISCOGS_RELEASE_ID': 'discogs_release_id',\n    'TXXX:DISCOGS_VOTES': 'discogs_votes',\n    'TXXX:CATALOGID': 'catalognumber',\n    'TXXX:STYLE': 'genre',\n    'TXXX:REPLAYGAIN_TRACK_PEAK': 'replaygain_track_peak',\n    'TXXX:REPLAYGAIN_TRACK_GAIN': 'replaygain_track_gain',\n    'TXXX:REPLAYGAIN_ALBUM_PEAK': 'replaygain_album_peak',\n    'TXXX:REPLAYGAIN_ALBUM_GAIN': 'replaygain_album_gain',\n    'TXXX:MP3GAIN_MINMAX': 'replaygain_track_minmax',\n    'TXXX:MP3GAIN_ALBUM_MINMAX': 'replaygain_album_minmax',\n    'TXXX:MP3GAIN_UNDO': 'replaygain_undo',\n    MVNM: 'movement',\n    MVIN: 'movementIndex',\n    PCST: 'podcast',\n    TCAT: 'category',\n    TDES: 'description',\n    TDRL: 'releasedate',\n    TGID: 'podcastId',\n    TKWD: 'keywords',\n    WFED: 'podcasturl',\n    GRP1: 'grouping'\n};\nclass ID3v24TagMapper extends CaseInsensitiveTagMap {\n    static toRating(popm) {\n        return {\n            source: popm.email,\n            rating: popm.rating > 0 ? (popm.rating - 1) / 254 * CommonTagMapper.maxRatingScore : undefined\n        };\n    }\n    constructor() {\n        super(['ID3v2.3', 'ID3v2.4'], id3v24TagMap);\n    }\n    /**\n     * Handle post mapping exceptions / correction\n     * @param tag to post map\n     * @param warnings Wil be used to register (collect) warnings\n     */\n    postMap(tag, warnings) {\n        switch (tag.id) {\n            case 'UFID':\n                {\n                    // decode MusicBrainz Recording Id\n                    const idTag = tag.value;\n                    if (idTag.owner_identifier === 'http://musicbrainz.org') {\n                        tag.id += `:${idTag.owner_identifier}`;\n                        tag.value = (0,Util/* decodeString */.v5)(idTag.identifier, 'latin1'); // latin1 == iso-8859-1\n                    }\n                }\n                break;\n            case 'PRIV':\n                {\n                    const customTag = tag.value;\n                    switch (customTag.owner_identifier) {\n                        // decode Windows Media Player\n                        case 'AverageLevel':\n                        case 'PeakValue':\n                            tag.id += `:${customTag.owner_identifier}`;\n                            tag.value = customTag.data.length === 4 ? lib.UINT32_LE.get(customTag.data, 0) : null;\n                            if (tag.value === null) {\n                                warnings.addWarning('Failed to parse PRIV:PeakValue');\n                            }\n                            break;\n                        default:\n                            warnings.addWarning(`Unknown PRIV owner-identifier: ${customTag.data}`);\n                    }\n                }\n                break;\n            case 'POPM':\n                tag.value = ID3v24TagMapper.toRating(tag.value);\n                break;\n            default:\n                break;\n        }\n    }\n}\n//# sourceMappingURL=ID3v24TagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/asf/AsfTagMapper.js\n\n/**\n * ASF Metadata tag mappings.\n * See http://msdn.microsoft.com/en-us/library/ms867702.aspx\n */\nconst asfTagMap = {\n    Title: 'title',\n    Author: 'artist',\n    'WM/AlbumArtist': 'albumartist',\n    'WM/AlbumTitle': 'album',\n    'WM/Year': 'date', // changed to 'year' to 'date' based on Picard mappings; ToDo: check me\n    'WM/OriginalReleaseTime': 'originaldate',\n    'WM/OriginalReleaseYear': 'originalyear',\n    Description: 'comment',\n    'WM/TrackNumber': 'track',\n    'WM/PartOfSet': 'disk',\n    'WM/Genre': 'genre',\n    'WM/Composer': 'composer',\n    'WM/Lyrics': 'lyrics',\n    'WM/AlbumSortOrder': 'albumsort',\n    'WM/TitleSortOrder': 'titlesort',\n    'WM/ArtistSortOrder': 'artistsort',\n    'WM/AlbumArtistSortOrder': 'albumartistsort',\n    'WM/ComposerSortOrder': 'composersort',\n    'WM/Writer': 'lyricist',\n    'WM/Conductor': 'conductor',\n    'WM/ModifiedBy': 'remixer',\n    'WM/Engineer': 'engineer',\n    'WM/Producer': 'producer',\n    'WM/DJMixer': 'djmixer',\n    'WM/Mixer': 'mixer',\n    'WM/Publisher': 'label',\n    'WM/ContentGroupDescription': 'grouping',\n    'WM/SubTitle': 'subtitle',\n    'WM/SetSubTitle': 'discsubtitle',\n    // 'WM/PartOfSet': 'totaldiscs',\n    'WM/IsCompilation': 'compilation',\n    'WM/SharedUserRating': 'rating',\n    'WM/BeatsPerMinute': 'bpm',\n    'WM/Mood': 'mood',\n    'WM/Media': 'media',\n    'WM/CatalogNo': 'catalognumber',\n    'MusicBrainz/Album Status': 'releasestatus',\n    'MusicBrainz/Album Type': 'releasetype',\n    'MusicBrainz/Album Release Country': 'releasecountry',\n    'WM/Script': 'script',\n    'WM/Language': 'language',\n    Copyright: 'copyright',\n    LICENSE: 'license',\n    'WM/EncodedBy': 'encodedby',\n    'WM/EncodingSettings': 'encodersettings',\n    'WM/Barcode': 'barcode',\n    'WM/ISRC': 'isrc',\n    'MusicBrainz/Track Id': 'musicbrainz_recordingid',\n    'MusicBrainz/Release Track Id': 'musicbrainz_trackid',\n    'MusicBrainz/Album Id': 'musicbrainz_albumid',\n    'MusicBrainz/Artist Id': 'musicbrainz_artistid',\n    'MusicBrainz/Album Artist Id': 'musicbrainz_albumartistid',\n    'MusicBrainz/Release Group Id': 'musicbrainz_releasegroupid',\n    'MusicBrainz/Work Id': 'musicbrainz_workid',\n    'MusicBrainz/TRM Id': 'musicbrainz_trmid',\n    'MusicBrainz/Disc Id': 'musicbrainz_discid',\n    'Acoustid/Id': 'acoustid_id',\n    'Acoustid/Fingerprint': 'acoustid_fingerprint',\n    'MusicIP/PUID': 'musicip_puid',\n    'WM/ARTISTS': 'artists',\n    'WM/InitialKey': 'key',\n    ASIN: 'asin',\n    'WM/Work': 'work',\n    'WM/AuthorURL': 'website',\n    'WM/Picture': 'picture'\n};\nclass AsfTagMapper extends CommonTagMapper {\n    static toRating(rating) {\n        return {\n            rating: Number.parseFloat(rating + 1) / 5\n        };\n    }\n    constructor() {\n        super(['asf'], asfTagMap);\n    }\n    postMap(tag) {\n        switch (tag.id) {\n            case 'WM/SharedUserRating': {\n                const keys = tag.id.split(':');\n                tag.value = AsfTagMapper.toRating(tag.value);\n                tag.id = keys[0];\n                break;\n            }\n        }\n    }\n}\n//# sourceMappingURL=AsfTagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/id3v2/ID3v22TagMapper.js\n\n/**\n * ID3v2.2 tag mappings\n */\nconst id3v22TagMap = {\n    TT2: 'title',\n    TP1: 'artist',\n    TP2: 'albumartist',\n    TAL: 'album',\n    TYE: 'year',\n    COM: 'comment',\n    TRK: 'track',\n    TPA: 'disk',\n    TCO: 'genre',\n    PIC: 'picture',\n    TCM: 'composer',\n    TOR: 'originaldate',\n    TOT: 'originalalbum',\n    TXT: 'lyricist',\n    TP3: 'conductor',\n    TPB: 'label',\n    TT1: 'grouping',\n    TT3: 'subtitle',\n    TLA: 'language',\n    TCR: 'copyright',\n    WCP: 'license',\n    TEN: 'encodedby',\n    TSS: 'encodersettings',\n    WAR: 'website',\n    PCS: 'podcast',\n    TCP: \"compilation\",\n    TDR: 'date',\n    TS2: 'albumartistsort',\n    TSA: 'albumsort',\n    TSC: 'composersort',\n    TSP: 'artistsort',\n    TST: 'titlesort',\n    WFD: 'podcasturl',\n    TBP: 'bpm'\n};\nclass ID3v22TagMapper extends CaseInsensitiveTagMap {\n    constructor() {\n        super(['ID3v2.2'], id3v22TagMap);\n    }\n}\n//# sourceMappingURL=ID3v22TagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/apev2/APEv2TagMapper.js\n\n/**\n * ID3v2.2 tag mappings\n */\nconst apev2TagMap = {\n    Title: 'title',\n    Artist: 'artist',\n    Artists: 'artists',\n    'Album Artist': 'albumartist',\n    Album: 'album',\n    Year: 'date',\n    Originalyear: 'originalyear',\n    Originaldate: 'originaldate',\n    Releasedate: 'releasedate',\n    Comment: 'comment',\n    Track: 'track',\n    Disc: 'disk',\n    DISCNUMBER: 'disk', // ToDo: backwards compatibility', valid tag?\n    Genre: 'genre',\n    'Cover Art (Front)': 'picture',\n    'Cover Art (Back)': 'picture',\n    Composer: 'composer',\n    Lyrics: 'lyrics',\n    ALBUMSORT: 'albumsort',\n    TITLESORT: 'titlesort',\n    WORK: 'work',\n    ARTISTSORT: 'artistsort',\n    ALBUMARTISTSORT: 'albumartistsort',\n    COMPOSERSORT: 'composersort',\n    Lyricist: 'lyricist',\n    Writer: 'writer',\n    Conductor: 'conductor',\n    // 'Performer=artist (instrument)': 'performer:instrument',\n    MixArtist: 'remixer',\n    Arranger: 'arranger',\n    Engineer: 'engineer',\n    Producer: 'producer',\n    DJMixer: 'djmixer',\n    Mixer: 'mixer',\n    Label: 'label',\n    Grouping: 'grouping',\n    Subtitle: 'subtitle',\n    DiscSubtitle: 'discsubtitle',\n    Compilation: 'compilation',\n    BPM: 'bpm',\n    Mood: 'mood',\n    Media: 'media',\n    CatalogNumber: 'catalognumber',\n    MUSICBRAINZ_ALBUMSTATUS: 'releasestatus',\n    MUSICBRAINZ_ALBUMTYPE: 'releasetype',\n    RELEASECOUNTRY: 'releasecountry',\n    Script: 'script',\n    Language: 'language',\n    Copyright: 'copyright',\n    LICENSE: 'license',\n    EncodedBy: 'encodedby',\n    EncoderSettings: 'encodersettings',\n    Barcode: 'barcode',\n    ISRC: 'isrc',\n    ASIN: 'asin',\n    musicbrainz_trackid: 'musicbrainz_recordingid',\n    musicbrainz_releasetrackid: 'musicbrainz_trackid',\n    MUSICBRAINZ_ALBUMID: 'musicbrainz_albumid',\n    MUSICBRAINZ_ARTISTID: 'musicbrainz_artistid',\n    MUSICBRAINZ_ALBUMARTISTID: 'musicbrainz_albumartistid',\n    MUSICBRAINZ_RELEASEGROUPID: 'musicbrainz_releasegroupid',\n    MUSICBRAINZ_WORKID: 'musicbrainz_workid',\n    MUSICBRAINZ_TRMID: 'musicbrainz_trmid',\n    MUSICBRAINZ_DISCID: 'musicbrainz_discid',\n    Acoustid_Id: 'acoustid_id',\n    ACOUSTID_FINGERPRINT: 'acoustid_fingerprint',\n    MUSICIP_PUID: 'musicip_puid',\n    Weblink: 'website',\n    REPLAYGAIN_TRACK_GAIN: 'replaygain_track_gain',\n    REPLAYGAIN_TRACK_PEAK: 'replaygain_track_peak',\n    MP3GAIN_MINMAX: 'replaygain_track_minmax',\n    MP3GAIN_UNDO: 'replaygain_undo'\n};\nclass APEv2TagMapper extends CaseInsensitiveTagMap {\n    constructor() {\n        super(['APEv2'], apev2TagMap);\n    }\n}\n//# sourceMappingURL=APEv2TagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/mp4/MP4TagMapper.js\n\n/**\n * Ref: https://github.com/sergiomb2/libmp4v2/wiki/iTunesMetadata\n */\nconst mp4TagMap = {\n    '©nam': 'title',\n    '©ART': 'artist',\n    aART: 'albumartist',\n    /**\n     * ToDo: Album artist seems to be stored here while Picard documentation says: aART\n     */\n    '----:com.apple.iTunes:Band': 'albumartist',\n    '©alb': 'album',\n    '©day': 'date',\n    '©cmt': 'comment',\n    '©com': 'comment',\n    trkn: 'track',\n    disk: 'disk',\n    '©gen': 'genre',\n    covr: 'picture',\n    '©wrt': 'composer',\n    '©lyr': 'lyrics',\n    soal: 'albumsort',\n    sonm: 'titlesort',\n    soar: 'artistsort',\n    soaa: 'albumartistsort',\n    soco: 'composersort',\n    '----:com.apple.iTunes:LYRICIST': 'lyricist',\n    '----:com.apple.iTunes:CONDUCTOR': 'conductor',\n    '----:com.apple.iTunes:REMIXER': 'remixer',\n    '----:com.apple.iTunes:ENGINEER': 'engineer',\n    '----:com.apple.iTunes:PRODUCER': 'producer',\n    '----:com.apple.iTunes:DJMIXER': 'djmixer',\n    '----:com.apple.iTunes:MIXER': 'mixer',\n    '----:com.apple.iTunes:LABEL': 'label',\n    '©grp': 'grouping',\n    '----:com.apple.iTunes:SUBTITLE': 'subtitle',\n    '----:com.apple.iTunes:DISCSUBTITLE': 'discsubtitle',\n    cpil: 'compilation',\n    tmpo: 'bpm',\n    '----:com.apple.iTunes:MOOD': 'mood',\n    '----:com.apple.iTunes:MEDIA': 'media',\n    '----:com.apple.iTunes:CATALOGNUMBER': 'catalognumber',\n    tvsh: 'tvShow',\n    tvsn: 'tvSeason',\n    tves: 'tvEpisode',\n    sosn: 'tvShowSort',\n    tven: 'tvEpisodeId',\n    tvnn: 'tvNetwork',\n    pcst: 'podcast',\n    purl: 'podcasturl',\n    '----:com.apple.iTunes:MusicBrainz Album Status': 'releasestatus',\n    '----:com.apple.iTunes:MusicBrainz Album Type': 'releasetype',\n    '----:com.apple.iTunes:MusicBrainz Album Release Country': 'releasecountry',\n    '----:com.apple.iTunes:SCRIPT': 'script',\n    '----:com.apple.iTunes:LANGUAGE': 'language',\n    cprt: 'copyright',\n    '©cpy': 'copyright',\n    '----:com.apple.iTunes:LICENSE': 'license',\n    '©too': 'encodedby',\n    pgap: 'gapless',\n    '----:com.apple.iTunes:BARCODE': 'barcode',\n    '----:com.apple.iTunes:ISRC': 'isrc',\n    '----:com.apple.iTunes:ASIN': 'asin',\n    '----:com.apple.iTunes:NOTES': 'comment',\n    '----:com.apple.iTunes:MusicBrainz Track Id': 'musicbrainz_recordingid',\n    '----:com.apple.iTunes:MusicBrainz Release Track Id': 'musicbrainz_trackid',\n    '----:com.apple.iTunes:MusicBrainz Album Id': 'musicbrainz_albumid',\n    '----:com.apple.iTunes:MusicBrainz Artist Id': 'musicbrainz_artistid',\n    '----:com.apple.iTunes:MusicBrainz Album Artist Id': 'musicbrainz_albumartistid',\n    '----:com.apple.iTunes:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid',\n    '----:com.apple.iTunes:MusicBrainz Work Id': 'musicbrainz_workid',\n    '----:com.apple.iTunes:MusicBrainz TRM Id': 'musicbrainz_trmid',\n    '----:com.apple.iTunes:MusicBrainz Disc Id': 'musicbrainz_discid',\n    '----:com.apple.iTunes:Acoustid Id': 'acoustid_id',\n    '----:com.apple.iTunes:Acoustid Fingerprint': 'acoustid_fingerprint',\n    '----:com.apple.iTunes:MusicIP PUID': 'musicip_puid',\n    '----:com.apple.iTunes:fingerprint': 'musicip_fingerprint',\n    '----:com.apple.iTunes:replaygain_track_gain': 'replaygain_track_gain',\n    '----:com.apple.iTunes:replaygain_track_peak': 'replaygain_track_peak',\n    '----:com.apple.iTunes:replaygain_album_gain': 'replaygain_album_gain',\n    '----:com.apple.iTunes:replaygain_album_peak': 'replaygain_album_peak',\n    '----:com.apple.iTunes:replaygain_track_minmax': 'replaygain_track_minmax',\n    '----:com.apple.iTunes:replaygain_album_minmax': 'replaygain_album_minmax',\n    '----:com.apple.iTunes:replaygain_undo': 'replaygain_undo',\n    // Additional mappings:\n    gnre: 'genre', // ToDo: check mapping\n    '----:com.apple.iTunes:ALBUMARTISTSORT': 'albumartistsort',\n    '----:com.apple.iTunes:ARTISTS': 'artists',\n    '----:com.apple.iTunes:ORIGINALDATE': 'originaldate',\n    '----:com.apple.iTunes:ORIGINALYEAR': 'originalyear',\n    '----:com.apple.iTunes:RELEASEDATE': 'releasedate',\n    // '----:com.apple.iTunes:PERFORMER': 'performer'\n    desc: 'description',\n    ldes: 'longDescription',\n    '©mvn': 'movement',\n    '©mvi': 'movementIndex',\n    '©mvc': 'movementTotal',\n    '©wrk': 'work',\n    catg: 'category',\n    egid: 'podcastId',\n    hdvd: 'hdVideo',\n    keyw: 'keywords',\n    shwm: 'showMovement',\n    stik: 'stik',\n    rate: 'rating'\n};\nconst tagType = 'iTunes';\nclass MP4TagMapper extends CaseInsensitiveTagMap {\n    constructor() {\n        super([tagType], mp4TagMap);\n    }\n    postMap(tag, warnings) {\n        switch (tag.id) {\n            case 'rate':\n                tag.value = {\n                    source: undefined,\n                    rating: Number.parseFloat(tag.value) / 100\n                };\n                break;\n        }\n    }\n}\n//# sourceMappingURL=MP4TagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/ogg/vorbis/VorbisTagMapper.js\n\n/**\n * Vorbis tag mappings\n *\n * Mapping from native header format to one or possibly more 'common' entries\n * The common entries aim to read the same information from different media files\n * independent of the underlying format\n */\nconst vorbisTagMap = {\n    TITLE: 'title',\n    ARTIST: 'artist',\n    ARTISTS: 'artists',\n    ALBUMARTIST: 'albumartist',\n    'ALBUM ARTIST': 'albumartist',\n    ALBUM: 'album',\n    DATE: 'date',\n    ORIGINALDATE: 'originaldate',\n    ORIGINALYEAR: 'originalyear',\n    RELEASEDATE: 'releasedate',\n    COMMENT: 'comment',\n    TRACKNUMBER: 'track',\n    DISCNUMBER: 'disk',\n    GENRE: 'genre',\n    METADATA_BLOCK_PICTURE: 'picture',\n    COMPOSER: 'composer',\n    LYRICS: 'lyrics',\n    ALBUMSORT: 'albumsort',\n    TITLESORT: 'titlesort',\n    WORK: 'work',\n    ARTISTSORT: 'artistsort',\n    ALBUMARTISTSORT: 'albumartistsort',\n    COMPOSERSORT: 'composersort',\n    LYRICIST: 'lyricist',\n    WRITER: 'writer',\n    CONDUCTOR: 'conductor',\n    // 'PERFORMER=artist (instrument)': 'performer:instrument', // ToDo\n    REMIXER: 'remixer',\n    ARRANGER: 'arranger',\n    ENGINEER: 'engineer',\n    PRODUCER: 'producer',\n    DJMIXER: 'djmixer',\n    MIXER: 'mixer',\n    LABEL: 'label',\n    GROUPING: 'grouping',\n    SUBTITLE: 'subtitle',\n    DISCSUBTITLE: 'discsubtitle',\n    TRACKTOTAL: 'totaltracks',\n    DISCTOTAL: 'totaldiscs',\n    COMPILATION: 'compilation',\n    RATING: 'rating',\n    BPM: 'bpm',\n    KEY: 'key',\n    MOOD: 'mood',\n    MEDIA: 'media',\n    CATALOGNUMBER: 'catalognumber',\n    RELEASESTATUS: 'releasestatus',\n    RELEASETYPE: 'releasetype',\n    RELEASECOUNTRY: 'releasecountry',\n    SCRIPT: 'script',\n    LANGUAGE: 'language',\n    COPYRIGHT: 'copyright',\n    LICENSE: 'license',\n    ENCODEDBY: 'encodedby',\n    ENCODERSETTINGS: 'encodersettings',\n    BARCODE: 'barcode',\n    ISRC: 'isrc',\n    ASIN: 'asin',\n    MUSICBRAINZ_TRACKID: 'musicbrainz_recordingid',\n    MUSICBRAINZ_RELEASETRACKID: 'musicbrainz_trackid',\n    MUSICBRAINZ_ALBUMID: 'musicbrainz_albumid',\n    MUSICBRAINZ_ARTISTID: 'musicbrainz_artistid',\n    MUSICBRAINZ_ALBUMARTISTID: 'musicbrainz_albumartistid',\n    MUSICBRAINZ_RELEASEGROUPID: 'musicbrainz_releasegroupid',\n    MUSICBRAINZ_WORKID: 'musicbrainz_workid',\n    MUSICBRAINZ_TRMID: 'musicbrainz_trmid',\n    MUSICBRAINZ_DISCID: 'musicbrainz_discid',\n    ACOUSTID_ID: 'acoustid_id',\n    ACOUSTID_ID_FINGERPRINT: 'acoustid_fingerprint',\n    MUSICIP_PUID: 'musicip_puid',\n    // 'FINGERPRINT=MusicMagic Fingerprint {fingerprint}': 'musicip_fingerprint', // ToDo\n    WEBSITE: 'website',\n    NOTES: 'notes',\n    TOTALTRACKS: 'totaltracks',\n    TOTALDISCS: 'totaldiscs',\n    // Discogs\n    DISCOGS_ARTIST_ID: 'discogs_artist_id',\n    DISCOGS_ARTISTS: 'artists',\n    DISCOGS_ARTIST_NAME: 'artists',\n    DISCOGS_ALBUM_ARTISTS: 'albumartist',\n    DISCOGS_CATALOG: 'catalognumber',\n    DISCOGS_COUNTRY: 'releasecountry',\n    DISCOGS_DATE: 'originaldate',\n    DISCOGS_LABEL: 'label',\n    DISCOGS_LABEL_ID: 'discogs_label_id',\n    DISCOGS_MASTER_RELEASE_ID: 'discogs_master_release_id',\n    DISCOGS_RATING: 'discogs_rating',\n    DISCOGS_RELEASED: 'date',\n    DISCOGS_RELEASE_ID: 'discogs_release_id',\n    DISCOGS_VOTES: 'discogs_votes',\n    CATALOGID: 'catalognumber',\n    STYLE: 'genre',\n    //\n    REPLAYGAIN_TRACK_GAIN: 'replaygain_track_gain',\n    REPLAYGAIN_TRACK_PEAK: 'replaygain_track_peak',\n    REPLAYGAIN_ALBUM_GAIN: 'replaygain_album_gain',\n    REPLAYGAIN_ALBUM_PEAK: 'replaygain_album_peak',\n    // To Sure if these (REPLAYGAIN_MINMAX, REPLAYGAIN_ALBUM_MINMAX & REPLAYGAIN_UNDO) are used for Vorbis:\n    REPLAYGAIN_MINMAX: 'replaygain_track_minmax',\n    REPLAYGAIN_ALBUM_MINMAX: 'replaygain_album_minmax',\n    REPLAYGAIN_UNDO: 'replaygain_undo'\n};\nclass VorbisTagMapper extends CommonTagMapper {\n    static toRating(email, rating, maxScore) {\n        return {\n            source: email ? email.toLowerCase() : undefined,\n            rating: (Number.parseFloat(rating) / maxScore) * CommonTagMapper.maxRatingScore\n        };\n    }\n    constructor() {\n        super(['vorbis'], vorbisTagMap);\n    }\n    postMap(tag) {\n        if (tag.id === 'RATING') {\n            // The way Winamp 5.666 assigns rating\n            tag.value = VorbisTagMapper.toRating(undefined, tag.value, 100);\n        }\n        else if (tag.id.indexOf('RATING:') === 0) {\n            const keys = tag.id.split(':');\n            tag.value = VorbisTagMapper.toRating(keys[1], tag.value, 1);\n            tag.id = keys[0];\n        }\n    }\n}\n//# sourceMappingURL=VorbisTagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/riff/RiffInfoTagMap.js\n\n/**\n * RIFF Info Tags; part of the EXIF 2.3\n * Ref: http://owl.phy.queensu.ca/~phil/exiftool/TagNames/RIFF.html#Info\n */\nconst riffInfoTagMap = {\n    IART: 'artist', // Artist\n    ICRD: 'date', // DateCreated\n    INAM: 'title', // Title\n    TITL: 'title',\n    IPRD: 'album', // Product\n    ITRK: 'track',\n    IPRT: 'track', // Additional tag for track index\n    COMM: 'comment', // Comments\n    ICMT: 'comment', // Country\n    ICNT: 'releasecountry',\n    GNRE: 'genre', // Genre\n    IWRI: 'writer', // WrittenBy\n    RATE: 'rating',\n    YEAR: 'year',\n    ISFT: 'encodedby', // Software\n    CODE: 'encodedby', // EncodedBy\n    TURL: 'website', // URL,\n    IGNR: 'genre', // Genre\n    IENG: 'engineer', // Engineer\n    ITCH: 'technician', // Technician\n    IMED: 'media', // Original Media\n    IRPD: 'album' // Product, where the file was intended for\n};\nclass RiffInfoTagMapper extends CommonTagMapper {\n    constructor() {\n        super(['exif'], riffInfoTagMap);\n    }\n}\n//# sourceMappingURL=RiffInfoTagMap.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/matroska/MatroskaTagMapper.js\n\n/**\n * EBML Tag map\n */\nconst ebmlTagMap = {\n    'segment:title': 'title',\n    'album:ARTIST': 'albumartist',\n    'album:ARTISTSORT': 'albumartistsort',\n    'album:TITLE': 'album',\n    'album:DATE_RECORDED': 'originaldate',\n    'album:DATE_RELEASED': 'releasedate',\n    'album:PART_NUMBER': 'disk',\n    'album:TOTAL_PARTS': 'totaltracks',\n    'track:ARTIST': 'artist',\n    'track:ARTISTSORT': 'artistsort',\n    'track:TITLE': 'title',\n    'track:PART_NUMBER': 'track',\n    'track:MUSICBRAINZ_TRACKID': 'musicbrainz_recordingid',\n    'track:MUSICBRAINZ_ALBUMID': 'musicbrainz_albumid',\n    'track:MUSICBRAINZ_ARTISTID': 'musicbrainz_artistid',\n    'track:PUBLISHER': 'label',\n    'track:GENRE': 'genre',\n    'track:ENCODER': 'encodedby',\n    'track:ENCODER_OPTIONS': 'encodersettings',\n    'edition:TOTAL_PARTS': 'totaldiscs',\n    picture: 'picture'\n};\nclass MatroskaTagMapper extends CaseInsensitiveTagMap {\n    constructor() {\n        super(['matroska'], ebmlTagMap);\n    }\n}\n//# sourceMappingURL=MatroskaTagMapper.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/aiff/AiffTagMap.js\n\n/**\n * ID3v1 tag mappings\n */\nconst tagMap = {\n    NAME: 'title',\n    AUTH: 'artist',\n    '(c) ': 'copyright',\n    ANNO: 'comment'\n};\nclass AiffTagMapper extends CommonTagMapper {\n    constructor() {\n        super(['AIFF'], tagMap);\n    }\n}\n//# sourceMappingURL=AiffTagMap.js.map\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/ParseError.js\nvar ParseError = __webpack_require__(1150);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/common/CombinedTagMapper.js\n\n\n\n\n\n\n\n\n\n\n\nclass CombinedTagMapper {\n    constructor() {\n        this.tagMappers = {};\n        [\n            new ID3v1TagMapper(),\n            new ID3v22TagMapper(),\n            new ID3v24TagMapper(),\n            new MP4TagMapper(),\n            new MP4TagMapper(),\n            new VorbisTagMapper(),\n            new APEv2TagMapper(),\n            new AsfTagMapper(),\n            new RiffInfoTagMapper(),\n            new MatroskaTagMapper(),\n            new AiffTagMapper()\n        ].forEach(mapper => {\n            this.registerTagMapper(mapper);\n        });\n    }\n    /**\n     * Convert native to generic (common) tags\n     * @param tagType Originating tag format\n     * @param tag     Native tag to map to a generic tag id\n     * @param warnings\n     * @return Generic tag result (output of this function)\n     */\n    mapTag(tagType, tag, warnings) {\n        const tagMapper = this.tagMappers[tagType];\n        if (tagMapper) {\n            return this.tagMappers[tagType].mapGenericTag(tag, warnings);\n        }\n        throw new ParseError/* InternalParserError */.Cb(`No generic tag mapper defined for tag-format: ${tagType}`);\n    }\n    registerTagMapper(genericTagMapper) {\n        for (const tagType of genericTagMapper.tagTypes) {\n            this.tagMappers[tagType] = genericTagMapper;\n        }\n    }\n}\n//# sourceMappingURL=CombinedTagMapper.js.map\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/id3v2/ID3v2Token.js\nvar ID3v2Token = __webpack_require__(1151);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/lrc/LyricsParser.js\n\n/**\n * Parse LRC (Lyrics) formatted text\n * Ref: https://en.wikipedia.org/wiki/LRC_(file_format)\n * @param lrcString\n */\nfunction parseLrc(lrcString) {\n    const lines = lrcString.split('\\n');\n    const syncText = [];\n    // Regular expression to match LRC timestamps (e.g., [00:45.52])\n    const timestampRegex = /\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\]/;\n    for (const line of lines) {\n        const match = line.match(timestampRegex);\n        if (match) {\n            const minutes = Number.parseInt(match[1], 10);\n            const seconds = Number.parseInt(match[2], 10);\n            const hundredths = Number.parseInt(match[3], 10);\n            // Convert the timestamp to milliseconds, as per TimestampFormat.milliseconds\n            const timestamp = (minutes * 60 + seconds) * 1000 + hundredths * 10;\n            // Get the text portion of the line (e.g., \"あの蝶は自由になれたかな\")\n            const text = line.replace(timestampRegex, '').trim();\n            syncText.push({ timestamp, text });\n        }\n    }\n    // Creating the ILyricsTag object\n    return {\n        contentType: ID3v2Token/* LyricsContentType.lyrics */.Q6.lyrics,\n        timeStampFormat: ID3v2Token/* TimestampFormat.milliseconds */.B_.milliseconds,\n        syncText,\n    };\n}\n//# sourceMappingURL=LyricsParser.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/common/MetadataCollector.js\n\n\n\n\n\n\n\n\nconst debug = browser('music-metadata:collector');\nconst TagPriority = ['matroska', 'APEv2', 'vorbis', 'ID3v2.4', 'ID3v2.3', 'ID3v2.2', 'exif', 'asf', 'iTunes', 'AIFF', 'ID3v1'];\n/**\n * Provided to the parser to uodate the metadata result.\n * Responsible for triggering async updates\n */\nclass MetadataCollector {\n    constructor(opts) {\n        this.format = {\n            tagTypes: [],\n            trackInfo: []\n        };\n        this.native = {};\n        this.common = {\n            track: { no: null, of: null },\n            disk: { no: null, of: null },\n            movementIndex: { no: null, of: null }\n        };\n        this.quality = {\n            warnings: []\n        };\n        /**\n         * Keeps track of origin priority for each mapped id\n         */\n        this.commonOrigin = {};\n        /**\n         * Maps a tag type to a priority\n         */\n        this.originPriority = {};\n        this.tagMapper = new CombinedTagMapper();\n        this.opts = opts;\n        let priority = 1;\n        for (const tagType of TagPriority) {\n            this.originPriority[tagType] = priority++;\n        }\n        this.originPriority.artificial = 500; // Filled using alternative tags\n        this.originPriority.id3v1 = 600; // Consider as the worst because of the field length limit\n    }\n    /**\n     * @returns {boolean} true if one or more tags have been found\n     */\n    hasAny() {\n        return Object.keys(this.native).length > 0;\n    }\n    addStreamInfo(streamInfo) {\n        debug(`streamInfo: type=${streamInfo.type ? types/* TrackTypeValueToKeyMap */.OY[streamInfo.type] : '?'}, codec=${streamInfo.codecName}`);\n        this.format.trackInfo.push(streamInfo);\n    }\n    setFormat(key, value) {\n        debug(`format: ${key} = ${value}`);\n        this.format[key] = value; // as any to override readonly\n        if (this.opts?.observer) {\n            this.opts.observer({ metadata: this, tag: { type: 'format', id: key, value } });\n        }\n    }\n    async addTag(tagType, tagId, value) {\n        debug(`tag ${tagType}.${tagId} = ${value}`);\n        if (!this.native[tagType]) {\n            this.format.tagTypes.push(tagType);\n            this.native[tagType] = [];\n        }\n        this.native[tagType].push({ id: tagId, value });\n        await this.toCommon(tagType, tagId, value);\n    }\n    addWarning(warning) {\n        this.quality.warnings.push({ message: warning });\n    }\n    async postMap(tagType, tag) {\n        // Common tag (alias) found\n        // check if we need to do something special with common tag\n        // if the event has been aliased then we need to clean it before\n        // it is emitted to the user. e.g. genre (20) -> Electronic\n        switch (tag.id) {\n            case 'artist':\n                if (this.commonOrigin.artist === this.originPriority[tagType]) {\n                    // Assume the artist field is used as artists\n                    return this.postMap('artificial', { id: 'artists', value: tag.value });\n                }\n                if (!this.common.artists) {\n                    // Fill artists using artist source\n                    this.setGenericTag('artificial', { id: 'artists', value: tag.value });\n                }\n                break;\n            case 'artists':\n                if (!this.common.artist || this.commonOrigin.artist === this.originPriority.artificial) {\n                    if (!this.common.artists || this.common.artists.indexOf(tag.value) === -1) {\n                        // Fill artist using artists source\n                        const artists = (this.common.artists || []).concat([tag.value]);\n                        const value = joinArtists(artists);\n                        const artistTag = { id: 'artist', value };\n                        this.setGenericTag('artificial', artistTag);\n                    }\n                }\n                break;\n            case 'picture':\n                return this.postFixPicture(tag.value).then(picture => {\n                    if (picture !== null) {\n                        tag.value = picture;\n                        this.setGenericTag(tagType, tag);\n                    }\n                });\n            case 'totaltracks':\n                this.common.track.of = CommonTagMapper.toIntOrNull(tag.value);\n                return;\n            case 'totaldiscs':\n                this.common.disk.of = CommonTagMapper.toIntOrNull(tag.value);\n                return;\n            case 'movementTotal':\n                this.common.movementIndex.of = CommonTagMapper.toIntOrNull(tag.value);\n                return;\n            case 'track':\n            case 'disk':\n            case 'movementIndex': {\n                const of = this.common[tag.id].of; // store of value, maybe maybe overwritten\n                this.common[tag.id] = CommonTagMapper.normalizeTrack(tag.value);\n                this.common[tag.id].of = of != null ? of : this.common[tag.id].of;\n                return;\n            }\n            case 'bpm':\n            case 'year':\n            case 'originalyear':\n                tag.value = Number.parseInt(tag.value, 10);\n                break;\n            case 'date': {\n                // ToDo: be more strict on 'YYYY...'\n                const year = Number.parseInt(tag.value.substr(0, 4), 10);\n                if (!Number.isNaN(year)) {\n                    this.common.year = year;\n                }\n                break;\n            }\n            case 'discogs_label_id':\n            case 'discogs_release_id':\n            case 'discogs_master_release_id':\n            case 'discogs_artist_id':\n            case 'discogs_votes':\n                tag.value = typeof tag.value === 'string' ? Number.parseInt(tag.value, 10) : tag.value;\n                break;\n            case 'replaygain_track_gain':\n            case 'replaygain_track_peak':\n            case 'replaygain_album_gain':\n            case 'replaygain_album_peak':\n                tag.value = (0,Util/* toRatio */.ej)(tag.value);\n                break;\n            case 'replaygain_track_minmax':\n                tag.value = tag.value.split(',').map(v => Number.parseInt(v, 10));\n                break;\n            case 'replaygain_undo': {\n                const minMix = tag.value.split(',').map(v => Number.parseInt(v, 10));\n                tag.value = {\n                    leftChannel: minMix[0],\n                    rightChannel: minMix[1]\n                };\n                break;\n            }\n            case 'gapless': // iTunes gap-less flag\n            case 'compilation':\n            case 'podcast':\n            case 'showMovement':\n                tag.value = tag.value === '1' || tag.value === 1; // boolean\n                break;\n            case 'isrc': { // Only keep unique values\n                const commonTag = this.common[tag.id];\n                if (commonTag && commonTag.indexOf(tag.value) !== -1)\n                    return;\n                break;\n            }\n            case 'comment':\n                if (typeof tag.value === 'string') {\n                    tag.value = { text: tag.value };\n                }\n                if (tag.value.descriptor === 'iTunPGAP') {\n                    this.setGenericTag(tagType, { id: 'gapless', value: tag.value.text === '1' });\n                }\n                break;\n            case 'lyrics':\n                if (typeof tag.value === 'string') {\n                    tag.value = parseLrc(tag.value);\n                }\n                break;\n            default:\n            // nothing to do\n        }\n        if (tag.value !== null) {\n            this.setGenericTag(tagType, tag);\n        }\n    }\n    /**\n     * Convert native tags to common tags\n     * @returns {IAudioMetadata} Native + common tags\n     */\n    toCommonMetadata() {\n        return {\n            format: this.format,\n            native: this.native,\n            quality: this.quality,\n            common: this.common\n        };\n    }\n    /**\n     * Fix some common issues with picture object\n     * @param picture Picture\n     */\n    async postFixPicture(picture) {\n        if (picture.data && picture.data.length > 0) {\n            if (!picture.format) {\n                const fileType = await fileTypeFromBuffer(Uint8Array.from(picture.data)); // ToDO: remove Buffer\n                if (fileType) {\n                    picture.format = fileType.mime;\n                }\n                else {\n                    return null;\n                }\n            }\n            picture.format = picture.format.toLocaleLowerCase();\n            switch (picture.format) {\n                case 'image/jpg':\n                    picture.format = 'image/jpeg'; // ToDo: register warning\n            }\n            return picture;\n        }\n        this.addWarning(\"Empty picture tag found\");\n        return null;\n    }\n    /**\n     * Convert native tag to common tags\n     */\n    async toCommon(tagType, tagId, value) {\n        const tag = { id: tagId, value };\n        const genericTag = this.tagMapper.mapTag(tagType, tag, this);\n        if (genericTag) {\n            await this.postMap(tagType, genericTag);\n        }\n    }\n    /**\n     * Set generic tag\n     */\n    setGenericTag(tagType, tag) {\n        debug(`common.${tag.id} = ${tag.value}`);\n        const prio0 = this.commonOrigin[tag.id] || 1000;\n        const prio1 = this.originPriority[tagType];\n        if (isSingleton(tag.id)) {\n            if (prio1 <= prio0) {\n                this.common[tag.id] = tag.value;\n                this.commonOrigin[tag.id] = prio1;\n            }\n            else {\n                return debug(`Ignore native tag (singleton): ${tagType}.${tag.id} = ${tag.value}`);\n            }\n        }\n        else {\n            if (prio1 === prio0) {\n                if (!isUnique(tag.id) || this.common[tag.id].indexOf(tag.value) === -1) {\n                    this.common[tag.id].push(tag.value);\n                }\n                else {\n                    debug(`Ignore duplicate value: ${tagType}.${tag.id} = ${tag.value}`);\n                }\n                // no effect? this.commonOrigin[tag.id] = prio1;\n            }\n            else if (prio1 < prio0) {\n                this.common[tag.id] = [tag.value];\n                this.commonOrigin[tag.id] = prio1;\n            }\n            else {\n                return debug(`Ignore native tag (list): ${tagType}.${tag.id} = ${tag.value}`);\n            }\n        }\n        if (this.opts?.observer) {\n            this.opts.observer({ metadata: this, tag: { type: 'common', id: tag.id, value: tag.value } });\n        }\n        // ToDo: trigger metadata event\n    }\n}\nfunction joinArtists(artists) {\n    if (artists.length > 2) {\n        return `${artists.slice(0, artists.length - 1).join(', ')} & ${artists[artists.length - 1]}`;\n    }\n    return artists.join(' & ');\n}\n//# sourceMappingURL=MetadataCollector.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/mpeg/MpegLoader.js\nconst mpegParserLoader = {\n    parserType: 'mpeg',\n    extensions: ['.mp2', '.mp3', '.m2a', '.aac', 'aacp'],\n    async load() {\n        return (await Promise.all(/* import() */[__webpack_require__.e(953), __webpack_require__.e(808)]).then(__webpack_require__.bind(__webpack_require__, 8808))).MpegParser;\n    }\n};\n//# sourceMappingURL=MpegLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/apev2/Apev2Loader.js\nconst apeParserLoader = {\n    parserType: 'apev2',\n    extensions: ['.ape'],\n    async load() {\n        return (await Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 7349))).APEv2Parser;\n    }\n};\n//# sourceMappingURL=Apev2Loader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/asf/AsfLoader.js\nconst asfParserLoader = {\n    parserType: 'asf',\n    extensions: ['.asf'],\n    async load() {\n        return (await __webpack_require__.e(/* import() */ 897).then(__webpack_require__.bind(__webpack_require__, 9897))).AsfParser;\n    }\n};\n//# sourceMappingURL=AsfLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/dsdiff/DsdiffLoader.js\nconst dsdiffParserLoader = {\n    parserType: 'dsdiff',\n    extensions: ['.dff'],\n    async load() {\n        return (await Promise.all(/* import() */[__webpack_require__.e(953), __webpack_require__.e(564)]).then(__webpack_require__.bind(__webpack_require__, 564))).DsdiffParser;\n    }\n};\n//# sourceMappingURL=DsdiffLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/aiff/AiffLoader.js\nconst aiffParserLoader = {\n    parserType: 'aiff',\n    extensions: ['.aif', 'aiff', 'aifc'],\n    async load() {\n        return (await Promise.all(/* import() */[__webpack_require__.e(953), __webpack_require__.e(186)]).then(__webpack_require__.bind(__webpack_require__, 5186))).AIFFParser;\n    }\n};\n//# sourceMappingURL=AiffLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/dsf/DsfLoader.js\nconst dsfParserLoader = {\n    parserType: 'dsf',\n    extensions: ['.dsf'],\n    async load() {\n        return (await Promise.all(/* import() */[__webpack_require__.e(953), __webpack_require__.e(965)]).then(__webpack_require__.bind(__webpack_require__, 7384))).DsfParser;\n    }\n};\n//# sourceMappingURL=DsfLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/flac/FlacLoader.js\nconst flacParserLoader = {\n    parserType: 'flac',\n    extensions: ['.flac'],\n    async load() {\n        return (await Promise.all(/* import() */[__webpack_require__.e(953), __webpack_require__.e(696)]).then(__webpack_require__.bind(__webpack_require__, 4696))).FlacParser;\n    }\n};\n//# sourceMappingURL=FlacLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/matroska/MatroskaLoader.js\nconst matroskaParserLoader = {\n    parserType: 'matroska',\n    extensions: ['.mka', '.mkv', '.mk3d', '.mks', 'webm'],\n    async load() {\n        return (await __webpack_require__.e(/* import() */ 636).then(__webpack_require__.bind(__webpack_require__, 9636))).MatroskaParser;\n    }\n};\n//# sourceMappingURL=MatroskaLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/mp4/Mp4Loader.js\nconst mp4ParserLoader = {\n    parserType: 'mp4',\n    extensions: ['.mp4', '.m4a', '.m4b', '.m4pa', 'm4v', 'm4r', '3gp'],\n    async load() {\n        return (await __webpack_require__.e(/* import() */ 683).then(__webpack_require__.bind(__webpack_require__, 3683))).MP4Parser;\n    }\n};\n//# sourceMappingURL=Mp4Loader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/musepack/MusepackLoader.js\nconst musepackParserLoader = {\n    parserType: 'musepack',\n    extensions: ['.mpc'],\n    async load() {\n        return (await Promise.all(/* import() */[__webpack_require__.e(953), __webpack_require__.e(369)]).then(__webpack_require__.bind(__webpack_require__, 1369))).MusepackParser;\n    }\n};\n//# sourceMappingURL=MusepackLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/ogg/OggLoader.js\nconst oggParserLoader = {\n    parserType: 'ogg',\n    extensions: ['.ogg', '.ogv', '.oga', '.ogm', '.ogx', '.opus', '.spx'],\n    async load() {\n        return (await __webpack_require__.e(/* import() */ 863).then(__webpack_require__.bind(__webpack_require__, 4863))).OggParser;\n    }\n};\n//# sourceMappingURL=OggLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/wavpack/WavPackLoader.js\nconst wavpackParserLoader = {\n    parserType: 'wavpack',\n    extensions: ['.wv', '.wvp'],\n    async load() {\n        return (await __webpack_require__.e(/* import() */ 723).then(__webpack_require__.bind(__webpack_require__, 8723))).WavPackParser;\n    }\n};\n//# sourceMappingURL=WavPackLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/wav/WaveLoader.js\nconst riffParserLoader = {\n    parserType: 'riff',\n    extensions: ['.wav', 'wave', '.bwf'],\n    async load() {\n        return (await Promise.all(/* import() */[__webpack_require__.e(953), __webpack_require__.e(425)]).then(__webpack_require__.bind(__webpack_require__, 4425))).WaveParser;\n    }\n};\n//# sourceMappingURL=WaveLoader.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/ParserFactory.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst ParserFactory_debug = browser('music-metadata:parser:factory');\nfunction parseHttpContentType(contentType) {\n    const type = content_type.parse(contentType);\n    const mime = (0,media_typer/* parse */.Qc)(type.type);\n    return {\n        type: mime.type,\n        subtype: mime.subtype,\n        suffix: mime.suffix,\n        parameters: type.parameters\n    };\n}\nclass ParserFactory {\n    constructor() {\n        this.parsers = [];\n        [\n            flacParserLoader,\n            mpegParserLoader,\n            apeParserLoader,\n            mp4ParserLoader,\n            matroskaParserLoader,\n            riffParserLoader,\n            oggParserLoader,\n            asfParserLoader,\n            aiffParserLoader,\n            wavpackParserLoader,\n            musepackParserLoader,\n            dsfParserLoader,\n            dsdiffParserLoader\n        ].forEach(parser => this.registerParser(parser));\n    }\n    registerParser(parser) {\n        this.parsers.push(parser);\n    }\n    async parse(tokenizer, parserLoader, opts) {\n        if (tokenizer.supportsRandomAccess()) {\n            ParserFactory_debug('tokenizer supports random-access, scanning for appending headers');\n            await scanAppendingHeaders(tokenizer, opts);\n        }\n        else {\n            ParserFactory_debug('tokenizer does not support random-access, cannot scan for appending headers');\n        }\n        if (!parserLoader) {\n            const buf = new Uint8Array(4100);\n            if (tokenizer.fileInfo.mimeType) {\n                parserLoader = this.findLoaderForType(getParserIdForMimeType(tokenizer.fileInfo.mimeType));\n            }\n            if (!parserLoader && tokenizer.fileInfo.path) {\n                parserLoader = this.findLoaderForExtension(tokenizer.fileInfo.path);\n            }\n            if (!parserLoader) {\n                // Parser could not be determined on MIME-type or extension\n                ParserFactory_debug('Guess parser on content...');\n                await tokenizer.peekBuffer(buf, { mayBeLess: true });\n                const guessedType = await fileTypeFromBuffer(buf);\n                if (!guessedType || !guessedType.mime) {\n                    throw new ParseError/* CouldNotDetermineFileTypeError */.GG('Failed to determine audio format');\n                }\n                ParserFactory_debug(`Guessed file type is mime=${guessedType.mime}, extension=${guessedType.ext}`);\n                parserLoader = this.findLoaderForType(getParserIdForMimeType(guessedType.mime));\n                if (!parserLoader) {\n                    throw new ParseError/* UnsupportedFileTypeError */.tw(`Guessed MIME-type not supported: ${guessedType.mime}`);\n                }\n            }\n        }\n        // Parser found, execute parser\n        ParserFactory_debug(`Loading ${parserLoader.parserType} parser...`);\n        const metadata = new MetadataCollector(opts);\n        const ParserImpl = await parserLoader.load();\n        const parser = new ParserImpl(metadata, tokenizer, opts ?? {});\n        ParserFactory_debug(`Parser ${parserLoader.parserType} loaded`);\n        await parser.parse();\n        return metadata.toCommonMetadata();\n    }\n    /**\n     * @param filePath - Path, filename or extension to audio file\n     * @return Parser submodule name\n     */\n    findLoaderForExtension(filePath) {\n        if (!filePath)\n            return;\n        const extension = getExtension(filePath).toLocaleLowerCase() || filePath;\n        return this.parsers.find(parser => parser.extensions.indexOf(extension) !== -1);\n    }\n    findLoaderForType(moduleName) {\n        return moduleName ? this.parsers.find(parser => parser.parserType === moduleName) : undefined;\n    }\n}\nfunction getExtension(fname) {\n    const i = fname.lastIndexOf('.');\n    return i === -1 ? '' : fname.slice(i);\n}\n/**\n * @param httpContentType - HTTP Content-Type, extension, path or filename\n * @returns Parser submodule name\n */\nfunction getParserIdForMimeType(httpContentType) {\n    let mime;\n    if (!httpContentType)\n        return;\n    try {\n        mime = parseHttpContentType(httpContentType);\n    }\n    catch (err) {\n        ParserFactory_debug(`Invalid HTTP Content-Type header value: ${httpContentType}`);\n        return;\n    }\n    const subType = mime.subtype.indexOf('x-') === 0 ? mime.subtype.substring(2) : mime.subtype;\n    switch (mime.type) {\n        case 'audio':\n            switch (subType) {\n                case 'mp3': // Incorrect MIME-type, Chrome, in Web API File object\n                case 'mpeg':\n                    return 'mpeg';\n                case 'aac':\n                case 'aacp':\n                    return 'mpeg'; // adts\n                case 'flac':\n                    return 'flac';\n                case 'ape':\n                case 'monkeys-audio':\n                    return 'apev2';\n                case 'mp4':\n                case 'm4a':\n                    return 'mp4';\n                case 'ogg': // RFC 7845\n                case 'opus': // RFC 6716\n                case 'speex': // RFC 5574\n                    return 'ogg';\n                case 'ms-wma':\n                case 'ms-wmv':\n                case 'ms-asf':\n                    return 'asf';\n                case 'aiff':\n                case 'aif':\n                case 'aifc':\n                    return 'aiff';\n                case 'vnd.wave':\n                case 'wav':\n                case 'wave':\n                    return 'riff';\n                case 'wavpack':\n                    return 'wavpack';\n                case 'musepack':\n                    return 'musepack';\n                case 'matroska':\n                case 'webm':\n                    return 'matroska';\n                case 'dsf':\n                    return 'dsf';\n                case 'amr':\n                    return 'amr';\n            }\n            break;\n        case 'video':\n            switch (subType) {\n                case 'ms-asf':\n                case 'ms-wmv':\n                    return 'asf';\n                case 'm4v':\n                case 'mp4':\n                    return 'mp4';\n                case 'ogg':\n                    return 'ogg';\n                case 'matroska':\n                case 'webm':\n                    return 'matroska';\n            }\n            break;\n        case 'application':\n            switch (subType) {\n                case 'vnd.ms-asf':\n                    return 'asf';\n                case 'ogg':\n                    return 'ogg';\n            }\n            break;\n    }\n}\n//# sourceMappingURL=ParserFactory.js.map\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/apev2/APEv2Parser.js + 1 modules\nvar APEv2Parser = __webpack_require__(7349);\n// EXTERNAL MODULE: ../../node_modules/music-metadata/lib/id3v1/ID3v1Parser.js\nvar ID3v1Parser = __webpack_require__(884);\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/lyrics3/Lyrics3.js\nconst endTag2 = 'LYRICS200';\nasync function getLyricsHeaderLength(tokenizer) {\n    const fileSize = tokenizer.fileInfo.size;\n    if (fileSize >= 143) {\n        const buf = new Uint8Array(15);\n        const position = tokenizer.position;\n        await tokenizer.readBuffer(buf, { position: fileSize - 143 });\n        tokenizer.setPosition(position); // Restore position\n        const txt = new TextDecoder('latin1').decode(buf);\n        const tag = txt.slice(6);\n        if (tag === endTag2) {\n            return Number.parseInt(txt.slice(0, 6), 10) + 15;\n        }\n    }\n    return 0;\n}\n//# sourceMappingURL=Lyrics3.js.map\n;// CONCATENATED MODULE: ../../node_modules/music-metadata/lib/core.js\n/**\n * Primary entry point, Node.js specific entry point is MusepackParser.ts\n */\n\n\n\n\n\n\n\n/**\n * Parse Web API File\n * Requires Blob to be able to stream using a ReadableStreamBYOBReader, only available since Node.js ≥ 20\n * @param blob - Blob to parse\n * @param options - Parsing options\n * @returns Metadata\n */\nasync function parseBlob(blob, options = {}) {\n    const fileInfo = { mimeType: blob.type, size: blob.size };\n    if (blob instanceof File) {\n        fileInfo.path = blob.name;\n    }\n    return parseWebStream(blob.stream(), fileInfo, options);\n}\n/**\n * Parse audio from Web Stream.Readable\n * @param webStream - WebStream to read the audio track from\n * @param options - Parsing options\n * @param fileInfo - File information object or MIME-type string\n * @returns Metadata\n */\nasync function parseWebStream(webStream, fileInfo, options = {}) {\n    const tokenizer = (0,core/* fromWebStream */.GC)(webStream, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n    try {\n        return await parseFromTokenizer(tokenizer, options);\n    }\n    finally {\n        await tokenizer.close();\n    }\n}\n/**\n * Parse audio from memory\n * @param uint8Array - Uint8Array holding audio data\n * @param fileInfo - File information object or MIME-type string\n * @param options - Parsing options\n * @returns Metadata\n * Ref: https://github.com/Borewit/strtok3/blob/e6938c81ff685074d5eb3064a11c0b03ca934c1d/src/index.ts#L15\n */\nasync function parseBuffer(uint8Array, fileInfo, options = {}) {\n    const tokenizer = (0,core/* fromBuffer */.FY)(uint8Array, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n    return parseFromTokenizer(tokenizer, options);\n}\n/**\n * Parse audio from ITokenizer source\n * @param tokenizer - Audio source implementing the tokenizer interface\n * @param options - Parsing options\n * @returns Metadata\n */\nfunction parseFromTokenizer(tokenizer, options) {\n    const parserFactory = new ParserFactory();\n    return parserFactory.parse(tokenizer, undefined, options);\n}\n/**\n * Create a dictionary ordered by their tag id (key)\n * @param nativeTags list of tags\n * @returns tags indexed by id\n */\nfunction orderTags(nativeTags) {\n    const tags = {};\n    for (const { id, value } of nativeTags) {\n        if (!tags[id]) {\n            tags[id] = [];\n        }\n        tags[id].push(value);\n    }\n    return tags;\n}\n/**\n * Convert rating to 1-5 star rating\n * @param rating Normalized rating [0..1] (common.rating[n].rating)\n * @returns Number of stars: 1, 2, 3, 4 or 5 stars\n */\nfunction ratingToStars(rating) {\n    return rating === undefined ? 0 : 1 + Math.round(rating * 4);\n}\n/**\n * Select most likely cover image.\n * @param pictures Usually metadata.common.picture\n * @return Cover image, if any, otherwise null\n */\nfunction selectCover(pictures) {\n    return pictures ? pictures.reduce((acc, cur) => {\n        if (cur.name && cur.name.toLowerCase() in ['front', 'cover', 'cover (front)'])\n            return cur;\n        return acc;\n    }) : null;\n}\nasync function scanAppendingHeaders(tokenizer, options = {}) {\n    let apeOffset = tokenizer.fileInfo.size;\n    if (await (0,ID3v1Parser/* hasID3v1Header */.gH)(tokenizer)) {\n        apeOffset -= 128;\n        const lyricsLen = await getLyricsHeaderLength(tokenizer);\n        apeOffset -= lyricsLen;\n    }\n    options.apeHeader = await APEv2Parser.APEv2Parser.findApeFooterOffset(tokenizer, apeOffset);\n}\n/**\n * Implementation only available when loaded as Node.js\n * This method will throw an Error, always.\n */\nasync function parseFile(filePath, options = {}) {\n    throw new Error('To load Web API File objects use parseBlob instead. For loading files, you need to import with the \"node\" condition is set.');\n}\n//# sourceMappingURL=core.js.map\n// EXTERNAL MODULE: ./js/webampLazy.tsx + 149 modules\nvar webampLazy = __webpack_require__(4615);\n;// CONCATENATED MODULE: ./js/webamp.js\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0,defineProperty/* default */.Z)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\n\n\nclass Webamp extends webampLazy[\"default\"] {\n  constructor(options) {\n    super(_objectSpread(_objectSpread({}, options), {}, {\n      requireJSZip: () => (jszip_min_default()),\n      requireMusicMetadata: () => lib_core_namespaceObject\n    }));\n  }\n}\n})();\n\n__webpack_exports__ = __webpack_exports__[\"default\"];\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});\n//# sourceMappingURL=webamp.bundle.js.map"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"module\": \"commonjs\",\n    \"moduleResolution\": \"node\",\n    \"sourceMap\": true,\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"esModuleInterop\": true,\n    \"noImplicitAny\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"lib\": [ \"es2015\", \"dom\" ],\n    \"outDir\": \"./dist\"\n  },\n  \"include\": [\n    \"src/**/*\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"**/*.spec.ts\"\n  ]\n}\n"
  },
  {
    "path": "tslint.json",
    "content": "{\n    \"rules\": {\n        \"class-name\": true,\n        \"comment-format\": [\n            true,\n            \"check-space\"\n        ],\n        \"indent\": [\n            true,\n            \"spaces\"\n        ],\n        \"no-duplicate-variable\": true,\n        \"no-eval\": true,\n        \"no-internal-module\": true,\n        \"no-trailing-whitespace\": true,\n        \"no-unsafe-finally\": true,\n        \"no-var-keyword\": true,\n        \"one-line\": [\n            true,\n            \"check-open-brace\",\n            \"check-whitespace\"\n        ],\n        \"quotemark\": [\n            true,\n            \"single\"\n        ],\n        \"semicolon\": [\n            true,\n            \"never\"\n        ],\n        \"triple-equals\": [\n            true,\n            \"allow-null-check\"\n        ],\n        \"typedef-whitespace\": [\n            true,\n            {\n                \"call-signature\": \"nospace\",\n                \"index-signature\": \"nospace\",\n                \"parameter\": \"nospace\",\n                \"property-declaration\": \"nospace\",\n                \"variable-declaration\": \"nospace\"\n            }\n        ],\n        \"variable-name\": [\n            true,\n            \"ban-keywords\"\n        ],\n        \"whitespace\": [\n            true,\n            \"check-branch\",\n            \"check-decl\",\n            \"check-operator\",\n            \"check-separator\",\n            \"check-type\"\n        ]\n    }\n}"
  },
  {
    "path": "webamp/.editorconfig",
    "content": "[*.jsx]\nindent_style = space\nindent_size = 2\n[*.js]\nindent_style = space\nindent_size = 2\n[*.css]\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": "webamp/.gitattributes",
    "content": "packages/webamp/packages/tweetBot/* linguist-vendored\npackages/webamp/modern/resources/* linguist-vendored\n"
  },
  {
    "path": "webamp/.gitignore",
    "content": "node_modules\n.vscode"
  },
  {
    "path": "webamp/LICENSE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) [2015] [Jordan Eldredge]\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "webamp/README.md",
    "content": "### Front Yammp\n\nИсходники фронта-плейра проекта [Yaamp.ru](http://yaamp.ru/ \"Yaamp.ru\").\n\nВесь код, это модифицированный форк проекта - [Webamp](https://github.com/captbaritone/webamp \"Webamp\")\n\n*Бэк работает на electronjs, в коде вы можете увидеть rpc вызовы для него.*\n\n`yarn install`\n\n**Основа на электроне доступна тут:** https://github.com/umnik1/yaamp"
  },
  {
    "path": "webamp/netlify.toml",
    "content": "[build]\n  command = \"yarn deploy\"\n  publish = \"packages/webamp/demo/built\"\n\n# A short URL for listeners of https://changelog.com/podcast/291\n[[redirects]]\n  from = \"/changelog\"\n  to = \"/#%7B\\\"initialTracks\\\"%3A%5B%7B\\\"url\\\"%3A\\\"https%3A%2F%2Fcdn.changelog.com%2Fuploads%2Fpodcast%2F291%2Fthe-changelog-291.mp3\\\"%2C\\\"metaData\\\"%3A%7B\\\"artist\\\"%3A\\\"Changelog%20Podcast\\\"%2C\\\"title\\\"%3A\\\"Winamp2-js\\\"%7D%7D%5D%7D\"\n\n[[redirects]]\n  from = \"/about\"\n  to = \"https://github.com/captbaritone/webamp\"\n\n# Redirect domain aliases to primary domain\n[[redirects]]\n  from = \"https://webamp.net/*\"\n  to = \"https://webamp.org/:splat\"\n  status = 301\n  force = true\n\n[build.environment]\n  NODE_VERSION = \"10\""
  },
  {
    "path": "webamp/package.json",
    "content": "{\n  \"name\": \"webamp-monorepo\",\n  \"private\": true,\n  \"workspaces\": [\n    \"packages/*\"\n  ],\n  \"scripts\": {\n    \"deploy\": \"yarn workspace ani-cursor build && yarn workspace webamp build && yarn workspace webamp build-library\"\n  },\n  \"devDependencies\": {\n    \"prettier\": \"^2.0.5\"\n  },\n  \"prettier\": {},\n  \"dependencies\": {\n    \"terser-webpack-plugin\": \"^5.3.14\",\n    \"webpack\": \"^5.99.2\"\n  }\n}\n"
  },
  {
    "path": "webamp/packages/ani-cursor/.gitignore",
    "content": "dist/"
  },
  {
    "path": "webamp/packages/ani-cursor/README.md",
    "content": "# ani-cursor\n\nA library for rendering Windows Animated Cursor files (`.ani`) in the browser by parsing out the individual frames and constructing a CSS animation.\n\nBuilt to support `.ani` files in Winamp skins for https://webamp.org.\n\nI wrote a blog post about this library which you can find [here](https://jordaneldredge.com/blog/rendering-animated-ani-cursors-in-the-browser/).\n\n## Install\n\n```bash\nyarn add ani-cursor\n```\n\nor\n\n```bash\nnpm install ani-cursor\n```\n\n## Usage Example\n\n```JavaScript\nimport {convertAniBinaryToCSS} from 'ani-cursor';\n\nasync function applyCursor(selector, aniUrl) {\n    const response = await fetch(aniUrl);\n    const data = new Uint8Array(await response.arrayBuffer());\n\n    const style = document.createElement('style');\n    style.innerText = convertAniBinaryToCSS(selector, data);\n\n    document.head.appendChild(style);\n}\n\nconst h1 = document.createElement('h1');\nh1.id = 'pizza';\nh1.innerText = 'Pizza Time!';\ndocument.body.appendChild(h1);\n\napplyCursor(\"#pizza\", \"https://archive.org/cors/tucows_169906_Pizza_cursor/pizza.ani\");\n```\n\nTry the [Live Demo on CodeSandbox](https://codesandbox.io/s/jolly-thunder-9jkio?file=/src/index.js)."
  },
  {
    "path": "webamp/packages/ani-cursor/babel.config.js",
    "content": "module.exports = {\n  presets: [\n    [\"@babel/preset-env\", { targets: { node: \"current\" } }],\n    \"@babel/preset-typescript\",\n  ],\n};\n"
  },
  {
    "path": "webamp/packages/ani-cursor/package.json",
    "content": "{\n  \"name\": \"ani-cursor\",\n  \"version\": \"0.0.4\",\n  \"description\": \"Render .ani cursors as CSS animations in the browser\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"files\": [\n    \"dist/\",\n    \"src/**/*.ts\"\n  ],\n  \"author\": \"Jordan Eldredge <jordan@jordaneldredge.com>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/captbaritone/webamp.git\",\n    \"directory\": \"packages/ani-cursor\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/captbaritone/webamp/issues\"\n  },\n  \"homepage\": \"https://github.com/captbaritone/webamp/tree/master/packages/ani-cursor\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"test\": \"jest\",\n    \"prepublish\": \"tsc\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.12.9\",\n    \"@babel/preset-env\": \"^7.12.7\",\n    \"@babel/preset-typescript\": \"^7.12.7\",\n    \"@types/jest\": \"^26.0.18\",\n    \"@types/puppeteer\": \"^7.0.4\",\n    \"babel-jest\": \"^26.6.3\",\n    \"jest\": \"^26.6.3\",\n    \"typescript\": \"^5.1\"\n  },\n  \"dependencies\": {\n    \"byte-data\": \"18.1.1\",\n    \"riff-file\": \"^1.0.3\"\n  },\n  \"jest\": {\n    \"modulePathIgnorePatterns\": [\n      \"dist\"\n    ]\n  }\n}\n"
  },
  {
    "path": "webamp/packages/ani-cursor/src/__tests__/__snapshots__/parser.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Edge cases piano.ani 1`] = `\n\"\n    @keyframes ani-cursor-3 {\n        0% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; }\n20% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; }\n40% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; }\n60% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; }\n80% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; }\n    }\n    #example:hover {\n        animation: ani-cursor-3 1250ms step-end infinite;\n    }\n   \"\n`;\n\nexports[`Green Dimension v2.wsz eqslid.cur 1`] = `\n\"\n    @keyframes ani-cursor-2 {\n        0% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIA...), auto; }\n50% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIA...), auto; }\n    }\n    #example:hover {\n        animation: ani-cursor-2 266.6666666666667ms step-end infinite;\n    }\n   \"\n`;\n\nexports[`Super_Mario_Amp_2.wsz close.cur 1`] = `\n\"\n    @keyframes ani-cursor-1 {\n        0% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n7.246376811594203% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n14.492753623188406% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n21.73913043478261% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n28.985507246376812%, 38.405797101449274%, 44.927536231884055% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n34.05797101449276%, 42.028985507246375%, 47.10144927536232% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n48.55072463768116% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n49.275362318840585% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n50.72463768115942%, 53.62318840579711%, 56.52173913043478% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n52.17391304347826%, 55.072463768115945% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; }\n    }\n    #example:hover {\n        animation: ani-cursor-1 2300ms step-end infinite;\n    }\n   \"\n`;\n\nexports[`Super_Mario_Amp_2.wsz eqslid.cur 1`] = `\n\"\n    @keyframes ani-cursor-0 {\n        0% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n12.5% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n25% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n37.5% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n50% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n62.5% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n75% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n87.5% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoDAAAFgAAACgAAAAgAAAAQAAAAAEAGA...), auto; }\n    }\n    #example:hover {\n        animation: ani-cursor-0 1333.3333333333335ms step-end infinite;\n    }\n   \"\n`;\n"
  },
  {
    "path": "webamp/packages/ani-cursor/src/__tests__/parser.test.ts",
    "content": "import fs from \"fs\";\nimport path from \"path\";\nimport { convertAniBinaryToCSS } from \"../\";\n\nconst LONG_BASE_64 = /([A-Za-z0-9+/=]{50})[A-Za-z0-9+/=]+/g;\n\n// Parse a `.ani` in our fixture directory and trim down the image data for use\n// in snapshot tests.\nfunction readPathCss(filePath: string): string {\n  const buffer = fs.readFileSync(path.join(__dirname, \"./fixtures/\", filePath));\n\n  return convertAniBinaryToCSS(\"#example\", buffer).replace(\n    LONG_BASE_64,\n    \"$1...\"\n  );\n}\n\n// https://skins.webamp.org/skin/6e30f9e9b8f5719469809785ae5e4a1f/Super_Mario_Amp_2.wsz/\ndescribe(\"Super_Mario_Amp_2.wsz\", () => {\n  test(\"eqslid.cur\", async () => {\n    expect(readPathCss(\"Super_Mario_Amp_2/eqslid.cur\")).toMatchSnapshot();\n  });\n  test(\"close.cur\", async () => {\n    expect(readPathCss(\"Super_Mario_Amp_2/close.cur\")).toMatchSnapshot();\n  });\n});\n\n// https://skins.webamp.org/skin/4308a2fc648033bf5fe7c4d56a5c8823/Green-Dimension-V2.wsz/\ndescribe(\"Green Dimension v2.wsz\", () => {\n  test(\"eqslid.cur\", async () => {\n    expect(readPathCss(\"Green Dimension v2/eqslid.cur\")).toMatchSnapshot();\n  });\n});\n\ndescribe(\"Edge cases\", () => {\n  test(\"piano.ani\", async () => {\n    expect(readPathCss(\"piano.ani\")).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "webamp/packages/ani-cursor/src/index.ts",
    "content": "import { parseAni } from \"./parser\";\n\ntype AniCursorImage = {\n  frames: {\n    url: string;\n    percents: number[];\n  }[];\n  duration: number;\n};\n\nconst JIFFIES_PER_MS = 1000 / 60;\n\n// Generate CSS for an animated cursor.\n//\n// This function returns CSS containing a set of keyframes with embedded Data\n// URIs as well as a CSS rule to the given selector.\nexport function convertAniBinaryToCSS(\n  selector: string,\n  aniBinary: Uint8Array\n): string {\n  const ani = readAni(aniBinary);\n\n  const animationName = `ani-cursor-${uniqueId()}`;\n\n  const keyframes = ani.frames.map(({ url, percents }) => {\n    const percent = percents.map((num) => `${num}%`).join(\", \");\n    return `${percent} { cursor: url(${url}), auto; }`;\n  });\n\n  // CSS properties with a animation type of \"discrete\", like `cursor`, actually\n  // switch half-way _between_ each keyframe percentage. Luckily this half-way\n  // measurement is applied _after_ the easing function is applied. So, we can\n  // force the frames to appear at exactly the % that we specify by using\n  // `timing-function` of `step-end`.\n  //\n  // https://drafts.csswg.org/web-animations-1/#discrete\n  const timingFunction = \"step-end\";\n\n  // Winamp (re)starts the animation cycle when your mouse enters an element. By\n  // default this approach would cause the animation to run continuously, even\n  // when the cursor is not visible. To match Winamp's behavior we add a\n  // `:hover` pseudo selector so that the animation only runs when the cursor is\n  // visible.\n  const pseudoSelector = \":hover\";\n\n  // prettier-ignore\n  return `\n    @keyframes ${animationName} {\n        ${keyframes.join(\"\\n\")}\n    }\n    ${selector}${pseudoSelector} {\n        animation: ${animationName} ${ani.duration}ms ${timingFunction} infinite;\n    }\n   `;\n}\n\nfunction readAni(contents: Uint8Array): AniCursorImage {\n  const ani = parseAni(contents);\n  const rate = ani.rate ?? ani.images.map(() => ani.metadata.iDispRate);\n  const duration = sum(rate);\n\n  const frames = ani.images.map((image) => ({\n    url: curUrlFromByteArray(image),\n    percents: [] as number[],\n  }));\n\n  let elapsed = 0;\n  rate.forEach((r, i) => {\n    const frameIdx = ani.seq ? ani.seq[i] : i;\n    frames[frameIdx].percents.push((elapsed / duration) * 100);\n    elapsed += r;\n  });\n\n  return { duration: duration * JIFFIES_PER_MS, frames };\n}\n\n/* Utility Functions */\n\nlet i = 0;\nconst uniqueId = () => i++;\n\nfunction base64FromDataArray(dataArray: Uint8Array): string {\n  return window.btoa(String.fromCharCode(...dataArray));\n}\n\nfunction curUrlFromByteArray(arr: Uint8Array) {\n  const base64 = base64FromDataArray(arr);\n  return `data:image/x-win-bitmap;base64,${base64}`;\n}\n\nfunction sum(values: number[]): number {\n  return values.reduce((total, value) => total + value, 0);\n}\n"
  },
  {
    "path": "webamp/packages/ani-cursor/src/parser.ts",
    "content": "import { RIFFFile } from \"riff-file\";\nimport { unpackArray, unpackString } from \"byte-data\";\n\ntype Chunk = {\n  format: string;\n  chunkId: string;\n  chunkData: {\n    start: number;\n    end: number;\n  };\n  subChunks: Chunk[];\n};\n\n// https://www.informit.com/articles/article.aspx?p=1189080&seqNum=3\ntype AniMetadata = {\n  cbSize: number; // Data structure size (in bytes)\n  nFrames: number; // Number of images (also known as frames) stored in the file\n  nSteps: number; // Number of frames to be displayed before the animation repeats\n  iWidth: number; // Width of frame (in pixels)\n  iHeight: number; // Height of frame (in pixels)\n  iBitCount: number; // Number of bits per pixel\n  nPlanes: number; // Number of color planes\n  iDispRate: number; // Default frame display rate (measured in 1/60th-of-a-second units)\n  bfAttributes: number; // ANI attribute bit flags\n};\n\ntype ParsedAni = {\n  rate: number[] | null;\n  seq: number[] | null;\n  images: Uint8Array[];\n  metadata: AniMetadata;\n  artist: string | null;\n  title: string | null;\n};\n\nconst DWORD = { bits: 32, be: false, signed: false, fp: false };\n\nexport function parseAni(arr: Uint8Array): ParsedAni {\n  const riff = new RIFFFile();\n\n  riff.setSignature(arr);\n\n  const signature = riff.signature as Chunk;\n  if (signature.format !== \"ACON\") {\n    throw new Error(\n      `Expected format. Expected \"ACON\", got \"${signature.format}\"`\n    );\n  }\n\n  // Helper function to get a chunk by chunkId and transform it if it's non-null.\n  function mapChunk<T>(chunkId: string, mapper: (chunk: Chunk) => T): T | null {\n    const chunk = riff.findChunk(chunkId) as Chunk | null;\n    return chunk == null ? null : mapper(chunk);\n  }\n\n  const metadata = mapChunk(\"anih\", (c) => {\n    const words = unpackArray(arr, DWORD, c.chunkData.start, c.chunkData.end);\n    return {\n      cbSize: words[0],\n      nFrames: words[1],\n      nSteps: words[2],\n      iWidth: words[3],\n      iHeight: words[4],\n      iBitCount: words[5],\n      nPlanes: words[6],\n      iDispRate: words[7],\n      bfAttributes: words[8],\n    };\n  });\n\n  if (metadata == null) {\n    throw new Error(\"Did not find anih\");\n  }\n\n  const rate = mapChunk(\"rate\", (c) => {\n    return unpackArray(arr, DWORD, c.chunkData.start, c.chunkData.end);\n  });\n  // chunkIds are always four chars, hence the trailing space.\n  const seq = mapChunk(\"seq \", (c) => {\n    return unpackArray(arr, DWORD, c.chunkData.start, c.chunkData.end);\n  });\n\n  const lists = riff.findChunk(\"LIST\", true) as Chunk[] | null;\n  const imageChunk = lists?.find((c) => c.format === \"fram\");\n  if (imageChunk == null) {\n    throw new Error(\"Did not find fram LIST\");\n  }\n\n  const images = imageChunk.subChunks.slice(0, metadata.nFrames).map((c) => {\n    if (c.chunkId !== \"icon\") {\n      throw new Error(`Unexpected chunk type in fram: ${c.chunkId}`);\n    }\n    return arr.slice(c.chunkData.start, c.chunkData.end);\n  });\n\n  let title = null;\n  let artist = null;\n\n  const infoChunk = lists?.find((c) => c.format === \"INFO\");\n  if (infoChunk != null) {\n    infoChunk.subChunks.forEach((c) => {\n      switch (c.chunkId) {\n        case \"INAM\":\n          title = unpackString(arr, c.chunkData.start, c.chunkData.end);\n          break;\n        case \"IART\":\n          artist = unpackString(arr, c.chunkData.start, c.chunkData.end);\n          break;\n        default:\n        // Unexpected subchunk\n      }\n    });\n  }\n\n  return { images, rate, seq, metadata, artist, title };\n}\n"
  },
  {
    "path": "webamp/packages/ani-cursor/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    /* Visit https://aka.ms/tsconfig.json to read more about this file */\n    \"target\": \"es5\" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,\n    \"module\": \"commonjs\" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,\n    \"sourceMap\": true /* Generates corresponding '.map' file. */,\n    \"outDir\": \"./dist\" /* Redirect output structure to the directory. */,\n    \"downlevelIteration\": true /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */,\n\n    /* Strict Type-Checking Options */\n    \"strict\": true /* Enable all strict type-checking options. */,\n    \"noImplicitAny\": true /* Raise error on expressions and declarations with an implied 'any' type. */,\n    \"strictNullChecks\": true /* Enable strict null checks. */,\n    \"strictFunctionTypes\": true /* Enable strict checking of function types. */,\n    \"strictBindCallApply\": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */,\n    \"strictPropertyInitialization\": true /* Enable strict checking of property initialization in classes. */,\n    \"noImplicitThis\": true /* Raise error on 'this' expressions with an implied 'any' type. */,\n    \"alwaysStrict\": true /* Parse in strict mode and emit \"use strict\" for each source file. */,\n\n    /* Additional Checks */\n    \"noUnusedLocals\": true /* Report errors on unused locals. */,\n    \"noUnusedParameters\": true /* Report errors on unused parameters. */,\n    \"noImplicitReturns\": true /* Report error when not all code paths in function return a value. */,\n    \"noFallthroughCasesInSwitch\": true /* Report errors for fallthrough cases in switch statement. */,\n\n    /* Module Resolution Options */\n    \"esModuleInterop\": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,\n\n    \"declaration\": true,\n    \"skipLibCheck\": true /* Skip type checking of declaration files. */,\n    \"forceConsistentCasingInFileNames\": true /* Disallow inconsistently-cased references to the same file. */\n  },\n  \"exclude\": [\"node_modules\", \"dist\"],\n  \"include\": [\"src/\"]\n}\n"
  },
  {
    "path": "webamp/packages/webamp/.babelrc",
    "content": "{\n  \"presets\": [\n    [\n      \"@babel/preset-env\",\n      {\n        \"useBuiltIns\": \"entry\",\n        \"corejs\": \"2\",\n        \"targets\": {\n          \"browsers\": [\n            \"last 2 Chrome versions\",\n            \"last 2 ChromeAndroid versions\",\n            \"last 2 Safari versions\",\n            \"last 2 Firefox versions\",\n            \"last 2 Edge versions\",\n            \"last 2 iOS versions\",\n            \"last 2 Opera versions\"\n          ]\n        }\n      }\n    ],\n    // TODO: Can TypeScript just do this for us?\n    [\n      \"@babel/preset-react\",\n      {\n        \"runtime\": \"automatic\"\n      }\n    ],\n    \"@babel/preset-typescript\"\n  ],\n  \"plugins\": [\n    \"@babel/plugin-proposal-nullish-coalescing-operator\",\n    \"@babel/plugin-proposal-optional-chaining\",\n    \"@babel/plugin-proposal-object-rest-spread\",\n    \"@babel/plugin-proposal-class-properties\"\n  ],\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\n        \"@babel/plugin-transform-modules-commonjs\",\n        \"@babel/plugin-syntax-dynamic-import\"\n      ]\n    },\n    \"library\": {\n      \"plugins\": [\"@babel/plugin-transform-runtime\"]\n    },\n    \"production\": {\n      \"plugins\": [\"@babel/plugin-syntax-dynamic-import\"]\n    }\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/.eslintignore",
    "content": "*.min.js\nbuilt/\ncoverage/\n**/node_modules/\nexamples/webpack/bundle.js\npacakges/tweetBot/env/"
  },
  {
    "path": "webamp/packages/webamp/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"jsx\": true,\n    \"sourceType\": \"module\",\n    \"ecmaFeatures\": {\n      \"jsx\": true,\n      \"experimentalObjectRestSpread\": true\n    }\n  },\n  \"plugins\": [\n    \"react\",\n    \"prettier\",\n    \"import\",\n    \"@typescript-eslint\",\n    \"react-hooks\"\n  ],\n  \"settings\": {\n    \"react\": {\n      \"version\": \"15.2\"\n    },\n    \"import/resolver\": {\n      \"node\": {\n        \"extensions\": [\".js\", \".ts\", \".tsx\"]\n      }\n    }\n  },\n  \"env\": {\n    \"node\": true,\n    \"amd\": true,\n    \"es6\": true,\n    \"jest\": true\n  },\n  // TODO: Consider removing some of these.\n  // https://github.com/facebook/create-react-app/pull/1840\n  // Create React App and \"Standard\" only allow the following:\n  // * document\n  // * window\n  // * console\n  // * navigator\n  \"globals\": {\n    \"window\": true,\n    \"document\": true,\n    \"console\": true,\n    \"navigator\": true,\n    \"alert\": true,\n    \"Blob\": true,\n    \"fetch\": true,\n    \"FileReader\": true,\n    \"Element\": true,\n    \"AudioNode\": true,\n    \"MutationObserver\": true,\n    \"Image\": true,\n    \"location\": true\n  },\n  \"rules\": {\n    \"no-multiple-empty-lines\": [\n      \"error\",\n      {\n        \"max\": 2,\n        \"maxEOF\": 0,\n        \"maxBOF\": 0\n      }\n    ],\n    \"block-scoped-var\": \"warn\",\n    \"camelcase\": \"error\",\n    \"constructor-super\": \"error\",\n    \"dot-notation\": \"error\",\n    \"eqeqeq\": [\"error\", \"smart\"],\n    \"guard-for-in\": \"error\",\n    \"lines-between-class-members\": [\n      \"warn\",\n      \"always\",\n      { \"exceptAfterSingleLine\": true }\n    ],\n    \"max-depth\": [\"warn\", 4],\n    \"max-params\": [\"warn\", 5],\n    \"new-cap\": \"error\",\n    \"no-caller\": \"error\",\n    \"no-catch-shadow\": \"error\",\n    \"no-const-assign\": \"error\",\n    \"no-debugger\": \"error\",\n    \"no-delete-var\": \"error\",\n    \"no-div-regex\": \"warn\",\n    \"no-dupe-args\": \"error\",\n    \"no-dupe-class-members\": \"error\",\n    \"no-dupe-keys\": \"error\",\n    \"no-duplicate-case\": \"error\",\n    \"no-duplicate-imports\": \"error\",\n    \"no-else-return\": \"error\",\n    \"no-empty-character-class\": \"error\",\n    \"no-eval\": \"error\",\n    \"no-ex-assign\": \"error\",\n    \"no-extend-native\": \"warn\",\n    \"no-extra-boolean-cast\": \"error\",\n    \"no-extra-semi\": \"error\",\n    \"no-fallthrough\": \"error\",\n    \"no-floating-decimal\": \"error\",\n    \"no-func-assign\": \"error\",\n    \"no-implied-eval\": \"error\",\n    \"no-inner-declarations\": \"error\",\n    \"no-irregular-whitespace\": \"error\",\n    \"no-label-var\": \"error\",\n    \"no-labels\": \"error\",\n    \"no-lone-blocks\": \"error\",\n    \"no-lonely-if\": \"error\",\n    \"no-multi-spaces\": \"warn\",\n    \"no-multi-str\": \"error\",\n    \"no-native-reassign\": \"error\",\n    \"no-negated-in-lhs\": \"warn\",\n    \"no-nested-ternary\": \"warn\",\n    \"no-new-object\": \"error\",\n    \"no-new-symbol\": \"error\",\n    \"no-new-wrappers\": \"error\",\n    \"no-obj-calls\": \"error\",\n    \"no-octal\": \"error\",\n    \"no-octal-escape\": \"error\",\n    \"no-proto\": \"error\",\n    \"no-redeclare\": \"error\",\n    \"no-shadow\": \"warn\",\n    \"no-spaced-func\": \"error\",\n    \"no-this-before-super\": \"error\",\n    \"no-throw-literal\": \"error\",\n    \"no-trailing-spaces\": \"error\",\n    \"no-undef\": \"error\",\n    \"no-undef-init\": \"error\",\n    \"no-unneeded-ternary\": \"error\",\n    \"no-unreachable\": \"error\",\n    \"no-unused-expressions\": \"error\",\n    \"@typescript-eslint/no-unused-vars\": [\n      \"error\",\n      { \"ignoreRestSiblings\": true }\n    ],\n    \"no-use-before-define\": [\"error\", \"nofunc\"],\n    \"no-useless-rename\": \"error\",\n    \"no-var\": \"error\",\n    \"no-with\": \"error\",\n    \"prefer-arrow-callback\": \"warn\",\n    \"prefer-const\": \"error\",\n    \"prefer-spread\": \"error\",\n    \"prefer-template\": \"warn\",\n    \"radix\": \"error\",\n    \"no-return-await\": \"error\",\n    \"react/no-string-refs\": \"error\",\n    \"react/jsx-boolean-value\": \"error\",\n    \"react/jsx-uses-react\": \"off\",\n    \"react/jsx-uses-vars\": \"error\",\n    \"react/prefer-es6-class\": \"error\",\n    \"react/jsx-pascal-case\": \"error\",\n    \"react/require-render-return\": \"error\",\n    \"react/self-closing-comp\": \"error\",\n    \"react/no-unescaped-entities\": \"error\",\n    \"use-isnan\": \"error\",\n    \"valid-typeof\": \"error\",\n    \"prettier/prettier\": \"error\",\n    \"import/default\": \"error\",\n    \"import/export\": \"error\",\n    \"import/first\": \"error\",\n    \"import/named\": \"error\",\n    \"import/namespace\": \"error\",\n    \"import/no-duplicates\": \"error\",\n    \"import/no-extraneous-dependencies\": \"error\",\n    \"import/no-named-as-default-member\": \"error\",\n    \"react-hooks/rules-of-hooks\": \"error\",\n    \"react-hooks/exhaustive-deps\": \"error\"\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/.gitignore",
    "content": "**/node_modules\n\n/built\n/demo/built\n/coverage\n/examples/webpack/bundle.js\n**/__diff_output__/\n"
  },
  {
    "path": "webamp/packages/webamp/.prettierignore",
    "content": "package.json\n**/*.min.css\n**/base-skin.css\ndemo/js/googleAnalytics.min.js\nbuilt/*\ndemo/built/*\ncoverage/*\nexamples/webpack/bundle.js\n"
  },
  {
    "path": "webamp/packages/webamp/CHANGELOG.md",
    "content": "## NEXT\n\n### Features\n\n- Support `.ani` cursors in skins [#1035](https://github.com/captbaritone/webamp/pull/1035), [blog post](https://jordaneldredge.com/blog/rendering-animated-ani-cursors-in-the-browser/).\n\n### Bug Fixes\n\n- Fix a number of edge cases where the close and minimize buttons in the equalizer window could render the wrong sprite [#1046](https://github.com/captbaritone/webamp/pull/1046)\n- Fix a bug where unminified bundle was accidentally minified.\n\n## 1.4.2\n\n### Bug Fixes\n\n- Add `webamp.close()` method to public TypeScript types.\n\n## 1.4.1\n\n### Features\n\n- New Webamp instance method: `.setSkinFromUrl(url)`. See [usage.md](./docs/usage.md) for more details.\n- New Webamp instance method: `.close()`. See [usage.md](./docs/usage.md) for more details.\n\n### Bug Fixes\n\n- Fix a bug where skins missing some images would fail to load [2e8392](https://github.com/captbaritone/webamp/commit/2e83920ca1597ad9704f01cc950d59a52c25635c)\n- Clicking on the lightning icon in the main window now correctly opens our about page in a new tab [#794](https://github.com/captbaritone/webamp/pull/794)\n- Skin `.ini` files can use `=` as a comment separator [577b5e3](https://github.com/captbaritone/webamp/commit/577b5e3c177f2f3ee06f9fbc6aac212adfbbc8c8)\n- We nolonger cycle Milkdrop presets when media is not playing [#799](https://github.com/captbaritone/webamp/pull/799)\n- Guard against some kinds of malformed `region.txt` files [0bd8b0](https://github.com/captbaritone/webamp/commit/0bd8b09ecff9f00873fc13dcd2a5662bf3efff61)\n\n## 1.4.0\n\n### Features\n\n- Added optional configuration option `handleTrackDropEvent` which lets you decide how drop events get converted into tracks.\n- New Webamp instance methods: `.stop()`, `.getMediaStatus()`, and `.seekToTime(seconds)`. See [usage.md](./docs/usage.md) for more details.\n- Windows are now layered in the order in which they were focused ([5ee1a4](https://github.com/captbaritone/webamp/commit/5ee1a4f7b024d9e667c41d24c961404e463009c4))\n- When focusing something other than Webamp, it's now possible for no windows to be selected ([6132ac](https://github.com/captbaritone/webamp/commit/6132acdf2cd42b56bf757fa101fc08203e84fd67))\n\n### Bug Fixes:\n\n- Fix a bug where context menus could appear in the wrong location ([95db2d](https://github.com/captbaritone/webamp/commit/95db2d08b6b189f5b9da577d23aca44b04c462a8))\n- Fix a bug where pressing next/previous when stopped would play the track ([#740](https://github.com/captbaritone/webamp/issues/730))\n- Fix a bug where `webamp.dispose` would error if the `#webamp` node had been reparented to anything other than `document.body`.\n- Fix a bug where tracks dropped in the main window were not autoplayed ([f8167d](https://github.com/captbaritone/webamp/commit/f8167dd32209e1a71958190abc037df79642a2cb))\n\n### Internal Improvements:\n\n- Upgraded [React Redux](https://github.com/reduxjs/react-redux) ([c3c3ad](https://github.com/captbaritone/webamp/commit/c3c3ad69abacdc34b58f3385b39b2634e9271590))\n- Several improvements to the performance of rendering Redux updates ([c75214](https://github.com/captbaritone/webamp/commit/c75214dcd7475b27f24c159cda26117a143ff740), [73f87b](https://github.com/captbaritone/webamp/commit/73f87be7c34acf5d0d5227a2a1b0e9718da11875), [4322aa](https://github.com/captbaritone/webamp/commit/4322aade4b5a60926c280e1807c4592cf915b497), [e89aa2](https://github.com/captbaritone/webamp/commit/e89aa266121ba7f890b96351d2da46314b7589e7),)\n\n## 1.3.1 [CURRENT]\n\n### Bug Fixes:\n\n- Fix issue where `music-metadata` was not imported correctly, and id3 tags could not be read. ([324fc2](https://github.com/captbaritone/webamp/commit/324fc29ca6c94fa54091608323842ba0604e0b4c))\n\n## 1.3.0\n\nThis release is far overdue. In the last six months we've made a huge number of improvements to Webamp.\n\nWe've fixed multiple longstanding bugs and continued to inch closer to pixel-perfect parity with Winamp. We've added several methods which make it easier to use Webamp in your project. In addition, we've continued to invest in the code by refactoring code to make it more maintainable, and converting the entire project from vanilla JavaScript to TypeScript which should help reduce the number of \"dumb\" bugs.\n\nSee a full list below:\n\n### Features:\n\n- Added methods to the webamp instance to control playback. See the [Usage Docs](./docs/usage.md) for more information:\n  - `webamp.play()`\n  - `webamp.pause()`\n  - `webamp.previousTrack()`\n  - `webamp.nextTrack()`\n  - `webamp.seekForward(seconds)`\n  - `webamp.seekBackward(seconds)`\n- Our ID3 parsing library [jsmediatags](https://github.com/aadsm/jsmediatags) has been replaced by [music-metadata](https://www.npmjs.com/package/music-metadata). This means we now support a broader range of media types, and also that the bitrate and sample rate displayed are now functional\n- The default skin is now included in the Skins section of the options menu by default\n- Implemented the \"Options\" sub context menu. Click the \"O\" in the \"clutter bar\" or select \"Options\" from the main context menu to see it\n- The equlizer graph is nolonger antialiased. It is now pixelated like real Winamp\n- Added a `.reopen()` method to reopen Webamp after you've closed it ([47ba520](https://github.com/captbaritone/webamp/commit/47ba520c2422d8e4842468a32ca13492845183cd))\n- Stip diacritic marks from song description so it displays better in the marquee ([2b2598](https://github.com/captbaritone/webamp/commit/2b2598329d3891ee8a976b8169066586110a767a))\n\n### Bug Fixes:\n\n- Fixed a longstanding bug where mono audio files would only play in the right channel ([4fd802](https://github.com/captbaritone/webamp/commit/4fd802f96efabb98c3c1573819eed37fec630f90))\n- Fixed a bug ([#687](https://github.com/captbaritone/webamp/issues/687)) where `webamp.appendTracks()` would cause currently playing media to pause.\n- Avoid sticking a file `<input>` into the global DOM ([343686](https://github.com/captbaritone/webamp/commit/343686f7454c4ece95b520fa3ddbf3ecc0198100))\n- Fix a bug where tracks dragged into the playlist were added at the wrong location ([b074e0](https://github.com/captbaritone/webamp/commit/b074e0eff35ac8b1b34efa902681aa19ba2b8629))\n- Fix a bug where skin cursors were not being shown for the equalizer sliders ([65bb59d](https://github.com/captbaritone/webamp/commit/65bb59353dc2da858440a3d753aec02fb771f0cc))\n- The Marquee text is nolonger blury when in \"Double Size\" mode ([4b5320](https://github.com/captbaritone/webamp/commit/4b53209e0cc0a9e0cd84821d012c1770a940063c))\n- Scrolling in the Equalizer window nolonger changes the volume ([48a937](https://github.com/captbaritone/webamp/commit/48a937da8722ccfd3c2e9df378a847c453c36864))\n- Clicking anywhere in a equalizer slider now makes the button depress ([20e681](20e6811e6f59e82a5765c38b0b33fbed2eb575ee)\n- Parsing of the `viscolor.txt` file in skins is now more permissive, allowing us to support more skins ([0d29ff](0d29ffe3f4b20505005346cbc97d0cdf85664619))\n- The hotkeys to seek forward/backwards 10 tracks now works propery ([7d9ef4](https://github.com/captbaritone/webamp/commit/7d9ef4287f7294f6bdc1db89b717592cf4e48f17))\n- Fix a bug where the preamp level was not applied until you changed it ([f03c88](https://github.com/captbaritone/webamp/commit/f03c88c6d89fd51cbc0538841bb3227accfa0431))\n- Fix a bug where `.eqf` values were encoded incorrectly ([c634cd](https://github.com/captbaritone/webamp/commit/c634cd8b947e5d2d8b94b38023bc20097737a995))\n- Preamp and EQ now boost/attenuate the same way original winamp 2 did ([#748](https://github.com/captbaritone/webamp/pull/748))\n\n### Internal Improvements:\n\n- Webamp is now written in [TypeScript](https://www.typescriptlang.org/).\n- Upraded to React and began using a few [hooks](https://reactjs.org/docs/hooks-overview.html).\n- We nolonger depend upon [cardinal-spline-js](https://www.npmjs.com/package/cardinal-spline-js), we use our own implementation.\n\n## 1.2.0\n\n### Features\n\n- Users can register an `onWillClose` callback, which is passed a `cancel` function. The `cancel` function can be called to prevent Webamp from closing. [#655](https://github.com/captbaritone/webamp/pull/655)\n\n### Internal changes\n\n- Webamp is now mostly built with [TypeScript](https://www.typescriptlang.org/).\n\n## 1.1.2\n\n### Changes\n\nWebamp is no-longer rendered into the DOM node you pass into `webamp.renderWhenReady()`. Instead, Webamp is rendred as a direct child of the `<body>` tag. The passed DOM node is still used for positioning. Webamp will attempt to center itself within that DOM node when it renders.\n\n### Features\n\n- Allow consumers to specify a z-index when constructing Webamp.\n\n### Fixes\n\n- Fixes positioning of context menus in context menu targets when they are spawned while scrolled.\n- Improve performance of CharacterString, which gets rendered on every marquee step.\n\n## 1.1.1\n\n### Fixes\n\n- Fixes the marquee text when the host page globally sets `box-sizing`.\n- Fixes the initial layout when the container is not at the top of the page.\n- Fixes the positioning of context menus created when scrolled down the page.\n\n## 1.1.0\n\n### Breaking\n\n- Webamp will attempt to center itself within the node it is rendered into, rather than within the entire page.\n- Webamp now includes the default skin directly in the JS bundle, so you don't need host it separately, or pass a URL as part of the initialztiaon.\n\n### Features\n\n- Equalizer sliders now \"stick\" slightly at zero.\n- Context menus on all windows.\n- Toggle window visibility via context menus.\n- Users can now hard code the duration of initial tracks. This saves Webamp from having to make an HTTP request to check the duration.\n\n### Fixed\n\n- Marquee now displays one additional character: https://github.com/captbaritone/webamp/issues/543\n- Track numbers in playlist are now padded to the length of the longest track number.\n- Fix close buttons in Playlist and Equalizer in shade mode.\n- Skins that omit assets will now fallback to using the default version of that asset.\n- Fix seeking forward via hotkeys.\n\n## 1.0.0\n\n**Important:** The NPM module as **moved** from `winamp2-js` to `webamp`. You will need to update your `package.json` to point to the new module.\n\n### Breaking\n\n- Project renamed from \"Winamp2-js\" to \"Webamp\".\n- UMD module exports as `window.Webamp` instead of `window.winamp2js`. When used via `<script>` tag.\n- Deprecated: The misspelled `Webmap` construction option `avaliableSkins` has been deprecated in favor of `availableSkins`. `avaliableSkins` will continue to work, but will log a deprecation warning. [#533](https://github.com/captbaritone/webamp/pull/533) by [@remigallego](https://github.com/remigallego)\n\n### Added\n\n- Instance method to be notified when Webamp is closed `webamp.onClose(callback)`.\n- Instance method to be notified when Webamp is minmized `webamp.onMinimize(callback)`.\n- Support for skins that use `.png` sprite sheets instead of `.bmp`. This saves 15kb for the default skin on the demo page. ([b88e87](https://github.com/captbaritone/winamp2-js/commit/b88e87b6584fd9db2e2295addab7bba0c1acd226))\n- We now attempt to detect mono audio files. Previously mono files would report as stereo and play only in the left channel.\n\n### Fixed\n\n- Shrink visualizer by one pixel to match Winamp. [#536](https://github.com/captbaritone/winamp2-js/issues/536) by [@The1Freeman](https://github.com/The1Freeman)\n- Remove Google Analytics tracking module from NPM module. ([aeb9522](https://github.com/captbaritone/winamp2-js/commit/aeb9522a47ac4032f0f73fe7828c3ef01728d6aa))\n\n## 0.0.6\n\n- Added: `winamp.appendTracks()`.\n- Added: `winamp.setTracksToPlay()`.\n- Changed: We no-longer try to center on window resize.\n- Meta: Added real [documentation](./docs/usage.md)!\n- Meta: Remove lots of garbage from the NPM build.\n\n## Prehistory\n\nIn all older versions, the API was not stable enough to merit a changelog.\n"
  },
  {
    "path": "webamp/packages/webamp/assets/skins/base-2.91/PLEDIT.TXT",
    "content": "[Text]\nNormal=#00FF00\nCurrent=#FFFFFF\nNormalBG=#000000\nSelectedBG=#0000C6\nFont=Arial\n"
  },
  {
    "path": "webamp/packages/webamp/assets/skins/base-2.91/REGION.TXT",
    "content": "; I stole this from the Complex skin, cause hey I thought it was cool :)\n; (and cause I'm too lazy to document it myself. :)\n; The original author is Adam Kennedy <adamk@iname.com>\n;\n; Hope you don't mind Adam :)\n;\n;\n; -Justin\n;\n;\n; P.S. you can use the section names [WindowShade] and [Equalizer]\n; for obvious purposes =)\n;\n;\n;                    REGION.TXT STRUCTURE FOR DEFINING SKIN MASKS\n;\n;The region information comes without any supporting documentation\n;so I thought I might as well make some.\n;\n;The region.txt in WinAmp 1.92 allows us to some interesting things with transparencies\n;But how does it work?\n;\n;Well, basically, it lets you define a set of polygons. Anything inside a polygon is drawn. Anything not in a polygon is not drawn. Simple heh?\n;For how to define it have a look below at the first block. Un-comment it now. Don't worry about commenting the actual one lower down, if WinAmp finds multiple definitions, it only does the first and ignores the rest\n;\n;How to make a mask\n;1. Type [Normal]. Real simple that one. (My guess is it is just for forward compatibility)\n;2. Just type the NumPoints= and leave the number blank, we'll fill it in later\n;3. OK, now for the fun part.\n;   The co-ordinates you should type in are the OUTSIDE pixel co-ordinates in x,y format.\n;   Start at the top lefthand corner and work your way CLOCKWISE around you polygon.\n;   Now WinAmp ONLY accepts the PointList as one line of comma seperated variables.\n;   You can use spaces, but DONT GO ONTO A NEW LINE. Clear? Good. :)\n;   One last thing, don't type the first position again at the end, WinAmp joins them.\n;   Putting a space between each pair is simply common sense, right?\n;4. Once your done, count the number of co-ords, and fill in that number for NumPoints.\n;\n;Oh, as a side note, the x variables go from 0 to 275, and the y from 0 to 116.\n;So if you look at the first example you can see I've gone across the second top line, gone down a bit, ducked in one pixel, gone down to the bottom, and across and back up the other side, putting another ledge on the other side.\n\n;This does the outside border, and chops some bits out on the top and edges\n;[Normal]\n;NumPoints=8    ;Do this LAST!\n;PointList=0,1,  275,1,  275,14,  274,14,  274,115,  1,115,  1,14,  0,14  \n\n;Cool heh? Very subtle effect. Now lets try a more complex one, with multiple polygons\n;For your first hard(ish) mask, I suggest defining each element as a seperate mask.\n;It makes them a bit easier to think about.\n\n;First, lets define an area that JUST does the titlebar.\n;[Normal]\n;NumPoints=4\n;PointList=0,1,  275,1,  275,14,  0,14\n\n;Simple as can be :)\n;Go ahead, uncomment it and have a look. Just remember to recomment everything above it\n;Doing your areas one at a time does speed the process up a bit\n\n;Now lets define JUST the area sort of inside the outer ring\n;[Normal]\n;NumPoints = 4\n;PointList = 3,15,  272,15,  272,113,  3,113\n\n;Right, so say we want a mask that has, the titlebar AND the main area.\n;We just add them together\n; [Normal] \n; NumPoints = 4, 4  ;Make sure to get the order right(although it doesnt matter here =P )\n; PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,113, 3,113\n\n;Dont forget to add that extra comma after the first set.\n; Having that bigger gap that lets you \"keep it in your head\" easier, it's a good idea\n\n;OK, now lets try something tricky. We are going to make a mask for just one green line around the outside of the skin\n;This introduces the other \"big thing\" with masks. Have a look at the first three co-ordinates below. You can see the first two moves we make are to go one to the side and then go down to the bottom. Looking at the last co-ordinate you can see we will come back up at the end, making a line two wide, right? \n;WRONG!! Here comes the big important phrase.\n;IF YOU ARNT FOLLOWING THE OUTSIDE EDGE, YOUR CO-ORDINATES MARK TRANSPARENT SPACE LIMITS\n;That's right. Because I don't make a square, because I have to turn \"inside\" the box, I am only marking space, and what I end up with is a mask with one green line.\n;WARNING: Leave your skins dialog open when you do this one. :)\n;[Normal]\n;NumPoints = 8\n;PointList = 1,14,  2,14,  2,114,  273,114,  273,14,  274,14,  274,115,  1,115\n\n;OK, as the final touch lets add lets the border we just made to the other two.\n;You should be able to work this out on your own\n;[Normal]\n;NumPoints = 4, 4, 8\n;PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,113, 3,113,     1,14, 2,14, 2,114, 273,114, 273,14, 274,14, 274,115, 1,115\n\n;hmm... that still looks a bit tacky down the bottom right\n;So I'm going to modify it a bit\n;See if you can work out what I've had to alter just by looking at the display of it\n;[Normal]\n;NumPoints = 4, 4, 8\n;PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,80, 3,80,     1,14, 2,14, 2,81, 273,81, 273,14, 274,14, 274,115, 1,115\n\n\n; Justin's whacked trans skin :) in one, big lame messy line\n; [Normal]\n; NumPoints=20,4,4,4,8,4,4,6,6,4,4,4,4\n; PointList=0,0,19,0,19,11,114,11,114,0,156,0,156,11,243,11,243,0,275,0,275,13,266,13,266,22,264,22,264,13,111,13,111,22,109,22,109,13,0,13,     109,22,266,22,266,36,109,36, 16,88,130,88,130,105,16,105,    136,89,157,89,157,104,136,104,    22,13,22,62,102,62,102,13,100,13,100,24,24,24,24,13,    0,0,275,0,275,3,0,3,   16,72,264,72,264,81,16,81,  0,13,0,78,16,78,16,75,4,75,4,13,   275,13,275,78,264,78,264,75,272,75,272,13,     14,78,16,78,16,105,14,105,     130,81,132,81,132,105,130,105,     146,81,146,89,148,89,148,81,     130,96,136,96,136,98,130,98\n\n;THE END\n;\n;Post-Script\n;The other good thing about doing your mask in bits and pieces like this is that can make multiple versions so you can change as your whims change\n"
  },
  {
    "path": "webamp/packages/webamp/assets/skins/base-2.91/Skining Updates.txt",
    "content": "Coppied from winamp/wa_dlg.h from the Winamp 2.9 ML SDK.\n\n       1) gen.bmp has a generic window frame for plugins to use.\n          its format is similar to the minibrowser's.\n          In addition gen.bmp includes a font for the titlebar, in both\n          highlight and no-highlight modes. The font is variable width,\n          and it uses the first color before the letter A as the delimiter.\n          The no-highlight form of letter must be the same width as the\n          highlight form.\n       2) genex.bmp has button and scrollbar images, as well as some individual\n          pixels that describe the colors for the dialog. The button and\n          scrollbar images should be self explanatory (note that the buttons\n          have 4 pixel sized edges that are not stretched, and the center is\n          stretched), and the scrollbars do something similar.\n          The colors start at (48,0) and run every other pixel. The meaning\n          of each pixel is:\n            x=48: item background (background to edits, listviews etc)\n            x=50: item foreground (text color of edit/listview, etc)\n            x=52: window background (used to set the bg color for the dialog)\n            x=54: button text color\n            x=56: window text color\n            x=58: color of dividers and sunken borders\n            x=60: selection color for listviews/playlists/etc\n            x=62: listview header background color\n            x=64: listview header text color\n            x=66: listview header frame top color\n            x=68: listview header frame middle color\n            x=70: listview header frame bottom color\n            x=72: listview header empty color\n            x=74: scrollbar foreground color\n            x=76: scrollbar background color\n            x=78: inverse scrollbar foreground color\n            x=80: inverse scrollbar background color\n            x=82: scrollbar dead area color"
  },
  {
    "path": "webamp/packages/webamp/assets/skins/base-2.91/VISCOLOR.TXT",
    "content": "0,0,0, // color 0 = black\n24,33,41, // color 1 = grey for dots\n239,49,16, // color 2 = top of spec\n206,41,16, // 3\n214,90,0, // 4\n214,102,0, // 5\n214,115,0, // 6\n198,123,8, // 7\n222,165,24, // 8\n214,181,33, // 9\n189,222,41, // 10\n148,222,33, // 11\n41,206,16, // 12\n50,190,16, // 13\n57,181,16, // 14\n49,156,8,  // 15\n41,148,0,  // 16\n24,132,8,   // 17 = bottom of spec\n255,255,255, // 18 = osc 1\n214,214,222, // 19 = osc 2 (slightly dimmer)\n181,189,189, // 20 = osc 3\n160,170,175,  // 21 = osc 4\n148,156,165,  // 22 = osc 4\n150, 150, 150, // 23 = analyzer peak dots\n"
  },
  {
    "path": "webamp/packages/webamp/config/jest.integration.js",
    "content": "module.exports = {\n  displayName: \"integration-test\",\n  rootDir: \"../\",\n  preset: \"jest-puppeteer\",\n  testRegex: \"\\\\.integration-test\\\\.js$\",\n};\n"
  },
  {
    "path": "webamp/packages/webamp/config/jest.unit.js",
    "content": "module.exports = {\n  displayName: \"test\",\n  rootDir: \"../\",\n  testRegex: \"\\\\.test\\\\.(js|ts|tsx)$\",\n  globals: {\n    SENTRY_DSN: null,\n  },\n  moduleFileExtensions: [\"js\", \"tsx\", \"ts\"],\n  moduleNameMapper: {\n    \"\\\\.css$\": \"<rootDir>/js/__mocks__/styleMock.js\",\n    \"\\\\.wsz$\": \"<rootDir>/js/__mocks__/fileMock.js\",\n    \"\\\\.mp3$\": \"<rootDir>/js/__mocks__/fileMock.js\",\n  },\n  transform: {\n    \"^.+\\\\.(js|ts|tsx)$\": \"babel-jest\",\n  },\n  testPathIgnorePatterns: [\"/node_modules/\"],\n};\n"
  },
  {
    "path": "webamp/packages/webamp/config/webpack.library.js",
    "content": "const path = require(\"path\");\nconst { BundleAnalyzerPlugin } = require(\"webpack-bundle-analyzer\");\nconst TerserPlugin = require(\"terser-webpack-plugin\");\n\nmodule.exports = {\n  devtool: \"source-map\",\n  mode: \"production\",\n  resolve: {\n    extensions: [\".js\", \".ts\", \".tsx\"],\n    fallback: {\n      \"stream\": require.resolve(\"stream-browserify\")\n    }\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.css$/,\n        use: [\n          \"style-loader\",\n          { loader: \"css-loader\", options: { importLoaders: 1 } },\n          // We really only need this in prod. We could find a way to disable it in dev.\n          {\n            loader: \"postcss-loader\",\n            options: {\n              plugins: [\n                require(\"cssnano\"),\n                require(\"../scripts/postcss-optimize-data-uri-pngs\"),\n              ],\n            },\n          },\n        ],\n      },\n      {\n        test: /\\.(js|ts|tsx)$/,\n        exclude: /(node_modules)/,\n        use: {\n          loader: \"babel-loader\",\n          options: {\n            envName: \"library\",\n          },\n        },\n      },\n    ],\n    noParse: [/jszip\\.js$/],\n  },\n  plugins: [\n    new BundleAnalyzerPlugin({\n      analyzerMode: \"static\",\n      reportFilename: \"library-report.html\",\n      openAnalyzer: false,\n    }),\n  ],\n  performance: {\n    // We do some crazy shit okay! Don't judge!\n    maxEntrypointSize: 9000000,\n    maxAssetSize: 9000000,\n  },\n  optimization: {\n    minimize: true,\n    minimizer: [\n      new TerserPlugin({\n        // This allows us to produce both minfied and unminified files.\n        test: /\\.min\\.js$/i,\n      }),\n    ],\n  },\n  entry: {\n    bundle: \"./js/webamp.js\",\n    \"bundle.min\": \"./js/webamp.js\",\n    \"lazy-bundle\": \"./js/webampLazy.tsx\",\n    \"lazy-bundle.min\": \"./js/webampLazy.tsx\",\n  },\n  output: {\n    path: path.resolve(__dirname, \"../built\"),\n    filename: \"webamp.[name].js\",\n    library: \"Webamp\",\n    libraryTarget: \"umd\",\n    libraryExport: \"default\",\n  },\n};\n"
  },
  {
    "path": "webamp/packages/webamp/css/base-skin.css",
    "content": "#webamp #balance {background-image: url(data:image/png;base64,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)}\n#webamp #balance::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAeUlEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rpCij8FQQ4eBkYGB4f+t568YLl+9RVDzuRMXGM5fu86wbdlUTI1xwUEMi9auY0CnQaYOF434Qgjmx4NbVyMCZ+HcVQRDFaQAFKpgjaB4tPcOJUoTTBFYI7kpBwBj9Y4F5LolbwAAAABJRU5ErkJggg==)}\n#webamp #balance::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAeUlEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rpCij8FQQ4eBkYGB4f+t568YLl+9RVDzuRMXGM5fu86wbdlUTI1xwUEMi9auY0CnQaYOF434Qgjmx4NbVyMCZ+HcVQRDFaQAFKpgjaB4tPcOJUoTTBFYI7kpBwBj9Y4F5LolbwAAAABJRU5ErkJggg==)}\n#webamp #balance:active::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAiElEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rhCtz1BDB6yWkYGB4f+t568Y1CTFCGr2ispm2LZsKpU1/v//n4GRkZEBnQZZg9dG+mvEF0Igp54/tp/h0/s3pIcqXCMoHu29QwlGBUzBwa2rIdEBSjmvPj4DW88nKAIWBLFBAJ0P0wxKOQCfeG0Fez8X/QAAAABJRU5ErkJggg==)}\n#webamp #balance:active::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAiElEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rhCtz1BDB6yWkYGB4f+t568Y1CTFCGr2ispm2LZsKpU1/v//n4GRkZEBnQZZg9dG+mvEF0Igp54/tp/h0/s3pIcqXCMoHu29QwlGBUzBwa2rIdEBSjmvPj4DW88nKAIWBLFBAJ0P0wxKOQCfeG0Fez8X/QAAAABJRU5ErkJggg==)}\n#webamp .actions #previous {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAABJklEQVQ4T2Ncu/XYfwYqg+v37zPMnzCZgRFkuJOXJdWM37ftOMPSdWsZLh04ijD83PnrFFvw4fkHBpCrjx07xnDr1LkBMry3ZyrcJ8Ul2Ri+gskjy4Fcfu78OYbz164z3Dp5FrfLQZp9/fwYIsLdGNCDDJcciuH4ggWXATBxkFfQLabIcGSDCRl++/R54oMF3WBChuNNLejBYmSoybBi5S6UiMUXLCS5HGQqugVUNRzdAqobjmwB2YaDggAGsBUNMHlkOeSkiBLmoAKHGgCWQ+GGgwwFFTjfP7ynhvng7H/n9AUGxpYpS/+DbPvx/QdVDIYZcvvMBQZGeXnD/4wMjAiDGSFsJkYGhv8MUBlGRgZGqDhIDiT6HyT2H1TPMDIwIMvB1AKlAEDTcEDPJ2rfAAAAAElFTkSuQmCC)}\n#webamp .actions #previous:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAvElEQVQ4T2Pk4BD4z0AjwEgXw6OLSxgkBCUo9sOL9y8Y3n94z7Bt7lwGuMuLW3oYjAy1KDYcZMC589cYemtKMA0HSVADDLzhIBfAACjo0AFMHl2OKJeDFDkFRTMkJ0eDwxIZEJLDiFBiDYAZDLIMl8VkGY5sMFUNRzeYqoaD8sLcuUtRwp6qwYJuAVUNBzkb2QKqG45sAdmGI5c32IoGmDy2JAxPiqBS0cvJCSOjkFvOoORQr+RkcDFJTQAAjl/gQQ3KhloAAAAASUVORK5CYII=)}\n#webamp .actions #play {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAABD0lEQVQ4T8WVsRLBQBCGd/MuzCjpjE6hMEPLOyh5BCUdpZKOgqFUni6hEaqgUUpHd2bDSgaJEzfjmszcXb7/vz+7FxxOhQTNw3YcGHR7gATPF7Pa8PPZAvqjIWyE5cNNy/5ZwD26QK6FEHBYbf4Eb7e63knqjZryici5aZlgrW3YLSOcE7xULsNkPFYWCcIjY2E421YR+dr5cyZRIrGdq4hog1crBU8vWMJB+H61DS/F58zZ+Tsor8V2HgV9D1dwrgL9Gp5Jp14y/dRNoZnThaNjcIc+PihB6cI5uycdfK/9D1QtzU5fktrlfNECZojnPJnISQAENNCHIwLyLwRv88hP4H3+fuP+rqS1+zRKA661DDna/M5AugAAAABJRU5ErkJggg==)}\n#webamp .actions #play:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAArUlEQVQ4T2Pk4BD4z0AjwEgXw6OLSxgkBCUo9sOL9y8Y3n94z7Bt7lwGuMuLW3oYjAy1KDYcZMC589cYemtKMA0HSVADDLzhIBeAACjYSAFEuRykyCkommHfuqUkWUKS4TBXE2sJWYYTawlFhhOyhCqGJydHg+1BT8IUGY7LUJiPyDKckKFkGU6soSQZDitvSC0WUIIFVCp6OTlhRAwpuRJZLYrhXsnJ4GKSmgAAJS2qQVLHzgcAAAAASUVORK5CYII=)}\n#webamp .actions #pause {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAA9klEQVQ4T2Ncu/XYfwYqg+v37zOsmbOMgRFkuJOXJdWM37ftOMPSdWsZ7p25iTD83PnrFFvw4fkHBpCrjx07xvD8+qMBMLy3ZyqKL4pLsuF8fHIgl587f47h/LXrDM+uPsTucpABvn5+YAMjwt0YkIMMnxyy4TiDZWQbPhrm8GRKv9RyA0cONTLURMlEyOkcnxxOl4MKHGoAWA59fv0xJIeCDAUVON8/vKeG+eDsD86hLVOW/gfZ9uP7D6oYDDPkBcjlOjqu/xkYGBkYGRkRhjMyMjDCqhAQm5GR4f///2AaBGHgPyMDAyOIYGBgYGRCiIPUgLQDAMR2dVMJ9yxOAAAAAElFTkSuQmCC)}\n#webamp .actions #pause:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAkUlEQVQ4T2Pk4BD4z0AjwEgXw6OLSxgkBCUo9sOL9y8Y3n94z7Bt7lwGuMuLW3oYjAy1KDYcZMC589cYemtKMA0HSVADDKzhINuRASjoYACfHEgNQZeDFDgFRYPNS06OBoclsuG45EYNxxpko8EySIMFvaxBTuf45DAiFFQqejk5oWQUSsoYlBzqlZwMLiapCQDcl+BBkqA+HQAAAABJRU5ErkJggg==)}\n#webamp .actions #stop {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAA7ElEQVQ4T2Ncu/XYfwYqg+v37zNsXLiegRFkuJOXJdWM37ftOMPSdWsZHl96iDD83PnrFFvw4fkHBpCrjx07xvDm9osBMry3ZypRPikuyYarA7n83PlzDOevXcfvcpDhvn5+eC2ICHdjQA5Ouhn++s5L3GFOqctf3x6qhr+hqcuHbJjjDRYjQ02iMhHudI6UWkAFDjUAIodCDQcZCipwvn94Tw3zwdkfnIlapiz9D7Ltx/cfVDEYZsibO68YGI0M/f4zMDKiGMzIyMgAgiDwn5EBwgIxQACk9v9/CA3mglT+Z/gPUgVTAqp+gPIAkGlAebz+wGwAAAAASUVORK5CYII=)}\n#webamp .actions #stop:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAAiklEQVQ4T2Pk4BD4z0AjwEgXw6OLSxgkBCUo9sOL9y8Y3n94z7Bt7lwGuMuLW3oYjAy1KDYcZMC589cYemtKMA0HSVADDLzhIBcQA0DBigyIcjlIkVNQNF7zk5OjweE8ajhKEIwGC9ZUMziDhdjyBm86B5WKXk5OGJmBmNyJTQ1KDvVKTgYXk9QEAAyvqkFyFeqqAAAAAElFTkSuQmCC)}\n#webamp .actions #next {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAA+0lEQVQ4T2Ncu/XYfwYqg+v37zNoKioyMIIMd/KypJrx+7YdZ1i6bi1DdFAwwvBz569TbMGH5x8YQK4+duwYQ3J09AAZ3tszFeyT4pJsDB/B5NDlQS4/d/4cw/lr1/G7HGSAr58fw+ZNmzAsgMlFhLsxIAcnyYaDXIduAVUNR7eA6oYjW0ATw2FhTHXDkSOPqoajpwqqGY5uMCjsKTbcyFATnHmwFQswOXR5nOkcVOBQA2DkUJChoALn+4f31DAfnP3f3XvPwNgyZel/kG0/vv+gisEwQ/atW8rAaGYWCq4sGBmZGP7//8/AyMiI1RJGBuziDDjUX7iwnQEAFVpccsVakREAAAAASUVORK5CYII=)}\n#webamp .actions #next:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAt0lEQVQ4T2Pk4BD4z0ADwEhzg6OLSxgkBCUocvuL9y8Y3n94z7Bt7lwGuIuLW3oYjAy1KDIYpPnc+WsMvTUlmAaDJCgFA2swyHYQAAUVOoDJocsT5WKQIqegaIZ965ZiGA6TS06OBoctDJBkMEgTuuFUMxjdcKoajGw41Q2GhSlVDUaOKKoZjC32QSmGolSBrhkU1hS5GFZ+YMvqyGULznQMKt28nJxQEjq5ZQZKBvFKTgYXd9QCAP/t4EEURE/rAAAAAElFTkSuQmCC)}\n#webamp #eject {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAQCAYAAAAS7Y8mAAAAvklEQVQ4T2Ncu/XYfwYqg+v37zMwggx28rKkmtH7th1nWLpuLcLgc+evU2z4h+cfGM6dP8dw/tp14g3u7ZnKUFySjddykg0GGerr58ewedMmvIaTZDDMUJhT8RlOtMHohhIynCiDcRmKz3CCBhsZahKdQpBTE0GDiTYVTSFBg0HBQCxAToJEGQxKXoRARLgbA0lBQdUwBuVxagCULA0yEFQiff/wnhpmQ8oKC4uo/4yMDAz///9nYAQxKAQwcwA0oPB1SETCWwAAAABJRU5ErkJggg==)}\n#webamp #eject:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAQCAYAAAAS7Y8mAAAAs0lEQVQ4T2Pk4BD4z0ADwEhzg6OLSxgkBCUocvuL9y8Y3n94z7Bt7lwGuIuLW3oYjAy1KDIYpPnc+WsMvTUlmAaDJPABkCaQIwipwXAxPoNBhjoFRTPsW7cUr+EkuRhmKMyl+Awn2mB0QwkZTpTBuAzFZzhBg0lJJchxQ9BgctMeQYNBCogFyEmQKINByYsQSE6OBmcMGCBoMFXCGFRWeDk5odhMyKW45FFc7JWcDC48qAUA7xGQAbqyvq4AAAAASUVORK5CYII=)}\n#webamp #main-window {background-image: url(data:image/png;base64,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)}\n#webamp .media-info #stereo {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAYAAACeGbYxAAACYElEQVQ4T3VUv09TURT+7qAtJi10wIAWaXWgJn1PqSZtGRq7SJ2ZdCAhJk2cdGMjYWFx0MQ/QpMOTDYspg1D0UFfAmiRqCSEWIoiDYuvS69559773r0PfMt779x7zved7/xgtlXhAIf3cPmmby5s4IY1sMvbjLylf8iHaTE5H0gMgFlWhTPhSc4+2DmAgoUi5HP9r58OKvwGFJ/Z9qyfisFYsvZyUM4GoRBBXZmwaj6gJC0yDcmrAkxMJLGwMIfl5ZdCKF8+gDOOM9LKUgiSAjpQR5PXtmbpKgPD6OUEHlTK+Ov20Wy2UCzchX0rg42Nj9jcbKNUylOM9fUPsO2b9D0yEofjbGNm5g5OTk5Rr79DOn2N/o+Pe1hba8B1XfCBAtXk9YDn5+cokON8wf7+AWKxuMz0BZ49fYyfnS5ct4+xsVH0+3262+n8QqEwjWbzPTKZG+j1Tum9svIK98pFRCNRrK6+DfKmmspMPevwcAyWNYXcdBaH3d9otRwfdHHxCdrtbxTUyy6RiGNv7wC7uz9QrT4i0Ej0AiIXI8jlslhaeo5SqYjx8St4/aYmSkG6h0ALhdvIZqdwaWgIn5xtbG19RbX6EI7zGd3uH+TzNjHe2fmOdDpJoF4ZKpUyUqkknTUaLUymruJ6epL+a7U6jo4O/enwbMyy7lO1qZUZ85sl6FR9jORoScbmCImR0B9jNrV5pu4FZJHVmHgEjMFWi8KjKQdLu+tJFvTq2Y7VG5ljYGYqDs0NpFRQe0cfk+BM+AlgtZ3CWXt2ceY3kpKTZJbHplzmqjMXhSJ7fpbhpfIPjL2aQ2aAdzkAAAAASUVORK5CYII=)}\n#webamp .stop .media-info #stereo.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAYAAACeGbYxAAACYElEQVQ4T3VUv09TURT+7qAtJi10wIAWaXWgJn1PqSZtGRq7SJ2ZdCAhJk2cdGMjYWFx0MQ/QpMOTDYspg1D0UFfAmiRqCSEWIoiDYuvS69559773r0PfMt779x7zved7/xgtlXhAIf3cPmmby5s4IY1sMvbjLylf8iHaTE5H0gMgFlWhTPhSc4+2DmAgoUi5HP9r58OKvwGFJ/Z9qyfisFYsvZyUM4GoRBBXZmwaj6gJC0yDcmrAkxMJLGwMIfl5ZdCKF8+gDOOM9LKUgiSAjpQR5PXtmbpKgPD6OUEHlTK+Ov20Wy2UCzchX0rg42Nj9jcbKNUylOM9fUPsO2b9D0yEofjbGNm5g5OTk5Rr79DOn2N/o+Pe1hba8B1XfCBAtXk9YDn5+cokON8wf7+AWKxuMz0BZ49fYyfnS5ct4+xsVH0+3262+n8QqEwjWbzPTKZG+j1Tum9svIK98pFRCNRrK6+DfKmmspMPevwcAyWNYXcdBaH3d9otRwfdHHxCdrtbxTUyy6RiGNv7wC7uz9QrT4i0Ej0AiIXI8jlslhaeo5SqYjx8St4/aYmSkG6h0ALhdvIZqdwaWgIn5xtbG19RbX6EI7zGd3uH+TzNjHe2fmOdDpJoF4ZKpUyUqkknTUaLUymruJ6epL+a7U6jo4O/enwbMyy7lO1qZUZ85sl6FR9jORoScbmCImR0B9jNrV5pu4FZJHVmHgEjMFWi8KjKQdLu+tJFvTq2Y7VG5ljYGYqDs0NpFRQe0cfk+BM+AlgtZ3CWXt2ceY3kpKTZJbHplzmqjMXhSJ7fpbhpfIPjL2aQ2aAdzkAAAAASUVORK5CYII=)}\n#webamp .media-info #stereo.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAMCAYAAACeGbYxAAAC9ElEQVQ4T22Uy09TQRTGf3NvoRSKFSxaH8QoQqKh+CDqAqOJiRb/A91q4goTl25d68KNf4orH4ku1ETFRI1KDIpCwAe1oC255fbOMWfubanR2dyZuTPnO9+Z73xmrDgpGEEAPAFfJ/EQ3+0itu1rBWNBPBCxG2eTM26jbd68i94R63BM8eCkGAXTIAroCzZl8TwP8eOgrYu6iAwi0QaY/J2Y+xEKokQiwYQGsRYFJVJgwYwdLon4BjosdAJdQCpJoNNCykBDsI2ElWJExiXXzrTJxIE2QEILgYmTDgTq4oA1X1McnxQ0eMZARpBegS4DaaE2WuHT1HMOTJ3eYNbQ8hpEq+MiJkyb38jGIFrGqoGqxOsAqGsyCnq0JHQLZKE+WmPx4nu8hse2B8OUT37h59gC/U8G2fy2wI8Tcy5Y/u5uVse/xaRyAdmXeVYmluisZth6Z4jatgqViQVSP9IUbo9gvoJUBdYECbW8x0siPSBZYe7GC8eg79UOMoubCPMBc+enKd4sMXP5EenlLP5aimCgir/e4UDT37v5Ob7AwOM9/B5aJrXaSXWkzMi1CcqnvxBm6xSuD0NVgYF1wRSPlURZKuj6/hqVM4usHvlK+nuWLS8HW6Bvr9yn98MAHb+6CDcFhLk63fM5et/l+XjpmQON0iE2HbEyuvQv6Iq+bRO0rbzlC/OUT80jPRG56QJ9z3cye/UpuentdC/lWJ747Nj1vslTG6rQM9vH1odDLJ2bYW3vivvXf28Xwd4qtcGKWxdu7SP9ugeaoHWrQjorqlrJWMh6uPftUqEk7ZKSWCxGFS5I4/8CaipNouReIE5IElhX2paQGgp66KzQYUCDJy1jfcEYi1XFq0EkLULcAWiHt4K3GURL4uoPYYRpKGii3HVNWNtN31RBdfixAxnfYNUUFECDa0e3DW3uFqt2F9LjalXNvJSReFgtp5pClFRMQxfHSuLsz0rMTPsr6UH7HxZNQ/jLpVoFaLfFxIWco+l8o0x/AH+fr0xHgSIjAAAAAElFTkSuQmCC)}\n#webamp .media-info #mono {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAMCAYAAACTB8Z2AAACCUlEQVQ4T3VUTShEURT+rsWwoYdGosyWhaY0VsZmMjsklmOtFAsLG7G1trNhOQvKhklpSg2ThPwmPxnGwuQnqSnlJ67uufe+d++b8Xr1bu/8fN859zuHRSKDHIwBnMN9xJkBUL+4OnDDxz0zTn6c/3rx5onMMhEjMMtoAwmTcDaBNDGugOzwX0otTV5qQaYMmExfFoR+Ggm0l0jEKkqr8wGySOeQoG2Qc3vnMrOqUoCajg602uhrvwyxKvPCQy1NSCT6cXV1i1Comb7hcBtWVtbx9lZEb2+MMO7vC/j4+EQ43Epf8aRSm5Z9YyPjFmK3kXNwBmiw2dl5TE2NIplcRTTagXz+AY2NQTw+vmB7ex/T02NEpKoqgK2tPQwPD+D6Ok/2TGYXMzPjWFxcRqHwpCoz20jFcbSEZGXlwBynhqrY2dnDxMQITk4u4DjVLtjx0Tm+vn8IbHJyBHNzCygW331qFJfJOCk+GHQQj0eRTK4hkehDOp1Fe3srnp9fcXOTQyzWTQAHB6cIBCrR0FCPs7NLillaSiHe04W6+lpks4fI5e5c4ag2SpHq0TJl65e852moVs2YKzMlOBKFoVLvztQgi+QMrGS2BIggoUfiPxWKO7fGQxMR4yuHWr724Ct1ChJKONLHvwO8zVEyIkryOq9dmdoWHmsJpNeZuRH8W0POko+xApMpOP4AEExfybH4J/EAAAAASUVORK5CYII=)}\n#webamp .stop .media-info #mono.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAMCAYAAACTB8Z2AAACCUlEQVQ4T3VUTShEURT+rsWwoYdGosyWhaY0VsZmMjsklmOtFAsLG7G1trNhOQvKhklpSg2ThPwmPxnGwuQnqSnlJ67uufe+d++b8Xr1bu/8fN859zuHRSKDHIwBnMN9xJkBUL+4OnDDxz0zTn6c/3rx5onMMhEjMMtoAwmTcDaBNDGugOzwX0otTV5qQaYMmExfFoR+Ggm0l0jEKkqr8wGySOeQoG2Qc3vnMrOqUoCajg602uhrvwyxKvPCQy1NSCT6cXV1i1Comb7hcBtWVtbx9lZEb2+MMO7vC/j4+EQ43Epf8aRSm5Z9YyPjFmK3kXNwBmiw2dl5TE2NIplcRTTagXz+AY2NQTw+vmB7ex/T02NEpKoqgK2tPQwPD+D6Ok/2TGYXMzPjWFxcRqHwpCoz20jFcbSEZGXlwBynhqrY2dnDxMQITk4u4DjVLtjx0Tm+vn8IbHJyBHNzCygW331qFJfJOCk+GHQQj0eRTK4hkehDOp1Fe3srnp9fcXOTQyzWTQAHB6cIBCrR0FCPs7NLillaSiHe04W6+lpks4fI5e5c4ag2SpHq0TJl65e852moVs2YKzMlOBKFoVLvztQgi+QMrGS2BIggoUfiPxWKO7fGQxMR4yuHWr724Ct1ChJKONLHvwO8zVEyIkryOq9dmdoWHmsJpNeZuRH8W0POko+xApMpOP4AEExfybH4J/EAAAAASUVORK5CYII=)}\n#webamp .media-info #mono.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAMCAYAAACTB8Z2AAACiElEQVQ4T32UTU8UQRCGn56PdQDX5VNAjWhEMRxUDCQYb15NMMGLiX/BxIuJJt5M/Al69OzReBGN8WA04kVEkRjk4kIiBzCShWU/ZqZM9c7sDgSty1RPV9dbVf2+bcbHpwVjwAjEgAMg4IGI+i0T0YCGyZ7N7F7zoIZHNptNZiyYmgUBcQXjG3BBHLFf+z8KMXgIYQvQtArRWtViiSAySCwWyIbHgoR7wTyBAwZ8kJz6jQzixpjIQWzriSVFWAAiHFz7tVYzEApxXTBlLVQwNTDjE9fFtq3JPQMBSD6GDoP4EbRlyk9yNUfpZ8DT8Yax7UbKCmCINxPAapyM0RgkiCBnoFMoTayzdPcdnQuDlIbXKSz18/vcKsNPL+Ft5Pg5PWdT51d6cas+G+eLODue/Tf07ALFqXnrH1zs4cijs0jZQCkdo96XdhQI5FtgF+9P8enhcwuyNrlEfqWP8sAf2tcK9H48wdc7Lyn8GCAMagy+H2H5xge71v3BmRF79sy9ywSfCwmYjlFvV8F82dXZfmDVwhZeJUf/29MWrPvLMapd5SaYrt0tn8Mzp/j24DWjt67gLQeZzrTnnCBtQBtUxkoUb84z/HiS5duzHH0xysZYkY5iFx2L3fy69p1azw69s0OEuRrVgW165o6zenWBoSdjjf38Dn2vTnLoTR/xZoypOCn1BfGxlLejzIG0R5jAbZDkHyapLBIWNmVZTrxtsfdlGdkkiCZTTamQXQVr6MzSXonzH4udhJFZkUdY2jt1iCtiZSB1pb4VdaInTeonmVVzqqE02T6Akuoqpb0KOfVVW6FpaLOuECbzgojouhWsnWarNSrH3e9XU+Rpc0q0JESi7NOmr6HwF2lYVBXpoCgfAAAAAElFTkSuQmCC)}\n#webamp #time #minus-sign {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAABCAYAAAAW/mTzAAAAF0lEQVQYV2OUUNT8/+L+dQYJRU0GGA0AVz4HY4h207oAAAAASUVORK5CYII=)}\n#webamp #time.countdown #minus-sign {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAABCAYAAAAW/mTzAAAAEElEQVQYV2Nk+MHwnwENAAAjgQH5sdp7TQAAAABJRU5ErkJggg==)}\n#webamp .digit-0 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAAPUlEQVQoU2OUUNT8/+L6dQZcQEJTk4GR4QfDfwYOnGoYGH4wIBRJKGoyvLh/nQGdRlGE06xRk4gPJ2LiDgC8hlZtbPrdogAAAABJRU5ErkJggg==)}\n#webamp .digit-1 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAAKklEQVQoU2OUUNT8/+L+dQYJRU0GbDTDDwYGRgYGhv8M+ABI0ahJgzGcAEuWbZlF2pZrAAAAAElFTkSuQmCC)}\n#webamp .digit-2 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAAUklEQVQoU2OUUNT8/+L6dQZcQEJTk4GRgYHhP04VIIkfDAyMYJPuX2eQUNRkwEaDFQ2ESQR994PhPwMHXv8xMDJAFeHyHUgcrgifWVQ0iZi4AwBgDEvDAzPYAwAAAABJRU5ErkJggg==)}\n#webamp .digit-3 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAAN0lEQVQoU2OUUNT8/+L6dQZcQEJTk4GRgYHhP04VIIkfDAyMYJPuX2eQUNRkwEaDFQ2ESSPadwCu5FDXBWnefQAAAABJRU5ErkJggg==)}\n#webamp .digit-4 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAAS0lEQVQoU2Nk+MHwn4GDgUFCUZPhxf3rGDTDDwYGRpgiBlwAWdFgMklCUfP/i+vXcbobJMHIwMDwH68KkO/AJmEJH5hvIeE0+EwCAP/lYJldypR3AAAAAElFTkSuQmCC)}\n#webamp .digit-5 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAATUlEQVQoU2OUUNT8/+L6dQZcQEJTk4GR4QfDfwYOnGrAEnBFEoqaDC/uX2fARtPbJOJ8x8DwH6/ffjAwMIJNwuErkDgDSBHDAJhEIO4A+GlLw9FRCeQAAAAASUVORK5CYII=)}\n#webamp .digit-6 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAARUlEQVQoU2OUUNT8/+L6dQZcQEJTk4GR4QfDfwYOnGrAEnBFEoqaDC/uX2fARg+ISXjcTZzvfhDhOwZkRThtpK5JxMQdAILzSMN7pNP0AAAAAElFTkSuQmCC)}\n#webamp .digit-7 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAANElEQVQoU2Nk+MHwnwEPkNDUZGBkYMCviOEHAwOjhKLm/xf3rzNIKGoyYKPBikZNonM4AQBoQGIDuih6MgAAAABJRU5ErkJggg==)}\n#webamp .digit-8 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAAOklEQVQoU2OUUNT8/+L6dQZcQEJTk4GR4QfDfwYOnGoYGH4wIBRJKGoyvLh/nQGdRlGE0yzqmjTqOwDVZk7XOqdJbQAAAABJRU5ErkJggg==)}\n#webamp .digit-9 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAANCAYAAAB7AEQGAAAAVUlEQVQoU2OUUNT8/+L6dQZcQEJTk4GR4QfDfwYOnGoYGH4wIBRJKGoyvLh/nQGdRlGE0yzqmkTIdyBnMDIwMPzH4zeI78AmYfEVzJcQ3w2ASQTiDgD1/U9ttsubdwAAAABJRU5ErkJggg==)}\n#webamp .play #play-pause {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAASklEQVQoU2OUUNT8/+L+dQYJRU0GEM3wgoGBQYIBzgeJMzIwMPxnQAYgRSAggRBkxGoSTB5qIm6TkBTiNwmqkAomEXQTQd+hhRMARcg3cZa2BEoAAAAASUVORK5CYII=)}\n#webamp .pause #play-pause {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAPUlEQVQoU2OUUNT8/+L+dQYJRU0GXDQjAwPDfwYCgJHhBZIiCQa4iQwvEDoxFMGl8CmCuY1WJhHjO2LCCQClmTRNgXndNwAAAABJRU5ErkJggg==)}\n#webamp .stop #play-pause {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAO0lEQVQoU2OUUNT8/+L+dQYJRU0GXDQjAwPDfwYCgBFmEsMLLColGMA2IEzCoQikdcBMwuNDuJvwhRMA5now6w5LPSgAAAAASUVORK5CYII=)}\n#webamp #work-indicator {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAT0lEQVQoU2NkeMHwnwEKBCOMYUyG9wfOMsI4jFRUxICwDm4XhIGwTkJR8/+L+9cZJBQ1wTIw9ov715HcRIxJfvwI6zZKInzHeAPJd1RTBABDlycKfbIKgQAAAABJRU5ErkJggg==)}\n#webamp #work-indicator.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAARUlEQVQoU2MUdDD+zwAF7w+cZYSxkWlG6iliYGCAW8fAwIDdOglFzf8v7l9nkFDUZHhx/zp2RUSZ9F8D4TvGGzh8RzVFAMv0IQqoJqssAAAAAElFTkSuQmCC)}\n#webamp .playlist-top-left-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWUlEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TllWjvk7ZyX9pb0jeRDhFvYqBDe5+kxzjR3hK6xImKqibtfUKXzEiXsosulowWkKRUQYx0SV10sYQeqQsAf0Ul/5LwY0QAAAAASUVORK5CYII=)}\n#webamp .playlist-top-left-spacer {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWUlEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TllWjvk7ZyX9pb0jeRDhFvYqBDe5+kxzjR3hK6xImKqibtfUKXzEiXsosulowWkKRUQYx0SV10sYQeqQsAf0Ul/5LwY0QAAAAASUVORK5CYII=)}\n#webamp .playlist-top-right-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWUlEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TllWjvk7ZyX9pb0jeRDhFvYqBDe5+kxzjR3hK6xImKqibtfUKXzEiXsosulowWkKRUQYx0SV10sYQeqQsAf0Ul/5LwY0QAAAAASUVORK5CYII=)}\n#webamp .playlist-top-right-spacer {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWUlEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TllWjvk7ZyX9pb0jeRDhFvYqBDe5+kxzjR3hK6xImKqibtfUKXzEiXsosulowWkKRUQYx0SV10sYQeqQsAf0Ul/5LwY0QAAAAASUVORK5CYII=)}\n#webamp .playlist-top-left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAB4klEQVRIS7VUu04DQQy0vR1UIFEghEAUdLR0FHQ0yaeAxA/e0STwEUBFBzRZJEQTNLb3xQUl0kGkZL13zs7O2B4+PDxbUv6wRsysXyIh/LLYqu9EbCVBYpXrMTLT8xQDZDKZFBj2QxQE+Wlvq6S9hHaP53q+5QVfiYU4gXTdHBewOwoTLdkY4KHHANC9r4gNFP8JyiBfIucMQOz24gdprPLY4TWICiissum7CqSwh4QVSN/NTUtXHywWi8dSrhFRlqvv50o7gcSPZ7q6OKajg+0Rx3uzpJoYiHUN6C/iE93cXo8G0DPbwrdM9na2/gPEuKBYMT6pXH/xqZjMfABNMtTk9GSfLs93R+OsAEltLPT59TIa4EdNZi6VSwbZRJo5ycNXDaM2CvJ04tcOI0CIYnxzsMq/dOisuc3HNBp4VLEctyD4W9tdxiTG1yFInnw1M2O3NBBj4M2f/aqYpV6utHDLZDqdZi9Ta2CXxKvEawwym2RrkDUIEZz5rn/IJskcKEjIBtl4lxupXkZHwD3LbeoXJhUIErUOVmAA6Sz5wSaXEMOpQwuSmmEjkKQ9JLIOC1aLFS5cM9kIpO/vjX5uUWvpAUiSi+z9r1bfdcOawDSLYb6XFk4dhkOr7tJa+KWqaaNvljee5+xL6DIAAAAASUVORK5CYII=)}\n#webamp .playlist-top-title {background-image: url(data:image/png;base64,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)}\n#webamp .playlist-top-right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAADGklEQVRIS41VTU9TQRQ9LyCJSAgJG0SgSPCbaKgREQsSdEl/gMYFO38C/gKXBPwDLl24khpiSEwxGElMYOFGQIOQICTKR/P6gBQ6M+beOzN9pUpI077OzJ177rkf5wU3rj80MAbuAwCG1kbzE3TCa0MHvNZGk5ncUe4/7dg71h8bAQiej47TTcBoKHtZgDR5kSddd461Kls7W7HjeMWdtc9kMggGUiOCayMvc2okaqM1xS+MtHNmz9hr6UzYC0v6zee3EPSnRijeWHoATdEG5FwYlIFw2qxTgiZQWtOHgomBUMBRtI0gkehg6NaW+9aADIF7TwZxJgpxVFfvnx9fTdm0SY16uvYx/3UBiytFl35c7ajG7ZtJzC5I6qJoC8GL0bRZ+7WH97OrFkih9/Egmgr+nv+zfRRi+s2sZ3Llcg5NhRw+/Vz3NqmLLbzeLyaZXUTpGpuQwk+MvUTLhT7ObyGaqkSwO7pqwHfc9x8zGOrtRMe5IlZzIdob6hmAmLW13SkxudV9iUFyO4pBKI+HeyeAVD/wTAikr6cRtcowAAGt74YWpIdTyul69nSIQShdwgQoRO9OzYRqQCkigP5kM15/WPQgRCXvapL9soPllU1fk6XlabQ3l4rpEJc3j9DZ+uiUNekupauyu6SFN5beYq+qlv0fBgeoMWeRSKTsrCgu6t2uA+6ub2s1nvm1xKF017xMCqfr+DBS4bUWkaFQeNKNlqfmkSzNiRtWnhHF9k5+TMDjJ+k6rl0ljXJS8h/t8kNHmKIIok4aw+lhzMzM2cJvx0CCcmciNZUC6eRFRNXqVEx2aJ9AstnPfMgTHxdI2nQieVqBFM0TFpOTk5yyCpB4TYJAQykncMprl2gVpUL5mlCNtFIwgeyTQRj+5lqm02lks3M8tMyEQZzAeUWlYwVdpCuiuiyUVoWdYouQikjSGYGQrYDE0nUcxEt+XP5Z3qkRFAx9qcvi6uxA8n9OBnHvAHLiWti/HW0LCxPFAJQqz9AGEeaJCSqZ/LOF7Zutof48pN81dnY3hIWdBWlb5sd7dXWNyDOTSpC/RTuMOsoqKj4AAAAASUVORK5CYII=)}\n#webamp .selected .playlist-top-left-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TkVWnvkzfnqmhvyf///2lviaujNe0tWTcplfaW0CVOVFQ1ae8TumRGupRddLFktIAkpQpipEvqoosl9EhdAAvFKfTd8tQbAAAAAElFTkSuQmCC)}\n#webamp .selected .playlist-top-left-spacer {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TkVWnvkzfnqmhvyf///2lviaujNe0tWTcplfaW0CVOVFQ1ae8TumRGupRddLFktIAkpQpipEvqoosl9EhdAAvFKfTd8tQbAAAAAElFTkSuQmCC)}\n#webamp .selected .playlist-top-right-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TkVWnvkzfnqmhvyf///2lviaujNe0tWTcplfaW0CVOVFQ1ae8TumRGupRddLFktIAkpQpipEvqoosl9EhdAAvFKfTd8tQbAAAAAElFTkSuQmCC)}\n#webamp .selected .playlist-top-right-spacer {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU1nL+z0BjwFhRPoH2ltjZJAwTS+TkVWnvkzfnqmhvyf///2lviaujNe0tWTcplfaW0CVOVFQ1ae8TumRGupRddLFktIAkpQpipEvqoosl9EhdAAvFKfTd8tQbAAAAAElFTkSuQmCC)}\n#webamp .selected .playlist-top-left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAB5klEQVRIS7VUO04DQQy1PWeALg0NNLkBQlxg03EBrkDFLbjRLk0CV6BKItEBRXaQEE2Qf/NhEyXSQqRkPLvOvHnP9sPJZLqF9EGJEFG+AAT8i6SrvCPSFYgTi1yLOdOfe8wgTdNkGLRDBITzfa8r+Z5Cvefncr7mBVsBCdBB2nbBF9A7EgJsURnwQ4sZQPa2cqyg/J8gDNIlUs4ARG9PdpDEIo8eXoKIgIQim7wrQDJ7lrAA6dqFamnqM4tNv8zlGhElubpuIbQdpP9cw8PdNVxdnow43prFa6Ig2jVMfxNXsFq+jAaQM+vC10zOz07/A0S5cLH6uBK5/uJTMJnbAKpkXJObZgr3txejcXaAeBsTfH2/jgb4VZO5SWWSsWxE1Zyk4SuGURqF82TiDw4jgwDE+G5ghX/J0Glzq49JNPCobDlmQexvdXcpkxjfhiBp8sXMlN1WQZSBNX/yq2yWcrncwjWT2WyWvEysAU0SqxIeMMhkkrVBliAA7MyP3XMyScQAgUIyyMq7zEjlMjIC5llmU3uYFCCcKHXQAjOQzJIdrHIRIDt1qEG8GY4Cce1ZIu2woLXY4cIlk6NAuu5J6acW1ZYegLhcoO/3Wn3bDmvCpumG2ceP3MLeYXxo0V1SC7tUMW3wA7D0otyFjhEjAAAAAElFTkSuQmCC)}\n#webamp .selected .playlist-top-title {background-image: url(data:image/png;base64,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)}\n#webamp .selected .playlist-top-right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAADEElEQVRIS41VTUiUURQ9j8ooBpLEhfkXViY5BBlmgRbkKnD2bQQ37cuCor3VJolWtWkdBC2cRasYScmF6MIMxNRM+iNHs5nBaJj3Xtx733vzzXwZzuA8v/fuu+ee+3M+1Xmq38Ja+C8AWHq2hlfQCT9bOuBnYw2ZyR3t/6cdd8f5YyMA6s7tR3QTsAbaXRYgQ15kpevesdEVz95W7Dhecefs0+k01MXeIcF1kVc4tRK1NYbiF0bGO3Nn7LV8JuyFJf3m81movt4hijeSHsBQtIqcC4MKEE6bc0rQBErP9KVgIiAUcKGwAdXSeoKhW5rOOwMyBIZvDfqUhvXByFOXNqnRueQ2fhWLWFqYDzbHO5I4VFODiVlJXaGQhcrO3rVvJtdx/eG4A9K4cXMQbd0NMZCV6W+4N/IkMDnZvoWr/W14NfGZwcj5lb4mPH+9grn5GmZXoHRZx6/1aDuaG3s4v8m27zEAvzH9PhE6bo+ZxNnTXex4eWERxzraGXBmbhbbpTNlJpcud3K6Pi4XGYTy2NK8xlFVfyjaxaW6wIRAKD3djSUMj05hdPgCpr/s5fRtl7o4pZyul4+vMQilS5gAzU2rvEaBCIA+ix8O75JJF89V3tfk/rMFvEi/CzU5uP8T6upVjMlq9giKW392WZN95XTFu0taOHFgLQaymat3s6K5qD3J3zt314xMCqerehip8MaIyFAoPOnWyGp4JMtz4oeVZ0SzvZcfq3j8JF3V2lXWKC8lO2hXGDrCFEUQdTIYSA1gfHzKFX4jAqIqnYnUxAXSy4uIqtOpiOzQPoFkMm/5kCc+KpC06UVytwIpmicsxsbGOGUxkGhNlDLQ2gucDtolWkWp0KEmVCOjNaySfTLI5X5wLVOpFDKZKW51ZsIgXuCCotKxhinRFVFdFkqnwl6xRUhFJOmMQMhWQCLpqgYJkh+Vf5Z3agQNS3/UZVF19iD59f+D+HcAOfEtHN6OroWFiWYASlVg6ILI5YkJ4kz+2cLuzUZOa2sbeC42f34VFm4WpG2ZH+8lEnXIM5M4yF+Df4Y6HTjM3gAAAABJRU5ErkJggg==)}\n#webamp .playlist-middle-left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAdCAYAAACe/43ZAAAAN0lEQVQ4T2OUldX97+vry7B//zEGEPjy5S2YRhaDiT9+fJmBcVTDaCghksto0hjND6P5gUr5AQCjdNAQLfmj1AAAAABJRU5ErkJggg==)}\n#webamp .playlist-middle-right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAUElEQVRIS2NkYGD4n5VVxbB//zEGGPjy5S0DD48wnI/McHS0QlGLzAfpYxw1EBxco2GIknxGkw3DaE4ZLRygeWK0cBgtHEarUaSWxNBoOQAAIuzbu7bX7tYAAAAASUVORK5CYII=)}\n#webamp .playlist-scrollbar-handle {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAASCAYAAABmQp92AAAAfklEQVQoU2O8dWrOfwY8gBGkYPPyORhKUhv3MIgL8DHAFRg6uDKYWXqCFf7j0GPYtzyLITJzCUJBemUfQ2NRDIO1rQ2DS2AGw571M0YVDFA4gGKP6cclcGQtn9HMICouiogLCY0IcOwhg6OHjzBMWfaAgbG30OJ/zcRTOJMMAMDIzB6ZAs/NAAAAAElFTkSuQmCC)}\n#webamp .playlist-middle-right:active .playlist-scrollbar-handle {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAASCAYAAABmQp92AAAAg0lEQVQoU2PcMDPuPwMOUFC8iIERpGDPjl0YSvIqWxjcnFIQCkxNjRmUNLTACsVl1Bk2L5/DMHn2CYSC8NhYhpWLFzMoKigwmNnaMpw6fHhUwQCFAyj2Xj65CY6sTevWMkiIiiHiQsvQDhx7yOD+gwcMW3a/YGAsjVH6v3rDPVxphgEAXbbPGTYFLkoAAAAASUVORK5CYII=)}\n#webamp .playlist-bottom {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAmCAYAAAAxxTAbAAAAXUlEQVRYR+3XMQ0AIAxEUaoGCyz4QAgqMA3BAX+g0+98SZPXWxpzrl0+T7Q2XPKMLNcz1Q3KJRcSQGHbJRcSQGHbJRcSQGHbJRcSQOGcdtXa/78OKUv8tEi9IuMmB/QdRE7mzrbgAAAAAElFTkSuQmCC)}\n#webamp .playlist-bottom-left {background-image: url(data:image/png;base64,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)}\n#webamp .playlist-bottom-right {background-image: url(data:image/png;base64,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)}\n#webamp .playlist-visualizer {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAAAmCAYAAACMJGZuAAABYklEQVRoQ+2asU6DUBSGf5wd7GACT9DoE3TxEdhN2sXgBiNP0dW6ldHBB/BVrIszHR1MHDXcRkJbW87pZvhYyA0/CXz5OPdy743Kcv4tDhOBaDK5BZYJlQQsI6gmBixgOQg4opgFLAcBRzQaj2/oDQ3A0jRVJAlYBlhlOd/AiuMrrdcrcT7MYTa7wyyDVCHSmqX8RXqcKo4TDDvwhXXMupD0YYU8yFxrVrb8UnWfYNaR2t0x61zS5yCNsb70ds2qCiWjM9X1O73iH4ZhllWrbm9IzeofZ2LWKWaFcRY162itxqxTzKJmUbMc3vRHGWc5ZluoWf1CtQn+DTHLoYsjSs3CLIcujuhezVL+FGZMs2Ud5re225dS/rx/vSqULV5VFddStgh/AqH9e/9/ub77vDvt0dsDc/BWuYJZzbphsybG0U+ARdZ+Rm0CWB5Y7Pyz02IXjZ0Vm9kcrDa9oeeGIWd/AMBk7SRwRvKPAAAAAElFTkSuQmCC)}\n#webamp #playlist-window-shade {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAOCAYAAADaOrdAAAAAO0lEQVQ4T2OUldX9z0BjwJiVVUV7SzQ1HWhvCQMDw6glRCcXxtHgIjqsGBgYRoOLlNBiYKRLjqdHAQkAcAIRQSkykpIAAAAASUVORK5CYII=)}\n#webamp #playlist-window-shade .left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAOCAYAAADaOrdAAAAAO0lEQVQ4T2OUldX9z0BjwAiyxNfXl6bWwC3Zv/8YzSzCsOT69QNUt2zUEpKCdDS4RoOLxjmepAAmQzEAZP9NQVGxvRAAAAAASUVORK5CYII=)}\n#webamp #playlist-window-shade .right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAOCAYAAABth09nAAABNUlEQVRIS2OUldX9zzAMAGNWVtWQ98jmzZsZGDU1HYa8R758ecvAyMDAQHWPaGo60DWxDrhHvr04heFhLgkzFDE7YyaGs5fOMdy49wcurqHEwmCsZ8Rw6Ow/sBhNPRKQGMewYf4inDED8oSoLBuDfWoXipo1dQUMyJ7R1/3DIPHzA8OR+0/g6mwUZcD8r78N6OcRXB7iZr0AdgS6Rw7OLoM7ECT/+PEZBicLFQYl7j8MDz58YlAQ4AN7AhRDsrIm9PcIuodAHolKbmB4ysSFEiPYPGJlJszA9fc/2BMgzzx5/2nweQTZF8vmNoC5sCQDixFQngAlJ5AnbI2kGJbvvTFwHkHPLKA8kt/QhiIM8sjrx78GZx7BVw6TUmpdf8gGN0pT/hf9Si16ViTg4nfY1OzDpdEIALsl0qNGyZxIAAAAAElFTkSuQmCC)}\n#webamp #playlist-window-shade.selected .right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAOCAYAAABth09nAAABRElEQVRIS2OUldX9zzAMAGNWVtWQ98jmzZsZGDU1HYa8R758ecvAyMDAQHWPaGo60DWx0tQjAYlxDBvmL8LrIRmJ3xjyT16woojZGTMxfPz1i+HOjStwcRUNHQZ+NjaGQ2f/gcVo6pFr1/YzaGk5MuDyEMgTXBx/GVS8khgspWTBDjr+7DHDpXULGZA9o6/7hyHCWYlh++EnYA+BPOBpK8OwYu89houXWejnEVweUlP4AXZEbEo9SgwsntPIcOsBB1yMm/UCg7GeEdjxd2/cYlDWUAN76uylcwxffxvQ3yPoHgJ5pH7mDIZ7p58T9AgoKZlK/2Eo6jvO0FdkyXD6KQs4qQ0qjyD7ojE9A8wd1DGCnldAecQzIJTBIRBSwh1Yf4Dh4I4VDN9+MA/OPIKv9BoSpRYxxS+1Khtw8Ttsavbh0mgEADDr8aM6z+iGAAAAAElFTkSuQmCC)}\n#webamp #playlist-add-menu.selected .bar {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2CAYAAAACnyOhAAAAQUlEQVQoU2PU13f5z8DAwCCuKMnACOLsu7CbITIwjoHRLSD2//L1iyCcxklL/+fkRo1yRsOALukAJfGhJEvkBAsAupQFUs0CrSgAAAAASUVORK5CYII=)}\n#webamp #playlist-add-menu .add-url {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAxUlEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJHaDC7KqwJZMmNYGpmF8QmIgg8+cu8Rw9doNTINBhiAbCGITK0bQYOQwoarBNHMxNoNhvsAX7niDgpKkQdBgWGQh0+gpAuZyZIeQZTByJCKnEooNHvwuRk4FuMIc2RcgNsEwJjdlYDUYVCpRA6CUFSADQaXSjw8fqWE2pBBqnLT0/7VLFxm+f/lBFUNhhgAA/49tOUJp/M4AAAAASUVORK5CYII=)}\n#webamp #playlist-add-menu .hover .add-url {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAwUlEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GSIAXtZUlghZVd88A0jE9IDK/BIEOQDQSxiRUjaDByuFDVYJq5GJvBMF/gC3eCkUduEiFoMCyykGn0FAFzObIjyDIYORKRUwnFBg9+FyOnAlxhjuwLlCwNKt3cnO0YQGUFcpamOFX4hCaAizpqAgBWFyajBHSbnQAAAABJRU5ErkJggg==)}\n#webamp #playlist-add-menu .add-dir {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAxklEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJHaDC7KqwJZMmNYGpmF8QmIgg8+cu8Rw9doNTINBhiAbCGITK0bQYOQwoarBNHMxNoNhvsAX7niDgpKkQdBgQqkCXR7mGKIMxhVpsOSHLg8Sp4rByGl6cLgYXy6DZRjkjENUUJCbMrCGMahUogZAKStABoJKpR8fPlLDbEgh1Dhp6f9rly4yfP/ygyqGwgwBADtYajn7H/rNAAAAAElFTkSuQmCC)}\n#webamp #playlist-add-menu .hover .add-dir {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAxElEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GSIAXtZUlghZVd88A0jE9IDK/BIEOQDQSxiRUjaDByuFDVYJq5GJvBMF/gC3eCkUduEiFoMKFUgS4PcwhRBuOKNFjyQ5cnOh0TMhg5TQ8OF+PLZbAMg5xxUIICVLq5OdsxgMoK5CxNcarwCU0AF3XUBADAGyOjMQhxYAAAAABJRU5ErkJggg==)}\n#webamp #playlist-add-menu .add-file {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAyUlEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJHaDC7KqwJZMmNYGpmF8QmIgg8+cu8Rw9doNTINBhiAbCGITK0bQYOQwoarBNHMxNoNhvsAX7niDgpKkgdNg9NjHxoe5GFtqwWswskaYZvSggfkKObWAxAi6GN1V+AxGTtsD42J8YUgoDuibKkClEjUASlkBMhBUKv348JEaZkMKocZJS/9fu3SR4fuXH1QxFGYIAOSdZzlhL3RPAAAAAElFTkSuQmCC)}\n#webamp #playlist-add-menu .hover .add-file {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAy0lEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GSIAXtZUlghZVd88A0jE9IDK/BIEOQDQSxiRUjaDByuFDVYJq5GJvBMF/gC3eCkUduEsFpMHrsY+PDXIwtteA1GFkjTDN60MB8hJxa8KZj9PRLjMHIaXtgXIwvDAnFAdzFoNLNzdmOAVRWIGdpilOFT2gCuKijJgAAmGkgo+t23qUAAAAASUVORK5CYII=)}\n#webamp #playlist-remove-menu.selected .bar {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAABICAYAAAAzt08QAAAAQ0lEQVQ4T2PU13f5z8DAwCCuKMnACOLsu7CbITIwjoHRLSD2//L1iyCcxklL/+fkRo1yRsNgNB1QNS+gZDOUDIicNQGQKl5oRVLWVQAAAABJRU5ErkJggg==)}\n#webamp #playlist-remove-menu .remove-all {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAz0lEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKbBBVlVYAsmTGsD0zA+TAzEh8nB5GF8kMFnzl1iuHrtBnaDQQphBmAzCNkSZEcQNBibi7H5ABZ2VHMxLh8RdDG6RmSXkR3GlCQNvC6GGYzsMnyuRHYIQYPRUwRVDSY2XAePiwmlDPQ0DOITDGNyUwZWg0GlEjUASlkBMhBUKv348JEaZkMKocZJS/9fu3SR4fuXH1QxFGYIAIHZXjlfaoVhAAAAAElFTkSuQmCC)}\n#webamp #playlist-remove-menu .hover .remove-all {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAyklEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GS7WVJYEWVXfPANIwPEwPxYXIweRifoMEghTADsBmEbAmyIwgajM3F2HwACz+quRiXjwi6GF0jssvIDmNKkgdeF8MMRnYZPlciO4SgwegpgqoGExuug8fFhFIGehpGydKg0s3N2Y4BVFbAsjRVUoVPaAK4qKMmAAC+RxejCM8pKAAAAABJRU5ErkJggg==)}\n#webamp #playlist-remove-menu .crop {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAtUlEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJPUNPnPuEsPVazeGg8EFWVXgsJ4wrY0BmQ0Sg/FxyYPCGGtQgDSCDIQBGJ9YmiSDYa6DuRjmE2w+IslgdIOw8WE+xGkwcjjiMhBmCLI8UQZTkkvwunjUYAZQqUQNgJJBQAaCSqUfHz5Sw2xIIdQ4aen/a5cuMnz/8oMqhsIMAQDtwTQ5dchcrgAAAABJRU5ErkJggg==)}\n#webamp #playlist-remove-menu .hover .crop {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAsklEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GSlNgwzAxuL0sCh0Zl1zwGZDZIDMbHJY8zKEAaQQbCAIxPLE2SwTDXwVwM8wk2H5FkMLpB2PgwH+JNFehhjM2FyGGMHHTDLLlRJeeBSjc3ZzsGUFlB1SztE5oALuqoCQCsDO2UslYpHgAAAABJRU5ErkJggg==)}\n#webamp #playlist-remove-menu .remove-selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA5ElEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKbBBVlVYAsmTGsD0zA+TAzEh8nB5GF8kMFnzl1iuHrtBnaDQQphBmAzCNkSZEcQNBibi7H5ABZ2VHMxLh8RdDG6RmSXkR3GlCQNvC6GGYycOgilDJgeggbj8y56EkP2IUGD0TVjS9vIaZloFyMHB3JEooujxwdBFxOT+9DTMIhP0GByUwZWg0GlEjUASlkBMhBUKv348JEaZkMKocZJS/9fu3SR4fuXH1QxFGYIAJm8VTm7Ep9qAAAAAElFTkSuQmCC)}\n#webamp #playlist-remove-menu .hover .remove-selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA30lEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GS7WVJYEWVXfPANIwPEwPxYXIweRifoMEghTADsBmEbAmyIwgajM3F2HwACz+quRiXjwi6GF0jssvIDmNKkgdeF8MMRk4dhFIGTA9Bg/F5Fz2JIfuQoMHomrGlbeS0TLSLkYMDOSLRxdHjg6CLicl96GkYJUuDSjc3ZzsGUFkBy9JUSRU+oQngoo6aAABgkw6jjjEMZwAAAABJRU5ErkJggg==)}\n#webamp #playlist-remove-menu .remove-misc {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA50lEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKbBBVlVYAsmTGsD0zA+TAzEh8nB5GF8kMFnzl1iuHrtBnaDQQphBmAzCNkSZEcQNBibi7H5ABZ2VHMxLh8RdDG6RmSXkR3GlCQNnC7G5RpkcVypBuRLvAbjinH0pIWNT9Bg5OBADm90w9B9SDAo0NMwMUEEspSgwTAXY7MAOY0j50y8YUxJisDpYlCpRA2AUlaADASVSj8+fKSG2ZBCqHHS0v/XLl1k+P7lB1UMhRkCAANgcDl4PeWiAAAAAElFTkSuQmCC)}\n#webamp #playlist-remove-menu .hover .remove-misc {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA30lEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GS7WVJYEWVXfPANIwPEwPxYXIweRifoMEghTADsBmEbAmyIwgajM3F2HwACz+quRiXjwi6GF0jssvIDmNKkgdOF+NyDbI4rlQD8iVeg3HFOHrSwsYnaDBycCCHN7ph6D4kGBToaZiYIMKb8wgZgB6+yDkTJYxBpZubsx0DqKyAZWmqpAqf0ARwUUdNAAAswymjNONjvgAAAABJRU5ErkJggg==)}\n#webamp #playlist-selection-menu.selected .bar {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2CAYAAAACnyOhAAAAQUlEQVQoU2PU13f5z8DAwCCuKMnACOLsu7CbITIwjoHRLSD2//L1iyCcxklL/+fkRo1yRsOALukAJfGhJEvkBAsAupQFUs0CrSgAAAAASUVORK5CYII=)}\n#webamp #playlist-selection-menu .invert-selection {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA4klEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKbBBVlVcAsmTGtjAPFBNAjA2NjEQPIgg8+cu8Rw9doN7C5G1wjShGwJVQ2GeQOXL8hyMcwwmMthwYLMJ2gwMWFMlsGUJA2CkQczHOZ65KBAj0hkhxBlMHLMIyc1ZEthyRAmRpTB6IYhux6bRQQjDz2MsWUKigzG5kL0tIzMJ9nFpKQSrGEMKpWoAVDKCpCBoFLpx4eP1DAbUgg1Tlr6/9qliwzfv/ygiqEwQwBqVFI52rK2lAAAAABJRU5ErkJggg==)}\n#webamp #playlist-selection-menu .hover .invert-selection {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA30lEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg0GS7WVJcAsqu+aB+SAaBGBsbGIwTTgNRjYAxgbRyJZQ1WCYi3D5giwXwwyDuRzdJ8iRQ1EYk2UwRUkDX6qAGQxLHcgpAlc4ExUU6KkC2SKYJbjU4E3H+AxCjzxki4hKFdgMR067ZLsYPXyRUwFyZkEOcwwXg0o3N2c7BlBZAcvvlKQMeDr2CU0AF3XUBABW4wujyY5pEwAAAABJRU5ErkJggg==)}\n#webamp #playlist-selection-menu .select-zero {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA4klEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJG6DC7KqwBZNmNbGAGMj80Hi6ABk8JlzlxiuXruB3WCQQcgaCfFhFhA0GKQQ2TBk16PLIbuaKIORDaCai7G5EOYybGFOUlCQk0RwBgW22MfmUlwRSzCMYWGKK2zR5WF8vAYTSg2wtIwtcvEGBTHpl2QXExPGsFQBcwCyDwmGMTkpAqQHq8GgUokaAKWsABkIKpV+fPhIDbMhhVDjpKX/r126yPD9yw+qGAozBACRSl45f6oTpAAAAABJRU5ErkJggg==)}\n#webamp #playlist-selection-menu .hover .select-zero {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA3klEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GSMBvay5LAzMqueQwwNjIfJI4OCBoMMghZIyE+zAKCBoMUIhuG7Hp0OWRXE2UwsgFUczE2F8Jchi3MSQoKcpIJzqDAFvvYXIorYgmGMSxMcYUtujyMj9dgQqkBlpaxRS7eoCAm/ZLsYmLCGJYqYA5A9iHcxaDSzc3ZjgFUVqBnaYpShU9oAriooyYAAM3kF6ONYWgIAAAAAElFTkSuQmCC)}\n#webamp #playlist-selection-menu .select-all {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA00lEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJG6DC7KqwBZNmNbGAGMj80Hi6ABk8JlzlxiuXruB3WCQQcgaCfFhFhA0GKQQ2TBk16PLIbuaKIORDaCai7G5EOYybGFOUlCQk0SICgr0MMYXmUS7GGYoOg0zAD3MSTIYPUwHv4thsY8r5yH7iOigICdFgPRgTRWgUokaAKWsABkIKpV+fPhIDbMhhVDjpKX/r126yPD9yw+qGAozBAA1LkY5sSVjZAAAAABJRU5ErkJggg==)}\n#webamp #playlist-selection-menu .hover .select-all {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAzUlEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GSMBvay5LAzMqueQwwNjIfJI4OCBoMMghZIyE+zAKCBoMUIhuG7Hp0OWRXE2UwsgFUczE2F8Jchi3MSQoKcpIJUUGBHsb4IpNoF8MMRaeRkyLZyQ09TAe/i2GxjyvnIfsII4xBpZubsx0DqKxAz9IUpQqf0ARwUUdNAADgi/+URj4UywAAAABJRU5ErkJggg==)}\n#webamp #playlist-close-button:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAaUlEQVQoU2NcNyn1PwMBwAhStPPUXbCys1dewZUb64iB2e5mygxwRSAFMAmYBhAfrqht3nGwApDCIHdFhnU778P5VUmWEJNgiuSluRkqOzYxtFf4MTx8+hWsCUMRXpNADifoJqJ8RyicAPgiWc7t6MAqAAAAAElFTkSuQmCC)}\n#webamp #playlist-window #playlist-shade-button:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAfklEQVQoU2NcNyn1PwMBwAhTJCAvgaH0w8MXYDGwIpiCb/+4GLiYvoElYGyQQrCinafu4rTQ3UwZomjVkesM/GxsGAo//vrFEGajiVAEUoGsEKQABOCKFm6/zMDJy4Jh0vfPfxjiPXUhJoFkQQph4NsPZgYujr9gBXDfEQonAAsIPs5hB3ZRAAAAAElFTkSuQmCC)}\n#webamp #playlist-window-shade #playlist-shade-button:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAhklEQVQoU2NcNyn1PwMBwAhTtHD7ZYZvP5gZuDj+wul4T12wdrAikAIQSE3zZ+Bi+sbw7R8XmJ44YzcDSCFY0aoj18GK0qIdUSyetXQ/Q5iNJkJRZpQ6w19GKcKKkFVMX3YTzIWbBHJTUbo2iikgRd8//0G4CSSL7DsQH+TTzEAthO8IhRMAYlxOzpLQgy0AAAAASUVORK5CYII=)}\n#webamp #playlist-misc-menu.selected .bar {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2CAYAAAACnyOhAAAAQUlEQVQoU2PU13f5z8DAwCCuKMnACOLsu7CbITIwjoHRLSD2//L1iyCcxklL/+fkRo1yRsOALukAJfGhJEvkBAsAupQFUs0CrSgAAAAASUVORK5CYII=)}\n#webamp #playlist-misc-menu .misc-options {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA5klEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKrBBVlVDBOmtcEtgPGRxUFsEICpQ+aDDD5z7hLD1Ws3MA2GaUI3ACSOy2KYSwgajBwmIJehuxjZtcg+xGswskHYggLZ5eg+IGgwzMXoBuMKHljw4TSY0mRBVBjDggRbCiArVRAKY1wRCbKMYBgjhy2y6wglOZIMRk5O2AxGFiMpjPEZjJ5K6JsqQKUSNQBKWQEyEFQq/fjwkRpmQwqhxklL/1+7dJHh+5cfVDEUZggA6r9zORPR0jkAAAAASUVORK5CYII=)}\n#webamp #playlist-misc-menu .hover .misc-options {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA4klEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg0GS7WVJDJVd8+CWwPjI4iA2CMDUIfPxGgzThG4ASByXxTCXEDQYOVxALkN3MbJrkX1IMCjQg4CYIKIojHEFDyz4cLqYoqRBKFXADIeFLbYUQFaqQI4sXMmNKpGH7DpCSY7kVIEc9ugpBNkyotIxevqFGY4vF8INBpVubs52DKCyApbfKUkZcIN9QhPARR01AQDlrCyjhQgNHQAAAABJRU5ErkJggg==)}\n#webamp #playlist-misc-menu .file-info {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA3ElEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKrBBVlVcMMnTGtjwMYHicMAujzI4DPnLjFcvXYD02BkjSADQJphYshsdDkQH6/BIAXorsJnMLL6gXExvjAkFAc4XUxpsiBoML7UAItAdDV4Iw/ZxeipARZJyAajpyCCLsaWzJAtRU7jyIaTZTC6YehpmqigIDaMyQoKclII1qAAlUrUAChlBchAUKn048NHapgNKYQaJy39f+3SRYbvX35QxVCYIQA1xVg5eUBbSwAAAABJRU5ErkJggg==)}\n#webamp #playlist-misc-menu .hover .file-info {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA2klEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg0GS7WVJcAsqu+Zh5YPEYQBdPV6DkTWCDABphokhs9HliHIxuqvwGQwyECY/MC7GF4aE4gCniylKGvhSBa7YxhaB6K7HG3nILkY3DBZJMHH0FEKRwTCLkdM4cpwQFcb4vA8zGD3NEzQYW+yjp2W8QQEq3dyc7RhAZQUsv1OSMuAu9glNABd11AQAz0sRo7oISqQAAAAASUVORK5CYII=)}\n#webamp #playlist-misc-menu .sort-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA3UlEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKbBBVlVYAsmTGtjgLHR+SA5EECXBxl85twlhqvXbqAaDFII0wTTCLMAG42sBsTGaTC6QphFyDTM9bBwQ3YMXoOJcSmyYUQZjBy+2MIQ3QckBQUlSYOkyINZhJ4SsKUaog3GFZnIviI6jJGTG7rBhPhkuxhbEiPaxchhSijnDWyqAJVK1AAoZQXIQFCp9OPDR2qYDSmEGict/X/t0kWG719+UMVQmCEAOvJtOYBqTYQAAAAASUVORK5CYII=)}\n#webamp #playlist-misc-menu .hover .sort-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA3klEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GS7WVJYEWVXfMYYGx0PkgOBNDlcRoMUgjTBNMIswAbjayGKBcjuwjdQJjrYWGH7Bi8QUGMS5ENI8pg5PDFFoYwQ0g2mKKkgS9VYIs8mGXoKQFbqiE6VaDHOrrFRKcKQhrRDaKqwfh8gTcokMOUUM7D6WJQ6ebmbMcAKitgWZqSlAF3sU9oAriooyYAAJHDJqNZ1LMcAAAAAElFTkSuQmCC)}\n#webamp #playlist-list-menu.selected .bar {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAA2CAYAAAACnyOhAAAAQUlEQVQoU2PU13f5z8DAwCCuKMnACOLsu7CbITIwjoHRLSD2//L1iyCcxklL/+fkRo1yRsOALukAJfGhJEvkBAsAupQFUs0CrSgAAAAASUVORK5CYII=)}\n#webamp #playlist-list-menu .new-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA5klEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKrBBVlVDBOmtYEtgLFBNAyA5JDVIKsDsUEGnzl3ieHqtRuYBoMUIBuAyyBki2GOIWgwugthlsFciB5mRBkMcy26y2GGwYIGXR3BoKBJGFOaLPCGMczF6OGJ7BPkYEKOD6INRk9O6CmEpOSG7GJ0jYT4ZLsYOWWgRzLBVIEtDaOHKXo8EEzHNEkVoFKJGgClrAAZCCqVfnz4SA2zIYVQ46Sl/69dusjw/csPqhgKMwQAAehnOSUAq6UAAAAASUVORK5CYII=)}\n#webamp #playlist-list-menu .hover .new-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA4ElEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg0GS7WVJDJVd88CKYGwQDQMgOWQ1yOoIGgxSgGwALoOQLYY5Bq+LkcMEZgHMMpgL0cONKIPRDcPmYmRfIVtK/zCmKGkQmyrQwxM5taAHBYxPVFDAXI8tCSL7DFmebIPR0y1J6RjmZWwuJuQLotIxcrLDlbxwuhhUurk52zGAygpYfqckZcBd7BOaAC7qqAkAtaUgo0lr1DsAAAAASUVORK5CYII=)}\n#webamp #playlist-list-menu .load-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAyUlEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKrBBVlVDBOmtcEtAPFhACSOiw/TAzL4zLlLDFev3SBsMMxAYmiKDEb3AbKFFBmMz+V4DSYUpugGg9QTDGNKkwVJQYHsAxAbljKwpRKiDYYZBPMqenJElyfbYHSDqGowPl9QlCqQUwHRLqZJqgCVStQAKGUFyEBQqfTjw0dqmA0phBonLf1/7dJFhu9fflDFUJghALK8djkycqE+AAAAAElFTkSuQmCC)}\n#webamp #playlist-list-menu .hover .load-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAAyUlEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg0GS7WVJDJVd8+CWgPgwABLHxYfpIclgmIHE0BQZjO4DZAspMhify/EaTChM0Q0GqScYxhQlDUpSBchiWMrAlkqIDmOYQTCvoidHdHmyDUY3iKoG4/MFRakCORXgdDGodHNztmMAlRWw/E5JyoC72Cc0AVzUURMAAIAPL6NBI7P5AAAAAElFTkSuQmCC)}\n#webamp #playlist-list-menu .save-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA2klEQVQ4T2Ncu+XIfwYqgyv3HjIwggx28LammtEHth5lWLVhE8LgS+euUGz4u+cfGUCuPXvsJKbBBVlVYAsmTGtjgLGR+TBxbPIgg8+cu8Rw9doNVINBBoE0wACMT4iGqcdpMEgBsuHEuhjmGLwGIxuOzaUw1yEHCUEXI4cvNgsI+Yigi8lNHiRFHrLXYS7GlWqINhib15FTDbo82QajG0RVg/H5Aq+L0ZMTNj62TARSR99UASqVqAFQygqQgaBS6ceHj9QwG1IINU5a+v/apYsM37/8oIqhMEMAbA9tOQyliQIAAAAASUVORK5CYII=)}\n#webamp #playlist-list-menu .hover .save-list {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAYAAABfJS4tAAAA3UlEQVQ4T2OUVND6z0ADwMjNL0Y7g2OyChiEBCUodve79y8YPrz+wLBl9QIGsIvzqjsYTIzUKDYYZMCZc7cYJrVWoBp8595Ligz/8OEjWD9Wg2GS7WVJYEWVXfMYYGxkPkwcmzxOg0EGgTTAAIxPiIapJ+himOHEuhimHq/BINvxuRDmOuQgIehi5PDFZgGyGIyNbBFBF5ObREiKPGQXIbuSolSBzevIqQZdnmgXo2skxKfIYHy+wGswenLCxseWiVCyNKh0c3O2YwCVFbAsTW6KQDHYJzQBXNRREwAAw2Qmo1Y+1W0AAAAASUVORK5CYII=)}\n#webamp #equalizer-window:not(.shade) {background-image: url(data:image/png;base64,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)}\n#webamp .equalizer-top {background-image: url(data:image/png;base64,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)}\n#webamp .selected .equalizer-top {background-image: url(data:image/png;base64,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)}\n#webamp .band {background-image: url(data:image/png;base64,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)}\n#webamp .band .slider-handle {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAbklEQVQoU2PU1HT6f//+OYYfPz4w4AIcHAIMiopGDIwcHAL/r967iVMhSCK3pIlh37qlCMUXrt/FquHc8XMM569dp4LiaG8vuA1Lt25jGMwmr9u6j+HDy7dYQwQjNEBhiQ+AwxlfDIJiDgZAMQgAyhp/SXLWaDcAAAAASUVORK5CYII=)}\n#webamp .band:active .slider-handle {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAU0lEQVQoU2PU1HT6f/36PgZCQFPTiYGRgYHh/91nL/GqzS1pYti2bCpCsbKUOE4NXlHZVFD8899/uA3sTCBXMjAMdpOxBQmGm0FhiQ+Aw5mUGAQAqm1OKbTaiFMAAAAASUVORK5CYII=)}\n#webamp #on {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMCAYAAAB8xa1IAAAAxUlEQVQ4T2Ncu/XYfwYagnvPHjKUpkYyMIIs8vG0pIlVW7YfZ1i6cS3Dulm9CIuOXLhOVcs+PP/AcO78OYbz164zbFs2FdWi3p6pGJYVl2TDxYoyy8HsvumdYBrEx8YGyRG06ATjTLjBh5vfMbz48ASnocgWI1tKM4tgLoP5jiiLulvaUYKPkI9AhqMHKUGLCKUGqsURIYtIkceZGEBpntoAI3mDLADl4A8v31LbLkQ+6p69/P/x02cYfnz5QXVLYAaCMiwAMGHxARDxJL8AAAAASUVORK5CYII=)}\n#webamp #on:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMCAYAAAB8xa1IAAAAnklEQVQ4T2Pk4BD4z0AHwEh3i6KLSxgkBCVo4rfemhIGuI+KW3oYjAy1aGJRtLcXpkXnzl+jumVYfQSyCCSBDkA+hgGYPEwMxMfGRlaPEXQwi7iCv8ANrnRYzPDh41cwH5uhyBYjy9PMIpjByL6HOQ6nj5onT0cJPUI+AhmOHqQEfUQoNVAUR6B85OXkxEDzVOcVl8ywbdFcQp4hWx4AUjOKgfyGJgMAAAAASUVORK5CYII=)}\n#webamp #on.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMCAYAAAB8xa1IAAAAxElEQVQ4T2Ncu/XYfwYagnvPHjKUpkYyMIIs8vG0pIlVW7YfZ1i6cS3Dulm9CIuOXLhOVcs+PP/AcO78OYbz164zbFs2FdWi3p6pGJYVl2TDxYoyy8HsvumdYBrEx8YGyRG0aFsNwrKrHJ8YXnx4gtNQZIuRLaWZRTAvw3xHlEXdLe0owUfIRyDD0YOUoEWEUgPV4oiQRaTI40wMoDRPbYCRvEEWgHLwh5dvqW0XIh91z17+//jpMww/vvyguiUwA0EZFgA52fEBTNmbaAAAAABJRU5ErkJggg==)}\n#webamp #on.selected:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAMCAYAAAB8xa1IAAAAnklEQVQ4T2Pk4BD4z0AHwEh3i6KLSxgkBCVo4rfemhIGuI+KW3oYjAy1aGJRtLcXpkXnzl+jumVYfQSyCCSBDkA+hgGYPEwMxMfGRlaPEXQwi36c+wA3uPvocoYPH7+C+dgMRbYYWZ5mFsEMRvY9zHE4fdQ8eTpK6BHyEchw9CAl6CNCqYGiOALlIy8nJwaapzqvuGSGbYvmEvIM2fIA5COOgc6i95kAAAAASUVORK5CYII=)}\n#webamp #auto {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMCAYAAAADFL+5AAAAxElEQVQ4T2Ncu/XYf4YBAveePWRgBDnAx9OS7k7Ysv04w9KNaxEOOHLhOt0c8eH5B4Zz588xnL92HdUBvT1TMRxRXJINFyvKLAez+6Z3gmkQH50NU4OuDpmP1wEnGGfCLTzc/I7hxYcneC3D5xhcjiTbAcjBA7IYWwjgshRZHK8DulvaUaKBriGALxXi8y1y/KKHAIxPVBqgVzbAGgWgfElPgJINQRaDSqUPL9/S0w2QcqB79vL/x0+fYfjx5QddLYdZBgBNPgGeMokJ+QAAAABJRU5ErkJggg==)}\n#webamp #auto:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMCAYAAAADFL+5AAAAr0lEQVQ4T2Pk4BD4zzCAgHFQOCC6uIRBQlCC7uHQW1PCAA6B4pYeBiNDLbo7INrbC9UB585fo6sjMEIA5ACQIDoAhRAMwORhYiA+OhvZDGQ5kBnoZqFEAcwBXMFf4BZWOixm+PDxK5iPyzJ8jsGlDyZOsgOQQwdkMTZHEbIU2cFYHdA8eTpKLNA1BPClQny+xRa/+NIOShSAygEvJyeGAcsFXnHJDNsWzaVrFoRZBgBY57GBgWTOlwAAAABJRU5ErkJggg==)}\n#webamp #auto.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMCAYAAAADFL+5AAAAw0lEQVQ4T2Ncu/XYf4YBAveePWRgBDnAx9OS7k7Ysv04w9KNaxEOOHLhOt0c8eH5B4Zz588xnL92HdUBvT1TMRxRXJINFyvKLAez+6Z3gmkQH50NU4OuDpmP1wHbahCOuMrxieHFhyd4LcPnGFyOJNsByMEDshhbCOCyFFkcrwO6W9pRooGuIYAvFeLzLXL8oocAjE9UGqBXNsAaBaB8SU+Akg1BFoNKpQ8v39LTDZByoHv28v/HT59h+PHlB10th1kGAFa2AZ4O71C7AAAAAElFTkSuQmCC)}\n#webamp #auto.selected:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMCAYAAAADFL+5AAAAr0lEQVQ4T2Pk4BD4zzCAgHFQOCC6uIRBQlCC7uHQW1PCAA6B4pYeBiNDLbo7INrbC9UB585fo6sjMEIA5ACQIDoAhRAMwORhYiA+OhvZDGQ5kBnoZqFEAcwBP859gFvYfXQ5w4ePX8F8XJbhcwwufTBxkh2AHDogi7E5ipClyA7G6oDmydNRYoGuIYAvFeLzLbb4xZd2UKIAVA54OTkxDFgu8IpLZti2aC5dsyDMMgALBLWB6MuYBQAAAABJRU5ErkJggg==)}\n#webamp #eqGraph {background-image: url(data:image/png;base64,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)}\n#webamp #presets {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAMCAYAAAAZKF83AAAA2UlEQVRIS2Ncu/XYf4YhAu49e8jACHKwj6floHfylu3HGZZuXItw8JEL1wetoz88/8Bw7vw5hvPXrmN3cFFmOdzxfdM7wWxsYrjEidFPjBqYI4hyMLJDQWyQBfjEYIYjq8MnBvMsupnYopkoB8M04gth5FACqUdXi00vujqYGuTYQhYDiRPlYHRNxIYwcgjB9GALdfQQxqaPrCSBLVrRHY8cG6SmdUJ5hKgQHmzFBdYkASrnBjNAKdZADgXVIh9evh3MboaUw92zl/8/fvoMw48vPwa1Y2GOAwBbDgOeqbZOGQAAAABJRU5ErkJggg==)}\n#webamp #presets:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAMCAYAAAAZKF83AAAAxUlEQVRIS2Pk4BD4zzCEAOOQdXB0cQmDhKDEoA7r3poSBngIF7f0MBgZag1qB0d7e2E6+Nz5a4PW0VhDGNnBrSUpcMdX98wBs7GJ4RInRj8xamCOIMrByA4FsUEW4BODGY6sDp8YzLPoZmKLZqIcDNOIL4SRQwmkHl0tNr3o6mBqkGMLWQwkTpSD0TURG8LIIQTTgy3U0UMYmz6ykgS2aEV3PHJskJrWCeURjBAGlcNeTk4MQ6aU8IpLZti2aO6gLdJgDgMAyti1gbci4XIAAAAASUVORK5CYII=)}\n#webamp #preamp-line {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==)}\n#webamp #equalizer-window.shade {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAAAOCAYAAAAMlvhJAAALy0lEQVRoQ9VbzW9dRxU/98VCUVw/J04koDUCQUJFEKA6paKxI1GyYmFL/A+sWFBlyYYd6rIqC5b8BUhIZVNHiRDYpiIhgQ1BlVIBqUsNpP4gjmOB/S6a8zXnnJn7nlsnanxV1Xlz5+PMzDm/+Z0z5zYTE2daiE8D0KTSpilfubJe5X1RhAVNc6z6AkcI4zTmdwMNkCilLNS0gbZttf+OaixDljf2l8ZxT2Pq4kDhNb+37Vpdt1y3Mf2YUv0ntk//6TxoINev+8VNm8atSWqVxx+9b7SqYWJD1lhkarkdrh9uTBq47IpKSv2IStBjUQet2WMuQx3kx+lAa14M2/C6KlJp6gPnkPtK65fm4qdE71tWgKRrSeYk78GegasmSyZrJutJInV0quX+fWpLuk824AcSuf18sF6cc5pdKtaNlCUya4N1ktaksrqcTQKT+fn5rNzBkJ2ARn98eVYarz4NKnj6X+62Dgq9itHJXje9bqWMxlqCTh5P3slf2YioFI0YQVBUUXwoZPVzUhkQXAgsijECWKmS4ZjD5itgIwZcA44hII8bkp9hayu1ENDFwBHAR4OEn68ZkwFXgc8Jw8bN6x73SQzG7nHXHh7M0KP9ZcOsGqiAEDeLWJp760aath3g+qW/+nD1aMweHAYWA/i0d7iQu7N9SykDiJWsBK8sUxewObl1HVr41ZtvgoLJ4tVrxEZQcRIO9zJ6F8yAlQnr0UMLRJsh1kNKmOqE0zYpY1rUXkLUBDS0LTUldSwlKHEXkMhpjyPrqckyOLDMrIiY08BwAKQLPDdhP5YN9NwJ1bPAY8ewhqEWWQIcrTzJU10HkoTfm/ayA1KU1rOXmQ2tflJTZkAG2RRcK2jXJjks6OicUjntK0kkvXcAamBZaI/YF+95tLvK2kXAeJwAkm2N51M75QOIWPqC66SGmlebmtRBhcoDy7B18ZVnBQUDkTERnKnuQOgS7w2usGEcKk/b8iGfx7EggdqS2iVsHxjmYxhSZFTb2/cNmCxey1xe6DorN/2xytJjAJCtiMYhfJEUL9eS482AUTi5nSGJIRrAMp0R4FUUXk5SHA3790CSVVmMN4NdVo7ScLUfHJPARJVRAdMCVJg7DixrkIFJQMRNhgE68BDnEqY9UWO2wDcABRRhAArpFWMVUCB0KJmO3//AMgIQRRfVzkllEVlrQCLuR2Vf4/oc9rcFJct6qiDgXCuyNDwoDauogZ6T0VCZbIzBVUFDZ+e+BgQO2OiQSHCuQGI0krwCdnccWKGD5P0frErMBOdh4My7RuI+GbBrW3jQBSaiLuPPjB12v56a9k1zSgHx0c4WySV2XfVDCKjI0PM0CjbkXnbXyzvHAOv6DKe6+OfMJqRXBGY2Nm+0XGNkjIuZhI3tGLCtbVYRW5JYieA0Ayu1Tco42gVamJ+H5eXbWe2RNNEabG6sugWvukPCaz5KvMSAlJy8ApxiPCKQklnBfi6QOFMiAPML87CydEvn8MHazadG14cJ0p/8MkWAOP6xtbpUVO8/e9Hxpm/P7MPNd/4Cd+5sa93z55+Bbz7/Fbh+kwDIMZOri9cY5eh0Gh8/BpdnvwRnP3f8SCzSMCHvvrcL11fehV5vCqs9erQFJ06c1MBVitdkjDdcKgQ50QVBYyGjkUAcMZTMgPBXjD0ZVmLjFDVW4tmZBMMZ3EKglkbOQVz9bYKGDqoCS5P6ljVIfQ8khr2JqhkQkDnb07kIanPsZW52BlYMmNi929j8B5w69VwRcK/FSw6rmKOZhA/S0hoRsszNXYClldv4OwHJUbAVsYPJ/jm09a3V38LpzwzglR+84ZbyFz++AhPPXsSytEYXvrYLp3e34Hcf3Ifm4S6048fh4mfPwNt3V2Fr/xsEJg+cm3MdC0W5E5hcufLDw+7XU9P+9dd/CscSmDQN7OxsIpjIk90FVv+KwXmAIMMWN4eUrOa+KPXJ7pZhFmrk4YT17MeDWwSqLjCx4IhYY2JHtZsjEr80/zyed9lsLMxuclccRqMJTQOXZmccM5FblQSy6+urCCbx6brN+zgK1hVzGeneqMK0MDt3AZaXb+G6JjA5KraS7GBy8hwS3LG93+CMIpj8+mevwn97cxrzuXfv9/Cdb52FL47vwd82/wNfONlHIPnz3/dgevoCsuUHDz/MMZOrV1PMBE0E/5/AZOrU+MfZq0+0zaDZrY6/ub6PYJKMJrk5AiYCJBlZyjiLi8EYGp/ARELQkWEU/apPZYK4HVfwCUz0Jsv7WAT4GksyN0UceLWQYGVDd70DJKlPH3C3QJv9PArM14Ck8+reuGzih1+aGwImG6tw6iSBSezzSQRe0zijr2RLlZqdS+yK3JwEJk+brQyzg/7kOYzvJjD53quvweb/TrgJ1sDk4kun4cR+i0CSAOWva/+Cd98fg+nnZrDt9rYFk8XrHPolui5uzieKDI9xcHRzjk3hSbLDbk40TBekTEEocyVNroSPBwiY1BiGsh12b9R1cH0yYZHgrb0uDsFab9z0S3mEjCFxbQNABw680mJkTHXulMBAeSMU5aq5Ocp60EVoYPbSDKws5ZhJRs4GNjbeh6mpaez2SVwFd7k29hraqZ29+ZBrbQAgQMxgktyco/AkOyA3J4OJlfuXb/wIfyIzGVA85N57N+Crnx+Dl89OI5B898Wz8PO3bjtmgmDST3kmCwuw+NY1l/SUwOT885+GSy+cOQprNFTGpT/ehzvv/JPcHCjBhOLhfEVduf0pT8nyJkeYSYyV0O0QixeZQYWZWBdHohTxNkrl0YA6XQerYfN89H7PxDZK+eQMYTnVW1P481lpjCvYj9xOBLYkLpbIkxMIiOPMWWYiAMbu3ygwsRv9uJhK17VrTGrLY7ccM7mFFH9t7Q9HwlbEDvr9cziVFHz9/ms/cbaTwOTDtR7GTATMJWaSXJvdvV04PnYcgQVjJntfRzV4WDCTfMwgxZzof+rIAcn+3l5VZnRxWOkvX77k6uipJHkprODdSWpozkUfZF9dcQdKVCquvjU3J3VXXnWrweA1pA/y5u2q3KDYOIkyHyPyARLPOl2XkW1zrEjyFfQmkuXC25wiVtTA7OwLGRQ/ym3NCE0dBjzD3JwcmJacDY61t6DMJIHnv+//6amylS47EFYiwtZucxRIONj8yostLN94G+6uZ3fo7NQOzL30Mly/sY9dqZuzwMxElbNnE9CoNMcESiOyq5izR6Wdqd/L6WuujTtWY7KUNRSfQq4ntKH8GgzloIO4KvFGw8Y0JDhob2R8spy09oHXNH6MmbhYiTRjEHDGKWxBA7KOWvA9v7AF5ighMU7nVImXmF3jf+Y+xLCcmzQkX8QCp9wcRcvpyi9xeTtd5jYyt+XJ2mln4FUCVzg80TBKi8IEEPdI3ojry+SgYNAb21XyPrR/7rarjnG5qDfSXMwxoew07qkrt0QSFOR9yHhl1qlMjd2c3GvuF+ej71vY3l73bg6hhveb84qpQy5fy3B1S4c5aGboLwGRnFQ22U2U2xpRptqSchxPcpcEF69fBfWi8VbdCXEi0l8DNeY6uDyZy+tgnaptp/2ZtYwA7VyPkrXkNSMA7bxyRbJixgkBTxuPsHEBvA537KWebKcHDLMmVOAKo5B9ti6OfkphDZEzK6Pr5w8Xf2ChKTsGdzhwsQYva1v06L5f4bwMDR0RKEjCoLStg1KKi1H9wp3SQSURjJLMbL8+YUxATQ4xTjJjTJBxCnlcKr1NNrMp/fzVTUhuwxFZftkHQiyLpgwmE/0zlBndCSKpZZ1GC3WNOV/DPupTBS5yOLLv7gAo7DIpcsoXJ62sHWoEQNahp5+aj1EIHD7qE1CSW44oA+d12OSm4d+rDE9UE+CIsYWh4N5xE0TnQQbKbNxUZte/ZpIFUAg4yXlgJ60dlPpR+xjOZgyTWVgQDxnmxXglwBwYUmxWrfw7GbcePnKccPapGh9nopqBRn/gJ5bNjQSAcHrDAIXrhzT5nMHcxWiMcDIn7cowIRM8luS76keGgd3UPurT1HtzMKS+/g9/gE2uIEfkAwAAAABJRU5ErkJggg==)}\n#webamp #equalizer-window.shade.selected {background-image: url(data:image/png;base64,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)}\n#webamp #equalizer-volume.left::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAALUlEQVQYV2NcPCXrv6eVAINv0WUGxjfnqv4zMDAwlE84iOBsP/aBGA5YD7JpAJtSJGi52PoXAAAAAElFTkSuQmCC)}\n#webamp #equalizer-volume.left::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAALUlEQVQYV2NcPCXrv6eVAINv0WUGxjfnqv4zMDAwlE84iOBsP/aBGA5YD7JpAJtSJGi52PoXAAAAAElFTkSuQmCC)}\n#webamp #equalizer-volume.center::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAIklEQVQYV2NcPCXrv6eVAMP2Yx8YGN+cq/rPAAVkcZBNAwAdshtHcq1eDAAAAABJRU5ErkJggg==)}\n#webamp #equalizer-volume.center::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAIklEQVQYV2NcPCXrv6eVAMP2Yx8YGN+cq/rPAAVkcZBNAwAdshtHcq1eDAAAAABJRU5ErkJggg==)}\n#webamp #equalizer-volume.right::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAL0lEQVQYV2O0dPD9v7lPl2H7sQ8MjMlx1v87C+wZQIBx8ZSs/55WAoQ4KHqQTQMABjYbR2VeyxUAAAAASUVORK5CYII=)}\n#webamp #equalizer-volume.right::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAL0lEQVQYV2O0dPD9v7lPl2H7sQ8MjMlx1v87C+wZQIBx8ZSs/55WAoQ4KHqQTQMABjYbR2VeyxUAAAAASUVORK5CYII=)}\n#webamp #equalizer-balance.left::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAALUlEQVQYV2NcPCXrv6eVAINv0WUGxjfnqv4zMDAwlE84iOBsP/aBGA5YD7JpAJtSJGi52PoXAAAAAElFTkSuQmCC)}\n#webamp #equalizer-balance.left::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAALUlEQVQYV2NcPCXrv6eVAINv0WUGxjfnqv4zMDAwlE84iOBsP/aBGA5YD7JpAJtSJGi52PoXAAAAAElFTkSuQmCC)}\n#webamp #equalizer-balance.center::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAIklEQVQYV2NcPCXrv6eVAMP2Yx8YGN+cq/rPAAVkcZBNAwAdshtHcq1eDAAAAABJRU5ErkJggg==)}\n#webamp #equalizer-balance.center::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAIklEQVQYV2NcPCXrv6eVAMP2Yx8YGN+cq/rPAAVkcZBNAwAdshtHcq1eDAAAAABJRU5ErkJggg==)}\n#webamp #equalizer-balance.right::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAL0lEQVQYV2O0dPD9v7lPl2H7sQ8MjMlx1v87C+wZQIBx8ZSs/55WAoQ4KHqQTQMABjYbR2VeyxUAAAAASUVORK5CYII=)}\n#webamp #equalizer-balance.right::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAL0lEQVQYV2O0dPD9v7lPl2H7sQ8MjMlx1v87C+wZQIBx8ZSs/55WAoQ4KHqQTQMABjYbR2VeyxUAAAAASUVORK5CYII=)}\n#webamp #equalizer-shade:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAbUlEQVQoU2PcMjH5PwMBwAhTxK0hjaH0642nYDGwImwKYDpACsGKdpx5gNNCDxMFiKJ5O28xSAmzYSh89vYXQ5K7GkIRSAWyQpACEIArmrbhNgMHJ6Ynf3xnZMgKUIWYBNIBUogOQArgviMUTgAGRzXpGfAzIgAAAABJRU5ErkJggg==)}\n#webamp #equalizer-window.shade #equalizer-shade:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAbklEQVQoU2PcMjH5PwMBwAhTNG3DbQylWQGqYDGwIpACDs7/DLn5jigKuzsOMIAUghXN23kLLImuaPLE/QxJ7moIRQXpKgx/OWRRTMKqCFnFhJl3wFy4SSA3VRQoo5gCUvTjOyPCTSBZgr4jFE4A2kg/6aCuM1IAAAAASUVORK5CYII=)}\n#webamp #equalizer-window.selected #eq-buttons.clicked #equalizer-close {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAiElEQVQoU2PU1HT6z0AAMIIUWRsxMXz9/YPhzs1rcOUq6loM3KwcDEfP/WMAKzLQ/cUQ4KTJsPvwfbBikKSrrSLDhn3XGS5cZoMo4mG7wKCvYwSWuHf/OYOSoiRYw8Ur5xi+/DJAKAIZr6cowFDUvpmhr9KX4dL9D2DrURQRNIkoNxHlO0LhBADl2Vw1H4GXqQAAAABJRU5ErkJggg==)}\n#webamp #equalizer-window.selected #eq-buttons.clicked #equalizer-close:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAfElEQVQoU2NcOSP1PwMBwAhStPvwfYavv38w3Lj1Ea5cQ42fgZuVg8HVVpEBrGjDvutgBcba4mDFIMmzV18ygBQGOGlCFHXMOAFWAJIIc5dnWLXzIZxfkWGBUATSpacowFDUvpmhr9KX4dL9D2DTURQRNIkoNxHlO0LhBAD8HGXXJ+lJqwAAAABJRU5ErkJggg==)}\n#webamp #equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAA2UlEQVQoU2PU1nb5////fwYGEAYDCP0fSoPYjCBFjkb/Gb4z/mC4fvkdVCEDg6auEAPnfw6GPaf/MDBqaTn/tzT5wRCoqcGw49oDsGKQpIeJAsP6szcYjp5igSgSYH/GYKQjBZa4e/c5g7KyJMOOMw8Yzl15xvDuuxhCEch4PQF+hryJWxkm5XszXPrwEWz9u2+iDIxamk7/BTieo5hk6CzOsGrNI1STwG4y1gBbAXNTWIgcw8K1txiOnmSGmORkwojbd6d+QxTBwgcWNqBwY2RkZPj/7x9YCgBOq24Dw83jIwAAAABJRU5ErkJggg==)}\n#webamp #equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAfElEQVQoU2PcMjH5PwMBwAhStOPMA4bvjD8Yrl9+B1euqSvEwPmfg8HDRIEBrGj92RtgBUY6UmDFIMlzV54xgBQGGmtAFLUtOAZWAJIIt1VkWHn4PpxflWCFUATSpSfAz5A3cSvDpHxvhksfPoJNR1FE0CSi3ESU7wiFEwDes2XpVzKmTwAAAABJRU5ErkJggg==)}\n#webamp #position {background-image: url(data:image/png;base64,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)}\n#webamp #position::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKCAYAAABIQFUsAAAArUlEQVQ4T2NMTSv+X5aqzUAvsGnVHAbG1NTi/2Vp2gwr5k2iqb1FPUcZZjS4MtT0nkC11MnTj0HfwpPqljNy6zHsWpzDcO/uTUxLCxunM4AUUBv8/3qJYfe6WbgtbSyMpradDPX9S/FbCnIRtYFrUBpuS0GRDQoKaoMVM5oZhMXEMYNXSiuc4efbYwwHty2jtp1g844dPsggISWBmpBA+YceAJ5llsztp4d9cDsA1L90sv7RoxcAAAAASUVORK5CYII=)}\n#webamp #position::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKCAYAAABIQFUsAAAArUlEQVQ4T2NMTSv+X5aqzUAvsGnVHAbG1NTi/2Vp2gwr5k2iqb1FPUcZZjS4MtT0nkC11MnTj0HfwpPqljNy6zHsWpzDcO/uTUxLCxunM4AUUBv8/3qJYfe6WbgtbSyMpradDPX9S/FbCnIRtYFrUBpuS0GRDQoKaoMVM5oZhMXEMYNXSiuc4efbYwwHty2jtp1g844dPsggISWBmpBA+YceAJ5llsztp4d9cDsA1L90sv7RoxcAAAAASUVORK5CYII=)}\n#webamp #position:active::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKCAYAAABIQFUsAAAAxUlEQVQ4T2MsCJX+7+DszEAvcOLoYQZGmKUH9u6lqb0ZBRUMC2b0MaxYfx/VUkNDAwYlDS2qWy4qLsewfcMyhpcvXkAszQkQ/+/i4c4A8mlwZBQDSAG1weuXjxjOHD+C29LFc+dR206G2OQk/JaCXERtYGJpg2ppmrfwfy9fb3DwgiIbFBTUBvt2bmXg4+NHBC/MUg1dU4Znj+8wXDx7itp2gs27fu0Wg5AQHyQhJboJ/PcP8mMA5R96ALil+499oId9cDsA4lJ1g/VE6vkAAAAASUVORK5CYII=)}\n#webamp #position:active::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAKCAYAAABIQFUsAAAAxUlEQVQ4T2MsCJX+7+DszEAvcOLoYQZGmKUH9u6lqb0ZBRUMC2b0MaxYfx/VUkNDAwYlDS2qWy4qLsewfcMyhpcvXkAszQkQ/+/i4c4A8mlwZBQDSAG1weuXjxjOHD+C29LFc+dR206G2OQk/JaCXERtYGJpg2ppmrfwfy9fb3DwgiIbFBTUBvt2bmXg4+NHBC/MUg1dU4Znj+8wXDx7itp2gs27fu0Wg5AQHyQhJboJ/PcP8mMA5R96ALil+499oId9cDsA4lJ1g/VE6vkAAAAASUVORK5CYII=)}\n#webamp #shuffle {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPCAYAAAB0i5aaAAABk0lEQVRIS9VWO0vDUBT+Lv6lgu3qKN1cVPwD4mPQFhd1Koj42KSjkzjp6OjmY0roYuhUBEE3g0tbCl45J7k3J2kaUgmaZkhyz+O73zk5N+eoSmVJgy4dPKA0EL6yWC7YjPShS+DBVnz/FhiR2GKwr9xLoFsdYRk7aDCk5BbuqNQcVK22qhv7m5bGLLx4vR6u25cR+YXF2izwxv3dE65ub9B97kBVqyu6ebAFIu+4XqkD8N99OK4D98XDa6ebTv7s9GIsiN3Gxr8Hlpv8I6IAHlpf+PDfmPzO+p4N4rx9zGt6Gl2WzDgam+Ta4KTtQ7JCyCc3yUt+kp8M3AQkk2Jk4+Tnl3XzcDtW81Q2J62jWJlkZV4a/m3mU8jnKW6TmWnKpvjMT/m3yVPzsmaTJTWpLNJw5ZlIr/lfZj7P1ynaJvPAUgMo+5X6nyfS1Hb7/mfZ+cebVH2tzp1r0B+UnrghaDssC+ykqAFFa77FgqHJTykVTJaBk9XHpk+GCCdCgZ30CRC0wDOwEk1H0yqpaeoFMBoN8QMXl6cW4q364wAAAABJRU5ErkJggg==)}\n#webamp #shuffle:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPCAYAAAB0i5aaAAAA7UlEQVRIS2Pk4BD4zzBEAeOwcHx0cQmDhKDEoI6DF+9fMLz/8J5h29y5YHfCQ764pYfByFBrUDse5Lhz568x9NaUYHc8SHKwA4KOhylA9ggodgYDIMrxHEEf4G6td13B8ObtFzC/tSQFLl7dMwfMB9EwOXxiMI0wNeh8mDnY7IGppdjx6JYQ63hc+pA9DnMkcqAgxzhRjm+fPgMlleALeWSFAx7yxKRtWMiQkmzoEvL4HE9MmkdOs+hJCleywGYucp4gOs0TE/IDpYZgmh8ohxFjL4bjQc0DLycncA022AGG472Sk+FthsHueJj7AD9R9uH12UctAAAAAElFTkSuQmCC)}\n#webamp #shuffle.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPCAYAAAB0i5aaAAABlElEQVRIS9VWvUvDUBD/PVz8gwo2q6N0c1HxHxA/Bm1xqU6CiB+bdHQSJx07uuqU0EFDpyIIuhlcWin45C55L5c0DakUTTMkeffxe7+73MudqlSWNejS4QNKA9Eri+WCzUgfuYQebMX3b4ERiy0G+8q9BLrVEZaxgwZDSm7RjkrNQTnOmq43tyyNWXjxez3ctK5i8otLzizwxn37Add3t+g+dqCq1VXdONgGkXc9v9QBBG8BXM+F9+zjpdPNJn9+djkSxF59898DK0y+3YwDeJr/xHvwyuR3N/ZtEBetE17T0+jyZMbR2KTXBidrH5JNhXx6k6Lkx/nJwE1AMilGNkp+YUU3DncSNU9lc3p0nCiTvMxLw7/NfAb5IsVtMjNJ2Uw/8xP+bYrUvKzZdEmNK4ssXHkmsmv+l5kv8nWmbZN7YKkBlP3K/M8TaWq7/eCj7PyTTaq2XuPONegPSk/cELQdlgV2UtSAojXfEsHQ5KeUCifL0MnqE9MnQ0QTocBO+4QIWuAZWImm42mV1DT1AhgOv/ADIbenFoA4hswAAAAASUVORK5CYII=)}\n#webamp #shuffle.selected:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAPCAYAAAB0i5aaAAAA7klEQVRIS2Pk4BD4zzBEAeOwcHx0cQmDhKDEoI6DF+9fMLz/8J5h29y5YHfCQ764pYfByFBrUDse5Lhz568x9NaUYHc8SHKwA4KOhylA9ggodgYDIMrxP859gLu1/+QKhjdvv4D5rSUpcPHqnjlgPoiGyeETg2mEqUHnw8zBZg9MLcWOR7eEWMfj0ofscZgjkQMFOcaJcnz79BkoqQRfyCMrHPCQJyZtw0KGlGRDl5DH53hi0jxymkVPUriSBTZzkfME0WmemJAfKDUE0/xAOYwYezEcD2oeeDk5gWuwwQ4wHO+VnAxvMwx2x8PcBwDW2frhgtK/dwAAAABJRU5ErkJggg==)}\n#webamp #repeat {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAYAAAD3T6+hAAABT0lEQVQ4T2O0sIj8z4AN/EcI/2dkYGAAc0EEnIOi6z9YPUwexPzHANLHCDcGwmA0NPT9X9NSidVOagtev3+fgdFA3+d/bVsVg5OXJbXNRzFv37bjDEvXrUW18Nz56zSx9MPzDwznzp9jOH/tOnYLe3umYlhcXJJNtmOIsvAYA8LSoy2fGF58eAK2EKR57tKlDE/vPsLqgL7pnRjiFFl4/Nh5BksrQ5y+LcosZ0C3FNVCA+//ta3V4EQDi0NQkHa3tKMYCvMhyEAYwOYbwhYipVJiEg3MQmyWgRxC2EIsPsSXOmAGIvsUWT1ZcUh2csShEWccgjInrQAiH0KDFGQRqOj5/uE9reyEZnwD7/8hKVHgkuDH9x80swxmMKOBvvf//5CqgAFU4jMyMjL8//cPyWKILKQ2AKuCUhBxUN0BEvsHE2b4BxWDKAWpQuhlYAAA30ME5wekpTAAAAAASUVORK5CYII=)}\n#webamp #repeat:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAYAAAD3T6+hAAAAu0lEQVQ4T2Pk4BD4z0BHwDhgFkYXlzBICErQxK8v3r9geP/hPcO2uXMZ4D4sbulhMDLUoomFIEPPnb/G0FtTgmkhSIJWAK+FIEl0AAoFSgBBCzmCPsDNr3ddwfDm7RcwHzlOsDkAl8PItvD6/esMmoqaOD0LMhibpQQtbJ8+A8VQmA+RgxuXwSRbiC+uYBbiCzqqWwgyEFvCAjmUrDikJDXi0juw+RBUtHk5OYFLBFoBFB96JSeDyzpaAwALWJbhXk0E/gAAAABJRU5ErkJggg==)}\n#webamp #repeat.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAYAAAD3T6+hAAABT0lEQVQ4T2O0sIj8z4AN/EcI/2dkYGAAc0EEnIOi6z9YPUwexPzHANLHCDcGwmA0NPT9X9NSidVOagtev3+fgdFA3+d/bVsVg5OXJbXNRzFv37bjDEvXrUW18Nz56zSx9MPzDwznzp9jOH/tOnYLe3umYlhcXJJNtmOIsnBbDcLSqxyfGF58eAK2EKR57tKlDE/vPsLqgL7pnRjiFFl4/Nh5BksrQ5y+LcosZ0C3FNVCA+//ta3V4EQDi0NQkHa3tKMYCvMhyEAYwOYbwhYipVJiEg3MQmyWgRxC2EIsPsSXOmAGIvsUWT1ZcUh2csShEWccgjInrQAiH0KDFGQRqOj5/uE9reyEZnwD7/8hKVHgkuDH9x80swxmMKOBvvf//5CqgAFU4jMyMjL8//cPyWKILKQ2AKuCUhBxUN0BEvsHE2b4BxWDKAWpQuhlYAAA6WME56JitvcAAAAASUVORK5CYII=)}\n#webamp #repeat.selected:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAPCAYAAAD3T6+hAAAAvElEQVQ4T2Pk4BD4z0BHwDhgFkYXlzBICErQxK8v3r9geP/hPcO2uXMZ4D4sbulhMDLUoomFIEPPnb/G0FtTgmkhSIJWAK+FIEl0AAoFSgBBC3+c+wA3v//kCoY3b7+A+chxgs0BuBxGtoXX719n0FTUxOlZkMHYLCVoYfv0GSiGwnyIHNy4DCbZQnxxBbMQX9BR3UKQgdgSFsihZMUhJakRl96BzYegos3LyQlcItAKoPjQKzkZXNbRGgAAikqa4RiuqqcAAAAASUVORK5CYII=)}\n#webamp #equalizer-button {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAABBUlEQVQ4T2Ncu/XYfwYqg+v37zOsmL6QgRFkuJOXJdWM37ftOMPSdWsZbp64iDD83PnrFFvw4fkHhnPnzzGcv3ad4dHFm5iG9/ZMRbGkuCQbzi/KLAez+6Z3gml0PrLhDy/hMPwYA8SCoy2fGF58eAI3CGYozGBkS0BsFMNxuRyX4TAvgAwCuZosw7tb2uFBQcjlyJYQdDm+WMUW5si+QDb8wYUbiAgFJSFqAFhqgRsOMhSU8L9/eE8N88FJ8cH56wyMLVOW/gfZ9uP7D6oYDDMEbLihoe/////+MzAwQkqB//9RS4P///4xMDAygiSg+v4zgFgIdVDx/xBxEGBk+M/wD2gmAHAj+SmlgVFoAAAAAElFTkSuQmCC)}\n#webamp #equalizer-button.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAAAx0lEQVQ4T2Ncu/XYfwYqg+v37zMsnz6fgRFkuJOXJdWM37ftOMPSdWsZbp64iDD83PnrFFvw4fkHhnPnzzGcv3ad4eHFm5iG9/ZMRbGkuCQbzi/KLAez+6Z3gml0PlGGb6uBWHCV4xPDiw9P4AbBDIUZjGwJiE2R4TAvgAwCuZosw7tb2uFBQcjlyJYQdDm+WMUW5si+wGk4KAlRA2CkFpChoIT//cN7apiPSIotU5b+B9n24/sPqhgMMwSczrW1Xaie/WEWAAAHruA5Lws3rgAAAABJRU5ErkJggg==)}\n#webamp #equalizer-button:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAAAqklEQVQ4T2Pk4BD4z0AjwEhzw3/8+MCQXN3CICEoQRU/XL9/nWHb3LkMYJeDDK/umcNgZKhFFcPPnb/G0FtTgmk4SIIaAK/hIElkUNzSA+e2lqSA2SDfggA6HyRG0HCOoA9gzfWuKxjevP0CNwhmKMxgZEtgbLINh3kBZBDI1WQZ3j59BjwoCLkc2RKCwYIvUrGFObovUIIFlM69nJwYaJJagrKLwQmfmgAASG+lgYikZu0AAAAASUVORK5CYII=)}\n#webamp #equalizer-button.selected:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAAAp0lEQVQ4T2Pk4BD4/+PHBwYODgEGagNGuhieXN3CICEoQRXHX79/nWHb3LkMcJdX98xhMDLUoorh585fY+itKcE0HCRBDYDXcJAkMihu6YFzW0tSwGyQb0EAnQ8SI2j4j3MfwJr7T65gePP2C9wgmKEwg5EtgbHJNhzmBZBBIFeTZXj79BnwoCDkcmRLCAYLvkjFFubovkAJFlA693JyYqBJaqFF9gcAw8CsgR2FMJIAAAAASUVORK5CYII=)}\n#webamp #playlist-button {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAABAUlEQVQ4T2Ncu/XYfwYqg+v37zMsmDCFgRFkuJOXJdWM37ftOMPSdWsZLh08hjD83PnrFFvw4fkHhnPnzzGcv3ad4fbp85iG9/ZMRbGkuCQbzC/KLIeL903vBPNBNDJANvzWqXPYDT/GALHgaMsnhhcfnsANRzaUkOE4XY7LcJgriXL5ybPYXd7d0g73LbrLYRKEXH4Lm+G4YhXdMPQ4AOlDCXNkw0FJiBoAllrgLgcZCkr43z+8p4b54KQINrxlytL/INt+fP9BFYNhhtwEGa6l6QTJ/oz/GRigBcF/hv8M///DOP8Z/jOCpEGiDAz///2HqAWxwQSi9ADrgfP/MwAAYUHwA3lbrLUAAAAASUVORK5CYII=)}\n#webamp #playlist-button.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAAAwElEQVQ4T2Ncu/XYfwYqg+v37zMsnz6fgRFkuJOXJdWM37ftOMPSdWsZbp64iDD83PnrFFvw4fkHhnPnzzGcv3ad4eHFm5iG9/ZMRbGkuCQbzC/KLIeL903vBPNBNDIgyvBtNRALrnJ8Ynjx4QnccGRDqW44zJUUuby7pR3uW3SXwyTIcjmuWEU3DD0OQPpwhjkoCVEDYKQWkKGghP/9w3tqmI9Iii1Tlv4H2fbj+w+qGAwzBJzOtbVdqJ79YRYAAEwf1zkHknJ2AAAAAElFTkSuQmCC)}\n#webamp #playlist-button:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAAArElEQVQ4T2Pk4BD4z0AjwEhTwxkYGP5zcAgwRBeXMEgISlDshxfvXzC8//CeYdvcuQyMMMOLW3oYjAy1KDYcZMC589cYemtKMA0HSVAD4DUcJIkMQD4DgdaSFLhwdc8cMB9EowOChnMEfQDrqXddwfDm7Re44ciGUt1wmCspcnn79Blw36K7HCZBlstxRSq6YehxANOHEuagdO7l5ARORtQAKIZ7JSeDEz41AQAODoGBkJ7kJQAAAABJRU5ErkJggg==)}\n#webamp #playlist-button.selected:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAMCAYAAACJOyb4AAAApklEQVQ4T2NkYGD4z8EhwEALwEgXw6OLSxgkBCUo9sCL9y8Y3n94z7Bt7lwGuMuLW3oYjAy1KDYcZMC589cYemtKMA0HSVAD4DUcJIkMQD4DgdaSFLhwdc8cMB9EowOChv849wGsp//kCoY3b7/ADUc2lOqGw1xJkcvbp8+A+xbd5TAJslyOK1LRDUOPA5g+lDAHpXMvJydwMqIGQDHcKzkZnPCpCQCMN4WBc+ctswAAAABJRU5ErkJggg==)}\n#webamp #title-bar {background-image: url(data:image/png;base64,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)}\n#webamp .selected #title-bar {background-image: url(data:image/png;base64,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)}\n#webamp .llama #title-bar {background-image: url(data:image/png;base64,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)}\n#webamp .llama.selected #title-bar {background-image: url(data:image/png;base64,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)}\n#webamp .selected #title-bar #option.clicked {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAnUlEQVQoU2WQOw7CQAxEZ3KGpERQQg5CtqKgDB3H4DB0fCoKKpZDUAI9LWfAyA4mRkyz8urp2RqW5VAQQjJMBUgBHbqfFxhPN+ihAsALIDtIgbQ84rSeYdJsPyaFAKjpeVmJApoIxbUGHfLDoHkzsNdn/2NVjUREvrfccmur3VynXXdTVDukqzV12sNMPxUAuOYWavD8mawl66rv6w39Lzed9tD61gAAAABJRU5ErkJggg==)}\n#webamp .selected #title-bar #option:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAfklEQVQoU2NcPCXrPwMBwAhSVDflNMPpZa4MplG7MZQ35ZgygBV5WgkweCRtYtgxzw9Mv/3BCVcMVvTmXNV/kAQIwBSB2DCFcEXrdj4GKwpylwXTMD5MDO4mYY7vGKaBTN5+7APETSCHgwBIIcxKEA0CGIpgrkX2Kdx3hMIJAHR4Tj10qlFbAAAAAElFTkSuQmCC)}\n#webamp .selected #title-bar #option.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAfklEQVQoU2NcPCXrPwMBwAhSVDflNMPpZa4MplG7MZQ35ZgygBV5WgkweCRtYtgxzw9Mv/3BCVcMVvTmXNV/kAQIwBSB2DCFcEXrdj4GKwpylwXTMD5MDO4mYY7vGKaBTN5+7APETSCHgwBIIcxKEA0CGIpgrkX2Kdx3hMIJAHR4Tj10qlFbAAAAAElFTkSuQmCC)}\n#webamp .selected #title-bar #minimize.clicked {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAA0UlEQVQoU2PU1XX/z8DIwMDwnwEO/v//B2b//w8RZNTT9fj/n+E/g4TIV4QqKOv5Kw6wXkZdXY//EiJfGHg5Qcahgs/f/zM8e8UBUuT+X1frMwMf028GZhY+uKq/fz4xfPrHynDhMidEkZ3BHwYOfn4GUe7vcEWvv3Iy/Pj4kWH/WbB17v/zU/TAksoanHBFd29ANPTNOAtRVNubxaCiLovioG//hBm+f//BkB+SBVEEkp08pZ7ht6gwisKC0GyG///+QRTBwgUeNtBwA4cTEAMA/TJUU5fQt84AAAAASUVORK5CYII=)}\n#webamp .selected #title-bar #minimize:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAm0lEQVQoU2NcPCXrPwMBwAhS9O7WA4Ytlz9hKPXR5WMQUlNgACtatPYSAy8nI4aiz9//M8QF60EUbT98gYGP6TcDMwsfXOHfP58YPv1jZfC0NYAoOnHyJgMHPz+DKPd3uKLXXzkZfnz8yGBhrg5R9PMvN1hSWYMTrujuDYgGduavCEXICmAqQQrhikC+41bWxnD417tXEb4jFE4AW+1HqrTsrEsAAAAASUVORK5CYII=)}\n#webamp .selected #title-bar #shade.clicked {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAnklEQVQoU2M0MPD5zwAC//8z/GeE0BAuhAYBRgMDbzCvqisNLghjtJTMYPjP8B+kyOd/VVcqg4q6LIaiOzcfM7QUT4costb9jqEAJnD4AitEkZLURwZJYTYMhc/f/mK485gb4iYlqU9gBcgKQQpAAK5IVPAjAy8nyGuoAKSAgRHkcH2I70SFPmIoevmGBxQYEEUgb6KHDTjcQGEElAAA1iRAvaht+tMAAAAASUVORK5CYII=)}\n#webamp .selected #title-bar #shade:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAbklEQVQoU2NcPCXrPwMBwAhTJKMqgqH0ye03YDGwImwKYDpACsGKTpy8idNCC3N1iKL12y4zSAqzYSh8/vYXQ6CXLkIRSAWyQpACEIArWrT2EgMvJyOGSZ+//2eIC9aDmASSBSlEByAFcN8RCicAyEM1qg5esnAAAAAASUVORK5CYII=)}\n#webamp .selected #title-bar #close.clicked {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAA2klEQVQoU2PU1nb5////fwYGEAYDCP0fSoPYjCBFDkb/Gf7++cRw5vp3qEIGBhNNTgZmFj6Gvaf/MDBqaTn/t9P/xOCjp8ew/doDsGKQpIW5OsPRo6cZDpzngijiYnvJYK4rDpZ4d+sBg5CaAsOJkzcZTl5+yfDlhzBCEch4TVFRhryJWxkm5XszXH/9Gmz9l+9CDIxamk7/udhfoZhk6CzOsHLNI1STQG6ytjYFWwFzU3iIHMOyFVcYDpzjhJjkaMKI23enfkMUwcIHFjagcGNkZGT4/+8fWAoAfA9uA+6EgssAAAAASUVORK5CYII=)}\n#webamp .selected #title-bar #close:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAfElEQVQoU2NcPCXrPwMBwAhSdOLkTYa/fz4xnLn+Ha7cRJOTgZmFj8HCXJ0BrOjo0dNgBea64mDFIMmTl18ygBRaW5tCFE2ccwisACQRayfHsPjQIzg/P8UOoQikS1NUlCFv4laGSfneDNdfvwabjqKIoElEuYko3xEKJwDjnmWq36AmKgAAAABJRU5ErkJggg==)}\n#webamp #clutter-bar {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAArCAYAAABFN8kTAAAAu0lEQVQ4T2OUkND8/+LFfQZcgBGi4DphBRISmgwgheg0VhOMbTzBJp49sp0BrgCmEyQJkgDxpVUUEApgjoApAPFBbBqYALMbw5EEA2qwhQOygzHigvKQRA8PjLggmB5gaQFneoDFxdM7D8ApDGeKAiUaEMDqBlBKIt8EnI6kXnogGA40yBcCAor/P3xAZH+i0gPMy+DMi24CRnqAKcCZuwm6gTYmoOQLbL5AKaPQ3UAwVeMNBw8PR4x0AwBDHW4yWokSEwAAAABJRU5ErkJggg==)}\n#webamp #clutter-bar.disabled {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAArCAYAAABFN8kTAAAAT0lEQVQ4T2OUkND8/+LFfQZcgBGi4DphBRISmgwghej0qAmQcBkNh9FwQM4fgyI9CAgo/v/wgYjsjzN3EzQBpmCYm0CwnEQOBw8PR4wCFQAkt2FCiLQxGQAAAABJRU5ErkJggg==)}\n#webamp #button-o:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAASElEQVQoU2OUkND8/+LFdQZkUNDYD+ZOqC9kYIQpkJDQZAApBEmCJED8iMw0hAKYCTAFID6ITQMTYHZjOBLFG0gcDDfAfAOjAXCKSgGSzlOuAAAAAElFTkSuQmCC)}\n#webamp #button-0.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAASElEQVQoU2OUkND8/+LFdQZkUNDYD+ZOqC9kYIQpkJDQZAApBEmCJED8iMw0hAKYCTAFID6ITQMTYHZjOBLFG0gcDDfAfAOjAXCKSgGSzlOuAAAAAElFTkSuQmCC)}\n#webamp #button-a:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAR0lEQVQYV2OUkND8/+LFdQZkUNDYD+ZOqC9kYIQpkJDQZAApBEmCJED8iMw0hAKYCTAFID6IjdUEZOvgCkgyAa8bULwD5AAAxLw7gVdqRloAAAAASUVORK5CYII=)}\n#webamp #button-a.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAR0lEQVQYV2OUkND8/+LFdQZkUNDYD+ZOqC9kYIQpkJDQZAApBEmCJED8iMw0hAKYCTAFID6IjdUEZOvgCkgyAa8bULwD5AAAxLw7gVdqRloAAAAASUVORK5CYII=)}\n#webamp #button-i:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAQ0lEQVQYV2OUkND8/+LFdQYJCU0GbDQjTAEDFBQ09sOYDBPqCxngCpBNiMhMY1gxfRbYRAwTQNpBpoB0gwANTEB3JAAZlkYB4xP/6QAAAABJRU5ErkJggg==)}\n#webamp #button-i.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAQ0lEQVQYV2OUkND8/+LFdQYJCU0GbDQjTAEDFBQ09sOYDBPqCxngCpBNiMhMY1gxfRbYRAwTQNpBpoB0gwANTEB3JAAZlkYB4xP/6QAAAABJRU5ErkJggg==)}\n#webamp #button-d:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAVUlEQVQoU2OUkND8/+LFdQZcgBGmQEJCkwGkEJ2GK4CZUNDYDzdsQn0hA4YJIAUgCZBJEZlpCAXIJoAUgABIMWETBAQU/3/4cB9uL8wKvCbAVIOsAgDuqEoBP9gxBAAAAABJRU5ErkJggg==)}\n#webamp #button-d.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAVUlEQVQoU2OUkND8/+LFdQZcgBGmQEJCkwGkEJ2GK4CZUNDYDzdsQn0hA4YJIAUgCZBJEZlpCAXIJoAUgABIMWETBAQU/3/4cB9uL8wKvCbAVIOsAgDuqEoBP9gxBAAAAABJRU5ErkJggg==)}\n#webamp #button-v:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAQ0lEQVQYV2MUEFD8/+HDfQZcgBGmQEJCk+HFi+sMBY39DBPqCxlA/IjMNAa4ApgJMAUgPohNIxOQHYzhBpjdIBrkWAA2DTuBQHwD7wAAAABJRU5ErkJggg==)}\n#webamp #button-v.selected {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAQ0lEQVQYV2MUEFD8/+HDfQZcgBGmQEJCk+HFi+sMBY39DBPqCxlA/IjMNAa4ApgJMAUgPohNIxOQHYzhBpjdIBrkWAA2DTuBQHwD7wAAAABJRU5ErkJggg==)}\n#webamp .shade #title-bar {background-image: url(data:image/png;base64,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)}\n#webamp .shade.selected #title-bar {background-image: url(data:image/png;base64,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)}\n#webamp .shade.selected #title-bar #shade {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAt0lEQVQoU2M0MPD5zwAC//8z/GeE0BAuhAYBRgMDbzBPVPAjXBDGePmWl+E/w3+QIp//ooIfGHg5GRkUPWMZzNXFwWpO3nzJcGndIoaXb3ggipSkIKZEFJSgmLZiQg/DncfcCEU10ycy3Ln5GJci7/9KUp8YQIqQQUtmPpgLNcn7P8jRNmGBDL5ejmCJzdv2M1zcvIHh8/f/DC/fgqzTh/pOCIvv3vCAAgOiCORN9LABhxsojIASAMaCUb12it8UAAAAAElFTkSuQmCC)}\n#webamp .shade #title-bar #shade:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAbklEQVQoU2NcPCXrPwMBwAhTtGjtJQylccF6YDGwIpACXk5Ghtx8RxSFbR37GEAKwYrWb7sMlkRXNHnifoZAL12EooJ0FYa/HLIoJmFVhKxiwsw7YC7cJJCbagtUUUwBKfr8/T/CTSBZgr4jFE4AB8s/qnrmyC4AAAAASUVORK5CYII=)}\n#webamp .shade #position {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAHCAYAAADu4qZ8AAAASklEQVQoU2NkYBD4z0ABiMrOZmAEGWJoaES2MZpWlhBDDAyssRrCyPidoOEEDSFkAsgSig0BWaJlbYDfO4RcAjckKruaotgBGQQAyX8RwVE3PzkAAAAASUVORK5CYII=)}\n#webamp .shade #position::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAIklEQVQYV2NcPCXrv6eVAMP2Yx8YGN+cq/rPAAVkcZBNAwAdshtHcq1eDAAAAABJRU5ErkJggg==)}\n#webamp .shade #position::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAIklEQVQYV2NcPCXrv6eVAMP2Yx8YGN+cq/rPAAVkcZBNAwAdshtHcq1eDAAAAABJRU5ErkJggg==)}\n#webamp .shade #position.left::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAALUlEQVQYV2NcPCXrv6eVAENg4SUGxjfnqv4zMDAw1HTvRnC2H/tADAesB9k0AJoiJGC3Nui1AAAAAElFTkSuQmCC)}\n#webamp .shade #position.left::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAALUlEQVQYV2NcPCXrv6eVAENg4SUGxjfnqv4zMDAw1HTvRnC2H/tADAesB9k0AJoiJGC3Nui1AAAAAElFTkSuQmCC)}\n#webamp .shade #position.right::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAL0lEQVQYV2O0tff5v75fj2H7sQ8MjBmRpv9bSl0ZQIBx8ZSs/55WAoQ4KHqQTQMABhYbRz30MGgAAAAASUVORK5CYII=)}\n#webamp .shade #position.right::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAHCAYAAADNufepAAAAL0lEQVQYV2O0tff5v75fj2H7sQ8MjBmRpv9bSl0ZQIBx8ZSs/55WAoQ4KHqQTQMABhYbRz30MGgAAAAASUVORK5CYII=)}\n#webamp #volume {background-image: url(data:image/png;base64,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)}\n#webamp #volume input::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAeUlEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rpCij8FQQ4eBkYGB4f+t568YLl+9RVDzuRMXGM5fu86wbdlUTI1xwUEMi9auY0CnQaYOF434Qgjmx4NbVyMCZ+HcVQRDFaQAFKpgjaB4tPcOJUoTTBFYI7kpBwBj9Y4F5LolbwAAAABJRU5ErkJggg==)}\n#webamp #volume input::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAeUlEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rpCij8FQQ4eBkYGB4f+t568YLl+9RVDzuRMXGM5fu86wbdlUTI1xwUEMi9auY0CnQaYOF434Qgjmx4NbVyMCZ+HcVQRDFaQAFKpgjaB4tPcOJUoTTBFYI7kpBwBj9Y4F5LolbwAAAABJRU5ErkJggg==)}\n#webamp #volume input:active::-webkit-slider-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAiElEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rhCtz1BDB6yWkYGB4f+t568Y1CTFCGr2ispm2LZsKpU1/v//n4GRkZEBnQZZg9dG+mvEF0Igp54/tp/h0/s3pIcqXCMoHu29QwlGBUzBwa2rIdEBSjmvPj4DW88nKAIWBLFBAJ0P0wxKOQCfeG0Fez8X/QAAAABJRU5ErkJggg==)}\n#webamp #volume input:active::-moz-range-thumb {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAALCAYAAABPhbxiAAAAiElEQVQoU2PU13f5f+fBJQZSgIqCHgMjN7/Y//M3rhCtz1BDB6yWkYGB4f+t568Y1CTFCGr2ispm2LZsKpU1/v//n4GRkZEBnQZZg9dG+mvEF0Igp54/tp/h0/s3pIcqXCMoHu29QwlGBUzBwa2rIdEBSjmvPj4DW88nKAIWBLFBAJ0P0wxKOQCfeG0Fez8X/QAAAABJRU5ErkJggg==)}\n#webamp .gen-window .gen-top {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAQUlEQVRIS2OUk9P/z0BjwJidXUN7S7S1XUYtITomGUeDi+iwYmBgGA0uUkKLTsFFl7KLLpaMFpCkJK9hlBnpkboA0WAgvSz+5SMAAAAASUVORK5CYII=)}\n#webamp .gen-window .gen-top-left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAB4ElEQVRIS61Vu04DMRDc3WuQqEBIVKlAQkKioEZU1PkVpHzhXZX8RUCiTpUjojs04/XrcjyUxFF09p3t8c7OjnU2exikaiqqmt6wryY6iLCrxg5+aGp4Wh77WszjDMwFyHw+r2GwEb9jmm+GycXmEYhgFjaM8/fWRZCuXYaj8kweTbExI4gbqYpxnIFThFxj+UBlJG27DFQ4DE9anb4Y+yYJhNSoqMWD/ATSrSIxKZJtv67TdeAo5SREoqJD4Ljv1/LydCO3s7MDt87LEsg4J/3nmywWr0cDkP6U+G4l0LKnXQByeXF+YhCoC1lxmQIEdJ2iTdAlzEu/e5f7u2t5frw6GqcG8QrFA3Ww+/o4GqDOCeny5iqD7vkP9ZzrZqJOyDTs5bdipLpEZNtv9guSi8MBcuXnwvMP2SmSE4y8awwyrnzaSGmMlc2MDTLazR8gMM1sM7Rb5im4cuHCUZFuQdlQs9ftJT7SBZCOVuNUaSNmOGEjhnfsF5R5Tho1GSpjLax+TBdB2pWXTsPUmzXBYV0M6JvfN3R8CZTGdxRM6cLTIMH+UTe8nCJl1jh1iDJSmNVVglBt1X1SqCtE4rIeSdpIHaIK9FF4BmKjOAA88Nv/InHgcJXmeyJTN3X91ur6BrqJo0MRJOhhAAAAAElFTkSuQmCC)}\n#webamp .gen-window .gen-top-left-end {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAABxklEQVRIS7WVvUoDQRDHZ/r4DIEThCiCtn4UCpa+gIiF76DmCWwv+D5WYm0nCFpZCSKWKZIdmY//Zu/CxSaXQPZuM7v/md2Z3/DO6FSEhESE9COSbCSbjUdKpC9qY7Nmu7wGa5MQsVn6Djy+qWMpRHwD1+nazIXwdVGTtfkU7+EZ8dHBpVnoD5tBcglsoqNGZ2Nsi7nCGbWx/+EYIhUhPj68Et/EpVTCDIsNTVznUyJhIUouZh7H8apzcIQ4HApRHg4rHH3cwHqHwaAivr87703k/XNKj88fxJPJpDcRPZO6fiDe39vtTSTxlH5/5sTXF2e9iWgkdlx93snTyze9vn0RV5tbvUUyn81osFGVdeJalu9R7VbBKVmN2JzWSVQ1UASUoBiBJq96rxdeF7u8lt3BJXZtj06CIisA2Y6uzbQcnQs5uhYI4vFtLZmuK6CIYyi5lsFYOBGYzAxTmwKQosjpZlcAEPfWuAtEUrQL3ImJAJDGOu0bIPAShb3XLHqP09lhGmgFqdVbPDdE0LDQrAoROwLNrPZcRn5k5X+o7+4nqXGMubdEerZT2BxpR+Ip7BlRpiHaL5pQo3aK7MpNOqLKTbHIrj9doofFD8vqAQAAAABJRU5ErkJggg==)}\n#webamp .gen-window .gen-top-right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAC2UlEQVRIS41VTWsTURQ9D7ooSRDJdCNoKjGoaY0YsMUmXaSCC6H9A1I3/gfpP3Bpgz/A3+FGJ7Q2AaW6slJIUFHxg1JaP7PIvCf33vfezCRSZhbzJi9v7rn33HPPqLnqigEMDN2NphsMaOE7r7xDK/0vu/acrNoAhUIx3uMIfJDPqo37D23YdGAHQKuWDCZAtAd3QXnHnyOcMOxCNRvrnJg2GiqVuU4EJyCqQoC4Or/S67LnWIDWMCoGU8uNdSZGcdk2gAMbC5gCoTMUzAIIveA9BlNCNV1qdrZsaxUaT7pmglqqkubVv3i5/xZ7e7/8a3NzBSxcqiLcdfQD6sHGWiaQ/schnu4MEBTnPV21y8cIhsfofjmA+j2EyU+jcWYGvf4n/DT1uJJ2u50JhFLd3HyUAukPtnDzRgXl/Ajvj37g/OlTDPDmwwil0qJXm6pfq2UC0WqIo8OIQVzvBoMtNBYD5CLDAAT07ut3DD5PoXRuQaROPbl351YmEDo8ThdVMj87haXKWQa4fb2Cx09e2UoIhPWcvSfbrw+wt//NV0Ivu54QRcPRENNT0wzIPdH1uJLyhYuZKolGIwTFK7ELGA1S1/MXPfQPc15dleIfLC8uIdxVfih5GHlGEtPLRpIYNrEON4zyH//moRT7EVfQMjvKeoqji7wr6U/eu0BBYq2Lb415GQ+k9TgYFPIBD2ertYSw0+MB58ZXqy3xOxnXzAYpNmIN05poIVfkSSeQTtj1FE4YpHdaHyAOJFWmXZlpsgk+C3f4cQLEGSSZY9q7nBHG/Ul6F5/13hXBROJXRElrZayS5eZdQ7wSl66R0nhr7ba5LAQ6pSNJhowwkZg4rzhxa6WRpktc2KrEBbTqonciVpkkQM+sICNA2jmuBxBVTYKcUAnTQwFYwpHIWstzpCMB5KGmZ9fn/4A4CYukJ9UFUMa2L3aWqILkh2p1bRWdsCffW2r8GF3/AFk9Lp/bePdhAAAAAElFTkSuQmCC)}\n#webamp .gen-window .gen-top-right-end {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAByUlEQVRIS7VVPUsDQRCdWRvBShGszoAKYg4C1mJj8m8Cgr2/1cLfENBu5b352D1NY7GXhLvszc57MzvzRqdpU1VV8MOlolJFpeCvFuEq3uMDGyxU3Ls1mrit22MvfWDffv9e7dGccfGXg3CYd5o6KS1GrtsbPoK0zuttNXtjh3thZG0zWaYTY8z3ngGVIlosMiMS0cNGhCBprCq1ihTEWVW0mPNMlRNAKrC5SAAZoRLA/uzsRed5Vw+HDxqNunS1uqnbp1u5m05HYQhB3t5ehwHweABycX42HgTpGnkxkvX9lTw/Xg7DYXV9fX8OA+CZzA8vVbwfotYhK9Zw3iuhAtmgaEhvvGhIykqoABq6UJ74vZ422YwhAyYLTbOsgTv5iOdOz9j1qVve/a5UekwgE2ThfAnSVMCpdXLS5MlOIQWyZ2tpa/q1EMbQOAV3k5c/kaYqe/r+L5AOvtAuW4voeKY8DmhfJ5BkXzwlfOksUBR5oFhvotkLa4BYVKHGATLvcp5AdS3DHYinrZ8XrQgccDEa4MMjCQVnCZ+oaEy7fkZ0g2kBQp1HfA3E5lArDpawF0OWcIaJ4/TDzPF7tMpatNYOffX5hPUW/wFZNjaZ4b4luAAAAABJRU5ErkJggg==)}\n#webamp .gen-window .gen-top-left-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU0nT8z0BjwFhe1kd7S2ysY4eJJfLySrT3SVu5L+0tmTBhAu0tMTTQpb0lSVGutLeELnGipKxGe5/QJTPSpeyiiyWjBSQpVRAjXVIXXSyhR+oCAGL8JbEqBdscAAAAAElFTkSuQmCC)}\n#webamp .gen-window .gen-top-right-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU0nT8z0BjwFhe1kd7S2ysY4eJJfLySrT3SVu5L+0tmTBhAu0tMTTQpb0lSVGutLeELnGipKxGe5/QJTPSpeyiiyWjBSQpVRAjXVIXXSyhR+oCAGL8JbEqBdscAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-top {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAQUlEQVRIS2OUk9P/z0BjwJidXUN7S7S1XUYtITomGUeDi+iwYmBgGA0uUkKLTsFFl7KLLpaMFpCkJK9hlBnpkboA0WAgvSz+5SMAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-top-left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAB+0lEQVRIS61VK1IDQRDtnlwAhYuhEJhcAI9AzKK4AHdAcADOtROTDVdAERxVxGQWQSGW6t98Nh+RZCOyn5l+/V53v8HpdDZAdSEgYnrD9+gABwC+Rcc39KMLHf27/Kx7aR2voLUE4r2vYSgQf6dlGowWF8ENiMGcBLT1W/sMJLQLSZVzUjZFYGZggRDB8XMGTgx5j8sJlUzadiFSKAxnWmVfPGuQBMLSIKCzRPaBhM6ESUw2/aou15FPqSbCBAEH0Tj2K3h9voP724sjQ+dtCWRck/jzCauP95MBWP5U+NAB9bKWHQjk+uryvCAt1YRRBIZASK5zXIVcnY5EBnn0M3h5ujkZpy489ZcyoZH5/fs6GaCqCcuVpiRbC/W+WMjhOeH8yF4ODWMIHVDl+36tky82kQGEVJ78PHj6ITtFcoKRdxlI7NfJIA1koBzFnAojLG1mbJBmNyMQk6uPwqQx0yw8q/K0QtzSgrKh5iS2Jj7GNW9vmgZCWLIflTWhgI60d2KESUKtyQQdDJWxFlZvtmJMyP7nYcmsKseVQ0X1d+D0vGHHBzlr7B0nt+3CCMxE5QrzN+4q3rS3u6Sjyu4qQbiuZivGhAsPCL7xMG+JiWZrnaXM8gGlJ6ATGYUlAQ+AOKmZmEGyXADgHxoGoZrEzbecZ7taeOfxW3fXP71np0Lr7PoWAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-top-left-end {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAByUlEQVRIS7WVPU4DQQyF7Z5cgaVJpAAnIFAk50AcgB4UwQEoKNJQp6GkpKCgp6ShoUFcgCJtkBgj/7zZ2Y0WmmwiZXcnXj97xv7MB+OZCAmJCOlHJNmVbDVuKZE+qI2tmu3mO3g3CRGbpXvg+cUiXoWIO3CdLmcuhK+Lmqytp3iOyIiPj07NQn/YDJJLwIleNTu7hlusFcGojf2PwJCpCPHJ5EzciUuphBkWDk1c11MiYSFKLmYRx/ZqcAiEOAIKUd6thtj6OIHtXgY7FfHX61VvIk8vK7q+fdZjyKe03RTCW7U3Ip5NJ71l8sMr+vz4Jr6/O+9NRJOx7erzTG6W7/Tw+EY8HB32lsl6vabBoCr7xLWs3qPbrYNTsh6xNe2T6GqgCChBMwJN3vXeL7wtdnkve4Ab7NofT4MifwCynV2baTk7F/KmqBHE88uFtQqI2QVFbEPJtQzGIojAZGaY2hSAFEVON7sCgDi3xlkgk2Jc4ExMBIA01uncAIE3KOyzpp49TmeHaaAVpNZocd8QwcDCsCpEbAu0stprGflRlf+hvnuepMY25tkS5dkuYQuknYmXsFdEWYYYvyiERu8U1ZWHdGRV47aurl8JSofPjXVkWwAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-top-right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAACuUlEQVRIS41VPYtTQRQ90yRNsIgRt9gPRfbjBbUTNAmYKGzj2lmurYW1IugPsFCsrCxsLCzcTkTYxU0EswqSFC6oW4QFtVjBYtWAZCEzcu+dO5OXXTZ5xZu8ycw9c+4994wpJjUHODh6O0svONDAbx55hkb6X2b9OhmtA3K5fJzjCLyQ15o7tx/5sOnACkCjlRPsA7EBXIPyTFhHOPX6Bky5tMwHs87CpE5uB4ITELEQIGYXRtouc5oFWAtnIpiplJY5MYZp+wAKNhQwBUJrKJgHkPSC5xjMSKrpMdMzs56rpPGw59jRYopJ+ew//Nnbw9Z2J2ybP3kKRzIZ1FuafsD8at8dC+T1xi7uPVhDIb8Q0nVm4TeuLU5jtbHDYBR8sTqBldVvaG1mIhOnnEbRADBzYi4Fksm2cW4+4cA7n39ionicAT9ufUG3WwxqM5dq5ZFM+maXj7Dd2WMQrV022walpzKZxY2Hb/Dk1mW8+9Hj9HX/JiJ1qsmzxzdHgijJ4XQNM5lKJvHq7XfPhEBYz+PX5P7Tr3jxcjMwoc0H1eTKxSk8X+ug9SkTmczOnR7JpNfrMZlCPoku4CwOV5cJTcnNyD0y0L1sJAPNJtahzSj/8Tc3pdiPuIJvSkMAfekbShd516A/Be8CBYlaF98a8jJuSO9xcMjlCnyAWq3EdqIeZ5KkKr+lXcc2SLERMUzGgQ0g1ep5NBofYrqGDTI4rTpuGKPzRlcWh9ZWq683+Tsw8XuDQZI5pr1LjTDW50DvCjWx3ssUpBk7vlK+7iivVHotpJ4u3C/qul4Qepi4Pn0gYdKMhRcX9pS9WlRdxgF9VozWyhfez4nlR3U52+d0hZp4xZrDmHB6yM5TEh64T9TaB1Pt1bXumXDHq4RF0/vVJerRVA5dv8wIWLq6hEbjfbi4qrULnC4VxH+78U2W+ZWyrQAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-top-right-end {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAABzUlEQVRIS7VVu04DQQy0lx+gokuQEEjAiXwAJYSCgpIfoE1NgUTLT1KRjh4qKBbN+LF7kIZiL4nusuf1jL32WBeLVVVVwQ+XikoVlYK/WoSreI8PbLBQce/WaOK2bo+99IF9m81ztUdzxsVfDsJh3mnqpLQYuW5v+AjSOp1fV7M3drgXRtY2k2U6McZ87xlQKaLFIjMiET1sRAiSxqpSq0hBnFVFiznPVDkBpAKbiwSQESoB7M/OXnSa1vXjc0ujUZcuD0/qy+ON3F7uj8IQgmzfXocB8HgAcnx0MB4E6Rp5MZL7uwt5ejgdhsPq+vp+HwbAM5nOrqp4P0StQ1as4bxXQgWyQdGQ3njRkJSVUAE0dKE88btcrLIZQwZMFppmWQN38hHPnZ6x61O3vPtdqXSXQCbIzPkcpKmAU+vkpMmTnUIKZM/W0tb0ayaMoXEK7iYvfyJNVfb0/V8gHXymXbYW0fFMeRzQvk4gyb54SvjSWaAo8kCx3kSzF9YAsahCjQNkWuc8gepahjsQT1s/L1oROOBsNMCHRxIKzhLeU9GYdv2M6AbTDIQ6j/gaiM2hVhwsYS+GLOEME8fph5njd2eVtWitHfrq8wnrLf4D9zg6mAHJo5AAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-top-left-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU0nT8z0BjwFhe1kd7S2ysY4eJJXLyqrT3yZtzVbS35P///7S3xMnRmvaWLJ6SRXtL6BInqmo6tPcJXTIjXcouulgyWkCSUgUx0iV10cUSeqQuABQNKbDZQyxmAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-top-right-fill {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAWklEQVRIS2PU0nT8z0BjwFhe1kd7S2ysY4eJJXLyqrT3yZtzVbS35P///7S3xMnRmvaWLJ6SRXtL6BInqmo6tPcJXTIjXcouulgyWkCSUgUx0iV10cUSeqQuABQNKbDZQyxmAAAAAElFTkSuQmCC)}\n#webamp .gen-window .gen-bottom-left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAAAOCAYAAAACNhNKAAAE7ElEQVRYR5VZTXpcKQyEnnPkCLlAVjMH8JmdVXKarDLrkE8/JUpCtNvthd2PhwBJVSXh+eXL1/X29ja+v/8Y8vn9/y/9XZ/J99tnzkc7NPnpTN/GGPn7PMb9DXo+yxw1L+Nr2W//dO+lZ81aMv/c4WOMucZY0zazjm37FjCzWrAN5bOd73Rnb8/ie4id9sthUfMLfESxmK8E/YioO22KM+TzuAQdAekWhg12tR6KgncJjpoLr4gLugR67tztOHsP39dcY459noi17+UxZmzR8gHz4WB5Y441xE6TiJEfeX9qFzPDvznJBFxr/RkVZLwO1hVbjdvt2aeDzgFHUDg4axn4sOiBRhx2jQcxhIJJ/dYzgKBhqW0fp6RhB2McDrTlz6SsQQeSO0bQFemMCDxIQFOmJOjBG8IklSmKTVlG/YYXhcDYJcpGTTLXZ8hUtXUS1OeCHpvEAcSo02txTIQ2ggnHMZI3wjabIENLkN3+gfDiyI5KkTBMtUfQHe2K9FWCWAOKAAYxPQ+6In9vXDHNSSQs/E9ZQxhkJ9WWOrV1QXtml9ACcy0k6nNId10LBJeMY22NZCW9dd3dAbD5j3TYj6m95nlQcRAAJ0uXQEy5nmqEoHBclR9aWM5grLTpnROK5SKSmZCueVpqkSwb8HVfRtxrqLRJK0LAnjz0Cr1r1m0owlNGNSgWRNcRWH63YQJGY7bs2VKRlvSbOEE0rmjnfjXE07XtTJcIFApBXV5QuXWdmSUfS0YMTUbBWUJuRSdmbNW3EwDpRu+5aOSd3wIeiQY6J2TX1HmB3o2aTGZCLIwMUVjoRhlBxrmJeXXcj+z6zJpukTEXAkVtVSt20n5OidjzcqBb6ocsMRKci7l+iLyotQWXbZcOAvR+AGcKT83xx+Cofx/sUQDUJpOfAX4LX5auI2DwDOnv338qeqsTk9Y4zdUKPh3woHCbBLuseegIjsIIpBK0mxEPe1LsZartJMNpHwGnlo+1PgGuaG4Uc4TyVGgmPnRcS8IwtWN9CrhNc6B1XeKlmAuk+7on0MkPt6Bzgm2+cTh27WrXXh09Ko7UU21J6rIFY4pTZuDdS2V7IBNmi6ULSnMC0ZaC9Ho2KQztB+/W3IT/9Pxd+5c91H9r4nKl94uFePwMBXnzxSlN2NDeybzHLaoT5Hc56RMEHMhPVMWy1C9+yAwfvkpB2Z5avADChqQuqY1qvnOycfu51TBp2UtHFelekS4D//737ZUcavvfiqNT1zdb1ORgejRM02yV8ktG1Eq72X3Xf+trCeGXahmXNQdQP2asK1PE5UnTmt44LdgF1T9Y7oNw1ZaTgw55hsPju0/KGem6KA8vN3K14IqEUMo1f3P25jusfRBFWgnOttVcvNB9Aq9JFnNK4X2v3hGo6g/sIWoRv6Hly5lbYqZirmnXZE0p6LQFpQL+gMgLFzTW4+e7AE7noPd3v3vfUrXbMTskem60NeZCbSFSIZRTY9+0oa3J47lPR4F/XnYAlZ2saPGneVFR0xVxvm+wBgVcz4NbFC4YK1Li4sRSVj5xA0itW70AOniK7EblHgywiW4nH/m8gBtrpZtNlbFTXjToL3F5vMQauK/Ko2fvCofuGVE1IzwX+vzPlF1xHxr4pAg7kd5IxAf1wJWiYaroOrFwFqRO2x1QnXDFlTJ1UC/rOktX+cfLX0ebsYBV+HOyAAAAAElFTkSuQmCC)}\n#webamp .gen-window .gen-bottom-right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAAAOCAYAAAACNhNKAAAFQklEQVRYR51YS44TQQytmiUfCYlbgMRHmswCIciI9dyBW8AxuBGsWMCCI3RnOxISErNOIX/Ldrk6GbLppFMfl5/9/Mr186cvrdhPa6XUWgo84WO/u4H8A4bh8L5MK37JOM2O7f+Z+WatcUsal6/RbWrlWGq5KPB0x6PJ/lxn2A5nqqUWPNumfd02N8cYMbc98Vtjb1awmxZpzZ8pg+Xb1+/6en/9psjvv3e/S3339qNFCwHEc8ETDsrf3ZN310NtGCGLV3bUkedelFqOMK/WEcAAgjobTYIV0Lhi18T1ulfwm/oJHIcH8O7xzu/BVJ1NeZBpYHMAwVq4n7Wdv7v12A6bGDRsMM75hsKNzg1BR/M1Cgbcd1evy88fv/D9NuiyIGQ3b9EauVw+0+g1GYAOl8CBpMJ8a8UC3Rdkp8qchCW6gyFILhh4s8fM2eY9gi6+NUBFZyN4Cvo2+1jgNbgnLETBMGbyUYPEhSlBbEweUN0AHgA/rEu5vf1zJujKfvmOGXXHjNdzVM42Bh4s6NlNDEtRyxGsgRYqjjALZpMECc0RqqOAwo2UftWNnOm1MT0zMJ0xu8NH6p0Az1Ms1erIJNspCwLTALR9Uv8zltYK48RH/Xya9RodrQjgy7qWhw+enAM6naQDW5VCcc+NWhbrTDyLZQsLframOD7VBkjvSO5oG9gFZ5a3hLuZGQGX8jWcJQN3O9Nt0NkAs9C6IEqAp0y37DIG7UD+MCfoEmCy3e4VZjgAvt9f34Pekaahpnun0sZGzAS+sQJH6J0EHoFgP1p7uZy4P3H7jXKiNZ0z3oJnGFL4A0fZzLOOZ5FEcTADONnHjnf6Y0yMTDfIeQFwZLtYEkKmU8IFhx9JD0m2X169LIfDWtZlLe/3+/vTu0SWCCXZbkuVZ4pSiRholSlImAhpnj8SShrREzUt9daKOYQrZK0VVVCfj6DkmR6doNO6OHpV2aYdscZHYDTIoxA1GZjrAwkxH2SkI9gD7jy+nHWnyXvIcAD8UNZlIcAPa1mW5Vx6d8SkCpiSfzvLUe45IBVRplsShJjlkZpYxGkQhFISg62DTGLHMwcH/+RqpaCzY8V1IY9CII2BRT6xgSvnjSlpM1k0R7fRxyvPTcpomu2tlcvdiwB4B3+q3p8/+2BD7vS9PHonUKNkhGGeZAazVXbVi3QZZgvgmBng9MTHPsNMELiYthNP127KwajEbBkiDanjnJhzTNyTKZSxzFHb/Qi/PzmjWyHr3dzc+Hu6A50QuzfwsR5KP2fW19HsyoShy8DRDQqoZNkEdJlZWfmKjcpIzrj/AD3LRoZ8YLLBRiM+zBHTm1G6D+kuJEQWsjPGguUH0IeOnAAPz1PdOClBIQOkFKTZoSwontiiw4F03YtpZ0/qd6BfV7mdAPSBfqqUndWRsx206J/0FpSzSO6dLBm2u3TzjpysJYIiUmvGpQpi0u7U+b3RAK9sDVbxwmNJXHeR4rpxQ+MjqelCVvHalmkSaXFOlTuHrWvYjOVCGikzKs6ubTGwoh/cjUMv0uaubnoUvmvK/QBzKxAfwquxDcuZS2XBNxM6jYyxZ69rdolIOaPo8iNiG1OYwgJPyrwr2tjeJYYNRCltWBvUQSFzE3UQcNLMzQCN19SsNOI8bU+Kd8gQ341Dap22Vp2QE9u5FGvQCW68DuUu48WsfQe996Gmy8BzqF2yPGQKibikp26vm9x3F5BShyWyRJ0fe5TOX6HZYXoMWnIGik0U+ozpUno2mlLOJvrEVA9yqwnaE2IuZQ/pLxiMtmr640dPtY8PoP8DfVEm7nmO2eAAAAAASUVORK5CYII=)}\n#webamp .gen-window .gen-bottom {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAOCAYAAADaOrdAAAAANUlEQVQ4T2OsKJ/wn4HGgNHOJmHUEqIDeTS4iA4qkEL6BJe2ljPtkzBdLBnN8aQkL0Z6xAkAxvEacVb25FIAAAAASUVORK5CYII=)}\n#webamp .gen-window .gen-middle-left {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAdCAYAAAB8I5agAAAANklEQVQ4T2OUldX97+vry3Bg/zEGEPj85S2YRhYDCzAwMDCOKoYFxWhoQNPLaNoYzSnDsdwAAOHqMrdsblvSAAAAAElFTkSuQmCC)}\n#webamp .gen-window .gen-middle-left-bottom {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAYCAYAAAAs7gcTAAAAM0lEQVQ4T2OUldX97+vry3Bg/zEGEPj85S2YRhYDCzAwMDCOKoYFxWhoQNPLaNoYkTkFAFFf/cnfZ/mnAAAAAElFTkSuQmCC)}\n#webamp .gen-window .gen-middle-right {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAdCAYAAACXFC2jAAAALElEQVQ4T2PMyqr6f2D/MQYYcHC0YoDxP395y8A4qoBhNBwg6WM0HAZXOAAAZMQtu5vd5AgAAAAASUVORK5CYII=)}\n#webamp .gen-window .gen-middle-right-bottom {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAYCAYAAADH2bwQAAAAKUlEQVQ4T2PMyqr6f2D/MQYYcHC0YoDxP395y8A4qoBhNBwg6WMEhQMAnDr5qQGVDEcAAAAASUVORK5CYII=)}\n#webamp .gen-window .gen-close:active {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAfElEQVQoU2PcMjH5PwMBwAhStOPMA4bvjD8Yrl9+B1euqSvEwPmfg8HDRIEBrGj92RtgBUY6UmDFIMlzV54xgBQGGmtAFLUtOAZWAJIIt1VkWHn4PpxflWCFUATSpSfAz5A3cSvDpHxvhksfPoJNR1FE0CSi3ESU7wiFEwDes2XpVzKmTwAAAABJRU5ErkJggg==)}\n#webamp .character-48 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALklEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOWRBJNUQlTCuGSpAEXBCLRQAyQhABbALQ/gAAAABJRU5ErkJggg==)}\n#webamp .character-49 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJElEQVQYV2NkYGD4zwACjxgYGOTALAZGsCBIAARQBLGqJFsQAB97DAFASJPiAAAAAElFTkSuQmCC)}\n#webamp .character-50 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAL0lEQVQYV2NkeMTwnwEG5CAMRgYGJMFHDAwMcngFQSpAAK4dZCaUAzOaEcUiqGoALSMMAep9mTsAAAAASUVORK5CYII=)}\n#webamp .character-51 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAANElEQVQYV12MwREAIAjDwiLsPxeL6AHFU/tMmxrB4o6DgWAA3m3DBJkHjq611acWZZzPT99JIw0BLtFFHAAAAABJRU5ErkJggg==)}\n#webamp .character-52 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAMUlEQVQYV2NkYGD4zwACjxgYGOTALAZGsCBIAATggo8Y/oM5KCpBgshADqYdq5loggB3mw0BA4AXHwAAAABJRU5ErkJggg==)}\n#webamp .character-53 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAL0lEQVQYV2NkeMTwnwEZyDEwMIIF5VCEoYIwMagkIwMDkvZHDAwgXTgEkS2CagcAMKsMAQsy1ngAAAAASUVORK5CYII=)}\n#webamp .character-54 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALElEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOVAoqCONhVQkyRg5dO1wQi0UAjiMOAcrNtFIAAAAASUVORK5CYII=)}\n#webamp .character-55 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKElEQVQYV2NkeMTwnwEZyDEwMDIwIAk+YmBgQBGECoA0QVQiCZAmCAAqiwwBThC6bQAAAABJRU5ErkJggg==)}\n#webamp .character-56 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOJEi8SmK1AwDlIw8BQmY9pAAAAABJRU5ErkJggg==)}\n#webamp .character-57 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALUlEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOpyCydqgRjGAzYQCuHYtFANIjDgHm/HbBAAAAAElFTkSuQmCC)}\n#webamp .character-97 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALElEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOJghVCFONRyXULFTtaIIA8zMQATbDs7QAAAAASUVORK5CYII=)}\n#webamp .character-98 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAI0lEQVQYV2NkeMTwnwEG5CAMRrAglMPwiIEBxIYIEq+SGO0A77sPAfDx/aMAAAAASUVORK5CYII=)}\n#webamp .character-99 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAK0lEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOXRCqAVUlVkG4diwWAQC5Ew4Br31QbAAAAABJRU5ErkJggg==)}\n#webamp .character-100 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQYV2NkeMTwnwEG5CAMRrAglMPwiIEBxKaKIJpFADZCEAGAIkAWAAAAAElFTkSuQmCC)}\n#webamp .character-101 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJ0lEQVQYV2NkeMTwnwEZyDEwMIIF5VCEoYIwMagkHpV4tYOMASoAAEgzDAFPEpM9AAAAAElFTkSuQmCC)}\n#webamp .character-102 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJUlEQVQYV2NkeMTwnwEZyDEwMIIF5VCEoYIwMagkHpVYtaMJAgBJmwwB+fIpaQAAAABJRU5ErkJggg==)}\n#webamp .character-103 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALUlEQVQYV2NkYGD4z/CIAQHkGBgYGR4x/GeQQxJkQBaEqcZQCZLALYhsEdRsANerDwE815OVAAAAAElFTkSuQmCC)}\n#webamp .character-104 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIklEQVQYV2NkeMTwn0GOAQIeMTCA2Iy4BaEKwRR+lcSYCQBnQhEB2omL+AAAAABJRU5ErkJggg==)}\n#webamp .character-105 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIklEQVQYV2NkYGD4z/CIAQHkGBgYwYIgAJKQg8hRRRDNIgAiEwwB3AFbUAAAAABJRU5ErkJggg==)}\n#webamp .character-106 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALElEQVQYV2NkYGD4zwADjxgYGOQYGBhJEHzE8B+kBQzg2rEKgiwCqQABqA4Ab4sOAeXWuOoAAAAASUVORK5CYII=)}\n#webamp .character-107 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAK0lEQVQYV2NkeMTwn0GOAQIeMTCA2IxwQagASA4iCAIw1fgFQaowtKNZBAA/MhABCyXvggAAAABJRU5ErkJggg==)}\n#webamp .character-108 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAGUlEQVQYV2NkeMTwn0GOAQUw0kwQ2RqgpQBKiwwB5wSvgwAAAABJRU5ErkJggg==)}\n#webamp .character-109 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQYV2NkeMTwn0GOAQIeMTCA2IxgQWSAXxCrdmIEAQtSEAH0ktA/AAAAAElFTkSuQmCC)}\n#webamp .character-110 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKElEQVQYV2NkeMTwn0GOAQIeMTCA2Iy4BUGqQKoxVIIEoJJ4tKNZBACxQhIB3vDBEQAAAABJRU5ErkJggg==)}\n#webamp .character-111 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAI0lEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFKOCoJYLAIALzIQAT4IiDcAAAAASUVORK5CYII=)}\n#webamp .character-112 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJ0lEQVQYV2NkeMTwnwEG5CAMRrAglMPwiIEBxIYI4lUJlUTVjk8QAKSbDQEi0gPoAAAAAElFTkSuQmCC)}\n#webamp .character-113 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALElEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOryBMK4ZKJHMZUSyC6gAAMcoQAUXt/9gAAAAASUVORK5CYII=)}\n#webamp .character-114 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAK0lEQVQYV2NkeMTwnwEG5CAMRrAglMPwiIEBxIYIYlUJEoSpRtEO1YrTTADKMw8B2M4pxwAAAABJRU5ErkJggg==)}\n#webamp .character-115 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAM0lEQVQYV22MuREAMAjDxCLsPxeLkDOBC0VUyo8BSfBwMILEl0RyNzu8ctBNzb9Sn0PPDymbDAH15uY8AAAAAElFTkSuQmCC)}\n#webamp .character-116 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4z/CIAQHkGBgYwYIgAJKQg8jRQhAAHwMMAUEO0v0AAAAASUVORK5CYII=)}\n#webamp .character-117 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAI0lEQVQYV2NkeMTwn0GOAQIeMTCA2Iw0EWRg+A+2AASgFgIAozIRASQN3AgAAAAASUVORK5CYII=)}\n#webamp .character-118 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJ0lEQVQYV2NkeMTwn0GOAQIeMTCA2IyUCjIw/AebBQJQsxkZsAgCAIMyEAEhZnVgAAAAAElFTkSuQmCC)}\n#webamp .character-119 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJElEQVQYV2NkeMTwn0GOAQIeMTCA2IwkCkJ1gym4dqyCaBYBAF9SEAF18j0yAAAAAElFTkSuQmCC)}\n#webamp .character-120 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKUlEQVQYV2NkeMTwn0GOAQIeMTCA2IzYBRkY/oNVgABUByMDVkFizQQALzIQAfgfUUkAAAAASUVORK5CYII=)}\n#webamp .character-121 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALElEQVQYV2NkeMTwn0GOAQIeMTCA2IzYBRkY/oNVgABUByMDSBBJK4hJvCAA+YsOAdmHYvYAAAAASUVORK5CYII=)}\n#webamp .character-122 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAMUlEQVQYV2NkeMTwnwEZyDEwMDIwIAk+YmBgQBGECoA0QVQiCUAEQWbKoZgKFUSzCAAxIwwBJNw/fQAAAABJRU5ErkJggg==)}\n#webamp .character-34 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQYV2NkYGD4z/CIgYFBjoEBRjPiFmRABRCVZAsCAEXjCgETcgZdAAAAAElFTkSuQmCC)}\n#webamp .character-64 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJklEQVQYV2NkYGD4zwADjyAMRrggSEAOWRAmgKISqyBIF4Z2NIsAd/8NibV7UPEAAAAASUVORK5CYII=)}\n#webamp .character-32 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAE0lEQVQYV2NkYGD4z4AGGOklCAChpQYBD5K5XgAAAABJRU5ErkJggg==)}\n#webamp .character-8230 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4z4AGGGki+IjhP4McAwPDIwYGGA0AwVsI4wY3hV4AAAAASUVORK5CYII=)}\n#webamp .character-46 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAGUlEQVQYV2NkYGD4z4AGGGki+AhqkRzCNgCztQcBQ/F5qwAAAABJRU5ErkJggg==)}\n#webamp .character-58 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAG0lEQVQYV2NkYGD4z4AGGHELPoIqlYPQFKoEABHUCAEa7xBFAAAAAElFTkSuQmCC)}\n#webamp .character-40 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKElEQVQYV2NkYGD4z4AGGFEEHzEwMMgxMCAEoQIgTQQEQUowtCNZBgCV1AoBCuExLwAAAABJRU5ErkJggg==)}\n#webamp .character-41 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJ0lEQVQYV2NkYGD4z4AGGBkeMfxnkEMVZQSrfMTAgCyBQxCndjSLALXUCgE7OPueAAAAAElFTkSuQmCC)}\n#webamp .character-45 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAG0lEQVQYV2NkYGD4z4AGGEkQfISmXY6BgXjtANzFBwGYHC/oAAAAAElFTkSuQmCC)}\n#webamp .character-39 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIUlEQVQYV2NkYGD4zwACjxgYGOTALAZG/IIQRWgqyRIEAHPECAGoStnnAAAAAElFTkSuQmCC)}\n#webamp .character-33 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAH0lEQVQYV2NkYGD4z/CIgYFBjgEOGKkhiDAOzMJqJgAQawsBnvEUjAAAAABJRU5ErkJggg==)}\n#webamp .character-95 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAFklEQVQYV2NkYGD4z4AGGGki+AjTIgCyawbjsVUKxAAAAABJRU5ErkJggg==)}\n#webamp .character-43 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJklEQVQYV2NkYGD4zwACjxgYGOTALAZG7IKPoCohivCpxGsmknYAEEcK49TiSnIAAAAASUVORK5CYII=)}\n#webamp .character-92 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALklEQVQYV2NkYGD4z4AGGBkeMfxnkEMVZQSrfMTAgCwBEQQBJAmEIJIEqiBUAgCoegrjMO8YZQAAAABJRU5ErkJggg==)}\n#webamp .character-47 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAL0lEQVQYV2NkYGD4z4AGGDEEHzEwoAo+YmBgkEMWhAqATIKoRBKACD5i+A/SggwAnqIK4za1AdUAAAAASUVORK5CYII=)}\n#webamp .character-91 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQYV2NkYGD4z/CIAQLkIBQjXBAqQFVBJIsAMwMMAVy4DMAAAAAASUVORK5CYII=)}\n#webamp .character-93 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4zwACj8AkA4McAwMjXBAmQU1BJIsACwMMAZBptUcAAAAASUVORK5CYII=)}\n#webamp .character-94 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALUlEQVQYV2NkYGD4zwACjxgYGOTALAZGsCBMAEozMjxi+A9TAdMBUYkGiBcEAF4nCuOkieCiAAAAAElFTkSuQmCC)}\n#webamp .character-38 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJklEQVQYV2NkYGD4zwACjxgYGOTALAZGsCBMAEpDBAmqJF470FwAy+sPxRnZS2IAAAAASUVORK5CYII=)}\n#webamp .character-37 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAL0lEQVQYV2NkYGD4z/CIAQLkIBQjhuAjmCBUIViHHLIgVABVO8g8qNkQM5G1A9kAhC8Np+jnyIIAAAAASUVORK5CYII=)}\n#webamp .character-44 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHklEQVQYV2NkYGD4z4AGGKkl+IiBgUEOYjjCTCRBAMu1CAHlOP+DAAAAAElFTkSuQmCC)}\n#webamp .character-61 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAH0lEQVQYV2NkYGD4z4AGGMGCj5BE5RgYIIIUqkTTDgA65AgBoymWoAAAAABJRU5ErkJggg==)}\n#webamp .character-36 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAALUlEQVQYV2NkYGD4zwACjxgYGOTALAZGsCBIAAbk0AVRVMK0g2gMlSiCaBYBACUjDAER0dcvAAAAAElFTkSuQmCC)}\n#webamp .character-35 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAJElEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/1AhuAQjpSpBFqEBACkzCwHNBOKTAAAAAElFTkSuQmCC)}\n#webamp .character-197 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKklEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOJEi8SpB2ZADWjsVMANMzDwH0yqd7AAAAAElFTkSuQmCC)}\n#webamp .character-214 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAKUlEQVQYV2NkeMTwn0GOAQIeMTCA2IwMDAz/wRwQgEoyYleJVTuxZgIARDIQAZK7OyEAAAAASUVORK5CYII=)}\n#webamp .character-196 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAMklEQVQYV2NkeMTwn0GOAQIeMTCA2IwMDAz/oUJwCiIIUgECUB2M2LWDzEQGYDOxWAQAhiMOAXY2HV8AAAAASUVORK5CYII=)}\n#webamp .character-63 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAMElEQVQYV2NkYGD4z/CIAQLkIBQjwyOG/zAOWFIOJAhSCQMoghjakVVCdUC0o6kEAGWLDAEwd1wzAAAAAElFTkSuQmCC)}\n#webamp .character-42 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAMUlEQVQYV2NkYGD4z4AGGOGCjxgYGOQgsowMj5BUwgVB2kGqYEAOpBImCFUF0Y7FIgCr9AoBpfDTDgAAAABJRU5ErkJggg==)}\n#webamp .character-60 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQYV2NkYGD4z/CIAQLkIBQjXBAqQFVBJIsAMwMMAVy4DMAAAAAASUVORK5CYII=)}\n#webamp .character-62 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4zwACj8AkA4McAwMjXBAmQU1BJIsACwMMAZBptUcAAAAASUVORK5CYII=)}\n#webamp .character-123 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAHUlEQVQYV2NkYGD4z/CIAQLkIBQjXBAqQFVBJIsAMwMMAVy4DMAAAAAASUVORK5CYII=)}\n#webamp .character-125 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAAIElEQVQYV2NkYGD4zwACj8AkA4McAwMjXBAmQU1BJIsACwMMAZBptUcAAAAASUVORK5CYII=)}\n#webamp .character-1072 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMTo0MTo1OSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MjkrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MjkrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk4Yjc1NzBiLTdmNGMtMzE0NC1hYWE0LTkwZGU1MjVkNTQ2MSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5OGI3NTcwYi03ZjRjLTMxNDQtYWFhNC05MGRlNTI1ZDU0NjEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5OGI3NTcwYi03ZjRjLTMxNDQtYWFhNC05MGRlNTI1ZDU0NjEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjk4Yjc1NzBiLTdmNGMtMzE0NC1hYWE0LTkwZGU1MjVkNTQ2MSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMTo0MTo1OSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlF7GKgAAAAjSURBVAiZY2T4z4ABWBieYBN+jCb4mOE/I4YgLpVMmKoYGAA3HQxVgIRV7wAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1073 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMTo0Nzo1MyswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzErMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzErMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjYzYWQ0ZjFiLTk3ZTctZjI0ZC1iMTc2LTJlYjYzM2U1ODAxYiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2M2FkNGYxYi05N2U3LWYyNGQtYjE3Ni0yZWI2MzNlNTgwMWIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2M2FkNGYxYi05N2U3LWYyNGQtYjE3Ni0yZWI2MzNlNTgwMWIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjYzYWQ0ZjFiLTk3ZTctZjI0ZC1iMTc2LTJlYjYzM2U1ODAxYiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMTo0Nzo1MyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhHCQtEAAAAhSURBVAiZY2T4z4ABWBieYBN+jCnIiE0QU+Vjhv9YVQIA3nsMVHk2cgYAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1074 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMTo0OTowMyswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzMrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzMrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdmZDU0NDY1LTQ0NDUtZDE0NS05NTZlLTNhZWE1M2Y0ZWNhOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3ZmQ1NDQ2NS00NDQ1LWQxNDUtOTU2ZS0zYWVhNTNmNGVjYTkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZmQ1NDQ2NS00NDQ1LWQxNDUtOTU2ZS0zYWVhNTNmNGVjYTkiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjdmZDU0NDY1LTQ0NDUtZDE0NS05NTZlLTNhZWE1M2Y0ZWNhOSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMTo0OTowMyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pruo4d4AAAAkSURBVAiZY2T4z4ABWBieYBN+jCb4mOE/I4agLAMjkSoZGBgAXhQOVEVlUIgAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1075 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMTo1NzozMCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzUrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzUrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdiMTMxMjA4LTczZTgtYWM0ZC05ODc3LTc2YWQ0NjBiYjdhNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3YjEzMTIwOC03M2U4LWFjNGQtOTg3Ny03NmFkNDYwYmI3YTciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3YjEzMTIwOC03M2U4LWFjNGQtOTg3Ny03NmFkNDYwYmI3YTciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjdiMTMxMjA4LTczZTgtYWM0ZC05ODc3LTc2YWQ0NjBiYjdhNyIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMTo1NzozMCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgHMuB4AAAAbSURBVAiZY2T4z4ABWBieYBN+jCnIhKmKFEEA1+wE0De/qugAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1076 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMTo1ODoxOCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzcrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzcrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjIxZTUxZjlhLTJkMGMtMGQ0My04ODEyLTZmMGM1NjZmMWMyNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMWU1MWY5YS0yZDBjLTBkNDMtODgxMi02ZjBjNTY2ZjFjMjYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMWU1MWY5YS0yZDBjLTBkNDMtODgxMi02ZjBjNTY2ZjFjMjYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjIxZTUxZjlhLTJkMGMtMGQ0My04ODEyLTZmMGM1NjZmMWMyNiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMTo1ODoxOCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvMLeBIAAAAvSURBVAiZbcyxDQAgDAMwlz/4/7AeUhaEBCVjIieUlgD5TqmuMtUAc4vDG/39pVpPHg5R8GVoYwAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1077 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMTo1OToyNCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzkrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzkrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgwYmVjMjliLWRkZGQtOTc0YS1iNmQ0LWMzMTU0MzBmMDk2OCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4MGJlYzI5Yi1kZGRkLTk3NGEtYjZkNC1jMzE1NDMwZjA5NjgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MGJlYzI5Yi1kZGRkLTk3NGEtYjZkNC1jMzE1NDMwZjA5NjgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgwYmVjMjliLWRkZGQtOTc0YS1iNmQ0LWMzMTU0MzBmMDk2OCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMTo1OToyNCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQIyFMAAAAbSURBVAiZY2T4z4ABWBieYBN+jCnIiE2QeJUAs0kKcq83318AAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1105 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMTo1OToyNCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzkrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6MzkrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgwYmVjMjliLWRkZGQtOTc0YS1iNmQ0LWMzMTU0MzBmMDk2OCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4MGJlYzI5Yi1kZGRkLTk3NGEtYjZkNC1jMzE1NDMwZjA5NjgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MGJlYzI5Yi1kZGRkLTk3NGEtYjZkNC1jMzE1NDMwZjA5NjgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgwYmVjMjliLWRkZGQtOTc0YS1iNmQ0LWMzMTU0MzBmMDk2OCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMTo1OToyNCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQIyFMAAAAbSURBVAiZY2T4z4ABWBieYBN+jCnIiE2QeJUAs0kKcq83318AAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1078 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjowMToxOCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDIrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDIrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQwYzA5MjM1LWE1YWMtNWI0ZS1iMGZlLTQ2YzY2NmUzMTkzZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkMGMwOTIzNS1hNWFjLTViNGUtYjBmZS00NmM2NjZlMzE5M2UiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkMGMwOTIzNS1hNWFjLTViNGUtYjBmZS00NmM2NjZlMzE5M2UiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQwYzA5MjM1LWE1YWMtNWI0ZS1iMGZlLTQ2YzY2NmUzMTkzZSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjowMToxOCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pizz5E4AAAAwSURBVAiZY2T4z4ABmBieMPxnYGRgQKaZMNUxMDAyMDAwMDxGMkSWgREhgERj1Q4AsGkOWSDy42gAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1079 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjowMTo1OCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDQrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDQrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBjMGJmODQxLTQwMzMtZjU0Ni05OTA5LTVhMjRjODFlOTkzMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowYzBiZjg0MS00MDMzLWY1NDYtOTkwOS01YTI0YzgxZTk5MzMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowYzBiZjg0MS00MDMzLWY1NDYtOTkwOS01YTI0YzgxZTk5MzMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjBjMGJmODQxLTQwMzMtZjU0Ni05OTA5LTVhMjRjODFlOTkzMyIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjowMTo1OCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsxYWOQAAAAlSURBVAiZY2T4z4ABWBieYBNGB48Z/jMyPEZTKcvASKRKBgYGAHxNCpDGDtqwAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1080 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjowMzoyMCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDUrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDUrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZiMGQyNjRjLTIyMWEtMzc0OC04NmEzLTAzZWQ4ZjRmYWY0YyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2YjBkMjY0Yy0yMjFhLTM3NDgtODZhMy0wM2VkOGY0ZmFmNGMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2YjBkMjY0Yy0yMjFhLTM3NDgtODZhMy0wM2VkOGY0ZmFmNGMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZiMGQyNjRjLTIyMWEtMzc0OC04NmEzLTAzZWQ4ZjRmYWY0YyIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjowMzoyMCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuSG7j4AAAAqSURBVAiZY2T4z4ABWBieMPxnkGVgZHiMkGZCUSLLwIgpiFUliuBjVOsAHycG8LSVwksAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1081 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjowNjo1NCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDcrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDcrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgyOGVmMGQ1LTc4NDgtNDU0MC1hMjIxLTE4YjZjYjdhMjkxMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4MjhlZjBkNS03ODQ4LTQ1NDAtYTIyMS0xOGI2Y2I3YTI5MTMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MjhlZjBkNS03ODQ4LTQ1NDAtYTIyMS0xOGI2Y2I3YTI5MTMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgyOGVmMGQ1LTc4NDgtNDU0MC1hMjIxLTE4YjZjYjdhMjkxMyIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjowNjo1NCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkVSDpYAAAApSURBVAiZY2T4z4AFPEYTfszwnxFDEBeAqJRlQNHBhGKuLAMjAwMDAwAaVQyNbtYwNgAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1082 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjowNzo0NSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDkrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NDkrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE3NzBjOGQ3LTk2ZjgtNjE0ZS1iOGYyLWVkNzBiMGNjZjIzZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxNzcwYzhkNy05NmY4LTYxNGUtYjhmMi1lZDcwYjBjY2YyM2UiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxNzcwYzhkNy05NmY4LTYxNGUtYjhmMi1lZDcwYjBjY2YyM2UiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE3NzBjOGQ3LTk2ZjgtNjE0ZS1iOGYyLWVkNzBiMGNjZjIzZSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjowNzo0NSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtYOos0AAAAgSURBVAiZY2T4z4AFPEYTfszwnwmbOkYMlbIMjMRrBwDKEwqOe78XPAAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1083 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjowODo1MCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTArMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTArMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJiNTdmN2IzLWRiYjEtYjA0ZS04MzZkLTM2OWQ0MGE3ZTI0NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiYjU3ZjdiMy1kYmIxLWIwNGUtODM2ZC0zNjlkNDBhN2UyNDYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiYjU3ZjdiMy1kYmIxLWIwNGUtODM2ZC0zNjlkNDBhN2UyNDYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJiNTdmN2IzLWRiYjEtYjA0ZS04MzZkLTM2OWQ0MGE3ZTI0NiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjowODo1MCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmnoO6QAAAAmSURBVAiZY2T4z4ABGBkYGBgYHmOTQhZ8zPCfCVMFAwMOQSzmAQBjVwiQeGNyJgAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1084 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjowOTozOSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTIrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTIrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmM0MTBiYzYwLWJjMjMtZTU0Yi05NWUwLWYyNmRlMjVhMjc1ZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpjNDEwYmM2MC1iYzIzLWU1NGItOTVlMC1mMjZkZTI1YTI3NWUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjNDEwYmM2MC1iYzIzLWU1NGItOTVlMC1mMjZkZTI1YTI3NWUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmM0MTBiYzYwLWJjMjMtZTU0Yi05NWUwLWYyNmRlMjVhMjc1ZSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjowOTozOSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpiwG2oAAAAnSURBVAiZY2T4z4ABWBieYAozMTAwMDDIMjAi00yYmpEFYapxqQQAVUADSkmcP80AAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1085 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxMDoyMiswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTMrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTMrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjhlODJiYjU4LWY1NmItZDY0YS1hOTM2LTYwMDkxZWJjZmE5YSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4ZTgyYmI1OC1mNTZiLWQ2NGEtYTkzNi02MDA5MWViY2ZhOWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4ZTgyYmI1OC1mNTZiLWQ2NGEtYTkzNi02MDA5MWViY2ZhOWEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjhlODJiYjU4LWY1NmItZDY0YS1hOTM2LTYwMDkxZWJjZmE5YSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxMDoyMiswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuBahawAAAAdSURBVAiZY2T4z4AFPEYTfszwnwmbOkYMlSRpBwDEzwpw/ebU5AAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1086 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxMToxMCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTUrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTUrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg1MTE1ZmVlLWExZmQtMmM0NS04Y2JlLTRjZTFmMmIzZDEzMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4NTExNWZlZS1hMWZkLTJjNDUtOGNiZS00Y2UxZjJiM2QxMzAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4NTExNWZlZS1hMWZkLTJjNDUtOGNiZS00Y2UxZjJiM2QxMzAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1MTE1ZmVlLWExZmQtMmM0NS04Y2JlLTRjZTFmMmIzZDEzMCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxMToxMCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pn9qB1MAAAAmSURBVAiZY2T4z4ABWBieYBN+jCb4mOE/E6YqBgasgowY2hkYGABz9AiT7iYgxAAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1087 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxMjoxNyswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTcrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTcrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmEzMjEyZmNjLTk0NzItNjM0YS05ODQ0LWZkODFkYzRjYjU4ZCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphMzIxMmZjYy05NDcyLTYzNGEtOTg0NC1mZDgxZGM0Y2I1OGQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphMzIxMmZjYy05NDcyLTYzNGEtOTg0NC1mZDgxZGM0Y2I1OGQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmEzMjEyZmNjLTk0NzItNjM0YS05ODQ0LWZkODFkYzRjYjU4ZCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxMjoxNyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Puon7HwAAAAgSURBVAiZY2T4z4ABWBieYBN+jCb4mOE/E6YqBgbiBQFSQQayE4uLkgAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1088 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxMjo1NSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTgrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6Mzk6NTgrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQxMjJlMzkwLWY0Y2QtMDE0NC1iODU3LTI4ZTNmY2YwOGFlNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MTIyZTM5MC1mNGNkLTAxNDQtYjg1Ny0yOGUzZmNmMDhhZTYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0MTIyZTM5MC1mNGNkLTAxNDQtYjg1Ny0yOGUzZmNmMDhhZTYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQxMjJlMzkwLWY0Y2QtMDE0NC1iODU3LTI4ZTNmY2YwOGFlNiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxMjo1NSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Proc6McAAAAmSURBVAiZY2T4z4ABWBieYBN+jCb4mOE/I4YgVpUMDAxMmKoYGAAL6wpzjsaJ7QAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1089 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE6GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxMzozOSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDArMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDArMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE2ZWJhNWU2LTZiMTQtNDI0ZC04ZmM1LTVjYzM2YWVhNmJmZCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphNmViYTVlNi02YjE0LTQyNGQtOGZjNS01Y2MzNmFlYTZiZmQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphNmViYTVlNi02YjE0LTQyNGQtOGZjNS01Y2MzNmFlYTZiZmQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmE2ZWJhNWU2LTZiMTQtNDI0ZC04ZmM1LTVjYzM2YWVhNmJmZCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxMzozOSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PplFO54AAAAlSURBVAiZY2T4z4ABWBieYBN+jCb4mOE/piADAwMTNp2M2FQCAA+TDFUjiz7LAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1090 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxNDoxOCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDErMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDErMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRmYTZmYzQ0LWIxOTMtNTA0MC1hY2ZkLTA0M2I4MjcyMzkyYiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkZmE2ZmM0NC1iMTkzLTUwNDAtYWNmZC0wNDNiODI3MjM5MmIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkZmE2ZmM0NC1iMTkzLTUwNDAtYWNmZC0wNDNiODI3MjM5MmIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmRmYTZmYzQ0LWIxOTMtNTA0MC1hY2ZkLTA0M2I4MjcyMzkyYiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxNDoxOCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvaLOfQAAAAdSURBVAiZY2T4z4ABWBieYBOGgccISSZs8sQLAgDI3ATQDN5+9wAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1091 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxNToxMyswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDMrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDMrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNjAxNjRmLTk2ZWEtMjY0MC05ODZhLTk1YTUxMGNlZDU4MiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxMjYwMTY0Zi05NmVhLTI2NDAtOTg2YS05NWE1MTBjZWQ1ODIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMjYwMTY0Zi05NmVhLTI2NDAtOTg2YS05NWE1MTBjZWQ1ODIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNjAxNjRmLTk2ZWEtMjY0MC05ODZhLTk1YTUxMGNlZDU4MiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxNToxMyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjTxWbYAAAAiSURBVAiZY2T4z4AFPEYTfszwnwmbOkYMlVjBY4b/WFUCAJ0wCm+9ao6SAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1092 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxNjowNiswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDUrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDUrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQyNDQ2YWZjLWFlODQtODU0YS05NDNlLTEzZGI0MDhhYmRlZCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MjQ0NmFmYy1hZTg0LTg1NGEtOTQzZS0xM2RiNDA4YWJkZWQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0MjQ0NmFmYy1hZTg0LTg1NGEtOTQzZS0xM2RiNDA4YWJkZWQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQyNDQ2YWZjLWFlODQtODU0YS05NDNlLTEzZGI0MDhhYmRlZCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxNjowNiswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph8qHkAAAAAkSURBVAiZY2T4z4AHPEZIMyJzYICJgYGBgUGWgRGZxqoSq5kAL1IIye46tIYAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1093 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxNjo1NyswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDYrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDYrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmNmOGY2NzRhLTAzY2YtNTU0NS1hM2MwLTc4YTdiYjU2Y2EyMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpjZjhmNjc0YS0wM2NmLTU1NDUtYTNjMC03OGE3YmI1NmNhMjAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZjhmNjc0YS0wM2NmLTU1NDUtYTNjMC03OGE3YmI1NmNhMjAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmNmOGY2NzRhLTAzY2YtNTU0NS1hM2MwLTc4YTdiYjU2Y2EyMCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxNjo1NyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlWR1UkAAAAgSURBVAiZY2T4z4AFPEYTfszwnwmbOkYM1bIMjMRrBwDCiwqOfWhhawAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1094 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxNzo0OCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDgrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDgrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFjMzhlMDk5LTk2MzQtNWI0OS1hZjljLWQ1ZjVlMjU4ZDBiNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxYzM4ZTA5OS05NjM0LTViNDktYWY5Yy1kNWY1ZTI1OGQwYjYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxYzM4ZTA5OS05NjM0LTViNDktYWY5Yy1kNWY1ZTI1OGQwYjYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFjMzhlMDk5LTk2MzQtNWI0OS1hZjljLWQ1ZjVlMjU4ZDBiNiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxNzo0OCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PozHf/cAAAAhSURBVAiZY2T4z4AFPEYTfszwnwmbOqyCjBjasYLHDP8BLKgIjjj926sAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1095 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxODozOSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDkrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MDkrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRmMzJkZGZmLTc5NjctYmE0OC05YmMxLTUwMWM2MDg1OTU3OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0ZjMyZGRmZi03OTY3LWJhNDgtOWJjMS01MDFjNjA4NTk1NzkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZjMyZGRmZi03OTY3LWJhNDgtOWJjMS01MDFjNjA4NTk1NzkiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRmMzJkZGZmLTc5NjctYmE0OC05YmMxLTUwMWM2MDg1OTU3OSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxODozOSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pr36LF4AAAAeSURBVAiZY2T4z4AFPEYTfszwnwmbOkYMlVgBLu0Ae30IjqIjZD4AAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1096 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoxOToyMiswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTErMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTErMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmNlNDRmN2I0LTU3NGUtZTE0ZS1iMmMwLTU0MzI0NDYzNmExZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpjZTQ0ZjdiNC01NzRlLWUxNGUtYjJjMC01NDMyNDQ2MzZhMWUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTQ0ZjdiNC01NzRlLWUxNGUtYjJjMC01NDMyNDQ2MzZhMWUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmNlNDRmN2I0LTU3NGUtZTE0ZS1iMmMwLTU0MzI0NDYzNmExZSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoxOToyMiswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtJnczUAAAAlSURBVAiZY2T4z4ABmBieMPxnYGRgQKaZMNUxMBAvyMjwGNMqALVCCJcqUUkzAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1097 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoyMDowNiswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTIrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTIrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQyYjYyNTc0LTk1ZTktYjQ0MS04OWJjLThiNTE1NTE0ZDM1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MmI2MjU3NC05NWU5LWI0NDEtODliYy04YjUxNTUxNGQzNTciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0MmI2MjU3NC05NWU5LWI0NDEtODliYy04YjUxNTUxNGQzNTciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQyYjYyNTc0LTk1ZTktYjQ0MS04OWJjLThiNTE1NTE0ZDM1NyIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoyMDowNiswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrBHMf0AAAAqSURBVAiZY2T4z4ABmBieMPxnYGRgQKaZMNUxMGAVZGR4jM1UdPCY4T8A4DUKdxuUJLIAAAAASUVORK5CYII=);margin-right: 1px;}\n#webamp .character-1098 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoyMDo1MSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTQrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTQrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIxODMyODY3LTU4YjYtYzk0Yi05M2UyLWIyZTJjZGNmN2JlOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiMTgzMjg2Ny01OGI2LWM5NGItOTNlMi1iMmUyY2RjZjdiZTkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiMTgzMjg2Ny01OGI2LWM5NGItOTNlMi1iMmUyY2RjZjdiZTkiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmIxODMyODY3LTU4YjYtYzk0Yi05M2UyLWIyZTJjZGNmN2JlOSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoyMDo1MSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Po8p/g0AAAAlSURBVAiZY2T4z4ABWBieIAnLMjCiSj9GSDJiE2RCUQ3VjlUlAEsJCM58h3DbAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1099 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoyMToyOSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTUrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTUrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjExZDk3ZWY3LTU5YTMtNDU0Ny04ZTY3LTc0NzY3MWZkOWFlNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxMWQ5N2VmNy01OWEzLTQ1NDctOGU2Ny03NDc2NzFmZDlhZTYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMWQ5N2VmNy01OWEzLTQ1NDctOGU2Ny03NDc2NzFmZDlhZTYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjExZDk3ZWY3LTU5YTMtNDU0Ny04ZTY3LTc0NzY3MWZkOWFlNiIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoyMToyOSswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhHj3jUAAAAlSURBVAiZY2T4z4AFPEYTfszwnwmbOia4aiQdEEFZBkbsKpEAAMmYCpEjwWDOAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1100 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoyMjoxOCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTcrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTcrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQxYWZmMTBiLWY3ZDItOTA0NS1iMTI3LWM5ZmFjMDg3OTA5NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkMWFmZjEwYi1mN2QyLTkwNDUtYjEyNy1jOWZhYzA4NzkwOTciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkMWFmZjEwYi1mN2QyLTkwNDUtYjEyNy1jOWZhYzA4NzkwOTciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQxYWZmMTBiLWY3ZDItOTA0NS1iMTI3LWM5ZmFjMDg3OTA5NyIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoyMjoxOCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmg0SykAAAAfSURBVAiZY2T4z4AFPMYUZsKmjhGbSkztjxn+Y1UJAESyCm/7U8M+AAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1101 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoyMzoyNyswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTgrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTgrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmY2NjE2NjJhLTE1NmQtNGY0OS05NGY0LTc4MmU5MWRiZWViMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpmNjYxNjYyYS0xNTZkLTRmNDktOTRmNC03ODJlOTFkYmVlYjAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpmNjYxNjYyYS0xNTZkLTRmNDktOTRmNC03ODJlOTFkYmVlYjAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmY2NjE2NjJhLTE1NmQtNGY0OS05NGY0LTc4MmU5MWRiZWViMCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoyMzoyNyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhF9T08AAAAdSURBVAiZY2T4z4ABWBieYBNGB48Z/jMyPKZEJQB3CQpyU3KwbgAAAABJRU5ErkJggg==);margin-right: 1px;}\n#webamp .character-1102 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoyNDowNyswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTkrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MTkrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUzMDgzYzg2LWM4ZTQtZTU0YS1hYjYzLTAyMWE1YzNmNmEzZCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5MTVkNjQ1My0zNTM3LTZhNDctYjljZC1lNmEyZGM2NWMzYWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5MTVkNjQ1My0zNTM3LTZhNDctYjljZC1lNmEyZGM2NWMzYWEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjkxNWQ2NDUzLTM1MzctNmE0Ny1iOWNkLWU2YTJkYzY1YzNhYSIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoyNDowNyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MzA4M2M4Ni1jOGU0LWU1NGEtYWI2My0wMjFhNWMzZjZhM2QiIHN0RXZ0OndoZW49IjIwMjMtMTAtMDZUMDE6NDA6MTkrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4Famj6AAAALUlEQVQImWNk+M+AAVgYnjD8Z5BlYGR4jJBmQlEiy8CIEHyMaggTsgrs2qE6AH2hCPDPss/JAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .character-1103 {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAGCAYAAAAL+1RLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZiwgMjAyMi8wOC8xNi0xODowMjo0MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMC0wNVQyMjoyNDo0NCswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MjArMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTAtMDZUMDE6NDA6MjArMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE4MjNkN2FkLTk1YTUtM2Y0Mi05Y2QyLTZiYTA5ZWVmOTEzZCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphODIzZDdhZC05NWE1LTNmNDItOWNkMi02YmEwOWVlZjkxM2QiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphODIzZDdhZC05NWE1LTNmNDItOWNkMi02YmEwOWVlZjkxM2QiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmE4MjNkN2FkLTk1YTUtM2Y0Mi05Y2QyLTZiYTA5ZWVmOTEzZCIgc3RFdnQ6d2hlbj0iMjAyMy0xMC0wNVQyMjoyNDo0NCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PueEOboAAAAlSURBVAiZY2T4z4ABWBieYBN+jCb4mOE/I4YgVh2PGf6zYFMJAEn/DjmVEcBIAAAAAElFTkSuQmCC);margin-right: 1px;}\n#webamp .gen-text-a {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAhklEQVQYV2PU1HT4z4AFMIIk+Ph4GWJjg8HSixevZfj06TMDWMLISJfByEiHgZ2dneH48bMM585dhkiEhfkwPH78nEFbWw2setWqLQyM5ua+/0HGgFTKykoyyMhIgY1jjI7O/Q8y5vXrtwzs7GwMoqIiYEWM9fU9/+/ceQg2FwRSUiLBxgEApiw2sTpzYwUAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-a {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAfUlEQVQYV2PU1HT4z4AFMIIkZGUlGXbuXAaWdnePYnj8+DkDWCIlJZIBhPn4eBn6+mYxzJmzHCKxevVMhuPHzzKEhfmAVYeGpjMwurlF/gcZA1JpaWkMxiDjGHt7Z4KNunr1FtgobW01sCLGK1du/t+58wDYXBA4cWIT2DgAFvc4Yp8jn50AAAAASUVORK5CYII=)}\n#webamp .gen-text-b {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAbUlEQVQYV2PU1HT4z4ADMIIks7MTUKSvXbvFsH//MQa45JMnzxg2btzFYGlpzGBkpMuwadNOhOTPnz8ZXr9+yyAqKszw+PFzhp07DyAkX79+w3D8+FkGLS11Bn5+HoZNm3YTaSyyi+7ceQA2FgAreT68rqvw2AAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-b {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAYklEQVQYV2PU1HT4z4ADMIIkr13bjyK9atUWhoaGXga45PHjZxmSk0sYiorSGFJSIsFsuOSnT58Zrl69xaCtrcYAUlhY2IiQBEn09c1iCAvzYZCRkULViddYZBft3HkAbCwA0hU/cjt7WNAAAAAASUVORK5CYII=)}\n#webamp .gen-text-c {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAhUlEQVQYV2PU1HT4z4ADMIIktbXVGIyMdBn4+HgZnjx5xnD8+FmGV6/eMjCam/v+j40NBgtcu3aLISYmiOHx4+cMO3ceYGCMjs79b2lpzLBp006wIDLAkAQZ/enTZ7AaRnv74P+hob5gI/fvP8bg7u7AwMHBxrBx4y4GuINARrOzs6M4CAAc80D/h7F6jAAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-c {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAfUlEQVQYV2PU1HT4z4ADMIIkw8J8GJKToxhkZSUZjh8/y9DXN4vh6tVbDIxubpH/d+5cBhZYtWoLw65dS8EKCgsbGRh7e2f+LypKY0hOLgELIgMMSZDRjx8/B6thDAlJ+7969UywkQ0NvQz9/fUMfHy8YJPgDgIZDRJEdhAAbK9A/8rJSIYAAAAASUVORK5CYII=)}\n#webamp .gen-text-d {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAS0lEQVQYV2PU1HT4z4AFMFZUtP2XkZECS/38+ZPh3LkrDOfOXWaAS0yduoDByEiXwdLSmOHAgWOoEiBd2dkJDE+ePCNSAqtR6JYDANUqN78RSeyxAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-d {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAR0lEQVQYV2PU1HT4z4AFMB47dua/paUxWOrTp88Mc+YsB2O4hJaWI0NKSiRDUVEaQ0NDL6oESNe1a/sZjh8/S6QEVqPQLQcA6ZU6e06sXVAAAAAASUVORK5CYII=)}\n#webamp .gen-text-e {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAWElEQVQYV2PU1HT4z4AFMIIksrMTUKSOHz/LAJd48uQZw8aNu+AK4BI/f/5keP36LcOdOw8Yrl69hdDx+vUbBpARHz9+Yfj06TOmBMisnz9/ISSQbQfZBwDpczmzdRQ6tAAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-e {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAUklEQVQYV2PU1HT4z4AFMIIkrl3bjyLV1zeLAS5x/PhZhuTkErgCuMSnT58Zrl69xbBz5wGGVau2IHSABEFGPHnyjOHx4+eYEiCzQLqxWg6yDwCOkDtiF2F4ZQAAAABJRU5ErkJggg==)}\n#webamp .gen-text-f {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAQklEQVQYV2PU1HT4z4AFMEZH5/63tDRGkdq0aScDXALEefz4OVwBXOLatVsMHz9+Zrhz5wHDp0+fETpwSuA0Cl0CAKaeOFIXEyTGAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-f {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAQklEQVQYV2PU1HT4z4AFMPb2zvxfVJSGIpWcXMIAlwBxjh8/C1cAl1i1agvDkyfPGHbuPMDw+PFzhA6cEjiNQpcAABgDOKTpYB3LAAAAAElFTkSuQmCC)}\n#webamp .gen-text-g {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAhUlEQVQYV2PU1HT4z4ADMIIkxcSEGRwcLBlERUUYPn36zHDu3GWGq1dvMYAlU1IiGV6/fsuwceMuBnd3BwYVFQWG1as3MzC6uUX+9/NzZzh+/CxYBzJAkQRJWFoag+U3bdqJMBZk16pVWxiMjHTBCuCSIAeB7OLj4wU76NWrtwzXrt1kAAAOyTw3A+3MIQAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-g {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAgElEQVQYV2PU1HT4z4ADMIIktbXVGBoaihlA9OPHzxnmzl3GsGrVFgaw5IkTmxiuXr3FkJxcwtDfX8/g7u7AEBqazsCYlFT8f+7cHoa+vlkMc+YsR7EARRIkU1SUBlYAMgVuLMgukFEpKZFgBXBJkEP6+hoYZGUlwQ66du0m2EEApzg9auXblNEAAAAASUVORK5CYII=)}\n#webamp .gen-text-h {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAU0lEQVQYV2PU1HT4z4AFMBYUNPyPigpgWLFiI8P27fsZJk1qZmBkZGAgLPH27TuGz5+/MsjISDJ8+/YdoeP69dsMDx8+YXB0tGL4+fMXEUahWw4AZqw+9SIzprcAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-h {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAR0lEQVQYV2PU1HT4z4AFMK5eveV/SIg3w5o1Wxnq6noYrl3bD1ZGWOLXr98M379/Z+Dn50PV8fLlG4bbt+8x2NiYEWkUuuUAThw9gbzoMH8AAAAASUVORK5CYII=)}\n#webamp .gen-text-i {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAPklEQVQYV2NUUbH5//fvXwZmZmYGEGAECbi7OzDw8/MwrFq1hVgBHx8XBiEhfoZFi9ZCtPj5uTIICPBhFwAAYNwfnYwkwYkAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-i {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAQUlEQVQYV2NUUbH5z8vLxgACnz//YmAECcyZ080gJyfF4OYWjUdAUVGOwdk5HKJi/vxeBjk5GQICSkryDPb2IQwAe1gfnRXNsg4AAAAASUVORK5CYII=)}\n#webamp .gen-text-j {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAARklEQVQYV2PU1HT4z4AFMMIksrMTGJ48ecawceMusDJqShgauv9XVpZncHCwQrXDzS3yv5+fO8PPnz8ZDhw4znDnzgOw5QCb1DH/5d+yiAAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-j {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAARklEQVQYV2PU1HT4z4AFMMIkrl3bz3D8+FmG5OQSsDJqSpib+/738LBnaGgoRrUjKan4/9y5PQyfPn1mqK/vY9i58wDYcgDUEDH/aYcSVQAAAABJRU5ErkJggg==)}\n#webamp .gen-text-k {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAfUlEQVQYV2PU1HT4z4ADMEZH5/63tDRm2LRpJwMfHy+Dg4MVw+rVmxlevXrLAJc8fvwsg5GRDsO5c1cYzp27DDYLLvnz508GdnZ2hgMHjjFcvXoLVfLTp88M7OxsDD9//mJYvHgtquTOnQfAdoLsh+lGcdDr1+8YYmKC4LoBDMND/07Z5bQAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-k {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAdklEQVQYV2PU1HT4z4ADMPb2zvxfVJTGkJxcwiArK8nQ0FDMEBqaznD16i0GuGRf3yyGlJRIhjlzloMxCMAlP336zMDHx8vQ0NDLsGrVFlTJx4+fM/Dz8zB8/PiFwd09ClWysLARbCfIfphuFAeBHLFr11K4bgB2P0P/MNHaowAAAABJRU5ErkJggg==)}\n#webamp .gen-text-l {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAADAp4fuAAAAOElEQVQYV2PU1HT4z4AGGKdMWfD/yZNnDBs37oJLUUPw9es3DMePnwWb+fr1OwawmciWb9q0kwEA9JQvaRC17LEAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-l {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAADAp4fuAAAAMklEQVQYV2PU1HT4z4AGGP//////+PGzDMnJJXApaghevXqLoa9vFthMEBtsJrLlIAsBN0svzTt3mzcAAAAASUVORK5CYII=)}\n#webamp .gen-text-m {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAe0lEQVQYV2PU1HT4z4AHMLq5Rf7383MHKzl+/CzDuXOXGWJjgxn4+HgZnjx5xoCi4PXrN2BFMA0oCkCSoqIiYF0/fvxiUFFRQDUBpNPS0hhs1YEDxxgcHKxQFWzatBMsCLJ77tzlDMnJkZgKZGSkwAp27jzAkJ2dAFYAADRvSVf5AvD5AAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-m {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAeklEQVQYV2PU1HT4z4AHMCYlFf+fO7cHrKSvbxbDnDnLGXbuXMYgKyvJcPz4WQYUBVev3gIrgmlAUQCS1NZWA+v69Okzg7u7A6oJIJ1FRWlgqxoaehkaGopRFSQnl4AFQXZbWPgxnDixCVOBpaUxWEFhYSPDtWv7wQoAhD9Oo6r9T8sAAAAASUVORK5CYII=)}\n#webamp .gen-text-n {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAbklEQVQYV2PU1HT4z4AFMFZUtP0XFRVmWLVqCwM/Pw+Dn587w6ZNOxnAEjIyUgx37jxguHbtJqoESAc7OzvDuXOXGYyMdBE6QFb8+PGLQUVFAWwb3CgQZ+fOgwwxMUFgnSgSGzfuAutwd3cASwAAXkkz8VU5jpwAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-n {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAbElEQVQYV2PU1HT4z4AFMB47dua/trYaQ2hoOoOMjBTD3Lk9DMnJJQxgCUtLY4adOw8wrFq1BVUCpIOPj5dhzpzlDCkpkQgdICs+ffrM4O7uALYNbhSIU1jYyLBr11KwThQJEAeko7+/HiwBAEMyNd2jyTEpAAAAAElFTkSuQmCC)}\n#webamp .gen-text-o {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAYElEQVQYV2PU1HT4z4AFMNrbB/93cLBkEBUVYfj06TPDuXOXGa5evcXA2Ns78//r128ZNm7cxWBkpMtgaWnMsHr1ZgbGKVMW/D9+/CxYpaysJIOfnzsDiI9bAqdRuCwHAFSiQp/nv1FpAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-o {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAY0lEQVQYV2PU1HT4z4AFMIaEpP1vaChm0NZWY3j8+DnD3LnLGFat2sLA+PHjp/9Xr95iSE4uYUhJiWQoKkpjCA1NZ2D8/////76+WQxz5ixnsLQ0Zpg7t4cBxMctgdMoXJYDABXIRDnjRqQgAAAAAElFTkSuQmCC)}\n#webamp .gen-text-p {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAYklEQVQYV2PU1HT4z4AFMEZH5/63tDSGS3369Jlh584DDHCJTZt2Mrx+/Y4hOTmS4c6dBwiJ48fPMoBUu7s7MFy7dgsh8fr1G4afP38xvHr1luH8+SuoRj1+/BxuF4odyBIABGY83zo8uP8AAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-p {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAXElEQVQYV2PU1HT4z4AFMPb2zvxfVJQGl3r8+DlDUVEDA1wiObmE4erVWwwnTmxi2LnzAEKir28WA0h1f389w6pVWxASINWfPn0G65ozZzmqUcePn4XbhWIHsgQABa8+tIas7RkAAAAASUVORK5CYII=)}\n#webamp .gen-text-q {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAeklEQVQYV2PU1HT4z4ADMIIkxcSEGRwcLBlERUUYPn36zHDu3GWGq1dvMYAlU1IiGV6/fsuwceMuBiMjXQZLS2OGxYvXMjC6uUX+9/NzZzh+/CxYh6ysJAOMj18S3djY2GAGPj5ehk2bdkLsRHYQyOH//v1j+PLlKwMAE31Aqi5n1A8AAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-q {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAd0lEQVQYV2PU1HT4z4ADMIIktbXVGBoaihlA9OPHzxnmzl3GsGrVFgaw5IkTmxiuXr3FkJxcwpCSEslQVJTG4O4excCYlFT8f+7cHoa+vlkMc+YsZ7C0NGaA8fFLohu7c+cyBllZSbAVGA4COfzPnz8Me/ceZQAA6AxC1+lFw1UAAAAASUVORK5CYII=)}\n#webamp .gen-text-r {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAdklEQVQYV2PU1HT4z4ADMLq5Rf7383OHS//8+ZPh+PGzDFev3mKAS4IEzp27zBAW5sMgKirCMHXqAoTkp0+fGUBYRkaK4fXrNwyrVm1BSF67douBjY2NQUVFgWHx4rVghSjGguxzcLBiOHDgGKadIN3JyZFwYwGDNkn/oviyDwAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-r {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAd0lEQVQYV2PU1HT4z4ADMCYlFf+fO7cHLv3p02eGvr5ZDKtWbWGAS4IE5sxZzrB69UwGbW01Bi0tR4Tk48fPGZ48ecZgaWnMcPXqLYbQ0HSEJMgYfn4eBnd3BwZ39ygGkGIUY0H2NTQUMzQ09GLaCdJ94sQmuLEA9Q5J/yFpluAAAAAASUVORK5CYII=)}\n#webamp .gen-text-s {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAgUlEQVQYV2PU1HT4z4AFMNrbB/+3tDRmkJGRYvj58yfDuXNXGM6du8zAWFDQ8F9FRYFh9erNDOzsbAw/f/5iePXqLUICZNqnT58Zrl69BdFhaOgONUqSgY+PF2wbSDdjdHQu2HKQKkdHKwYtLTWIREhI2n8jI12wapDlx4+fBRsHAJkqOH1aFP3tAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-s {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAfElEQVQYV2PU1HT4z4AFMIaEpP0vKkpjsLQ0Zvj06TPDnDnLwZhxx479/93dHRhCQ9MZ+Ph4wZJXr95CSIBMe/z4OcPq1ZshOszNfeFGycpKgm0D6Wbs7Z0JthykqqGhmCEszAciUV/f8z85OYoBpBpkfl/fLIZVq7YwAAAJujj3bDlY7wAAAABJRU5ErkJggg==)}\n#webamp .gen-text-t {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAADAp4fuAAAALklEQVQYV2PU0XH+z4AGGCdMmIMpqKZq819FVZHBzc2eYfXqLQyvX71hYKSBIACnryn7i49aBgAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-t {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAADAp4fuAAAALElEQVQYV2PU1HT4z4AGGP///48pCFLp6enI0NtbxxAams5w9eotBkYaCAIAcHMragU6oasAAAAASUVORK5CYII=)}\n#webamp .gen-text-u {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAATUlEQVQYV2PU1HT4z4AFMEZH5/63tDRm2LRpJ8Pjx88ZsrMTGI4fP8tAC4lr124xfPz4mQFk34EDxxgYDQ3dwZZraamB3QZSsH//MQYAWVlAv2gmNLIAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-u {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAASklEQVQYV2PU1HT4z4AFMPb2zvxfVJTGkJxcwnD8+FmGa9f2M/T1zWKghcSqVVsYnjx5xgCyr6Ghl4HR3NwXbHlYmA/YbSAFIAkAiCFDe7641t0AAAAASUVORK5CYII=)}\n#webamp .gen-text-v {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAgUlEQVQYV2PU1HT4z4AFMPr6Jvx3d3dgOH78LMO5c5cZODjYGZKTIxkYQTpSUiIZfv78xbB48VoGbW01BktLY4iEo6MVg5aWGsPq1ZvBgq9evYVIyMpKMvj5uTPcufOAQUVFAawALAGyOzY2mIGPj5fh06fPYCPhEiAjjIx04Y4AALI2Mjr5EYBOAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-v {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAe0lEQVQYV2PU1HT4z4AFMBYUNPzv769n6OubxTBnznIGPj5ehhMnNjEwgnSAGB8/fmFwd49iCAvzYSgqSoNINDQUgwVCQ9PBglev3oJIWFoaM8yd28Owc+cBBnd3B7ACsATI7p07lzHIykoyPH78HGwkXAJkREpKJNwRAEThNXIpOsaIAAAAAElFTkSuQmCC)}\n#webamp .gen-text-w {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAsUlEQVQYV2PU1HT4z4AHMGZlVf3X0lJjWLx4LYOKigKDpaUxw6ZNO8Fa/PzcGRhDQtL+OzhYMRw4cAysQEZGiuH48bMM7OxsDGJiwgyMhobu/5OTIxmuXbvFADIJBJ48eQZWcOfOQwZGkBvCwnwYREVFwJLnzl1mMDLSBbNXr94MUQCyFyQI0nn16i0Gd3cHhp8/fzLMmbMcokBWVhLsIJDdIBOysxMY7tx5wLBz5wEGAJrgQOlxzyhYAAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-w {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAqElEQVQYV2PU1HT4z4AHMK5cufl/WJgPg7t7FIO7uwNDUVEaQ3JyCVjL3Lk9DIz19T3/GxqKGRoaesEKLC2NGfr6ZjHw8fEyaGurMTCam/v+P3FiE8OqVVsYQCaBwPHjZ8EKdu48wMAIcsPq1TPBqkFgzpzlDCkpkWB2aGg6RAHIXpAgSCfIpP7+eoZPnz4zWFj4QRSA7AU5CGQ3yIRr1/aDjS8sbGQAAKfRQ81atTaOAAAAAElFTkSuQmCC)}\n#webamp .gen-text-x {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAe0lEQVQYV2PU1HT4z4ADMBoauv8PDfUBS69evYVBS0uNwchIh2HJknUMjCCdsrKSDH5+7gx37jxgUFFRYNi58wCYDZYE6bK0NGYwMtJlePLkGcPGjbvAJmFI/vz5k2HVqi0Mnz59RjX2+PGzYBNguuEOAtkBkwQZD2IDAIEwO6fvBo92AAAAAElFTkSuQmCC)}\n#webamp .gen-window.selected .gen-text-x {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAc0lEQVQYV2PU1HT4z4ADMJqb+/5fvXomWDo0NJ0hLMyHISUlksHNLZqBEaTT0tKYYe7cHoadOw8wuLs7MBQWNoLZYEmQrqKiNLCO48fPMiQnl4BNwpD89Okz2PjHj5+jGtvXNwtsAkw33EEgO2CSIONBbADjajxJfQVljQAAAABJRU5ErkJggg==)}\n#webamp .gen-text-y {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAdElEQVQYV2PU1HT4z4AFME6ZsuD/kyfPGDZu3MWgra3G4OBgxbB69WYGxujo3P+WlsYMx4+fZTAy0mG4evUWmM0IMio2NpiBj4+X4efPnwxLlqxj+PHjJ0RCRUWBwd3dAazy3LnLYBvBErKykgx+fu7ESQAAeBc4Pt1yL3EAAAAASUVORK5CYII=)}\n#webamp .gen-window.selected .gen-text-y {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAHCAYAAAArkDztAAAAcElEQVQYV2PU1HT4z4AFMP7/////8eNnGZKTSxjCwnwYGhqKGUJD0xkYe3tn/i8qSmPo65vFkJISybBq1RYwmxFk1M6dyxhkZSUZPn36zODmFg2mwRLu7g4M/f31YJVz5iwH2wiWsLQ0Zpg7t4c4CQDdVTh70KajNwAAAABJRU5ErkJggg==)}\n#webamp .gen-text-z {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAhUlEQVQoU2PU1HT4z4AGrl8/wIguBuIzVlS0/ZeRkUKRy8lJwK4YZrKjoxWDlpYaw/HjZxmWLp2MW7GsrCSDn587w+vXbxhWrdrCgNMZhobu/0NDfRj4+HgZVq/ezPDq1VvciqOjc/9bWhozPHnyjOHcuctgt+/atRy7M6ZMWYARGrg8CABbBjEI7pDliQAAAABJRU5ErkJggg==)}\n#webamp .gen-window.selected .gen-text-z {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAfklEQVQoU2PU1HT4z4AGrl8/wIguBuIzHjt25r+lpTGKHCMjI3bFMJMbGooZwsJ8GPr6ZjEUF6fjVgwyee7cHoarV28xhIamM+B0hrm57//Vq2cyyMpKghWCNOBU3Ns7839RURrD8eNnGebMWQ52+7x5vdid8f//f4zQwOVBALVSMQi0QnIEAAAAAElFTkSuQmCC)}\n#webamp .gen-text-a {width: 6px;}\n#webamp .selected .gen-text-a {width: 6px;}\n#webamp .gen-text-b {width: 7px;}\n#webamp .selected .gen-text-b {width: 7px;}\n#webamp .gen-text-c {width: 7px;}\n#webamp .selected .gen-text-c {width: 7px;}\n#webamp .gen-text-d {width: 6px;}\n#webamp .selected .gen-text-d {width: 6px;}\n#webamp .gen-text-e {width: 6px;}\n#webamp .selected .gen-text-e {width: 6px;}\n#webamp .gen-text-f {width: 6px;}\n#webamp .selected .gen-text-f {width: 6px;}\n#webamp .gen-text-g {width: 7px;}\n#webamp .selected .gen-text-g {width: 7px;}\n#webamp .gen-text-h {width: 6px;}\n#webamp .selected .gen-text-h {width: 6px;}\n#webamp .gen-text-i {width: 4px;}\n#webamp .selected .gen-text-i {width: 4px;}\n#webamp .gen-text-j {width: 6px;}\n#webamp .selected .gen-text-j {width: 6px;}\n#webamp .gen-text-k {width: 7px;}\n#webamp .selected .gen-text-k {width: 7px;}\n#webamp .gen-text-l {width: 5px;}\n#webamp .selected .gen-text-l {width: 5px;}\n#webamp .gen-text-m {width: 8px;}\n#webamp .selected .gen-text-m {width: 8px;}\n#webamp .gen-text-n {width: 6px;}\n#webamp .selected .gen-text-n {width: 6px;}\n#webamp .gen-text-o {width: 6px;}\n#webamp .selected .gen-text-o {width: 6px;}\n#webamp .gen-text-p {width: 6px;}\n#webamp .selected .gen-text-p {width: 6px;}\n#webamp .gen-text-q {width: 7px;}\n#webamp .selected .gen-text-q {width: 7px;}\n#webamp .gen-text-r {width: 7px;}\n#webamp .selected .gen-text-r {width: 7px;}\n#webamp .gen-text-s {width: 6px;}\n#webamp .selected .gen-text-s {width: 6px;}\n#webamp .gen-text-t {width: 5px;}\n#webamp .selected .gen-text-t {width: 5px;}\n#webamp .gen-text-u {width: 6px;}\n#webamp .selected .gen-text-u {width: 6px;}\n#webamp .gen-text-v {width: 6px;}\n#webamp .selected .gen-text-v {width: 6px;}\n#webamp .gen-text-w {width: 8px;}\n#webamp .selected .gen-text-w {width: 8px;}\n#webamp .gen-text-x {width: 7px;}\n#webamp .selected .gen-text-x {width: 7px;}\n#webamp .gen-text-y {width: 6px;}\n#webamp .selected .gen-text-y {width: 6px;}\n#webamp .gen-text-z {width: 11px;}\n#webamp .selected .gen-text-z {width: 11px;}\n#webamp #title-bar #close {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAIgAAAAAAAAAAAAAAAf4AACAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAADwAAAAAAAAAAAAf/gAAAAA8AAAAAAAAAAAAH//iIiAAPAAAAAAAAAAAAB//4iIAADwAAAAAAAAAAAAf/iIgAAA8AAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+HP//3hz//8w8///EP///wHz//8AE///ADP//wBz//8A8///AfP//wP///8H////D////x////8/////f////w==), auto}\n#webamp #equalizer-window .band {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAAAAA/3cAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAAAAj3AAAA9wAAAAAAAAAAgACPcAAAAPcAAAAAAAAAAIcAj3AAAAAAAAAAAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAA/3cAAAAAAAAACP/3d3AAAA9wAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////////////////////////8////+H///jA///wwP//8P///+Hz//3h4f/8w+H//EPz//wH///8AED//ADA//wB4f/8A/P//Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #equalizer-window .title-bar {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #equalizer-window.shade {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #equalizer-window.shade input {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp .window {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH//iIiAAAAAAAAAAAAAAAB//4iIAAAAAAAAAAAAAAAAf/iIgAAAAAAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+H///3h///8w////EP///wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp .window input {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH//iIiAAAAAAAAAAAAAAAB//4iIAAAAAAAAAAAAAAAAf/iIgAAAAAAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+H///3h///8w////EP///wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #main-window {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH//iIiAAAAAAAAAAAAAAAB//4iIAAAAAAAAAAAAAAAAf/iIgAAAAAAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+H///3h///8w////EP///wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #main-window.shade #title-bar {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH//iIiAAAAAAAAAAAAAAAB//4iIAAAAAAAAAAAAAAAAf/iIgAAAAAAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+H///3h///8w////EP///wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #playlist-window {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAcAB/gAAAAAAAAAAAAAAAAHgAf4AAAAAAAAAAAAAAAAB/gPgAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH//iIiAAAAAAAAAAAAAAAB//4iIAAAAAAAAAAAAAAAAf/iIgAAAAAAAAAAAAAAAAH/4iAAAAAAAAAAAAAAAAAB/iIAAAAAAAAAAAAAAAAAAf4gAAAAAAAAAAAAAAAAAAHiAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8P///+H///3h///8w////EP///wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #playlist-window .playlist-top {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #main-window #position {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #playlist-window #playlist-resize-target {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAAAAA/3cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAcAAAAAAAAAAACPcAAAdwAHcAAAAAAAAAAAj3AAAP8AD/AAAAAAAAgACPcAAAAAAA8AAAAAAAAIcAj3AAAAAAAAAAAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////n////w////4H///iB///w/n//8OY//+HCH/3hwh/8w+Y//EP+f/wH///8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #playlist-window .playlist-scrollbar {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAAAAA/3cAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAAAAj3AAAA9wAAAAAAAAAAgACPcAAAAPcAAAAAAAAAAIcAj3AAAAAAAAAAAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAA/3cAAAAAAAAACP/3d3AAAA9wAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////////////////////////8////+H///jA///wwP//8P///+Hz//3h4f/8w+H//EPz//wH///8AED//ADA//wB4f/8A/P//Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #main-window #title-bar {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAAAAP93AAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAP93AAAAAAAACP/3d3AAAAAPcAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////P////h///jwP//w8D//8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AHA//ADwP/wB+H/8A/z//Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #volume {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #volume input {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n#webamp #balance {cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHcAAAAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAAAACPcAAHAAAAAHAAAAAAAAAAj3AAdwAHcAB3AAAAAAgACPcAAP8AD/AA/wAAAAAIcAj3AAAPAAAAAPAAAAAACPcPcAAAAAAAAAAAAAAAAAj/cAAAAAAAAAAAAAAAAAAI//d3dwAAAAAAAAAAAAAACP/3d3AAAAAAAAAAAAAAAAj/d3cAAAAAAAAAAAAAAAAI/3dwAAAAAAAAAAAAAAAACPd3AAAAAAAAAAAAAAAAAAj3cAAAAAAAAAAAAAAAAAAIdwAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////j////w////8M/P/+GMx/3hCEP8wwhD/EOMx/wHz8/8AH///AD///wB///8A////Af///wP///8H////D////x////8/////f////w==), auto}\n"
  },
  {
    "path": "webamp/packages/webamp/css/context-menu.css",
    "content": "#webamp-context-menu .context-menu {\n  left: 0px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  cursor: default;\n}\n\n#webamp-context-menu .context-menu.bottom {\n  top: 12px;\n}\n\n#webamp-context-menu .context-menu.top {\n  top: 0px;\n}\n\n#webamp-context-menu .context-menu,\n#webamp-context-menu .context-menu ul {\n  z-index: 50; /* Gross */\n  background-color: #ffffff;\n  position: absolute;\n  list-style: none;\n  padding: 0;\n  margin: 0;\n  border: 1px solid #a7a394;\n  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);\n}\n\n#webamp-context-menu .context-menu li {\n  position: relative;\n  font-family: \"Tahoma\";\n  font-size: 11px;\n  color: black;\n  white-space: nowrap;\n  margin: 2px;\n  padding: 1px 18px 3px 18px;\n  display: block;\n}\n\n#webamp-context-menu .context-menu li.input {\n  padding: 0;\n}\n\n#webamp-context-menu .context-menu li.checked:before {\n  float: left;\n  /* TODO: Use an image */\n  content: \"\\2713\";\n  margin-left: -12px;\n}\n\n#webamp-context-menu .context-menu li.parent:after {\n  float: right;\n  content: \"\\25b8\";\n  margin-right: -12px;\n}\n#webamp-context-menu .context-menu li a {\n  text-decoration: none;\n  color: black;\n  cursor: default;\n}\n\n#webamp-context-menu .context-menu li:hover,\n#webamp-context-menu .context-menu li:hover a {\n  background-color: #224eb7;\n  color: #ffffff;\n}\n\n#webamp-context-menu .context-menu li.hr {\n  padding: 2px 0;\n}\n\n#webamp-context-menu .context-menu li.hr:hover {\n  background-color: #ffffff;\n}\n\n#webamp-context-menu .context-menu li.hr hr {\n  border: none;\n  height: 1px;\n  background-color: #a7a394;\n  margin: 0;\n  padding: 0;\n}\n\n#webamp-context-menu .context-menu ul {\n  display: none;\n  left: 100%;\n  margin-left: -3px;\n  max-height: 300px;\n  overflow-y: auto;\n}\n\n#webamp-context-menu .context-menu li:hover > ul {\n  display: block;\n}\n\n.searchField {\n  width: 120px;\n  height: 20px;\n  border: 0;\n  padding: 1px 18px 3px;\n  font-family: Tahoma;\n  font-size: 11px;\n}"
  },
  {
    "path": "webamp/packages/webamp/css/equalizer-window.css",
    "content": "/* Styles */\n#webamp #equalizer-window {\n  height: 116px;\n  width: 275px;\n}\n\n#webamp #equalizer-window.shade {\n  height: 14px;\n}\n\n#webamp #equalizer-volume {\n  position: absolute;\n  left: 61px;\n  top: 4px;\n  height: 6px;\n  width: 97px;\n  background-position: 0 0;\n}\n\n#webamp #equalizer-volume::-webkit-slider-thumb {\n  height: 7px;\n  width: 3px;\n}\n\n#webamp #equalizer-volume::-moz-range-thumb {\n  height: 7px;\n  width: 3px;\n}\n\n#webamp #equalizer-balance {\n  position: absolute;\n  left: 164px;\n  top: 4px;\n  height: 6px;\n  width: 43px;\n  background-position: 0 0;\n}\n\n#webamp #equalizer-balance::-webkit-slider-thumb {\n  height: 7px;\n  width: 3px;\n}\n\n#webamp #equalizer-balance::-moz-range-thumb {\n  height: 7px;\n  width: 3px;\n}\n\n#webamp .equalizer-top {\n  height: 14px;\n  width: 275px;\n  position: relative;\n}\n\n#webamp #equalizer-close {\n  position: absolute;\n  height: 9px;\n  width: 9px;\n  left: 264px;\n  top: 3px;\n}\n\n#webamp #equalizer-shade {\n  position: absolute;\n  height: 9px;\n  width: 9px;\n  left: 254px;\n  top: 3px;\n}\n\n#webamp #on {\n  position: absolute;\n  width: 26px;\n  height: 12px;\n  top: 18px;\n  left: 14px;\n}\n\n#webamp #auto {\n  position: absolute;\n  width: 32px;\n  height: 12px;\n  top: 18px;\n  left: 40px;\n}\n\n#webamp #presets-context {\n  position: absolute;\n  width: 44px;\n  height: 12px;\n  top: 18px;\n  left: 217px;\n}\n\n#webamp #presets {\n  width: 100%;\n  height: 100%;\n}\n\n#webamp #eqGraph {\n  position: absolute;\n  width: 113px;\n  height: 19px;\n  top: 17px;\n  left: 86px;\n}\n\n#webamp #preamp {\n  position: absolute;\n  left: 21px;\n  top: 38px;\n}\n\n#webamp #plus12db {\n  position: absolute;\n  left: 45px;\n  top: 36px;\n  width: 22px;\n  height: 8px;\n}\n\n#webamp #zerodb {\n  position: absolute;\n  left: 45px;\n  top: 64px;\n  width: 22px;\n  height: 8px;\n}\n\n#webamp #minus12db {\n  position: absolute;\n  left: 45px;\n  top: 95px;\n  width: 22px;\n  height: 8px;\n}\n\n#webamp #band-60 {\n  position: absolute;\n  left: 78px;\n  top: 38px;\n}\n\n#webamp #band-170 {\n  position: absolute;\n  left: 96px;\n  top: 38px;\n}\n\n#webamp #band-310 {\n  position: absolute;\n  left: 114px;\n  top: 38px;\n}\n\n#webamp #band-600 {\n  position: absolute;\n  left: 132px;\n  top: 38px;\n}\n\n#webamp #band-1000 {\n  position: absolute;\n  left: 150px;\n  top: 38px;\n}\n\n#webamp #band-3000 {\n  position: absolute;\n  left: 168px;\n  top: 38px;\n}\n\n#webamp #band-6000 {\n  position: absolute;\n  left: 186px;\n  top: 38px;\n}\n\n#webamp #band-12000 {\n  position: absolute;\n  left: 204px;\n  top: 38px;\n}\n\n#webamp #band-14000 {\n  position: absolute;\n  left: 222px;\n  top: 38px;\n}\n\n#webamp #band-16000 {\n  position: absolute;\n  left: 240px;\n  top: 38px;\n}\n\n"
  },
  {
    "path": "webamp/packages/webamp/css/gen-window.css",
    "content": "#webamp .gen-text-space {\n  width: 5px;\n}\n\n#webamp .gen-text-letter {\n  height: 7px;\n  display: inline-block;\n}\n\n#webamp .gen-window {\n  /* Default size */\n  width: 275px;\n  height: 116px;\n  display: flex;\n  flex-direction: column;\n}\n\n#webamp .gen-top {\n  height: 20px;\n  display: flex;\n  flex-direction: row;\n}\n\n#webamp .gen-top-left {\n  width: 25px;\n  height: 20px;\n}\n\n#webamp .gen-top-title {\n  line-height: 7px;\n  margin-top: 2px;\n  /* TODO: This should be a conciquence of the repeating tiles, not hard coded */\n  padding: 0 3px 0 4px;\n}\n\n#webamp .gen-top-left-fill {\n  flex-grow: 1;\n  height: 20px;\n  background-position: left;\n}\n\n#webamp .gen-top-right-fill {\n  flex-grow: 1;\n  height: 20px;\n  background-position: right;\n}\n\n#webamp .gen-top-left-end {\n  width: 25px;\n  height: 20px;\n}\n\n#webamp .gen-top-right {\n  width: 25px;\n  height: 20px;\n}\n\n#webamp .gen-top-right-end {\n  width: 25px;\n  height: 20px;\n}\n\n#webamp .gen-close {\n  width: 9px;\n  height: 9px;\n  position: absolute;\n  right: 2px;\n  top: 3px;\n}\n\n#webamp .gen-middle {\n  flex-grow: 1;\n  display: flex;\n  flex-direction: row;\n  position: relative;\n}\n\n#webamp .gen-middle-left {\n  width: 11px;\n}\n\n#webamp .gen-middle-left-bottom {\n  width: 11px;\n  height: 24px;\n  bottom: 0;\n  position: absolute;\n}\n\n#webamp .gen-middle-center {\n  flex-grow: 1;\n  position: relative;\n}\n\n#webamp .gen-middle-right {\n  width: 8px;\n}\n\n#webamp .gen-middle-right-bottom {\n  width: 8px;\n  height: 24px;\n  bottom: 0;\n  position: absolute;\n}\n\n#webamp .gen-bottom {\n  height: 14px;\n  background-repeat: repeat-x;\n}\n\n#webamp .gen-bottom-left {\n  position: absolute;\n  left: 0;\n  width: 125px;\n  height: 14px;\n}\n\n#webamp .gen-bottom-right {\n  position: absolute;\n  right: 0;\n  width: 125px;\n  height: 14px;\n}\n\n#webamp .gen-bottom-right #gen-resize-target {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  height: 20px;\n  width: 20px;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/css/main-window.css",
    "content": "/* Styles */\n#webamp #main-window {\n  position: absolute;\n  height: 116px;\n  width: 275px;\n  /* Ask the browser to scale showing large pixels if possible */\n  image-rendering: -moz-crisp-edges; /* Firefox */\n  image-rendering: -o-crisp-edges; /* Opera */\n  image-rendering: -webkit-optimize-contrast; /* Safari */\n  image-rendering: pixelated; /* Only in Chrome > 40 */\n  -ms-interpolation-mode: nearest-neighbor; /* IE (non-standard property) */\n}\n\n#webamp #title-bar {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 14px;\n  width: 275px;\n  -webkit-app-region: drag;\n}\n\n#webamp #option-context,\n#webamp #minimize,\n#webamp #shade,\n#webamp #close {\n  position: absolute;\n  height: 9px;\n  width: 9px;\n  top: 3px;\n  -webkit-app-region: no-drag;\n  cursor: pointer;\n}\n\n#webamp #title-bar #option {\n  width: 100%;\n  height: 100%;\n}\n\n#webamp #title-bar #option-context {\n  left: 6px;\n}\n#webamp #title-bar #minimize {\n  left: 244px;\n}\n#webamp #title-bar #shade {\n  left: 254px;\n}\n#webamp #title-bar #close {\n  left: 264px;\n}\n#webamp #clutter-bar {\n  position: absolute;\n  top: 22px;\n  left: 10px;\n  height: 43px;\n  width: 8px;\n}\n\n#webamp #clutter-bar div {\n  position: absolute;\n  height: 7px;\n  width: 8px;\n  left: 0px;\n}\n\n#webamp #clutter-bar #button-o {\n  top: 3px;\n  height: 8px;\n}\n#webamp #clutter-bar #button-a {\n  top: 11px;\n}\n#webamp #clutter-bar #button-i {\n  top: 18px;\n}\n#webamp #clutter-bar #button-d {\n  top: 25px;\n  height: 8px;\n}\n#webamp #clutter-bar #button-v {\n  top: 33px;\n}\n\n#webamp #play-pause {\n  position: absolute;\n  top: 28px;\n  left: 26px;\n  height: 9px;\n  width: 9px;\n  background-repeat: no-repeat;\n}\n\n#webamp .play #work-indicator,\n#webamp #work-indicator.selected {\n  position: absolute;\n  top: 28px;\n  left: 24px;\n  height: 9px;\n  width: 3px;\n}\n#webamp .status #time {\n  position: absolute;\n  left: 39px;\n  top: 26px;\n  /* Just to make it clickable */\n  height: 13px;\n  width: 59px;\n}\n\n#webamp .stop .status #time {\n  display: none;\n}\n#webamp .pause .status #time {\n  animation: blink 2s step-start 1s infinite;\n  -webkit-animation: blink 2s step-start 1s infinite;\n}\n\n#webamp .status #time #minus-sign {\n  /* Note that this get's augmented by the skin CSS if NUM_EX.BMP is present */\n  position: absolute;\n  top: 6px;\n  left: -1px;\n  width: 5px;\n  height: 1px;\n}\n\n#webamp .status #time #minute-first-digit {\n  position: absolute;\n  pointer-events: none;\n  left: 9px;\n  height: 13px;\n  width: 9px;\n}\n#webamp .status #time #minute-second-digit {\n  position: absolute;\n  pointer-events: none;\n  left: 21px;\n  height: 13px;\n  width: 9px;\n}\n#webamp .status #time #second-first-digit {\n  position: absolute;\n  pointer-events: none;\n  left: 39px;\n  height: 13px;\n  width: 9px;\n}\n#webamp .status #time #second-second-digit {\n  position: absolute;\n  pointer-events: none;\n  left: 51px;\n  height: 13px;\n  width: 9px;\n}\n\n#webamp #main-window #visualizer {\n  position: absolute;\n  top: 43px;\n  left: 24px;\n}\n\n#webamp #main-window.shade #visualizer {\n  top: 5px;\n  left: 79px;\n}\n\n#webamp #main-window.stop #visualizer {\n  display: none;\n}\n\n#webamp .text {\n  display: none;\n}\n\n#webamp #marquee {\n  position: absolute;\n  left: 111px;\n  top: 24px;\n  width: 155px;\n  height: 6px;\n  overflow: hidden;\n  display: block;\n  padding: 3px 0px; /* Ensure the target is correct for the cursor */\n}\n\n#webamp .media-info #kbps {\n  position: absolute;\n  left: 111px;\n  top: 43px;\n  width: 15px;\n  height: 6px;\n  overflow: hidden;\n}\n\n#webamp .stop .media-info #kbps {\n  display: none;\n}\n\n#webamp .media-info #khz {\n  position: absolute;\n  left: 156px;\n  top: 43px;\n  width: 10px;\n  height: 6px;\n  overflow: hidden;\n}\n\n#webamp .stop .media-info #khz {\n  display: none;\n}\n\n#webamp .media-info .mono-stereo {\n  position: absolute;\n  left: 212px;\n  top: 41px;\n  width: 57px;\n  height: 12px;\n}\n\n#webamp .media-info .mono-stereo div {\n  position: absolute;\n  height: 12px;\n}\n\n#webamp .media-info .mono-stereo #mono {\n  width: 27px;\n}\n\n#webamp .media-info .mono-stereo #stereo {\n  left: 27px;\n  width: 29px;\n}\n\n#webamp #volume {\n  position: absolute;\n  left: 107px;\n  top: 57px;\n  height: 13px;\n  width: 68px;\n  background-position: 0 0;\n}\n\n#webamp #volume input {\n  height: 13px;\n  /* The input itself, is actually 3px shorter than the background\n     * https://twitter.com/LuigiHann/status/959275940688867328\n     */\n  width: 65px;\n  display: block;\n}\n#webamp #volume input::-webkit-slider-thumb {\n  top: 1px;\n  height: 11px;\n  width: 14px;\n}\n#webamp #volume input::-moz-range-thumb {\n  top: 1px;\n  height: 11px;\n  width: 14px;\n}\n\n#webamp #balance {\n  position: absolute;\n  left: 177px;\n  top: 57px;\n  height: 13px;\n  width: 38px;\n  background-position: 0 0;\n}\n\n#webamp #balance::-webkit-slider-thumb {\n  top: 1px;\n  height: 11px;\n  width: 14px;\n}\n#webamp #balance::-moz-range-thumb {\n  top: 1px;\n  height: 11px;\n  width: 14px;\n}\n\n#webamp .windows {\n  position: absolute;\n  left: 219px;\n  top: 58px;\n  width: 46px;\n  height: 12px;\n}\n\n#webamp .windows div {\n  position: absolute;\n  width: 23px;\n  height: 12px;\n}\n\n#webamp .windows #equalizer-button {\n  left: 0;\n}\n\n#webamp .windows #playlist-button {\n  left: 23px;\n}\n\n#webamp #position {\n  position: absolute;\n  left: 16px;\n  top: 72px;\n  width: 248px;\n  height: 10px;\n}\n\n#webamp #position::-webkit-slider-thumb {\n  height: 10px;\n  width: 29px;\n  /*\n     * Fix the strange bug in Safair/mobile-chrome\n     * http://stackoverflow.com/questions/26727769/rendering-glitch-when-manipulating-range-input-value-via-javascript-in-webkit\n     */\n  -webkit-box-sizing: border-box;\n  position: relative;\n}\n\n#webamp #position::-moz-range-thumb {\n  height: 10px;\n  width: 29px;\n}\n\n/* For some reason, we can't use display: none here */\n#webamp .stop #position::-webkit-slider-thumb {\n  visibility: hidden;\n}\n#webamp .stop #position::-moz-range-thumb {\n  visibility: hidden;\n}\n\n/* For some reason this is needed for the position slider to show up now that\n * we are using React.\n */\n#webamp .play #position::-webkit-slider-thumb {\n  visibility: visible;\n}\n\n#webamp .actions div {\n  height: 18px;\n  width: 23px;\n  position: absolute;\n}\n\n#webamp .actions #previous {\n  top: 88px;\n  left: 16px;\n}\n#webamp .actions #play {\n  top: 88px;\n  left: 39px;\n}\n#webamp .actions #pause {\n  top: 88px;\n  left: 62px;\n}\n#webamp .actions #stop {\n  top: 88px;\n  left: 85px;\n}\n#webamp .actions #next {\n  top: 88px;\n  left: 108px;\n  width: 22px;\n}\n\n#webamp #eject {\n  position: absolute;\n  top: 89px;\n  left: 136px;\n  height: 16px;\n  width: 22px;\n}\n\n#webamp .shuffle-repeat {\n  position: absolute;\n  top: 89px;\n  left: 164px;\n  width: 74px;\n}\n\n#webamp .shuffle-repeat div {\n  position: absolute;\n  height: 15px;\n}\n\n#webamp .shuffle-repeat #shuffle {\n  width: 47px;\n}\n\n#webamp .shuffle-repeat #repeat {\n  left: 46px;\n  width: 28px;\n}\n\n#webamp #about {\n  position: absolute;\n  top: 91px;\n  left: 253px;\n  height: 15px;\n  width: 13px;\n}\n\n#webamp .digit {\n  position: absolute;\n  display: inline-block;\n  width: 9px;\n  height: 13px;\n  background-repeat: no-repeat;\n  text-indent: -9999px;\n}\n\n/* Shade View */\n#webamp #main-window.shade {\n  height: 14px;\n}\n\n#webamp .shade .media-info,\n#webamp .shade .windows,\n#webamp .shade #volume,\n#webamp .shade #balance,\n#webamp .shade .shuffle-repeat,\n#webamp .shade .status {\n  display: none;\n}\n#webamp .shade #title-bar {\n}\n\n#webamp .shade .actions div {\n  position: absolute;\n}\n#webamp .shade .actions #previous,\n#webamp .shade .actions #previous:active {\n  background: none;\n  height: 10px;\n  width: 7px;\n  top: 2px;\n  left: 169px;\n}\n#webamp .shade .actions #play,\n#webamp .shade .actions #play:active {\n  background: none;\n  height: 10px;\n  width: 10px;\n  top: 2px;\n  left: 176px;\n}\n#webamp .shade .actions #pause,\n#webamp .shade .actions #pause:active {\n  background: none;\n  height: 10px;\n  width: 9px;\n  top: 2px;\n  left: 186px;\n}\n#webamp .shade .actions #stop,\n#webamp .shade .actions #stop:active {\n  background: none;\n  height: 10px;\n  width: 9px;\n  top: 2px;\n  left: 195px;\n}\n#webamp .shade .actions #next,\n#webamp .shade .actions #next:active {\n  background: none;\n  height: 10px;\n  width: 10px;\n  top: 2px;\n  left: 204px;\n}\n#webamp .shade #eject,\n#webamp .shade #eject:active {\n  height: 10px;\n  width: 10px;\n  top: 2px;\n  left: 215px;\n  background: none;\n}\n\n#webamp .shade #position {\n  position: absolute;\n  left: 226px;\n  top: 4px;\n  width: 17px;\n  height: 7px;\n}\n\n#webamp .shade #position::-webkit-slider-thumb {\n  height: 7px;\n  width: 3px;\n  /* This make it appear. Not sure why */\n  background: none;\n}\n\n#webamp .shade #position::-moz-range-thumb {\n  height: 7px;\n  width: 3px;\n  /* This make it appear. Not sure why */\n  background: none;\n}\n\n#webamp #main-window .mini-time {\n  position: absolute;\n  top: 4px;\n  left: 127px;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/css/milkdrop-window.css",
    "content": ".webamp-desktop {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: -1;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/css/mini-time.css",
    "content": "#webamp .mini-time {\n  display: block;\n  height: 6px;\n  width: 25px;\n}\n\n#webamp .mini-time.blinking .character:not(.background-character) {\n  animation: blink 2s step-start 1s infinite;\n  -webkit-animation: blink 2s step-start 1s infinite;\n}\n\n#webamp .mini-time .background-character {\n  z-index: 1;\n}\n\n#webamp .mini-time .character {\n  position: absolute;\n  top: 0;\n  z-index: 2;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/css/playlist-window.css",
    "content": "/* Styles */\n#webamp #playlist-window {\n  display: flex;\n  flex-direction: column;\n}\n\n#webamp .playlist-top {\n  width: 100%;\n  min-height: 20px;\n  max-height: 20px;\n  position: relative;\n  display: flex;\n}\n\n#webamp .playlist-top-left {\n  width: 25px;\n}\n\n#webamp .playlist-top-left-spacer {\n  width: 12px;\n}\n\n#webamp .playlist-top-left-fill {\n  flex-grow: 1;\n  background-position: right;\n}\n\n#webamp .playlist-top-right-spacer {\n  /* This goes to the right of the center */\n  width: 13px;\n}\n\n#webamp .playlist-top-right-fill {\n  flex-grow: 1;\n  background-position: right;\n}\n\n#webamp .playlist-top-title {\n  width: 100px;\n}\n\n#webamp .playlist-top-right {\n  width: 25px;\n}\n\n#webamp .playlist-middle {\n  flex-grow: 1;\n  display: flex;\n  flex-direction: row;\n  overflow: hidden;\n}\n\n#webamp .playlist-middle-left {\n  background-repeat: repeat-y;\n  width: 12px;\n  min-width: 12px;\n}\n\n#webamp .playlist-middle-center {\n  flex-grow: 1;\n  padding: 3px 0;\n  min-width: 0; /* Not sure why this is needed */\n}\n\n#webamp .playlist-tracks {\n  display: flex;\n  flex: 1 0 auto;\n}\n\n#webamp .playlist-tracks .track-cell {\n  height: 13px;\n  line-height: 13px;\n  font-size: 9px;\n  letter-spacing: 0.5px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n\n#webamp .playlist-track-durations > div {\n  padding-right: 3px;\n  text-align: right;\n}\n\n#webamp .playlist-track-titles {\n  flex: 1 1 auto;\n  overflow: hidden;\n}\n\n#webamp .playlist-track-titles > div {\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n#webamp .playlist-middle-right {\n  background-repeat: repeat-y;\n  background-position: top right;\n  width: 20px;\n  min-width: 20px;\n  position: relative;\n  padding-bottom: 18px;\n}\n\n#webamp .playlist-bottom {\n  width: 100%;\n  height: 38px;\n  min-height: 38px;\n  max-height: 38px;\n  position: relative;\n}\n\n#webamp .playlist-bottom-left {\n  width: 125px;\n  height: 100%;\n  position: absolute;\n}\n\n#webamp .playlist-menu li {\n  list-style: none;\n  display: none;\n  width: 22px;\n  height: 18px;\n  padding: 0;\n  margin: 0;\n}\n\n#webamp .playlist-menu li > div {\n  height: 100%;\n}\n\n#webamp .playlist-menu ul {\n  padding: 0;\n  margin: 0;\n  position: absolute;\n  bottom: 0;\n}\n\n#webamp .playlist-menu.selected li {\n  display: block;\n}\n\n#webamp .playlist-menu .bar {\n  position: absolute;\n  bottom: 0;\n  left: -3px;\n  width: 3px;\n  height: 54px;\n}\n\n#webamp #playlist-add-menu {\n  position: absolute;\n  bottom: 12px;\n  left: 14px;\n  width: 22px;\n  height: 18px;\n}\n\n#webamp #playlist-remove-menu.playlist-menu .bar {\n  height: 72px;\n}\n\n#webamp #playlist-remove-menu {\n  position: absolute;\n  bottom: 12px;\n  left: 43px;\n  width: 22px;\n  height: 18px;\n}\n\n#webamp #playlist-selection-menu {\n  position: absolute;\n  bottom: 12px;\n  left: 72px;\n  width: 22px;\n  height: 18px;\n}\n\n#webamp #playlist-misc-menu {\n  position: absolute;\n  bottom: 12px;\n  left: 101px;\n  width: 22px;\n  height: 18px;\n}\n\n#webamp #playlist-list-menu {\n  position: absolute;\n  bottom: 12px;\n  right: 22px;\n  width: 22px;\n  height: 18px;\n}\n\n#webamp .playlist-bottom-right {\n  width: 150px;\n  height: 100%;\n  position: absolute;\n  right: 0;\n}\n\n#webamp .playlist-running-time-display {\n  position: absolute;\n  top: 10px;\n  left: 7px;\n  height: 10px;\n}\n\n#webamp .playlist-action-buttons {\n  position: absolute;\n  top: 22px;\n  left: 3px;\n  display: flex;\n}\n\n#webamp .playlist-action-buttons > div {\n  height: 10px;\n  width: 10px;\n}\n\n#webamp #playlist-window .playlist-visualizer {\n  width: 75px;\n  height: 100%;\n  position: absolute;\n  right: 150px;\n}\n\n#webamp #playlist-window .mini-time {\n  position: absolute;\n  top: 23px;\n  left: 66px;\n}\n\n#webamp #playlist-window #playlist-resize-target {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  height: 20px;\n  width: 20px;\n}\n\n#webamp #playlist-close-button {\n  position: absolute;\n  right: 2px;\n  height: 9px;\n  width: 9px;\n  top: 3px;\n}\n\n#webamp #playlist-shade-button {\n  position: absolute;\n  right: 12px;\n  height: 9px;\n  width: 9px;\n  top: 3px;\n}\n\n#webamp #playlist-window-shade {\n  height: 14px;\n}\n\n#webamp #playlist-window-shade .left {\n  height: 14px;\n  background-repeat: no-repeat;\n}\n\n#webamp #playlist-window-shade .right {\n  height: 14px;\n  background-repeat: no-repeat;\n  background-position-x: right;\n}\n\n#webamp #playlist-window #playlist-scroll-up-button,\n#webamp #playlist-window #playlist-scroll-down-button {\n  position: absolute;\n  width: 8px;\n  height: 5px;\n  right: 7px;\n}\n\n#webamp #playlist-window #playlist-scroll-up-button {\n  top: 2px;\n}\n#webamp #playlist-window #playlist-scroll-down-button {\n  top: 8px;\n}\n\n#webamp #playlist-window-shade #playlist-resize-target {\n  position: absolute;\n  right: 20px;\n  top: 3px;\n  height: 9px;\n  width: 9px;\n}\n\n#webamp #playlist-shade-track-title {\n  position: absolute;\n  top: 4px;\n  left: 5px;\n}\n\n#webamp #playlist-shade-time {\n  position: absolute;\n  top: 4px;\n  right: 30px;\n}\n\n#webamp #playlist-window .visualizer-wrapper {\n  position: absolute;\n  top: 12px;\n  left: 2px;\n  width: 72px;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/css/webamp.css",
    "content": "/* Rules used by all windows */\n\n#webamp {\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\n/* Prevent accidental highlighting */\n#webamp canvas {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n\n#webamp * {\n  /* Some environments globably change the box-sizing */\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n}\n\n#webamp *:focus {\n  outline: 0;\n}\n\n/* Range input css reset */\n#webamp input[type=\"range\"] {\n  -webkit-appearance: none;\n  margin: 0;\n  padding: 0;\n  background: none;\n  border: none;\n}\n#webamp input[type=\"range\"]::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  border: none;\n  border-radius: 0;\n  background: none;\n}\n#webamp input[type=\"range\"]::-moz-range-thumb {\n  border: none;\n  border-radius: 0;\n  background: none;\n}\n#webamp input[type=\"range\"]::-moz-range-track {\n  border: none;\n  background: none;\n}\n#webamp input[type=\"range\"]:focus {\n  outline: none;\n}\n#webamp input[type=\"range\"]::-moz-focus-outer {\n  border: 0;\n}\n\n#webamp a:focus {\n  outline: none;\n}\n\n/* Animation */\n@keyframes blink {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@-webkit-keyframes blink {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n#webamp .character {\n  display: inline-block;\n  vertical-align: top;\n  width: 5px;\n  height: 6px;\n  /* background-image: TEXT.BMP via Javascript */\n  text-indent: -9999px;\n}\n\n#webamp .window {\n  position: absolute;\n  /* Ask the browser to scale showing large pixels if possible */\n  image-rendering: -moz-crisp-edges; /* Firefox */\n  image-rendering: -o-crisp-edges; /* Opera */\n  image-rendering: -webkit-optimize-contrast; /* Safari */\n  image-rendering: pixelated; /* Only in Chrome > 40 */\n  -ms-interpolation-mode: nearest-neighbor; /* IE (non-standard property) */\n}\n\n#webamp .window {\n  /* Work around rendering bug with clip-path */\n  -webkit-transform: translateZ(0);\n}\n#webamp .window.doubled {\n  -moz-transform: translateZ(0) scale(2);\n  -moz-transform-origin: top left;\n  -webkit-transform: translateZ(0) scale(2);\n  -webkit-transform-origin: top left;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/demo/config/webpack.common.js",
    "content": "const path = require(\"path\");\nconst HtmlWebpackPlugin = require(\"html-webpack-plugin\");\nconst HtmlWebpackInlineSVGPlugin = require(\"html-webpack-inline-svg-plugin\");\nconst CopyWebpackPlugin = require(\"copy-webpack-plugin\");\n\nmodule.exports = {\n  resolve: {\n    extensions: [\".js\", \".ts\", \".tsx\"],\n    fallback: {\n      \"stream\": require.resolve(\"stream-browserify\")\n    }\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.css$/,\n        use: [\n          \"style-loader\",\n          { loader: \"css-loader\", options: { importLoaders: 1 } },\n          // We really only need this in prod. We could find a way to disable it in dev.\n          {\n            loader: \"postcss-loader\",\n            options: {\n              plugins: [\n                require(\"cssnano\"),\n                require(\"../../scripts/postcss-optimize-data-uri-pngs\"),\n              ],\n            },\n          },\n        ],\n      },\n      {\n        test: /\\.(js|ts|tsx)?$/,\n        exclude: /(node_modules)/,\n        use: {\n          loader: \"babel-loader\",\n          options: {\n            envName: \"production\",\n          },\n        },\n      },\n      {\n        test: /\\.(wsz|wal|mp3|png|ico|jpg|svg)$/,\n        use: [\n          {\n            loader: \"file-loader\",\n            options: {\n              emitFile: true,\n              name: \"[path][name]-[hash].[ext]\",\n            },\n          },\n        ],\n      },\n    ],\n    noParse: [/jszip\\.js$/],\n  },\n  plugins: [\n    new HtmlWebpackPlugin({\n      template: \"./index.html\",\n      chunks: [\"webamp\"],\n    }),\n    new HtmlWebpackInlineSVGPlugin({ runPreEmit: true }),\n    new CopyWebpackPlugin([\n      {\n        from: \"./js/delete-service-worker.js\",\n        to: \"service-worker.js\",\n        force: true,\n      },\n      {\n        from: \"../assets\",\n        to: \"assets\",\n      },\n    ]),\n  ],\n\n  performance: {\n    // We do some crazy shit okay! Don't judge!\n    maxEntrypointSize: 7000000,\n    maxAssetSize: 7000000,\n  },\n  entry: {\n    webamp: [\"./js/index.js\"],\n  },\n  context: path.resolve(__dirname, \"../\"),\n  output: {\n    filename: \"[name]-[hash].js\",\n    chunkFilename: \"[name]-[hash].js\",\n    publicPath: \"/\",\n    path: path.resolve(__dirname, \"../built\"),\n  },\n};\n"
  },
  {
    "path": "webamp/packages/webamp/demo/config/webpack.dev.js",
    "content": "const webpack = require(\"webpack\");\nconst merge = require(\"webpack-merge\");\nconst common = require(\"./webpack.common.js\");\n\nmodule.exports = merge(common, {\n  devtool: \"eval-cheap-module-source-map\",\n  mode: \"development\",\n  devServer: {\n    overlay: true,\n  },\n  plugins: [\n    new webpack.DefinePlugin({\n      SENTRY_DSN: JSON.stringify(\n        \"https://c8c64ef822f54240901bc64f88c234d8@sentry.io/146022\"\n      ),\n    }),\n  ],\n});\n"
  },
  {
    "path": "webamp/packages/webamp/demo/config/webpack.prod.js",
    "content": "const webpack = require(\"webpack\");\nconst merge = require(\"webpack-merge\");\nconst GitRevisionPlugin = require(\"git-revision-webpack-plugin\");\nconst { BundleAnalyzerPlugin } = require(\"webpack-bundle-analyzer\");\n\nconst common = require(\"./webpack.common.js\");\n\nconst gitRevisionPlugin = new GitRevisionPlugin();\n\nconst config = merge(common, {\n  devtool: \"source-map\",\n  mode: \"production\",\n  plugins: [\n    new BundleAnalyzerPlugin({\n      analyzerMode: \"static\",\n      reportFilename: \"prod-report.html\",\n      openAnalyzer: false,\n    }),\n    new webpack.DefinePlugin({\n      SENTRY_DSN: JSON.stringify(\n        \"https://12b6be8ef7c44f28ac37ab5ed98fd294@sentry.io/146021\"\n      ),\n      COMMITHASH: JSON.stringify(gitRevisionPlugin.commithash()),\n    }),\n  ],\n});\n\nconfig.entry.webamp.unshift(\"./js/googleAnalytics.min.js\");\n\nmodule.exports = config;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/css/page.css",
    "content": "/* Rules for the page layout */\nbody {\n  background-color: rgb(58, 110, 165);\n  font-family: arial;\n  font-size: 15px;\n}\n\n#browser-compatibility {\n  display: none;\n  position: absolute;\n  width: 275px;\n  margin-top: -58px;\n  margin-left: -137px;\n  top: 40%;\n  left: 50%;\n  background: white;\n  text-align: center;\n}\n\n.about {\n  position: fixed;\n  bottom: 0;\n  right: 0;\n  color: white;\n  /* Let users drag windows over this text */\n  z-index: -1;\n  margin: 0;\n  display: none;\n  flex-direction: row;\n}\n\n@media all and (display-mode: fullscreen) {\n  .about {\n    display: none;\n  }\n}\n\n.about.loaded {\n  display: flex;\n}\n\n.about a {\n  display: flex;\n}\n\n.about a svg {\n  margin: 10px 13px;\n  width: 16px;\n  height: 16px;\n  fill: #fff;\n  transition: 0.25s ease-out;\n}\n\n/* TODO: Ideally this would be a border not a :before */\n.about a:before {\n  position: absolute;\n  top: 0;\n  content: \"\";\n  width: 42px; /* TODO: This should be derived not hard coded */\n  height: 2px;\n  background-color: rgba(255, 255, 255, 0);\n  transition: 0.25s ease-out;\n}\n\n.about a:hover:before {\n  background-color: rgba(255, 255, 255, 255);\n  transition: 0.25s ease-out;\n}\n\n.about a:hover svg {\n  transition: 0.25s ease-out;\n  transform: scale(1.35);\n}\n\n#github-share {\n  background-color: #2d3238;\n}\n\n#music-credits {\n  background-color: rgb(89, 141, 197);\n}\n\n#butterchurn-share {\n  display: none; /* Button is only shown if the window gets enabled */\n  background-size: 100%; /* Image is 2x size for retina displays */\n  background-size: 100%; /* Image is 2x size for retina displays */\n}\n\n#app {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: -2; /* Place this below the about buttons */\n}\n\n#app #loading {\n  color: white;\n  text-align: center;\n  font-size: 40px;\n  height: 30px;\n  position: absolute;\n  margin: auto;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n}\n\n#app #loading .ellipsis-anim span {\n  opacity: 0;\n  -webkit-animation: ellipsis-dot 1s infinite;\n  animation: ellipsis-dot 1s infinite;\n}\n\n#app #loading .ellipsis-anim span:nth-child(1) {\n  -webkit-animation-delay: 0s;\n  animation-delay: 0s;\n}\n\n#app #loading .ellipsis-anim span:nth-child(2) {\n  -webkit-animation-delay: 0.1s;\n  animation-delay: 0.1s;\n}\n\n#app #loading .ellipsis-anim span:nth-child(3) {\n  -webkit-animation-delay: 0.2s;\n  animation-delay: 0.2s;\n}\n\n@-webkit-keyframes ellipsis-dot {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes ellipsis-dot {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n.desktop-icon {\n  text-align: center;\n  cursor: pointer;\n  image-rendering: pixelated;\n}\n\n.desktop-icon-title {\n  color: white;\n  font-family: \"MS Sans Serif\", \"Segoe UI\", sans-serif;\n  font-size: 11px;\n  -webkit-font-smoothing: none;\n  margin-top: 5px;\n  width: 100%;\n  border: 1px dotted transparent;\n  text-overflow: ellipsis;\n  word-wrap: break-word;\n  overflow-wrap: break-word;\n}\n\n.desktop-icon.selected .desktop-icon-title {\n  background-color: #000080;\n  border-color: white;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/demo/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <title>Webamp &middot; Winamp 2 in your browser</title>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta name=\"description\" content=\"Winamp 2.9 reimplemented in HTML5 and JavaScript\" />\n    <meta property=\"og:title\" content=\"Webamp &bull; Winamp in your browser\" />\n    <meta property=\"og:description\" content=\"Winamp 2.9 reimplemented in HTML5 and JavaScript\" />\n    <meta property=\"og:type\" content=\"website\" />\n    <meta property=\"og:url\" content=\"https://webamp.org\" />\n    <meta property=\"og:image\" content=\"https://webamp.org<%= require('./images/preview.png') %>\" />\n    <link rel='stylesheet' type='text/css' href=\"<%= require('!file-loader?name=[path][name]-[hash].[ext]!./css/page.css') %>\" />\n    <link rel=\"shortcut icon\" sizes=\"16x16 32x32\" href=\"<%= require('./images/favicon.ico') %>\">\n\n    <!-- See https://goo.gl/qRE0vM -->\n    <meta name=\"theme-color\" content=\"#4b4b4b\">\n\n    <meta name=\"google-site-verification\" content=\"ycocEnfUpYf8u_UmzpqSe0gNooPs0PBjbD7HKw-qa5I\" />\n\n    <!-- Load and register service worker that deletes the service worker we used to have -->\n    <script>\n      if ('serviceWorker' in navigator) {\n        window.addEventListener('load', function() {\n          navigator.serviceWorker.register('/service-worker.js');\n        });\n      }\n    </script>\n</head>\n\n<body>\n    <div id='app'>\n        <div id=\"loading\" style=\"display: none\">\n            Loading<span class=\"ellipsis-anim\"><span>.</span><span>.</span><span>.</span></span>\n        </div>\n    </div>\n    <div id='browser-compatibility'>\n        <p>Your browser does not support the features we need.</p>\n        <p>Try using the most recent version of Chrome, Firefox, Safari or Edge.</p>\n    </div>\n    <div id=\"demo-desktop\"></div>\n    <p class='about'>\n        <a target=\"_blank\" href='https://github.com/jberg/butterchurn' id='butterchurn-share' style=\"background-image: url(<%= require('./images/share/butterchurn-bg.png') %>)\">\n            <img inline src=\"demo/images/share/eye.svg\" />\n        </a>\n        <a target=\"_blank\" href='https://github.com/captbaritone/webamp/blob/master/packages/webamp/docs/music-credits.md' id='music-credits'>\n            <img inline src=\"demo/images/share/music.svg\" />\n        </a>\n        <a target=\"_blank\" href='https://github.com/captbaritone/webamp' id='github-share'>\n            <img inline src=\"demo/images/share/github.svg\" />\n        </a>\n    </p>\n    <script type=\"text/javascript\">\n        // If we can load faster than half a second, don't bother showing the loading indicator.\n        setTimeout(function() {\n            var loading = document.getElementById('loading');\n            if (loading != null) {\n                loading.style.display = 'block';\n            }\n        }, 500)\n    </script>\n    <!-- https://github.com/captbaritone/webamp/issues/750\n    <script type=\"text/javascript\" src=\"https://www.dropbox.com/static/api/2/dropins.js\" id=\"dropboxjs\" data-app-key=\"7py29249dpeddu8\" async></script>\n    -->\n    <!-- Scripts get injected by html-webpack-plugin -->\n</body>\n\n</html>\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/DemoDesktop.tsx",
    "content": "import WebampLazy from \"../../js/webampLazy\";\nimport { Suspense } from \"react\";\nimport WebampIcon from \"./WebampIcon\";\n// import Mp3Icon from \"./Mp3Icon\";\nimport SkinIcon from \"./SkinIcon\";\nimport { /* defaultInitialTracks, */ SHOW_DESKTOP_ICONS } from \"./config\";\nimport { useWindowSize } from \"../../js/hooks\";\nimport avaliableSkins from \"./avaliableSkins\";\nimport DesktopLinkIcon from \"./DesktopLinkIcon\";\nimport museumIcon from \"../images/icons/internet-folder-32x32.png\";\n// import MilkIcon from \"./MilkIcon\";\n\ninterface Props {\n  webamp: WebampLazy;\n}\n\nconst ICON_WIDTH = 75;\nconst ICON_HEIGHT = 100;\nconst VERTICAL_MARGIN = 30;\nconst HORIZONTAL_MARGIN = 10;\n\nconst DemoDesktop = ({ webamp }: Props) => {\n  const { width } = useWindowSize();\n  const visibleWidth = width - VERTICAL_MARGIN * 2;\n\n  const columns = Math.floor(visibleWidth / ICON_WIDTH);\n\n  const icons = [<WebampIcon webamp={webamp} />];\n\n  if (SHOW_DESKTOP_ICONS) {\n    icons.push(\n      /*\n      ...defaultInitialTracks.map((track) => {\n        return <Mp3Icon webamp={webamp} track={track} />;\n      }),\n      */\n      ...avaliableSkins.map((skin) => {\n        return <SkinIcon webamp={webamp} skin={skin} />;\n      }),\n      /*\n      <MilkIcon\n        webamp={webamp}\n        preset={{\n          url:\n            \"https://s3-us-east-2.amazonaws.com/butterchurn-presets/65b9eea6e1cc6bb9f0cd2a47751a186f.json\",\n          name: \"105\",\n        }}\n      />\n      */ <DesktopLinkIcon\n        iconUrl={museumIcon}\n        name=\"Winamp Skin Musuem\"\n        href={\"https://skins.webamp.org\"}\n      />\n    );\n  }\n  return (\n    <div\n      id=\"desktop\"\n      style={{\n        position: \"absolute\",\n        top: 0,\n        left: 0,\n        right: 0,\n        // bottom: 0,\n        marginTop: VERTICAL_MARGIN,\n        marginLeft: HORIZONTAL_MARGIN,\n      }}\n    >\n      <Suspense\n        fallback={null /* Wait for all icons to load before showing any */}\n      >\n        {icons.map((icon, i) => {\n          const row = Math.floor(i / columns);\n          const column = i % columns;\n          return (\n            <div\n              key={i}\n              style={{\n                left: column * ICON_WIDTH,\n                top: row * ICON_HEIGHT,\n                width: ICON_WIDTH,\n                position: \"absolute\",\n              }}\n            >\n              {icon}\n            </div>\n          );\n        })}\n      </Suspense>\n    </div>\n  );\n};\n\nexport default DemoDesktop;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/DesktopIcon.tsx",
    "content": "import { useEffect, useState, useRef } from \"react\";\nimport classnames from \"classnames\";\nimport IconImage from \"./IconImage\";\n\ninterface Props {\n  iconUrl: string;\n  name: string;\n  onOpen: () => void;\n  onDragStart?: (e: React.DragEvent<HTMLDivElement>) => void;\n}\n\nconst DesktopIcon = ({ iconUrl, onOpen, name, onDragStart }: Props) => {\n  const ref = useRef<HTMLDivElement>(null);\n  const [selected, setSelected] = useState(false);\n\n  useEffect(() => {\n    if (!selected) {\n      return;\n    }\n    const handleClick = (e: MouseEvent) => {\n      if (ref.current != null && ref.current.contains(e.target as Element)) {\n        return;\n      }\n      setSelected(false);\n    };\n    document.addEventListener(\"click\", handleClick);\n    return () => document.removeEventListener(\"click\", handleClick);\n  }, [selected]);\n\n  return (\n    <div\n      ref={ref}\n      onDoubleClick={() => {\n        onOpen();\n        setSelected(false);\n      }}\n      onClick={() => setSelected(true)}\n      className={classnames(\"desktop-icon\", { selected })}\n      onDragStart={onDragStart}\n    >\n      <IconImage src={iconUrl} />\n      <div className=\"desktop-icon-title\">{name}</div>\n    </div>\n  );\n};\n\nexport default DesktopIcon;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/DesktopLinkIcon.tsx",
    "content": "import { useEffect, useState, useRef } from \"react\";\nimport classnames from \"classnames\";\nimport IconImage from \"./IconImage\";\n\ninterface Props {\n  iconUrl: string;\n  name: string;\n  href: string;\n}\n\nconst DesktopLinkIcon = ({ iconUrl, href, name }: Props) => {\n  const ref = useRef<HTMLAnchorElement>(null);\n  const [selected, setSelected] = useState(false);\n\n  useEffect(() => {\n    if (!selected) {\n      return;\n    }\n    const handleClick = (e: MouseEvent) => {\n      if (ref.current != null && ref.current.contains(e.target as Element)) {\n        return;\n      }\n      setSelected(false);\n    };\n    document.addEventListener(\"click\", handleClick);\n    return () => document.removeEventListener(\"click\", handleClick);\n  }, [selected]);\n\n  return (\n    <a\n      ref={ref}\n      href={href}\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n      style={{ display: \"block\", textDecoration: \"none\" }}\n      onDoubleClick={() => {\n        setSelected(false);\n      }}\n      onClick={(e) => {\n        if (!selected) {\n          e.preventDefault();\n        }\n        setSelected(true);\n      }}\n      className={classnames(\"desktop-icon\", { selected })}\n    >\n      <IconImage src={iconUrl} />\n      <div className=\"desktop-icon-title\">{name}</div>\n    </a>\n  );\n};\n\nexport default DesktopLinkIcon;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/IconImage.tsx",
    "content": "import SuspenseImage from \"./SuspenseImage\";\n\ntype Props = {\n  src: string;\n};\nexport default function IconImage({ src }: Props) {\n  return <SuspenseImage src={src} style={{ width: 32, height: 32 }} />;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/MilkIcon.tsx",
    "content": "import WebampLazy from \"../../js/webampLazy\";\nimport { useCallback } from \"react\";\n// @ts-ignore\nimport iconLarge from \"../images/manifest/icon-96x96.png\";\n// @ts-ignore\nimport iconSmall from \"../images/manifest/icon-48x48.png\";\nimport DesktopIcon from \"./DesktopIcon\";\nimport * as Actions from \"../../js/actionCreators\";\n\nconst iconUrl = window.devicePixelRatio > 1 ? iconLarge : iconSmall;\n\ninterface Props {\n  webamp: WebampLazy;\n  preset: { url: string; name: string };\n}\n\nconst MilkIcon = ({ webamp, preset }: Props) => {\n  const onOpen = useCallback(() => {\n    const statePreset = {\n      type: \"UNRESOLVED\",\n      name: preset.name,\n      getPreset: async () => {\n        const response = await fetch(preset.url);\n        return response.json();\n      },\n    } as const;\n\n    webamp.store.dispatch(Actions.loadPresets([statePreset]));\n  }, [preset, webamp]);\n  return (\n    <DesktopIcon\n      iconUrl={iconUrl}\n      name={`${preset.name}.milk`}\n      onOpen={onOpen}\n    />\n  );\n};\n\nexport default MilkIcon;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/Mp3Icon.tsx",
    "content": "import WebampLazy from \"../../js/webampLazy\";\nimport { useCallback } from \"react\";\n// @ts-ignore\nimport iconLarge from \"../images/manifest/icon-96x96.png\";\n// @ts-ignore\nimport iconSmall from \"../images/manifest/icon-48x48.png\";\nimport DesktopIcon from \"./DesktopIcon\";\nimport { URLTrack } from \"../../js/types\";\n\nconst iconUrl = window.devicePixelRatio > 1 ? iconLarge : iconSmall;\n\ninterface Props {\n  webamp: WebampLazy;\n  track: URLTrack;\n}\n\nconst Mp3Icon = ({ webamp, track }: Props) => {\n  const url = track.url.toString();\n  const title = track.metaData?.title;\n\n  const onDragStart = useCallback(\n    (e: React.DragEvent<HTMLDivElement>) => {\n      e.dataTransfer.setData(\"text/json\", JSON.stringify(track));\n    },\n    [track]\n  );\n\n  if (title == null) {\n    console.warn(`Could not derive filename for ${url}`);\n    return null;\n  }\n  function onOpen() {\n    webamp.setTracksToPlay([track]);\n  }\n\n  return (\n    <DesktopIcon\n      iconUrl={iconUrl}\n      name={`${title}.mp3`}\n      onOpen={onOpen}\n      onDragStart={onDragStart}\n    />\n  );\n};\n\nexport default Mp3Icon;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/SkinIcon.tsx",
    "content": "import WebampLazy from \"../../js/webampLazy\";\n// @ts-ignore\nimport iconSmall from \"../images/icons/paint-file-32x32.png\";\nimport DesktopIcon from \"./DesktopIcon\";\nimport { log } from \"./logger\";\n\nconst iconUrl = iconSmall;\n\ninterface Props {\n  webamp: WebampLazy;\n  skin: { url: string; name: string };\n}\n\nconst SkinIcon = ({ webamp, skin }: Props) => {\n  function onOpen() {\n    log({ category: \"SkinIcon\", action: \"click\", label: skin.name });\n    webamp.setSkinFromUrl(skin.url);\n  }\n  return (\n    <DesktopIcon iconUrl={iconUrl} name={`${skin.name}.wsz`} onOpen={onOpen} />\n  );\n};\n\nexport default SkinIcon;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/SuspenseImage.tsx",
    "content": "import * as React from \"react\";\n\n// A Resource is an object with a read method returning the payload\ninterface Resource<Payload> {\n  read: () => Payload;\n}\n\ntype status = \"pending\" | \"success\" | \"error\";\n\n// this function let us get a new function using the asyncFn we pass\n// this function also receives a payload and return us a resource with\n// that payload assigned as type\nfunction createResource<Payload>(\n  asyncFn: () => Promise<Payload>\n): Resource<Payload> {\n  // we start defining our resource is on a pending status\n  let status: status = \"pending\";\n  // and we create a variable to store the result\n  let result: any;\n  // then we immediately start running the `asyncFn` function\n  // and we store the resulting promise\n  const promise = asyncFn().then(\n    (r: Payload) => {\n      // once it's fulfilled we change the status to success\n      // and we save the returned value as result\n      status = \"success\";\n      result = r;\n    },\n    (e: Error) => {\n      // once it's rejected we change the status to error\n      // and we save the returned error as result\n      status = \"error\";\n      result = e;\n    }\n  );\n  // lately we return an error object with the read method\n  return {\n    read(): Payload {\n      // here we will check the status value\n      switch (status) {\n        case \"pending\":\n          // if it's still pending we throw the promise\n          // throwing a promise is how Suspense know our component is not ready\n          throw promise;\n        case \"error\":\n          // if it's error we throw the error\n          throw result;\n        case \"success\":\n          // if it's success we return the result\n          return result;\n      }\n    },\n  };\n}\n\n// First we need a type of cache to avoid creating resources for images\n// we have already fetched in the past\nconst cache = new Map<string, any>();\n\n// then we create our loadImage function, this function receives the source\n// of the image and returns a resource\nfunction loadImage(source: string): Resource<string> {\n  // here we start getting the resource from the cache\n  let resource = cache.get(source);\n  // and if it's there we return it immediately\n  if (resource) return resource;\n  // but if it's not we create a new resource\n  resource = createResource<string>(\n    () =>\n      // in our async function we create a promise\n      new Promise((resolve, reject) => {\n        // then create a new image element\n        const img = new window.Image();\n        // set the src to our source\n        img.src = source;\n        // and start listening for the load event to resolve the promise\n        img.addEventListener(\"load\", () => resolve(source));\n        // and also the error event to reject the promise\n        img.addEventListener(\"error\", () =>\n          reject(new Error(`Failed to load image ${source}`))\n        );\n      })\n  );\n  // before finishing we save the new resource in the cache\n  cache.set(source, resource);\n  // and return return it\n  return resource;\n}\n\nexport default function SuspenseImage(\n  props: React.ImgHTMLAttributes<HTMLImageElement>\n): JSX.Element {\n  if (props.src != null) {\n    loadImage(props.src).read();\n  }\n  return <img {...props} />;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/WebampIcon.tsx",
    "content": "import WebampLazy from \"../../js/webampLazy\";\nimport { useEffect, useState } from \"react\";\n// @ts-ignore\nimport iconSmall from \"../images/icons/winamp2-32x32.png\";\nimport DesktopIcon from \"./DesktopIcon\";\nimport { SHOW_DESKTOP_ICONS } from \"./config\";\n\nconst iconUrl = iconSmall;\n\ninterface Props {\n  webamp: WebampLazy;\n}\n\nconst WebampIcon = (props: Props) => {\n  const [hidden, setHidden] = useState(true);\n  useEffect(() => {\n    return props.webamp.onClose(() => {\n      setHidden(false);\n    });\n  }, [props.webamp]);\n\n  if (hidden && !SHOW_DESKTOP_ICONS) {\n    return null;\n  }\n\n  function onOpen() {\n    props.webamp.reopen();\n    setHidden(true);\n  }\n  return <DesktopIcon iconUrl={iconUrl} name=\"Webamp\" onOpen={onOpen} />;\n};\n\nexport default WebampIcon;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/avaliableSkins.ts",
    "content": "// @ts-ignore\nimport osx from \"../skins/MacOSXAqua1-5.wsz\";\n// @ts-ignore\nimport topaz from \"../skins/TopazAmp1-2.wsz\";\n// @ts-ignore\nimport visor from \"../skins/Vizor1-01.wsz\";\n// @ts-ignore\nimport xmms from \"../skins/XMMS-Turquoise.wsz\";\n// @ts-ignore\nimport zaxon from \"../skins/ZaxonRemake1-0.wsz\";\n// @ts-ignore\nimport green from \"../skins/Green-Dimension-V2.wsz\";\n// @ts-ignore\nimport internetArchive from \"../skins/Internet-Archive.wsz\";\n\nexport default [\n  { url: green, name: \"Green Dimension V2\" },\n  { url: internetArchive, name: \"Internet Archive\" },\n  { url: osx, name: \"Mac OSX v1.5 (Aqua)\" },\n  { url: topaz, name: \"TopazAmp\" },\n  { url: visor, name: \"Vizor\" },\n  { url: xmms, name: \"XMMS Turquoise \" },\n  { url: zaxon, name: \"Zaxon Remake\" },\n];\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/butterchurnOptions.ts",
    "content": "import { ButterchurnOptions } from \"../../js/types\";\n\nconst KNOWN_PRESET_URLS_REGEXES = [\n  /^https:\\/\\/unpkg\\.com\\/butterchurn-presets\\/.*\\.json$/,\n  /^https:\\/\\/unpkg\\.com\\/butterchurn-presets-weekly\\/.*\\.json$/,\n  /^https:\\/\\/archive\\.org\\/cors\\/md_.*\\.json$/,\n  /^https:\\/\\/s3-us-east-2\\.amazonaws\\.com\\/butterchurn-presets\\/.*\\.json$/,\n];\n\nfunction presetNameFromURL(url: string) {\n  try {\n    const urlParts = url.split(\"/\");\n    const lastPart = urlParts[urlParts.length - 1];\n    const presetName = lastPart.substring(0, lastPart.length - 5); // remove .milk or .json\n    return decodeURIComponent(presetName);\n  } catch (e) {\n    // if something goes wrong parsing url, just use url as the preset name\n    console.error(e);\n    return url;\n  }\n}\n\nasync function loadButterchurnPresetMapURL(url: string) {\n  const resp = await fetch(url);\n  const namesToPresetUrls = await resp.json();\n  return Object.keys(namesToPresetUrls).map((name: string) => {\n    return { name, butterchurnPresetUrl: namesToPresetUrls[name] };\n  });\n}\n\nexport function getButterchurnOptions(\n  startWithMilkdropHidden: boolean\n): ButterchurnOptions {\n  return {\n    importButterchurn: () => {\n      return import(\n        /* webpackChunkName: \"butterchurn-initial-dependencies\" */\n        // @ts-ignore\n        \"butterchurn\"\n      );\n    },\n    importConvertPreset: () => {\n      return import(\n        /* webpackChunkName: \"milkdrop-preset-converter\" */\n        // @ts-ignore\n        \"milkdrop-preset-converter-aws\"\n      );\n    },\n    presetConverterEndpoint:\n      \"https://p2tpeb5v8b.execute-api.us-east-2.amazonaws.com/default/milkdropShaderConverter\",\n    getPresets: async () => {\n      if (\"URLSearchParams\" in window) {\n        const params = new URLSearchParams(location.search);\n        const butterchurnPresetUrlParam = params.get(\"butterchurnPresetUrl\");\n        const butterchurnPresetMapUrlParam = params.get(\n          \"butterchurnPresetMapUrl\"\n        );\n        const milkdropPresetUrl = params.get(\"milkdropPresetUrl\");\n        if (butterchurnPresetMapUrlParam) {\n          if (\n            !KNOWN_PRESET_URLS_REGEXES.some((pattern) =>\n              pattern.test(butterchurnPresetMapUrlParam)\n            )\n          ) {\n            console.error(\n              \"Unsupported URL passed as butterchurnPresetMapUrl query param.\"\n            );\n          } else {\n            return loadButterchurnPresetMapURL(butterchurnPresetMapUrlParam);\n          }\n        } else if (butterchurnPresetUrlParam) {\n          if (\n            !KNOWN_PRESET_URLS_REGEXES.some((pattern) =>\n              pattern.test(butterchurnPresetUrlParam)\n            )\n          ) {\n            console.error(\n              \"Unsupported URL passed as butterchurnPresetUrl query param.\"\n            );\n          } else {\n            return [\n              {\n                name: presetNameFromURL(butterchurnPresetUrlParam),\n                butterchurnPresetUrl: butterchurnPresetUrlParam,\n              },\n            ];\n          }\n        } else if (milkdropPresetUrl) {\n          throw new Error(\"We still need to implement this\");\n        }\n      }\n      // TODO: Fallback to some other presets?\n      return loadButterchurnPresetMapURL(\n        \"https://unpkg.com/butterchurn-presets-weekly@0.0.2/weeks/week1/presets.json\"\n      );\n    },\n    butterchurnOpen: !startWithMilkdropHidden,\n  };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/config.ts",
    "content": "import { Track, AppState, URLTrack } from \"../../js/types\";\n// @ts-ignore\nimport llamaAudio from \"../mp3/llama-2.91.mp3\";\nimport { DeepPartial } from \"redux\";\n\ninterface Config {\n  initialTracks?: Track[];\n  audioUrl?: string;\n  skinUrl?: string;\n  disableMarquee?: boolean;\n  initialState?: DeepPartial<AppState>;\n}\n\nconst { hash } = window.location;\nlet config: Config = {};\nif (hash) {\n  try {\n    config = JSON.parse(decodeURIComponent(hash).slice(1));\n  } catch (e) {\n    console.error(\"Failed to decode config from hash: \", hash);\n  }\n}\n\n// Backwards compatibility with the old syntax\nif (config.audioUrl && !config.initialTracks) {\n  config.initialTracks = [{ url: config.audioUrl }];\n}\n\nexport const SHOW_DESKTOP_ICONS = true;\n\nif (\"URLSearchParams\" in window) {\n  // const params = new URLSearchParams(location.search);\n  // SHOW_DESKTOP_ICONS = Boolean(params.get(\"icons\"));\n}\n\nexport const skinUrl = config.skinUrl === undefined ? null : config.skinUrl;\n\n// https://freemusicarchive.org/music/netBloc_Artists/netBloc_Vol_24_tiuqottigeloot/\nconst album = \"netBloc Vol. 24: tiuqottigeloot\";\n\nexport const defaultInitialTracks: URLTrack[] = [\n  {\n    metaData: {\n      artist: \"DJ Mike Llama\",\n      title: \"Llama Whippin' Intro\",\n    },\n    url: llamaAudio,\n    duration: 5.322286,\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Diablo_Swing_Orchestra_-_01_-_Heroines.mp3\",\n    duration: 322.612245,\n    metaData: {\n      title: \"Heroines\",\n      artist: \"Diablo Swing Orchestra\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Eclectek_-_02_-_We_Are_Going_To_Eclecfunk_Your_Ass.mp3\",\n    duration: 190.093061,\n    metaData: {\n      title: \"We Are Going To Eclecfunk Your Ass\",\n      artist: \"Eclectek\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Auto-Pilot_-_03_-_Seventeen.mp3\",\n    duration: 214.622041,\n    metaData: {\n      title: \"Seventeen\",\n      artist: \"Auto-Pilot\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Muha_-_04_-_Microphone.mp3\",\n    duration: 181.838367,\n    metaData: {\n      title: \"Microphone\",\n      artist: \"Muha\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Just_Plain_Ant_-_05_-_Stumble.mp3\",\n    duration: 86.047347,\n    metaData: {\n      title: \"Stumble\",\n      artist: \"Just Plain Ant\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Sleaze_-_06_-_God_Damn.mp3\",\n    duration: 226.795102,\n    metaData: {\n      title: \"God Damn\",\n      artist: \"Sleaze\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Juanitos_-_07_-_Hola_Hola_Bossa_Nova.mp3\",\n    duration: 207.072653,\n    metaData: {\n      title: \"Hola Hola Bossa Nova\",\n      artist: \"Juanitos\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Entertainment_for_the_Braindead_-_08_-_Resolutions_Chris_Summer_Remix.mp3\",\n    duration: 314.331429,\n    metaData: {\n      title: \"Resolutions (Chris Summer Remix)\",\n      artist: \"Entertainment for the Braindead\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Nobara_Hayakawa_-_09_-_Trail.mp3\",\n    duration: 204.042449,\n    metaData: {\n      title: \"Trail\",\n      artist: \"Nobara Hayakawa\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Paper_Navy_-_10_-_Tongue_Tied.mp3\",\n    duration: 201.116735,\n    metaData: {\n      title: \"Tongue Tied\",\n      artist: \"Paper Navy\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/60_Tigres_-_11_-_Garage.mp3\",\n    duration: 245.394286,\n    metaData: {\n      title: \"Garage\",\n      artist: \"60 Tigres\",\n      album,\n    },\n  },\n  {\n    url:\n      \"https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/CM_aka_Creative_-_12_-_The_Cycle_Featuring_Mista_Mista.mp3\",\n    duration: 221.44,\n    metaData: {\n      title: \"The Cycle (Featuring Mista Mista)\",\n      artist: \"CM aka Creative\",\n      album,\n    },\n  },\n];\n\nexport const initialTracks = config.initialTracks || defaultInitialTracks;\n\nexport const disableMarquee = config.disableMarquee || false;\nexport const initialState = config.initialState || undefined;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/delete-service-worker.js",
    "content": "\"strict\";\n\n// This project used to have a service worker. For the sake of simplicity I've\n// removed it, but in case anyone still has the old service worker registered,\n// we need this service worker to unregister the old one.\n\n// Copied from https://github.com/NekR/self-destroying-sw\n/* eslint-env serviceworker */\nself.addEventListener(\"install\", () => {\n  self.skipWaiting();\n});\n\nself.addEventListener(\"activate\", () => {\n  self.registration\n    .unregister()\n    .then(() => {\n      return self.clients.matchAll();\n    })\n    .then((clients) => {\n      clients.forEach((client) => client.navigate(client.url));\n    });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/dropboxFilePicker.ts",
    "content": "import { FilePicker } from \"../../js/types\";\n\ninterface DropboxFile {\n  link: string;\n  name: string;\n}\n\n// Requires Dropbox's Chooser to be loaded on the page\nfunction genAudioFileUrlsFromDropbox(): Promise<DropboxFile[]> {\n  return new Promise((resolve, reject) => {\n    // @ts-ignore\n    if (window.Dropbox == null) {\n      reject();\n    }\n    // @ts-ignore\n    window.Dropbox.choose({\n      success: resolve,\n      error: reject,\n      linkType: \"direct\",\n      folderselect: false,\n      multiselect: true,\n      extensions: [\"video\", \"audio\"],\n    });\n  });\n}\nconst dropboxFilePicker: FilePicker = {\n  contextMenuName: \"Dropbox...\",\n  filePicker: async () => {\n    alert(\n      `Dropbox integration is currently disabled. See https://github.com/captbaritone/webamp/issues/750 for more information.`\n    );\n    // https://github.com/captbaritone/webamp/issues/750\n    const files = await genAudioFileUrlsFromDropbox();\n    return files.map((file) => ({\n      url: file.link,\n      defaultName: file.name,\n    }));\n  },\n  requiresNetwork: true,\n};\n\nexport default dropboxFilePicker;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/eventLogger.ts",
    "content": "import { log, GoogleAnalyticsEvent } from \"./logger\";\nimport * as Selectors from \"../../js/selectors\";\nimport { Action, Store } from \"../../js/types\";\n\nfunction logEventFromAction(\n  action: Action,\n  store: Store\n): GoogleAnalyticsEvent | null {\n  switch (action.type) {\n    case \"IS_PLAYING\": {\n      const label =\n        Selectors.getCurrentTrackDisplayName(store.getState()) ?? \"[UNKNOWN]\";\n      return { category: \"Media\", action: \"IsPlaying\", label };\n    }\n    case \"PAUSE\": {\n      const label =\n        Selectors.getCurrentTrackDisplayName(store.getState()) ?? \"[UNKNOWN]\";\n      return { category: \"Media\", action: \"Pause\", label };\n    }\n    case \"STOP\": {\n      const label =\n        Selectors.getCurrentTrackDisplayName(store.getState()) ?? \"[UNKNOWN]\";\n      return { category: \"Media\", action: \"Stop\", label };\n    }\n    case \"TOGGLE_REPEAT\":\n      return { category: \"Media\", action: \"ToggleRepeat\" };\n    case \"TOGGLE_SHUFFLE\":\n      return { category: \"Media\", action: \"ToggleShuffle\" };\n    case \"TOGGLE_DOUBLESIZE_MODE\":\n      return { category: \"Display\", action: \"ToggleDoublesizeMode\" };\n    case \"TOGGLE_VISUALIZER_STYLE\":\n      return { category: \"Display\", action: \"ToggleVisualizerStyle\" };\n    case \"SET_SKIN_DATA\":\n      return { category: \"Display\", action: \"SetSkinData\" };\n    case \"CLOSE_WINAMP\":\n      return { category: \"Display\", action: \"CloseWinamp\" };\n    case \"OPEN_WINAMP\":\n      return { category: \"Display\", action: \"OpenWinamp\" };\n    case \"SET_MILKDROP_DESKTOP\":\n      return { category: \"Milkdrop\", action: \"SetMilkdropDesktop\" };\n    case \"SET_MILKDROP_FULLSCREEN\":\n      return { category: \"Milkdrop\", action: \"SetMilkdropFullscreen\" };\n    case \"TOGGLE_PRESET_OVERLAY\":\n      return { category: \"Milkdrop\", action: \"TogglePresetOverlay\" };\n    case \"TOGGLE_RANDOMIZE_PRESETS\":\n      return { category: \"Milkdrop\", action: \"ToggleRandomizePresets\" };\n    case \"TOGGLE_PRESET_CYCLING\":\n      return { category: \"Milkdrop\", action: \"TogglePresetCycling\" };\n    case \"CLICKED_TRACK\":\n      return { category: \"Playlist\", action: \"ClickedTrack\" };\n    case \"CTRL_CLICKED_TRACK\":\n      return { category: \"Playlist\", action: \"CtrlClickedTrack\" };\n    case \"SHIFT_CLICKED_TRACK\":\n      return { category: \"Playlist\", action: \"ShiftClickedTrack\" };\n    case \"SELECT_ALL\":\n      return { category: \"Playlist\", action: \"SelectAll\" };\n    case \"SELECT_ZERO\":\n      return { category: \"Playlist\", action: \"SelectZero\" };\n    case \"INVERT_SELECTION\":\n      return { category: \"Playlist\", action: \"InvertSelection\" };\n    /* This is triggered programatically when you load a new track\n    case \"REMOVE_ALL_TRACKS\":\n      return {\n        category: \"Playlist\",\n        action: \"RemoveAllTracks\",\n      };\n    */\n    case \"REVERSE_LIST\":\n      return { category: \"Playlist\", action: \"ReverseList\" };\n    case \"RANDOMIZE_LIST\":\n      return { category: \"Playlist\", action: \"RandomizeList\" };\n    case \"ENABLE_MILKDROP\":\n      return { category: \"Windows\", action: \"EnableMilkdrop\" };\n    case \"TOGGLE_WINDOW_SHADE_MODE\":\n      return {\n        category: \"Windows\",\n        action: \"ToggleWindowShadeMode\",\n        label: action.windowId,\n      };\n    case \"TOGGLE_WINDOW\":\n      return {\n        category: \"Windows\",\n        action: \"ToggleWindow\",\n        label: action.windowId,\n      };\n    case \"CLOSE_WINDOW\":\n      return {\n        category: \"Windows\",\n        action: \"CloseWindow\",\n        label: action.windowId,\n      };\n    case \"SET_WINDOW_VISIBILITY\":\n      return {\n        category: \"Windows\",\n        action: \"CloseWindow\",\n        label: `${action.windowId}:${action.hidden ? \"hidden\" : \"visibile\"}`,\n      };\n    case \"MAIN_CONTEXT_MENU_OPENED\":\n      return { category: \"ContextMenu\", action: \"MainContextMenuOpened\" };\n    case \"DROPPED_FILES\":\n      return {\n        category: \"DroppedFiles\",\n        action: action.windowId,\n        label: action.firstFileName ?? \"[UNKNOWN]\",\n        value: action.count,\n      };\n    case \"OPENED_FILES\":\n      return {\n        category: \"OpenedFiles\",\n        action: action.expectedType,\n        label: action.firstFileName ?? \"[UNKNOWN]\",\n        value: action.count,\n      };\n    case \"TOGGLE_LLAMA_MODE\":\n      return { category: \"Hotkeys\", action: \"ToggledLlamaMode\" };\n  }\n  return null;\n}\n\nexport const loggerMiddleware = (store: Store) => (\n  next: (action: Action) => void\n) => (action: Action) => {\n  const event = logEventFromAction(action, store);\n  if (event != null) {\n    log(event);\n  }\n  return next(action);\n};\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/index.js",
    "content": "/* global SENTRY_DSN */\n\nimport * as Sentry from \"@sentry/browser\";\nimport ReactDOM from \"react-dom\";\nimport createMiddleware from \"redux-sentry-middleware\";\nimport isButterchurnSupported from \"butterchurn/lib/isSupported.min\";\nimport { WINDOWS } from \"../../js/constants\";\nimport * as Selectors from \"../../js/selectors\";\nimport { loggerMiddleware } from \"./eventLogger\";\n\nimport WebampLazy from \"../../js/webampLazy\";\nimport {\n  STEP_MARQUEE,\n  UPDATE_TIME_ELAPSED,\n  UPDATE_WINDOW_POSITIONS,\n  SET_VOLUME,\n  SET_BALANCE,\n  SET_BAND_VALUE,\n  DISABLE_MARQUEE,\n  TOGGLE_REPEAT,\n  TOGGLE_SHUFFLE,\n  SET_EQ_AUTO,\n  SET_DUMMY_VIZ_DATA,\n} from \"../../js/actionTypes\";\n\nimport { loadFilesFromReferences } from \"../../js/actionCreators\";\nimport { getButterchurnOptions } from \"./butterchurnOptions\";\nimport dropboxFilePicker from \"./dropboxFilePicker\";\nimport availableSkins from \"./avaliableSkins\";\n\nimport {\n  skinUrl as configSkinUrl,\n  initialTracks,\n  initialState,\n  disableMarquee,\n} from \"./config\";\nimport DemoDesktop from \"./DemoDesktop\";\nimport enableMediaSession from \"./mediaSession\";\nimport screenshotInitialState from \"./screenshotInitialState\";\n\nconst DEFAULT_DOCUMENT_TITLE = document.title;\n\nconst NOISY_ACTION_TYPES = new Set([\n  STEP_MARQUEE,\n  UPDATE_TIME_ELAPSED,\n  UPDATE_WINDOW_POSITIONS,\n  SET_VOLUME,\n  SET_BALANCE,\n  SET_BAND_VALUE,\n]);\n\nconst MIN_MILKDROP_WIDTH = 725;\n\nlet screenshot = false;\nlet skinUrl = configSkinUrl;\nif (\"URLSearchParams\" in window) {\n  const params = new URLSearchParams(location.search);\n  screenshot = params.get(\"screenshot\");\n  skinUrl = params.get(\"skinUrl\") || skinUrl;\n}\n\nfunction supressDragAndDrop(e) {\n  e.preventDefault();\n  e.dataTransfer.effectAllowed = \"none\";\n  e.dataTransfer.dropEffect = \"none\";\n}\n\nwindow.addEventListener(\"dragenter\", supressDragAndDrop);\nwindow.addEventListener(\"dragover\", supressDragAndDrop);\nwindow.addEventListener(\"drop\", supressDragAndDrop);\n\nlet lastActionType = null;\n\n// Filter out consecutive common actions\nfunction filterBreadcrumbActions(action) {\n  const noisy =\n    NOISY_ACTION_TYPES.has(action.type) &&\n    NOISY_ACTION_TYPES.has(lastActionType);\n  lastActionType = action.type;\n  return !noisy;\n}\n\ntry {\n  Sentry.init({\n    dsn: SENTRY_DSN,\n    /* global COMMITHASH */\n    release: typeof COMMITHASH !== \"undefined\" ? COMMITHASH : \"DEV\",\n  });\n} catch (e) {\n  // Archive.org tries to rewrite the DSN to point to a archive.org version\n  // since it looks like a URL. When this happens, Sentry crashes.\n  console.error(e);\n}\n\nconst sentryMiddleware = createMiddleware(Sentry, {\n  filterBreadcrumbActions,\n  stateTransformer: Selectors.getDebugData,\n});\n\nasync function main() {\n  const about = document.getElementsByClassName(\"about\")[0];\n  if (screenshot) {\n    about.style.visibility = \"hidden\";\n  }\n  if (!WebampLazy.browserIsSupported()) {\n    document.getElementById(\"browser-compatibility\").style.display = \"block\";\n    document.getElementById(\"app\").style.visibility = \"hidden\";\n    return;\n  }\n  about.classList.add(\"loaded\");\n\n  let __butterchurnOptions = null;\n  let __initialWindowLayout = null;\n  if (isButterchurnSupported()) {\n    const startWithMilkdropHidden =\n      document.body.clientWidth < MIN_MILKDROP_WIDTH ||\n      skinUrl != null ||\n      screenshot;\n\n    __butterchurnOptions = getButterchurnOptions(startWithMilkdropHidden);\n\n    if (startWithMilkdropHidden) {\n      __initialWindowLayout = {\n        [WINDOWS.MAIN]: { position: { x: 0, y: 0 } },\n        [WINDOWS.EQUALIZER]: { position: { x: 0, y: 116 } },\n        [WINDOWS.PLAYLIST]: { position: { x: 0, y: 232 }, size: [0, 0] },\n        [WINDOWS.MILKDROP]: { position: { x: 0, y: 348 }, size: [0, 0] },\n      };\n    } else {\n      __initialWindowLayout = {\n        [WINDOWS.MAIN]: { position: { x: 0, y: 0 } },\n        [WINDOWS.EQUALIZER]: { position: { x: 0, y: 116 } },\n        [WINDOWS.PLAYLIST]: { position: { x: 0, y: 232 }, size: [0, 4] },\n        [WINDOWS.MILKDROP]: { position: { x: 275, y: 0 }, size: [7, 12] },\n      };\n    }\n\n    document.getElementById(\"butterchurn-share\").style.display = \"flex\";\n  }\n\n  const initialSkin = !skinUrl ? null : { url: skinUrl };\n\n  const webamp = new WebampLazy({\n    initialSkin,\n    initialTracks: screenshot ? null : initialTracks,\n    availableSkins,\n    filePickers: [dropboxFilePicker],\n    enableHotkeys: true,\n    handleTrackDropEvent: (e) => {\n      const trackJson = e.dataTransfer.getData(\"text/json\");\n      if (trackJson == null) {\n        return null;\n      }\n      try {\n        const track = JSON.parse(trackJson);\n        return [track];\n      } catch (err) {\n        return null;\n      }\n    },\n    requireJSZip: () =>\n      import(/* webpackChunkName: \"jszip\" */ \"jszip/dist/jszip\"),\n    requireMusicMetadata: () =>\n      import(\n        /* webpackChunkName: \"music-metadata-browser\" */ \"music-metadata\"\n      ),\n    __initialWindowLayout,\n    __initialState: screenshot ? screenshotInitialState : initialState,\n    __butterchurnOptions,\n    __customMiddlewares: [sentryMiddleware, loggerMiddleware],\n  });\n\n  if (disableMarquee || screenshot) {\n    webamp.store.dispatch({ type: DISABLE_MARQUEE });\n  }\n  if (screenshot) {\n    window.document.body.style.backgroundColor = \"#000\";\n    webamp.store.dispatch({ type: TOGGLE_REPEAT });\n    webamp.store.dispatch({ type: TOGGLE_SHUFFLE });\n    webamp.store.dispatch({ type: SET_EQ_AUTO, value: true });\n    webamp.store.dispatch({\n      type: SET_DUMMY_VIZ_DATA,\n      data: {\n        0: 11.75,\n        8: 11.0625,\n        16: 8.5,\n        24: 7.3125,\n        32: 6.75,\n        40: 6.4375,\n        48: 6.25,\n        56: 5.875,\n        64: 5.625,\n        72: 5.25,\n        80: 5.125,\n        88: 4.875,\n        96: 4.8125,\n        104: 4.375,\n        112: 3.625,\n        120: 1.5625,\n      },\n    });\n  }\n\n  webamp.onTrackDidChange((track) => {\n    document.title =\n      track == null\n        ? DEFAULT_DOCUMENT_TITLE\n        : `${track.metaData.title} - ${track.metaData.artist} \\u00B7 ${DEFAULT_DOCUMENT_TITLE}`;\n  });\n\n  enableMediaSession(webamp);\n\n  // Expose a file input in the DOM for testing.\n  const fileInput = document.createElement(\"input\");\n  fileInput.id = \"webamp-file-input\";\n  fileInput.style.display = \"none\";\n  fileInput.type = \"file\";\n  fileInput.value = null;\n  fileInput.addEventListener(\"change\", (e) => {\n    webamp.store.dispatch(loadFilesFromReferences(e.target.files));\n  });\n  document.body.appendChild(fileInput);\n\n  // Expose webamp instance for debugging and integration tests.\n  window.__webamp = webamp;\n\n  await webamp.renderWhenReady(document.getElementById(\"app\"));\n\n  if (!screenshot) {\n    ReactDOM.render(\n      <DemoDesktop webamp={webamp} />,\n      document.getElementById(\"demo-desktop\")\n    );\n  }\n}\n\nmain();\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/logger.ts",
    "content": "export type GoogleAnalyticsEvent = {\n  category: string;\n  action: string;\n  label?: string;\n  value?: number;\n};\nexport function log({ category, action, label, value }: GoogleAnalyticsEvent) {\n  // @ts-ignore\n  if (window.ga != null) {\n    // @ts-ignore\n    window.ga(\"send\", \"event\", category, action, label, value);\n  } else {\n    // console.log({ category, action, label, value });\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/mediaSession.ts",
    "content": "import WebampLazy from \"../../js/webampLazy\";\n\nexport default function enableMediaSession(webamp: WebampLazy) {\n  if (\"mediaSession\" in navigator) {\n    /* global MediaMetadata */\n    webamp.onTrackDidChange((track) => {\n      if (track == null) {\n        return;\n      }\n      const {\n        metaData: { title, artist, album, albumArtUrl },\n      } = track;\n      // @ts-ignore TypeScript does not know about the Media Session API: https://github.com/Microsoft/TypeScript/issues/19473\n      navigator.mediaSession.metadata = new MediaMetadata({\n        title,\n        artist,\n        album,\n        artwork: albumArtUrl\n          ? [\n              {\n                src: albumArtUrl,\n                // We don't currently know these.\n                // sizes: \"96x96\",\n                // type: \"image/png\"\n              },\n            ]\n          : [],\n      });\n    });\n\n    // @ts-ignore TypeScript does not know about the Media Session API: https://github.com/Microsoft/TypeScript/issues/19473\n    navigator.mediaSession.setActionHandler(\"play\", () => {\n      webamp.play();\n    });\n    // @ts-ignore TypeScript does not know about the Media Session API: https://github.com/Microsoft/TypeScript/issues/19473\n    navigator.mediaSession.setActionHandler(\"pause\", () => {\n      webamp.pause();\n    });\n    // @ts-ignore TypeScript does not know about the Media Session API: https://github.com/Microsoft/TypeScript/issues/19473\n    navigator.mediaSession.setActionHandler(\"seekbackward\", () => {\n      webamp.seekBackward(10);\n    });\n    // @ts-ignore TypeScript does not know about the Media Session API: https://github.com/Microsoft/TypeScript/issues/19473\n    navigator.mediaSession.setActionHandler(\"seekforward\", () => {\n      webamp.seekForward(10);\n    });\n    // @ts-ignore TypeScript does not know about the Media Session API: https://github.com/Microsoft/TypeScript/issues/19473\n    navigator.mediaSession.setActionHandler(\"previoustrack\", () => {\n      webamp.previousTrack();\n    });\n    // @ts-ignore TypeScript does not know about the Media Session API: https://github.com/Microsoft/TypeScript/issues/19473\n    navigator.mediaSession.setActionHandler(\"nexttrack\", () => {\n      webamp.nextTrack();\n    });\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/demo/js/screenshotInitialState.ts",
    "content": "import { DeepPartial } from \"redux\";\nimport { AppState } from \"../../js/types\";\n\nconst defaultTracksState = {\n  \"0\": {\n    id: 0,\n    title: \"Llama Whipping Intro\",\n    artist: \"DJ Mike Llama\",\n    duration: 5,\n    url: \"\",\n    kbps: \"128\",\n    khz: \"44\",\n    channels: 2,\n  },\n  \"1\": {\n    id: 1,\n    title: \"Rock Is Dead\",\n    artist: \"Marilyn Manson\",\n    duration: 191, // 3:11\n    url: \"\",\n    kbps: \"128\",\n    khz: \"44\",\n    channels: 2,\n  },\n  \"2\": {\n    id: 2,\n    title: \"Spybreak! (Short One)\",\n    artist: \"Propellerheads\",\n    duration: 240, // 4:00\n    url: \"\",\n    kbps: \"128\",\n    khz: \"44\",\n    channels: 2,\n  },\n  \"3\": {\n    id: 3,\n    title: \"Bad Blood\",\n    artist: \"Ministry\",\n    duration: 300, // 5:00\n    url: \"\",\n    kbps: \"128\",\n    khz: \"44\",\n    channels: 2,\n  },\n};\n\nconst initialState: DeepPartial<AppState> = {\n  equalizer: {\n    sliders: {\n      \"60\": 52,\n      \"170\": 74,\n      \"310\": 83,\n      \"600\": 91,\n      \"1000\": 80,\n      \"3000\": 54,\n      \"6000\": 23,\n      \"12000\": 19,\n      \"14000\": 34,\n      \"16000\": 75,\n      preamp: 56,\n    },\n  },\n  media: {\n    status: \"PLAYING\",\n    timeElapsed: 3,\n  },\n  playlist: {\n    trackOrder: [0, 1, 2, 3],\n    currentTrack: 0,\n    selectedTracks: new Set([2]),\n  },\n  tracks: defaultTracksState,\n  display: {\n    working: false,\n  },\n};\n\nexport default initialState;\n"
  },
  {
    "path": "webamp/packages/webamp/demo/readme.md",
    "content": "# Webamp.org\n\nThis directory contains the code used for [Webamp.org](https://webamp.org), as opposed to the `webamp` NPM module.\n"
  },
  {
    "path": "webamp/packages/webamp/demo/skins/.gitignore",
    "content": "Skinner_Atlas/\n"
  },
  {
    "path": "webamp/packages/webamp/docs/architecture.md",
    "content": "# Architecture\n\n## Library/Application\n\nThis repository contains both an NPM module, and a demo page, found at <https://webamp.org>. The NPM module's goal is to provide a widget which can be embedded in any website, where as the demo page depends upon the library, and provides the canonical usage. You can find more information about the library's API in the [usage](./usage.md) document.\n\n- The entry point for the demo page is [demo/js/index.js](../demo/js/index.js)\n- The entry point for the NPM modules is [webamp.js](../js/webamp.js)\n\n## Redux\n\nWithin the core library, state is managed by [Redux]. In fact, Redux's own docs mention Webamp in the [Apps and Examples](https://redux.js.org/introduction/learning-resources#apps-and-examples) section of their docs!\n\nOur reducers, and the states they control, can be found in the [reducers](../js/reducers/) directory.\n\nAsync actions are handled using the [redux-thunk]. You can find all of the actionCreators in the [actionCreators](../js/actionCreators/index.ts) file. This is the most complex portion of the app, as it contains all the coordination of our many async actions.\n\nAny non-trivial value derived from state is computed inside a [selector](../js/selectors.ts). Care has been taken to ensure that the structure of the state allows for most common selectors to be a constant time operation. For selectors that are `O(n)`, we use [reselect] to ensure the calculation is only done when dependent values change.\n\nCoordination between the playing media (which is inherently stateful, and changes over time) and Redux is handed in the [mediaMiddleware](../js/mediaMiddleware.ts). This basically listens for events, and triggers the correct methods on our `Media` instance. It also listens events emitted by the media instance, and dispatches the corresponding actions.\n\n## React\n\nWe use [react-redux] to bind Redux state into our [React components](../js/components/). Any component which is not reusable, and even some that are, are connected using [connect]. This works well for us, since most components are \"one off\", and connecting most components allows for state changes to result in a mininmal set of react components needing to re-render. This does, however, require that our selectors be performant.\n\n## Media\n\nMedia (audio files) is managed by our [Media](../js/media/index.ts) class. It encapsulates the Web Audio API complexity. Audio manipulation (volume, balance, EQ) is handled in the main `Media` class, but the audio source is managed in [elementSource.ts](../js/media/elementSource.ts). This class tries to encapsulate some of the complexity required to get the playing of audio files working across all browsers seamlessly. We handle playing audio from a URL source (subject to CORs) and from a local file. Both of these are normalized to a URL before they are passed into our audio aparatus. For local files, we convert the `ArrayBuffer` we get, into a Blob url using `URL.createObjectURL()`. This transformation is handlded inside our Action Creators (see the Redux section above).\n\nThe `Winamp` class instantiates a single `Media` instance and passes it's [AnalyserNode](https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode) down through the tree of React components to the visualizer.\n\n## Skins\n\nWinamp skins (`.wsz`) are, under the hood, just `.zip` files which contain `.bmp` sprite sheets, and some config files. We use [JSZip] to unpack the zip archive, and then some clever canvas slicing to extract the individual sprites out of each `.bmp`. We get these sprite images as [data URIs] which are dispatched to Redux. We then have a [Skin](../js/components/Skin.tsx) component which renders a `<style>` tag into the `<head>` using [React Portals](https://reactjs.org/docs/portals.html). You can read more about this in a [blog post](https://jordaneldredge.com/blog/how-winamp2-js-loads-native-skins-in-your-browser/) I wrote.\n\nIn addition to the sprite sheets there are some config files in various formats, mostly `.ini` (although with different names). We have a very simple `.ini` parser, for these files. Finally, there is a `region.txt` which defines some vectors which define the transparent areas of a skin. We have a custom parser for this file format, and then dispatch the data to Redux.\n\nFrom there, our `Skin` component has a `ClipPaths` sub component which ouputs a series of `<svg>`s representing the clip path for each window into the DOM. Finally, CSS `clip-path` rules representing each window are dynamically generated and added to the injected style sheet.\n\nThe parsing of skin files is handed in [skinParser.js](../js/skinParser.js). Rendering the `<svg>` and `<style>` tags is done in [Skin.js](../js/components/Skin.tsx). The definitions for all the individual sprites live in [skinSpirtes.js](../js/skinSprites.ts), and the mapping of skin spirtes to CSS rules lives in [skinSelectors.js](../js/skinSelectors.ts).\n\n## CSS\n\nCSS style sheets are imported by the components which use them. Each rule is individually prefixed with the id `#webamp` to prevent our style rules from \"leaking\" out onto other potential elements. For example, [98.js.org], includes Webamp on a page along with many other elements, and we want to be sure our rules for `.selected` elements do not apply to any elements outside of `#webamp`.\n\nThe nature of Winamp skins is such that most elements are absolutely positioned, and have an explicit size. There are a few down sides to our current approach:\n\n1. Much of the size data for the individual sprites is duplicated in the items CSS rules and in [skinSprites.js](../js/skinSprites.ts).\n2. Style data is lives far away from the individual component, and it can be hard to know where to look for the CSS that corresponds to an individual component.\n\nAll windows are rendred with `image-rendering: pixelated;` (or equivilant) so that high density displays don't blur the pixel art UI. This is especially important for \"Double\" mode, where the main and equalizer windows are twice as large. This doubleing is achived with the CSS: `transform: scale(2)`.\n\n## Visualizer\n\nThe visualizer in the main window is a React component [Visualizer.tsx](../js/components/Visualizer.tsx) that gets passed skin data from the Redux store, an [analyser node](https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode) and some various user settings (which visualizer should be shown? are we playing?). All computation is done such that it works both in the \"regular\" mode, but also in shade mode. In shade mode the dimension values are just different.\n\nTo improve performance, two off-screen canvases are pre-rendered whenever the skin changes. These are then used as components of the per-frame rendering:\n\n- The textured background.\n- A single vertical bar for the bar graph analyser.\n\nThe actual canvas is rendered at twice the visible size so that \"high density\" or \"retina\" displays will not look blury.\n\n## Equalizer\n\nThe audio portion of the equalizer is handed in the Media class (see above) but the visual representation of the current equalizer settings is created using [spline.js] which calculates the curved line for us.\n\nThe coloring of the curved line is achived by extracting the single-pixel-wide, many-pixel-tall sprite from the skin file, passing it through the Redux state to the graph component, and then drawing the splined line with [CanvasRenderingContext2D.createPattern()\n](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/createPattern).\n\nYou can see the implementation of the equalizer graph in [EqGraph.tsx](../js/components/EqualizerWindow/EqGraph.tsx).\n\nThe equalizer window can also load/geneate `.eqf` files. The loading and parsing of these has been extracted into its own NPM module: [winamp-eqf](https://www.npmjs.com/package/winamp-eqf).\n\n## Playlist\n\n**TODO**\n\n- Windowing\n- Resizing\n- Menus\n\n## Window management\n\nWindow position is managed in the [WindowManager.tsx](../js/components/WindowManager.tsx) React component. It handles:\n\n- Dragging windows around (windows can add a `.draggable` class to any node to make it a drag handle)\n- Snapping windows to eachother\n- Snapping windows to the browser edges\n- Creating the initial layout of the windows\n\nMoving windows when their neighbors are resized via \"double\" or \"shade\" mode toggles is handled by the `withWindowGraphIntegrity()` higher order action creator in [actionCreators](../js/actionCreators/index.ts). It works by:\n\n1. Computing a graph where each window is a node, and the edges are where those windows are \"touching\".\n2. Dispatching the passed in action.\n3. Looking at the new sizes, and dispatching another event to move the windows to new locations where the original edeges are all still touching.\n\n## Dropping files\n\nWebamp allows you to drag files (media files, skins and `.eqf` equalizer presets) onto various windows to load them. This behavior is manged by the [`<DropTarget>`](../js/components/DropTarget.tsx) component. The component expects to be passed a `handleDrop` handler which will be called with the drop event, and also the `{x, y}` coordinates of the drop within the component. This is needed to allow us to insert dropped tracks at the correct place in the playlist.\n\n[redux]: https://redux.js.org/\n[redux-thunk]: https://github.com/gaearon/redux-thunk\n[reselect]: https://github.com/reactjs/reselect\n[connect]: https://react-redux.js.org/api/connect\n[jszip]: https://stuk.github.io/jszip/\n[data uris]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n[98.js.org]: https://98.js.org\n[spline.js]: ../js/components/EqualizerWindow/spline.js\n"
  },
  {
    "path": "webamp/packages/webamp/docs/music-credits.md",
    "content": "# Credits\n\n## Music\n\nMusic courtesy of [blocSonic](https://blocsonic.com) and all included netBloc artists. [Download your free copy of \"netBloc Volume 24 (tiuqottigeloot)\"](https://blocsonic.com/releases/bscomp0024).\n\n## Milkdrop Visualization\n\nThe Milkdrop visualization window is provided by the [Butterchurn](https://butterchurnviz.com/) project which was built and integrated, by [Jordan Berg](https://twitter.com/jnberg16).\n"
  },
  {
    "path": "webamp/packages/webamp/docs/press.md",
    "content": "## Articles (notable)\n\n- [Gizmodo](https://gizmodo.com/winamp-2-has-been-immortalized-in-html5-for-your-pleasu-1655373653)\n- [Vice Motherboard](https://motherboard.vice.com/en_us/article/qvebbv/winamp-2-mp3-music-player-emulator)\n- [Tech Crunch](https://techcrunch.com/2018/02/09/whip-the-llamas-ass-with-this-javascript-winamp-emulator/)\n- [Mashable](https://mashable.com/2018/02/09/winamp-web-version-llama/)\n\n## Podcast Interviews\n\n- [Zeal Interesitngs](http://podcast.codingzeal.com/114820/657488-winamp-js)\n- [Changelog](https://changelog.com/podcast/291)\n- [JavaScript Jabber](https://devchat.tv/js-jabber/jsj-319-winamp2-js-with-jordan-eldredge/)\n- [React Roundup](https://devchat.tv/react-round-up/rru-024-webamp-with-jordan-eldredge/)\n\n## Newsletters\n\n- [JavaScript Weekly](http://javascriptweekly.com/issues/353) (issue 353)\n- [JavaScript Weekly](http://javascriptweekly.com/issues/372) (issue 372)\n- [W3 \"weekly digest of W3C news and trends\"](https://www.w3.org/blog/2014/11/this-week-html5-is-a-recommendation-w3c20-winamp-in-html5js-etc/)\n- [Front End Focus](https://frontendfoc.us/issues/309)\n- [Web Audio Weekly](http://www.webaudioweekly.com/86)\n\n## News Aggregators\n\n- [/r/InternetIsBeautiful](https://www.reddit.com/r/InternetIsBeautiful/comments/2lh3ob/winamp_2_preserved_in_html5/)\n- [Hacker News](https://news.ycombinator.com/item?id=17583997) (Jul. 2018)\n- [Hacker News](https://news.ycombinator.com/item?id=16333550) (Feb. 2018)\n- [Hacker News](https://news.ycombinator.com/item?id=15314629) (Sept. 2017)\n- [Hacker News](https://news.ycombinator.com/item?id=8565665) (Nov. 2014)\n- [Waxy.org](https://waxy.org/2018/02/winamp2-js-now-supports-all-three-windows/)\n- [The Useless Web Index](https://www.theuselesswebindex.com/most-useless-websites/2018/17/)\n- [Product Hunt](https://www.producthunt.com/posts/winamp2-js) (2014)\n- [Product Hunt](https://www.producthunt.com/posts/webamp) (2018)\n\n## Documentation\n\n- [Redux Documentation](https://redux.js.org/introduction/learning-resources#apps-and-examples)\n\n## Podcast Mentions\n\n- [React Round Up](https://devchat.tv/react-round-up/rru-003-advanced-component-patterns-and-downshift-with-kent-c-dodds) (0:59:00)\n- [Grumpy Old Geeks](http://gog.show/ep-248-side-hustle/) (1:37:30)\n- [User Error](https://www.youtube.com/watch?v=qlm_G0xgK8Q&feature=youtu.be&t=309)\n- [Important if True](https://youtu.be/6B6E2Kv-w04?t=3295)\n- [Binärgewitter](http://blog.binaergewitter.de/2018/02/16/binaergewitter-talk-number-192-bitcoinheizung#t=1:52:13.216) (German)\n- [The Changelog - State of the \"log\" (2018)](https://changelog.com/podcast/328#t=00:07:200.07) (00:07:40)\n- [Freak Show](https://freakshow.fm/fs214-hoert-euch-doch-mal-zu?t=1:59:05,2:10:51) (German)\n- [Apparatus Pogovori](https://apparatus.si/095apg/) (Slovenian)\n\n## Forum Posts\n\n- [Yaplakal.com](http://www.yaplakal.com/forum1/topic1737838.html)\n- [Straight Dope](https://boards.straightdope.com/sdmb/showthread.php?t=836828)\n\n## Twitter Endorsements\n\n- [Scott Hanselman](https://twitter.com/shanselman/status/966129035649564677)\n- [Jake Rodkin](https://twitter.com/ja2ke/status/961279058507063296)\n- [Changelog](https://twitter.com/changelog/status/911957655392006145)\n\n## Articles (continued)\n\n### English\n\n- http://entertainment.ie/trending/news/Remember-Winamp-Now-theres-a-web-browser-version-of-it/402141.htm\n- http://newsvire.com/get-some-media-player-nostalgia-with-this-web-version-of-winamp/\n- http://osxdaily.com/2018/02/10/run-winamp-web-browser/\n- https://www.ghacks.net/2018/02/08/winamp2-js-is-a-web-based-version-of-audio-player-winamp/\n- https://uk.news.yahoo.com/media-player-nostalgia-version-winamp-070022687.html\n- https://thenextweb.com/shareables/2018/02/09/bring-nostalgia-browser-winamp-emulator/\n- https://www.follownews.com/winamp2js-is-a-webbased-version-of-audio-player-winamp-43icg\n- https://www.gizmodo.com.au/2018/02/someone-remade-winamp-so-it-runs-in-your-browser/\n- https://changelog.com/news/winamp-29-in-htmljs--PJr\n- https://www.howtogeek.com/343813/re-live-90s-computing-in-your-browser-right-now/amp/\n- https://techcaption.com/run-winamp-web-browser/\n- https://www.trishtech.com/2018/02/javascript-version-of-winamp-runs-in-any-web-browser/\n- https://ourcodeworld.com/articles/read/685/winamp2-js-a-reimplementation-of-winamp-2-9-in-html5-and-javascript\n- http://whazupnaija.com/whip-the-llamas-ass-with-this-javascript-winamp-emulator/\n- http://cashrange.com/run-winamp-in-web-browser-and-play-mp3s/\n- https://coolmaterial.com/media/winamp-emulator/\n- http://www.redferret.net/?p=57922\n- https://hackernoon.com/50-popular-javascript-open-source-projects-on-github-in-2018-469c11b48b8d (mention)\n- https://mashable.com/2018/08/01/old-ways-to-listen-to-music-ranked/ (mention)\n- https://www.thewindowsclub.com/webamp-online-music-player-winamp\n- https://www.techspot.com/news/58728-winamp-recreated-html5.html\n\n### Russian\n\n- http://altervision.org/2018/02/winamp-zapustili-v-vashem-brauzere/\n- http://droider.ru/post/emulyator-dlya-nostalgii-po-winamp-09-02-2018/\n- http://fornote.net/2018/02/winamp2-js-legendarny-j-winamp-dostupny-j-pryamo-v-brauzere/\n- http://internetua.com/programmist-voskresil-legendarni-pleer-winamp\n- http://oane.ws/2018/02/10/legendarnyy-pleer-winamp-vozrodili-v-brauzernoy-versii.html\n- http://www.belursus.info/soft/i.php?c=winamp2js\n- https://esquire.ru/articles/42012-winamp/\n- https://lifehacker.ru/2018/02/09/browser-winamp-emulator/\n- https://itc.ua/blogs/kaliforniyskiy-razrabotchik-vozrodil-legendarnyiy-muzyikalnyiy-pleer-winamp-nu-pochti/\n- https://meduza.io/shapito/2018/02/09/kaliforniyskiy-razrabotchik-vossozdal-winamp-v-brauzere\n- https://nplus1.ru/news/2018/02/09/winamp\n- https://rg.ru/2018/02/09/programmist-voskresil-legendarnyj-pleer-winamp.html\n- https://tjournal.ru/66060-brauzernyy-emulyator-kultovogo-muzykalnogo-pleera-winamp\n- https://trashbox.ru/topics/115521/winamp-zhivee-vseh-zhivyh\n- https://tech.onliner.by/2018/02/09/winamp-5\n- http://fonotekaelektrika.com/2018/02/winamp-%D0%B2-%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D1%8A%D1%80/\n- https://toocha.me/winamp-web/\n- https://manjaro.ru/soft/poyavilsya-reliz-winamp2-js-desktop.html (forum post)\n- https://mixed.news/news/1123379\n- https://banana.by/index.php?newsid=269984\n- https://zen.yandex.ru/media/apple-iphone.ru/legendarnyi-winamp-teper-mojno-polnocenno-ispolzovat-iz-liubogo-brauzera-5a8280f4a936f46fea003489\n\n### Spanish\n\n- http://datainfox.com/2018/02/lanzan-version-web-winamp/\n- http://html5facil.com/noticias/winamp-web/\n- http://omicrono.elespanol.com/2014/11/winamp-2-en-html5-es-nostalgia-pura/\n- http://www.microsiervos.com/archivo/musica/winamp-html5-javascript-codigo-abierto.html\n- http://www.tecnofanatico.com/winamp-el-popular-reproductor-de-audio-llega-en-version-web/\n- https://emisorasunidas.com/winamp-2-vuelve-a-la-vida-con-una-version-para-la-web/\n- https://es.gizmodo.com/ahora-puedes-viajar-al-pasado-y-volver-a-usar-el-mitico-1822850658\n- https://hipertextual.com/archivo/2014/12/port-winamp-html5-javascript/\n- https://ohmygeek.net/2018/02/09/winamp-2-js/\n- https://www.softzone.es/2018/02/08/winamp2-js-nueva-version-famoso-reproductor-formato-web/\n- https://www.tekcrispy.com/2018/02/08/winamp2-js-la-version-web/\n- https://www.softandapps.info/2014/11/07/resucita-winamp-en-version-html5-y-javascript/\n- https://www.neoteo.com/winamp2-js-version-web-del-legendario-winamp/\n- https://www.taringa.net/posts/musica/20127134/Ahora-podes-revivir-el-Winamp-desde-tu-navegador.html\n- https://www.xataka.com/aplicaciones/winamp-se-hace-inmortal-gracias-a-la-magia-del-html5\n- https://www.sweclockers.com/nyhet/25215-kor-klassikern-winamp-i-webblasaren\n- https://www.rocambola.com/winamp2-js-la-nueva-version-del-famoso-reproductor-en-formato-web/\n- https://www.genbeta.com/web/viaja-a-1998-con-esta-version-web-de-winamp\n- https://codigoespagueti.com/noticias/winamp-navegador/\n- https://wwwhatsnew.com/2018/02/09/lanzan-una-version-web-del-mitico-winamp/\n- https://abertoatedemadrugada.com/2018/02/winamp-completamente-funcional-em.html\n- https://www.ardilu.com/software/winamp2-js-reproductor-winamp-html-5\n- http://computerhoy.com/noticias/internet/recuerdas-winamp-puedes-volver-utilizarlo-esta-web-75669\n\n### Chinese\n\n- http://baijiahao.baidu.com/s?id=1592074295875163282\n- http://blog.csdn.net/souhugirl/article/details/43907469\n- http://m.sohu.com/a/221750379_549015\n- http://news.cnblogs.com/n/589654/\n- http://top.jobbole.com/16031/\n- http://www.apprcn.com/winamp2-js.html\n- http://www.cnbeta.com/articles/soft/697983.htm\n- http://www.linuxidc.com/Linux/2018-02/150869.htm\n- https://news.aotu.io/a/5a7ebbfd0b61600038184eec\n- https://unwire.hk/2018/02/11/winampemu/mobile-music/\n- https://www.appinn.com/winamp2-js/\n- https://www.waerfa.com/winamp2-js\n- https://www.techapple.com/archives/19899\n- https://ezone.ulifestyle.com.hk/article/2010877\n- https://www.minwt.com/life/19526.html\n- http://www.xia1ge.com/winamp2-js.html\n- https://www.techbang.com/posts/56800-do-you-miss-the-days-when-you-used-winamp-to-listen-to-music-now-you-can-go-back-to-this-page-and-relive-that-time\n\n### German\n\n- http://de.engadget.com/2018/02/09/retro-winamp-emulator-fur-deinen-browser/\n- http://www.chip.de/news/Winamp-ist-zurueck-Kult-Player-ueber-Browser-nutzen_124413881.html\n- http://www.intro.de/life/mit-winamp-zuruck-in-die-vergangenheit-nostalgische-browser-version-des-media-players\n- https://futurezone.at/digital-life/entwickler-baut-winamp-fuer-den-browser-nach/400003172\n- https://t3n.de/news/winamp-javascript-open-source-863217/\n- https://www.smartdroid.de/winamp2-js-laesst-den-klassiker-im-browser-wieder-aufleben/\n- https://www.morgenpost.de/web-wissen/web-technik/article212250123/Surftipp-Kultiger-MP3-Player-im-Browser.html\n- https://eay.cc/2017/winamp2-js/\n- https://www.maennersache.de/winamp-simulator-neues-browser-plugin-befoerdert-dich-zurueck-ins-jahr-1999-aol-webamp-jordan-eldredge-9063.html#\n- https://www.abendblatt.de/ratgeber/multimedia/article212250123/Surftipp-Kultiger-MP3-Player-im-Browser.html\n- https://www.techbook.de/entertainment/sound/surftipp-kultiger-mp3-player-im-browser\n- https://seeseekey.net/archive/124127/\n\n### Polish\n\n- https://www.antyradio.pl/Technologia/Internet/Winamp-powrocil-jako-strona-internetowa-17497\n- http://innpoland.pl/137663,kultowy-winamp-powraca-w-nowej-formie-uderza-tam-gdzie-jest-juz-spotify\n- http://www.instalki.pl/aktualnosci/software/30055-winamp-przegladarka.html\n- https://mobirank.pl/2018/02/10/emulator-winamp-przeniesie-cie-do-1999-roku/\n- https://www.dobreprogramy.pl/Kultowy-odtwarzacz-muzyki-Winamp-powrocil-w-przegladarce-internetowej,News,86017.html\n- https://dailyweb.pl/pamietacie-jeszcze-winampa-poznajcie-jego-webowa-reinkarnacje/\n- https://www.wykop.pl/link/4432835/winamp-w-przehttps://www.producthunt.com/posts/webampgladarce-www/\n- http://android.com.pl/news/98936-winamp-online/\n\n### French\n\n- http://www.phonandroid.com/winamps-lecteur-multimedia-retour.html\n- http://www.lemonde.fr/pixels/breve/2014/11/07/winamp-en-html_4520190_4408996.html\n- https://korben.info/winamp-en-html-javascript.html\n- https://www.geekzone.fr/2018/02/09/winamp2-sinvite-navigateur/\n- https://www.lesnumeriques.com/vie-du-net/winamp-est-retour-enfin-presque-n71341.html\n- https://www.macg.co/logiciels/2018/02/revivez-les-glorieuses-annees-winamp-avec-votre-navigateur-101345\n- https://www.byothe.fr/2018/05/avis-aux-nostalgiques-un-emulateur-de-winamp-dans-votre-navigateur-web/\n- https://fr.softonic.com/articles/winamp-revient-sous-la-forme-de-lecteur-web\n\n### Italian\n\n- https://tech.everyeye.it/notizie/il-ritorno-winamp-storico-player-riappare-in-una-versione-web-320373.html\n- https://www.hwupgrade.it/news/web/winamp-arriva-su-qualsiasi-browser-web-nostalgici-gioiscono_74100.html\n- https://www.wired.it/internet/web/2018/02/09/winamp-rinasce-sul-web/\n- https://www.macitynet.it/winamp-nostalgici-un-clone-utilizzabile-via-web/\n- https://www.windowsblogitalia.com/2018/02/ascoltare-la-musica-edge-firefox-chrome-winamp2-js/\n- https://www.amicopc.com/software-5/winamp-debutta-sul-web-versione-browser/\n\n### Thai\n\n- http://www.flashfly.net/wp/208175\n- https://www.aripfan.com/bring-winamp-emulator-in-web-browser/\n- https://www.beartai.com/news/itnews/221530\n- https://men.kapook.com/view188468.html\n\n### Hungarian\n\n- http://hvg.hu/tudomany/20180212_winamp_zenelejatszo_letoltes_bongeszoben\n- http://www.karpatinfo.net/cikk/tudomany/2567147-feltamadt-winamp-90-es-evek-kedvenc-zenelejatszoja-hasznalhatja\n- https://www.gamestar.hu/hir/winamp-html5-verzio-243839.html\n- https://pcworld.hu/pcwlite/feltamad-a-winamp-raadasul-bongeszoben-243841.html\n- https://24.hu/tech/2018/02/11/ezernyi-emlek-onti-fogja-elonteni-a-szivet-ettol-a-hirtol/\n- https://888.hu/article-visszatert-minden-idok-legjobb-zenelejatszoja-a-winamp\n\n### Bosnian\n\n- https://www.b92.net/tehnopolis/vesti.php?yyyy=2018&mm=02&nav_id=1357852\n- https://www.benchmark.rs/vesti/novi_winamp_emulator_budi_nostalgiju_na_stara_vremena-74941\n\n### Turkish\n\n- http://www.bursateknikpc.com/winamp-2nin-html5-de-yazilmis-versiyonu-cikti/\n- https://www.log.com.tr/winamp-efsanesini-yeniden-kullanima-sunan-site/\n\n### Japanese\n\n- http://jp.techcrunch.com/2018/02/10/2018-02-09-whip-the-llamas-ass-with-this-javascript-winamp-emulator/\n- https://gigazine.net/news/20180213-winamp2-js/\n- https://www.gizmodo.jp/2014/11/90winamp_2html5.html\n- https://www.softantenna.com/wp/review/winamp2-js/\n- http://mantiddesign.com/archives/15468\n- https://jp.sputniknews.com/science/201802104563738/\n\n### Portuguese\n\n- http://abertoatedemadrugada.com/2018/02/winamp-completamente-funcional-em.html\n- https://canaltech.com.br/musica/desenvolvedor-ressuscita-winamp-em-emulador-com-javascript-108112/\n- https://itovnp.blogspot.com/2018/07/winamp-atraves-de-um-simples-browser.html\n- https://pplware.sapo.pt/software/chegou-winamp-funciona-um-browser/\n- https://www.techtudo.com.br/noticias/2018/03/oito-curiosidades-sobre-o-winamp-player-que-era-sucesso-nos-anos-2000.ghtml (mention)\n- https://tecnoblog.net/234125/winamp-versao-web-navegador/\n\n### Swedish\n\n- http://gaffa.se/nyhet/125537/klassisk-musikspelare-nu-pa-webben/\n- https://www.idg.se/2.1085/1.697529/mp3-winamp-webblasare\n\n### Armenian\n\n- http://www.armblog.net/2018/02/github-winamp.htm\n\n### Dutch\n\n- https://tweakers.net/geek/135087/ontwikkelaar-bouwt-winamp-29-in-javascript.html)\n- https://p-magazine.be/nostalgisch-luisterplezier-slechts-muisklik-verwijderd/\n\n### Romanian\n\n- https://zonait.tv/va-era-dor-de-winamp/\n- https://playtech.ro/2018/macos-windows-95-winamp-paint-software-vechi-browser/\n\n### Czech\n\n- https://www.zive.cz/clanky/zpatky-do-minulosti-winamp-muzete-pouzivat-primo-v-prohlizeci/sc-3-a-191743/default.aspx\n- https://www.zive.cz/clanky/prehistoricky-winamp-se-konecne-docka-navratu-unikla-betaverze/sc-3-a-195099/default.aspx (mention)\n\n### Croatian\n\n- http://idesh.net/tech-i-web/internet/winamp-se-vratio-nostalgija-na-najjace/\n\n### Vietnamese\n\n- http://vnreview.vn/tin-tuc-xa-hoi-so/-/view_content/content/2421915/song-lai-thap-nien-90-voi-trai-nghiem-nhung-phan-mem-nay-ngay-tren-trinh-duyet\n- http://genk.vn/trang-web-gia-lap-trinh-phat-nhac-winamp-nay-se-dua-ban-tro-lai-hoi-uc-nhung-cuoi-the-ky-20-20180212175238851.chn\n\n### Indonsian\n\n- https://www.trentech.id/masih-ingat-winamp-kamu-bisa-nostalgia-dengan-winamp-di-situs-ini/\n\n### Persian\n\n- http://www.1pezeshk.com/archives/2018/07/webamp.html\n\n### Korean\n\n- http://funtenna.funshop.co.kr/article/11801\n\n### Dutch\n\n- https://freshgadgets.nl/nostalgie-je-kunt-winamp-in-je-browser-gebruiken\n\n## Internet Archive\n\nOn October 2nd, 2018 the Internet Archive announced Webamp integration. Here are some articles covering that annoucement.\n\n- https://blog.archive.org/2018/10/02/dont-click-on-the-llama/\n- https://www.ghacks.net/2018/10/04/internet-archive-releases-winamp-skins-collection/?utm_source=dlvr.it&utm_medium=twitter\n- https://www.pcactual.com/noticias/actualidad/internet-archive-no-quiere-olvidarse-winamp_14008\n- https://www.guaripetesolutions.us/internet-archive-releases-winamp-skins-collection/\n- https://www.softzone.es/2018/10/04/internet-archive-coleccion-skins-winamp/\n- https://tugatech.com.pt/t26972-internet-archive-disponibiliza-colecoes-de-skins-para-winamp\n- https://www.bardtech.com/internet-archive-releases-winamp-skins-collection/\n"
  },
  {
    "path": "webamp/packages/webamp/docs/usage.md",
    "content": "# Usage\n\nHere's how to use Webamp in your own project. If you get stuck, or need help, please either file an issue, or reach out on [Discord](https://discord.gg/fBTDMqR).\n\n## Examples\n\nIf you would like to look at some examples check out the [examples directory](../examples/) where you will find:\n\n- [Minimal](../examples/minimal/) - An example that just uses a `<script>` tag that points to a CDN. No install required.\n- [Webpack](../examples/webpack/) - An example that installs Webamp via NPM, and bundles it into an application using Webpack.\n\nEach example has a README which explains it in more detail.\n\n## Install\n\n```\nnpm install --save webamp\n```\n\nOr, you can include it via a script tag:\n\n```html\n<!-- You can use this URL, or download it and check it into your own project -->\n<script src=\"https://unpkg.com/webamp@1.4.0/built/webamp.bundle.min.js\"></script>\n```\n\n## Create a container\n\nCreate a DOM element somewhere in your HTML document. This will be used by Webamp to find it's initial position.\n\n```html\n<div id=\"winamp-container\"></div>\n```\n\n## Initialize the JavaScript\n\n```JavaScript\nimport Webamp from 'webamp';\n\n// Or, if you installed via a script tag, `Winamp` is available on the global `window`:\n// const Winamp = window.Webamp;\n\n// Check if Winamp is supported in this browser\nif(!Webamp.browserIsSupported()) {\n    alert(\"Oh no! Webamp does not work!\")\n    throw new Error(\"What's the point of anything?\")\n}\n\n// All configuration options are optional.\nconst webamp = new Webamp({\n  // Optional.\n  initialTracks: [{\n    metaData: {\n      artist: \"DJ Mike Llama\",\n      title: \"Llama Whippin' Intro\",\n    },\n    // Can be downloaded from: https://github.com/captbaritone/webamp/raw/master/mp3/llama-2.91.mp3\n    url: \"path/to/mp3/llama-2.91.mp3\"\n  }],\n  // Optional. The default skin is included in the js bundle, and will be loaded by default.\n  initialSkin: {\n    // Can be downloaded from https://github.com/captbaritone/webamp/raw/master/skins/TopazAmp1-2.wsz\n    url: \"path/to/skins/TopazAmp1-2.wsz\"\n  },\n});\n// Render after the skin has loaded.\nwebamp.renderWhenReady(document.getElementById('winamp-container'));\n```\n\n## API\n\nMany methods on the webamp instance deal with `track`s. Here is the shape of a `track`:\n\n```JavaScript\nconst track = {\n    // Either `url` or `blob` must be specified\n    // Note: This URL must be served the with correct CORs headers.\n    url: 'https://example.com/song.mp3',\n    blob: dataBlob,\n\n    // Optional. Name to be used until ID3 tags can be resolved.\n    // If the track has a `url`, and this property is not given,\n    // the filename will be used instead.\n    defaultName: 'My Song',\n\n    // Optional. Data to be used _instead_ of trying to fetch ID3 tags.\n    metaData: {\n        artist: 'Jordan Eldredge',\n        title: \"Jordan's Song\"\n    },\n\n    // Optional. Duration (in seconds) to be used instead of\n    // fetching enough of the file to measure its length.\n    duration: 95\n};\n```\n\n## Static Methods\n\nThe `Winamp` class has the following _static_ methods:\n\n### `browserIsSupported()`\n\nReturns a true if the current browser supports the features that Webamp depends upon. It is recommended to check this before you attempt to instantiate an instance of `Winamp`.\n\n```JavaScript\nif(Winamp.browserIsSupported()) {\n    new Winamp({/* ... */});\n    // ...\n} else {\n    // Perhaps you could show some simpler player in this case.\n}\n```\n\n## Construction\n\nThe `Winamp` class is constructed with an options object. All are optional.\n\n```JavaScript\nconst options = {\n    // Optional. An object representing the initial skin to use.\n    // If omitted, the default skin, included in the bundle, will be used.\n    // Note: This URL must be served the with correct CORs headers.\n    initialSkin: {\n        url: './path/to/skin.wsz'\n    },\n\n    // Optional. An array of `track`s (see above) to prepopulate the playlist with.\n    initialTracks: [/* ... */],\n\n    // Optional. An array of objects representing skins.\n    // These will appear in the \"Options\" menu under \"Skins\".\n    // Note: These URLs must be served with the correct CORs headers.\n    availableSkins: [\n      { url: \"./green.wsz\", name: \"Green Dimension V2\" },\n      { url: \"./osx.wsz\", name: \"Mac OSX v1.5 (Aqua)\" }\n    ],\n\n    // Optional. (Default: `false`) Should global hotkeys be enabled?\n    enableHotkeys: true,\n\n    // Optional. (Default: `0`) The zIndex that Webamp should use.\n    zIndex: 99999,\n\n    // Optional. An array of additional file pickers.\n    // These will appear in the \"Options\" menu under \"Play\".\n    // In the offical version. This option is used to provide a \"Dropbox\" file picker.\n    filePickers: [{\n        // The name that will appear in the context menu.\n        contextMenuName: \"My File Picker...\",\n        // A function which returns a Promise that resolves to\n        // an array of `track`s (see above)\n        filePicker: () => Promise.resolve([{\n            url: './rick_roll.mp3'\n        }]),\n        // A boolean indicating if this options should be made\n        // available when the user is offline.\n        requiresNetwork: true\n    }],\n\n    // Optional. Provide a custom way to derive `Track` objects from a drop event.\n    // Useful if your website has some DOM representation of a track that you can map to a URL/blob.\n    handleTrackDropEvent: async (e) => {\n        // Return an array of `Track` objects, see documentation below, or `null` to get the default drop behavior.\n        // You may optionally wrap the return value in a promise.\n    },\n\n    // Optional. Provide a way to extend the behavior of the button ADD URL.\n    // **Since** 1.4.1\n    handleAddUrlEvent: async () => {\n        // Return an optional array of `Track` objects or null.\n    },\n\n    // Optional. Provide a way to extend the behavior of the playlist button LOAD LIST.\n    // **Since** 1.4.1\n    handleLoadListEvent: async () => {\n        // Return an optional array of `Track` objects or null.\n    },\n\n    // Optional. Provide a way to extend the behavior of the playlist button SAVE LIST.\n    // Where tracks: Track[]\n    // **Since** 1.4.1\n    handleSaveListEvent: (tracks) => {}\n};\nconst webamp = new Webamp(options);\n```\n\n## Instance Methods\n\nThe `Webamp` class has the following _instance_ methods:\n\n### `appendTracks(tracks: Track[]): void`\n\nAdd an array of `track`s (see above) to the end of the playlist.\n\n```JavaScript\nwebamp.appendTracks([\n    {url: 'https://example.com/track1.mp3'},\n    {url: 'https://example.com/track2.mp3'},\n    {url: 'https://example.com/track3.mp3'}\n]);\n```\n\n### `setTracksToPlay(tracks: Track[]): void`\n\nReplace the playlist with an array of `track`s (see above) and begin playing the first track.\n\n```JavaScript\nwebamp.setTracksToPlay([\n    {url: 'https://example.com/track1.mp3'},\n    {url: 'https://example.com/track2.mp3'},\n    {url: 'https://example.com/track3.mp3'}\n]);\n```\n\n### `previousTrack(): void`\n\nPlay the previous track.\n\n**Since** 1.3.0\n\n```JavaScript\nwebamp.previousTrack();\n```\n\n### `nextTrack(): void`\n\nPlay the next track.\n\n**Since** 1.3.0\n\n```JavaScript\nwebamp.nextTrack();\n```\n\n### `seekForward(seconds): void`\n\nSeek forward n seconds in the current track.\n\n**Since** 1.3.0\n\n```JavaScript\nwebamp.seekForward(10);\n```\n\n### `seekBackward(seconds): void`\n\nSeek backward n seconds in the current track.\n\n**Since** 1.3.0\n\n```JavaScript\nwebamp.seekBackward(10);\n```\n\n### `seekToTime(seconds)`\n\nSeek to a given time within the current track.\n\n**Since** 1.4.0\n\n```JavaScript\nwebamp.seekToTime(15.5);\n```\n\n### `getMediaStatus()`\n\nGet the current \"playing\" status. The return value is one of: `\"PLAYING\"`, `\"STOPPED\"`, or `\"PAUSED\"`.\n\n**Since** 1.4.0\n\n```JavaScript\nconst isPlaying = webamp.getMediaStatus() === \"PLAYING\";\n```\n\n### `pause(): void`\n\nPause the current track.\n\n**Since** 1.3.0\n\n```JavaScript\nwebamp.pause();\n```\n\n### `play(): void`\n\nPlay the current track.\n\n**Since** 1.3.0\n\n```JavaScript\nwebamp.play();\n```\n\n### `stop(): void`\n\nStop the currently playing audio. Equivilant to pressing the \"stop\" button.\n\n**Since** 1.4.0\n\n```JavaScript\nwebamp.stop();\n```\n\n### `renderWhenReady(domNode: HTMLElement): Promise<void>`\n\nWebamp will wait until it has fetched the skin and fully parsed it, and then render itself into a new DOM node at the end of the `<body>` tag.\n\nIf a `domNode` is passed, Webamp will place itself in the center of that DOM node.\n\nA promise is returned which will resolve after the render is complete.\n\n```JavaScript\nconst container = document.getElementById('winamp-container');\nwebamp.renderWhenReady(container).then(() => {\n    console.log('rendered webamp!');\n});\n```\n\n### `onTrackDidChange(cb: (trackInfo: LoadedURLTrack | null) => void): () => void`\n\nA callback which will be called when a new track starts loading. This can happen on startup when the first track starts buffering, or when a subsequent track starts playing. The callback will be called with an object (`{url: 'https://example.com/track.mp3'}`) containing the URL of the track.\n\nReturns an \"unsubscribe\" function.\n\n**Note:** If the user drags in a track, the URL may be an [ObjectURL](https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL)\n\n```JavaScript\nconst unsubscribe = webamp.onTrackDidChange((track => {\n    console.log(\"New track playing:\", track.url);\n});\n\n// If at some point in the future you want to stop listening to these events:\nunsubscribe();\n```\n\n### `onWillClose(cb: (cancel: () => void) => void): () => void`\n\nA callback which will be called when Webamp is _about to_ close. Returns an \"unsubscribe\" function. The callback will be passed a `cancel` function which you can use to conditionally prevent Webamp from being closed.\n\n```JavaScript\nconst unsubscribe = webamp.onWillClose((cancel) => {\n    if (!window.confirm(\"Are you sure you want to close Webamp?\")) {\n        cancel();\n    }\n});\n\n// If at some point in the future you want to stop listening to these events:\nunsubscribe();\n```\n\n### `onClose(cb: () => void): () => void`\n\nA callback which will be called when Webamp is closed. Returns an \"unsubscribe\" function.\n\n```JavaScript\nconst unsubscribe = webamp.onClose(() => {\n    console.log(\"Webamp closed\");\n});\n\n// If at some point in the future you want to stop listening to these events:\nunsubscribe();\n```\n\n### `close(): void`\n\nEquivalent to selection \"Close\" from Webamp's options menu. Once closed, you can open it again with `.reopen()`.\n\n**Since** 1.4.1\n\n### `reopen(): void`\n\nAfter `.close()`ing this instance, you can reopen it by calling this method.\n\n**Since** 1.3.0\n\n```JavaScript\nconst icon = document.getElementById('webamp-icon');\n\nwebamp.onClose(() => {\n    icon.addEventListener('click', () => {\n        webamp.reopen();\n    });\n})\n```\n\n### `onMinimize(cb: () => void): () => void`\n\nA callback which will be called when Webamp is minimized. Returns an \"unsubscribe\" function.\n\n```JavaScript\nconst unsubscribe = webamp.onMinimize(() => {\n    console.log(\"Webamp closed\");\n});\n\n// If at some point in the future you want to stop listening to these events:\nunsubscribe();\n```\n\n### `setSkinFromUrl(url: string): void`\n\nUpdates the skin used by the webamp instance. Note that this does not happen immediately. If you want to be notified when the skin load is complete, use `.skinIsLoaded()`, which returns a promise which you can await.\n\n**Since** 1.4.1\n\n### `skinIsLoaded(): Promise<void>`\n\nReturns a promise that resolves when the skin is done loading.\n\n```JavaScript\nconst start = Date.now();\nawait webamp.skinIsLoaded();\nconsole.log(`The skin loaded in ${Date.now() - start}`);\n```\n\n### `dispose(): void`\n\n**Note:** _This method is not fully functional. It is currently impossible to clean up a Winamp instance. This method makes an effort, but it still leaks the whole instance. In the future the behavior of this method will improve, so you might as well call it._\n\nWhen you are done with a Webamp instance, call this method and Webamp will attempt to clean itself up to avoid memory leaks.\n\n```JavaScript\nwebamp.dispose();\n```\n\n## Notes\n\n- Internet Explorer is not supported.\n- Webamp injects CSS into the page. The CSS is namespaced (every CSS selector is prefixed with `#webamp`), so it should not interfere with anything on the host page.\n- Webamp HTML contains somewhat generic IDs and class names. If you have CSS on your page that is not namespaced, it may accidentaly be applied to Webamp. If this happens please reach out. I may be able to resolve it.\n- Skin and audio URLs are subject to [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). Please ensure they are either served from the same domain, or that the other domain is served with the correct headers.\n- Please reach out to me. I'd love to help you set it up, and understand how it's being used. I plan to expand this API as I learn how people want to use it.\n"
  },
  {
    "path": "webamp/packages/webamp/index.d.ts",
    "content": "interface TrackInfo {\n  /**\n   * Name to be used until ID3 tags can be resolved.\n   *\n   * If the track has a `url`, and this property is not given,\n   * the filename will be used instead.\n   *\n   * Example: `'My Song'`\n   */\n  defaultName?: string;\n\n  /**\n   * Data to be used _instead_ of trying to fetch ID3 tags.\n   *\n   * Example: `{ artist: 'Jordan Eldredge', title: \"Jordan's Song\" }`\n   */\n  metaData?: {\n    artist: string;\n    title: string;\n    album?: string;\n  };\n\n  /**\n   * Duration (in seconds) to be used instead of fetching enough of the file to measure its length.\n   *\n   * Example: 95\n   */\n  duration?: number;\n}\n\ninterface URLTrack extends TrackInfo {\n  /**\n   * Source URL of the track\n   *\n   * Note: This URL must be served the with correct CORs headers.\n   *\n   * Example: `'https://example.com/song.mp3'`\n   */\n  url: string | URL;\n}\n\ninterface BlobTrack extends TrackInfo {\n  /**\n   * Blob source of the track\n   */\n  blob: Blob;\n}\n\ninterface LoadedURLTrack {\n  url: string;\n  metaData: {\n    artist: string | null;\n    title: string | null;\n    album: string | null;\n    albumArtUrl: string | null;\n  };\n}\n\n/**\n * Many methods on the webamp instance deal with track.\n *\n * Either `url` or `blob` must be specified\n */\ntype Track = URLTrack | BlobTrack;\n\ninterface Options {\n  /**\n   * An object representing the initial skin to use.\n   *\n   * If omitted, the default skin, included in the bundle, will be used.\n   * Note: This URL must be served the with correct CORs headers.\n   *\n   * Example: `{ url: './path/to/skin.wsz' }`\n   */\n  initialSkin?: {\n    url: string;\n  };\n\n  /**\n   * An array of `Track`s to prepopulate the playlist with.\n   */\n  initialTracks?: Track[];\n\n  /**\n   * An array of objects representing available skins.\n   *\n   * These will appear in the \"Options\" menu under \"Skins\".\n   * Note: These URLs must be served with the correct CORs headers.\n   *\n   * Example: `[ { url: \"./green.wsz\", name: \"Green Dimension V2\" } ]`\n   */\n  availableSkins?: { url: string; name: string }[];\n\n  /**\n   * Should global hotkeys be enabled?\n   *\n   * Default: `false`\n   */\n  enableHotkeys?: boolean;\n\n  /**\n   * An array of additional file pickers.\n   *\n   * These will appear in the \"Options\" menu under \"Play\".\n   *\n   * In the offical version, this option is used to provide a \"Dropbox\" file picker.\n   */\n  filePickers?: [\n    {\n      /**\n       * The name that will appear in the context menu.\n       *\n       * Example: `\"My File Picker...\"`\n       */\n      contextMenuName: string;\n\n      /**\n       * A function which returns a Promise that resolves to an array of `Track`s\n       *\n       * Example: `() => Promise.resolve([{ url: './rick_roll.mp3' }])`\n       */\n      filePicker: () => Promise<Track[]>;\n\n      /**\n       * Indicates if this options should be made available when the user is offline.\n       */\n      requiresNetwork: boolean;\n    }\n  ];\n  zIndex?: number;\n\n  handleTrackDropEvent?: (\n    e: React.DragEvent<HTMLDivElement>\n  ) => Track[] | null | Promise<Track[] | null>;\n}\n\nexport default class Webamp {\n  constructor(options: Options);\n\n  /**\n   * Returns a true if the current browser supports the features that Webamp depends upon.\n   *\n   * It is recommended to check this before you attempt to instantiate an instance of Winamp.\n   */\n  public static browserIsSupported(): boolean;\n\n  /**\n   * Add an array of `Track`s to the end of the playlist.\n   */\n  public appendTracks(tracks: Track[]): void;\n\n  /**\n   * Replace the playlist with an array of `Track`s and begin playing the first track.\n   */\n  public setTracksToPlay(tracks: Track[]): void;\n\n  /**\n   * Play the previous track\n   */\n  public previousTrack(): void;\n\n  /**\n   * Play the next track\n   */\n  public nextTrack(): void;\n\n  /**\n   * Seek forward n seconds in the curent track\n   */\n  public seekForward(seconds: number): void;\n\n  /**\n   * Seek backward n seconds in the curent track\n   */\n  public seekBackward(seconds: number): void;\n\n  /**\n   * Seek to a given time within the current track\n   */\n  public seekToTime(seconds: number): void;\n\n  /**\n   * Pause the current tack\n   */\n  public pause(): void;\n\n  /**\n   * Play the current tack\n   */\n  public play(): void;\n\n  /**\n   * Stop the currently playing audio. Equivilant to pressing the \"stop\" button\n   */\n  public stop(): void;\n\n  /**\n   * Center windows in view\n   */\n  public centerWindowsInView(): void;\n\n  /**\n   * Webamp will wait until it has fetched the skin and fully parsed it and then render itself.\n   *\n   * Webamp is rendered into a new DOM node at the end of the <body> tag with the id `#webamp`.\n   *\n   * If a domNode is passed, Webamp will place itself in the center of that DOM node.\n   *\n   * @returns A promise is returned which will resolve after the render is complete.\n   */\n  public renderWhenReady(domNode: HTMLElement): Promise<void>;\n\n  /**\n   * A callback which will be called when a new track starts loading.\n   *\n   * This can happen on startup when the first track starts buffering, or when a subsequent track starts playing.\n   * The callback will be called with an object `({url: 'https://example.com/track.mp3'})` containing the URL of the track.\n   * Note: If the user drags in a track, the URL may be an ObjectURL.\n   *\n   * @returns An \"unsubscribe\" function. Useful if at some point in the future you want to stop listening to these events.\n   */\n  public onTrackDidChange(\n    cb: (trackInfo: LoadedURLTrack | null) => void\n  ): () => void;\n\n  /**\n   * Get the current \"playing\" status.\n   */\n  public getMediaStatus(): \"PLAYING\" | \"STOPPED\" | \"PAUSED\";\n\n  /**\n   * A callback which will be called when Webamp is _about to_ close. Returns an\n   * \"unsubscribe\" function. The callback will be passed a `cancel` function\n   * which you can use to conditionally prevent Webamp from being closed.\n   *\n   * @returns An \"unsubscribe\" function. Useful if at some point in the future you want to stop listening to these events.\n   */\n  public onWillClose(cb: (cancel: () => void) => void): () => void;\n\n  /**\n   * A callback which will be called when Webamp is closed.\n   *\n   * @returns An \"unsubscribe\" function. Useful if at some point in the future you want to stop listening to these events.\n   */\n  public onClose(cb: () => void): () => void;\n\n  /**\n   * Equivalent to selection \"Close\" from Webamp's options menu. Once closed,\n   * you can open it again with `.reopen()`.\n   */\n  public close(): void;\n\n  /**\n   * After `.close()`ing this instance, you can reopen it by calling this method.\n   */\n  public reopen(): void;\n\n  /**\n   * A callback which will be called when Webamp is minimized.\n   *\n   * @returns An \"unsubscribe\" function. Useful if at some point in the future you want to stop listening to these events.\n   */\n  public onMinimize(callback: () => any): () => void;\n\n  public setSkinFromUrl(url: string): void;\n  public setSkinFromClient(data: string): void;\n\n  /**\n   * Returns a promise that resolves when the skin is done loading.\n   */\n  public skinIsLoaded(): Promise<void>;\n\n  /**\n   * **Note:** _This method is not fully functional. It is currently impossible to\n   * clean up a Winamp instance. This method makes an effort, but it still leaks\n   * the whole instance. In the future the behavior of this method will improve,\n   * so you might as well call it._\n   *\n   * When you are done with a Webamp instance, call this method and Webamp will\n   * attempt to clean itself up to avoid memory leaks.\n   */\n  public dispose(): void;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/jest-puppeteer.config.js",
    "content": "module.exports = {\n  launch: {\n    dumpio: true,\n  },\n  server: {\n    // Note: We require the the build be run before these tests.\n    // TODO: Figure out how to get this command to run the build.\n    command: \"npm run serve\",\n    port: 8080, // Jest Puppeteer will wait 5000ms for this port to come online.\n  },\n};\n"
  },
  {
    "path": "webamp/packages/webamp/js/Disposable.ts",
    "content": "type Teardown = (() => void) | { dispose: () => void };\n\nexport default class Disposable {\n  _teardowns: Teardown[] = [];\n  disposed: boolean;\n\n  constructor() {\n    this.disposed = false;\n  }\n\n  add(...teardowns: Teardown[]): void {\n    if (this.disposed) {\n      throw new Error(\n        \"Attempted to add a new teardown to a disposed disposable.\"\n      );\n    }\n    this._teardowns.push(...teardowns);\n  }\n\n  dispose() {\n    if (this.disposed) {\n      throw new Error(\n        \"Attempted to dispose disposable which is already disposed.\"\n      );\n    }\n    this._teardowns.forEach((teardown) => {\n      if (typeof teardown === \"function\") {\n        teardown();\n      } else if (typeof teardown.dispose === \"function\") {\n        teardown.dispose();\n      }\n    });\n    this._teardowns = [];\n    this.disposed = true;\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/__mocks__/fileMock.js",
    "content": ""
  },
  {
    "path": "webamp/packages/webamp/js/__mocks__/mediaMock.js",
    "content": "const media = {\n  addEventListener: jest.fn(),\n  setVolume: jest.fn(),\n  setBalance: jest.fn(),\n  setPreamp: jest.fn(),\n  getAnalyser: () => null,\n  on: jest.fn(),\n};\nexport default media;\n"
  },
  {
    "path": "webamp/packages/webamp/js/__mocks__/storeMock.js",
    "content": "import getStore from \"../store\";\nimport Emitter from \"../emitter\";\nimport media from \"./mediaMock\";\n\nexport default function mockGetStore() {\n  return getStore(media, new Emitter());\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/__mocks__/styleMock.js",
    "content": ""
  },
  {
    "path": "webamp/packages/webamp/js/__snapshots__/regionParser.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`regionParser parses Satellite M's region.txt 1`] = `\nObject {\n  \"normal\": Array [\n    \"4,0 271,0 271,116 4,116\",\n    \"2,1 273,1 273,116 2,116\",\n    \"1,2 274,2 274,116 1,116\",\n    \"0,4 275,4 275,116 0,116\",\n  ],\n}\n`;\n\nexports[`regionParser parses a complex file 1`] = `\nObject {\n  \"equalizer\": Array [\n    \"2,0 9,0 9,2 2,2\",\n    \"9,0 25,0 25,1 9,1\",\n    \"41,0 51,0 51,10 41,10\",\n    \"51,0 81,0 81,1 51,1\",\n    \"82,0 122,0 122,10 82,10\",\n    \"123,0 133,0 133,10 123,10\",\n    \"133,0 163,0 163,1 133,1\",\n    \"1,1 3,1 3,3 1,3\",\n    \"15,1 25,1 25,10 15,10\",\n    \"25,1 51,1 51,9 25,9\",\n    \"57,1 59,1 59,3 57,3\",\n    \"59,1 65,1 65,2 59,2\",\n    \"71,1 81,1 81,10 71,10\",\n    \"81,1 133,1 133,9 81,9\",\n    \"139,1 141,1 141,3 139,3\",\n    \"141,1 147,1 147,2 141,2\",\n    \"152,1 159,1 159,10 152,10\",\n    \"161,1 162,1 162,10 161,10\",\n    \"0,2 2,2 2,9 0,9\",\n    \"7,2 10,2 10,3 7,3\",\n    \"63,2 65,2 65,3 63,3\",\n    \"145,2 148,2 148,3 145,3\",\n    \"159,2 160,2 160,10 159,10\",\n    \"166,2 168,2 168,16 166,16\",\n    \"8,3 10,3 10,8 8,8\",\n    \"56,3 58,3 58,7 56,7\",\n    \"64,3 66,3 66,7 64,7\",\n    \"138,3 140,3 140,7 138,7\",\n    \"146,3 149,3 149,5 146,5\",\n    \"160,3 162,3 162,10 160,10\",\n    \"165,3 172,3 172,13 165,13\",\n    \"172,3 188,3 188,4 172,4\",\n    \"218,3 228,3 228,115 218,115\",\n    \"255,3 260,3 260,12 255,12\",\n    \"264,3 269,3 269,12 264,12\",\n    \"10,4 11,4 11,7 10,7\",\n    \"149,4 150,4 150,7 149,7\",\n    \"164,4 172,4 172,13 164,13\",\n    \"178,4 188,4 188,13 178,13\",\n    \"188,4 269,4 269,12 188,12\",\n    \"271,4 273,4 273,12 271,12\",\n    \"11,5 12,5 12,7 11,7\",\n    \"146,5 148,5 148,7 146,7\",\n    \"150,5 151,5 151,7 150,7\",\n    \"163,5 172,5 172,12 163,12\",\n    \"172,5 173,5 173,11 172,11\",\n    \"269,5 273,5 273,11 269,11\",\n    \"12,6 14,6 14,8 12,8\",\n    \"151,6 173,6 173,10 151,10\",\n    \"2,7 3,7 3,10 2,10\",\n    \"7,7 9,7 9,9 7,9\",\n    \"14,7 18,7 18,11 14,11\",\n    \"57,7 59,7 59,10 57,10\",\n    \"63,7 65,7 65,10 63,10\",\n    \"139,7 141,7 141,10 139,10\",\n    \"145,7 147,7 147,10 145,10\",\n    \"3,8 8,8 8,10 3,10\",\n    \"13,8 51,8 51,9 13,9\",\n    \"59,8 65,8 65,10 59,10\",\n    \"141,8 147,8 147,10 141,10\",\n    \"173,8 174,8 174,10 173,10\",\n    \"0,9 1,9 1,25 0,25\",\n    \"51,9 81,9 81,10 51,10\",\n    \"133,9 174,9 174,10 133,10\",\n    \"4,10 7,10 7,11 4,11\",\n    \"13,10 18,10 18,11 13,11\",\n    \"141,10 143,10 143,11 141,11\",\n    \"150,10 154,10 154,11 150,11\",\n    \"160,10 161,10 161,13 160,13\",\n    \"162,10 173,10 173,11 162,11\",\n    \"5,11 7,11 7,12 5,12\",\n    \"12,11 14,11 14,12 12,12\",\n    \"17,11 19,11 19,13 17,13\",\n    \"142,11 145,11 145,12 142,12\",\n    \"149,11 151,11 151,12 149,12\",\n    \"153,11 155,11 155,13 153,13\",\n    \"159,11 161,11 161,13 159,13\",\n    \"6,12 8,12 8,13 6,13\",\n    \"11,12 13,12 13,13 11,13\",\n    \"19,12 20,12 20,14 19,14\",\n    \"143,12 145,12 145,13 143,13\",\n    \"148,12 150,12 150,13 148,13\",\n    \"172,12 188,12 188,13 172,13\",\n    \"7,13 9,13 9,116 7,116\",\n    \"10,13 12,13 12,14 10,14\",\n    \"20,13 21,13 21,116 20,116\",\n    \"116,13 126,13 126,115 116,115\",\n    \"144,13 148,13 148,16 144,16\",\n    \"148,13 149,13 149,14 148,14\",\n    \"154,13 156,13 156,14 154,14\",\n    \"158,13 160,13 160,14 158,14\",\n    \"165,13 170,13 170,14 165,14\",\n    \"9,14 11,14 11,116 9,116\",\n    \"21,14 22,14 22,116 21,116\",\n    \"24,14 64,14 64,107 24,107\",\n    \"65,14 75,14 75,115 65,115\",\n    \"75,14 105,14 105,15 75,15\",\n    \"137,14 147,14 147,115 137,115\",\n    \"155,14 159,14 159,16 155,16\",\n    \"168,14 177,14 177,115 168,115\",\n    \"190,14 201,14 201,115 190,115\",\n    \"201,14 214,14 214,15 201,15\",\n    \"1,15 11,15 11,104 1,104\",\n    \"14,15 16,15 16,116 14,116\",\n    \"18,15 75,15 75,107 18,107\",\n    \"81,15 83,15 83,17 81,17\",\n    \"83,15 89,15 89,16 83,16\",\n    \"95,15 147,15 147,115 95,115\",\n    \"148,15 150,15 150,17 148,17\",\n    \"153,15 155,15 155,17 153,17\",\n    \"159,15 161,15 161,17 159,17\",\n    \"164,15 166,15 166,17 164,17\",\n    \"177,15 201,15 201,115 177,115\",\n    \"207,15 209,15 209,17 207,17\",\n    \"209,15 215,15 215,16 209,16\",\n    \"16,16 75,16 75,107 16,107\",\n    \"80,16 82,16 82,22 80,22\",\n    \"87,16 90,16 90,17 87,17\",\n    \"150,16 151,16 151,18 150,18\",\n    \"152,16 154,16 154,22 152,22\",\n    \"163,16 166,16 166,17 163,17\",\n    \"167,16 201,16 201,115 167,115\",\n    \"206,16 208,16 208,22 206,22\",\n    \"213,16 216,16 216,17 213,17\",\n    \"11,17 13,17 13,116 11,116\",\n    \"88,17 90,17 90,21 88,21\",\n    \"151,17 154,17 154,18 151,18\",\n    \"160,17 162,17 162,21 160,21\",\n    \"162,17 164,17 164,18 162,18\",\n    \"214,17 216,17 216,23 214,23\",\n    \"205,18 208,18 208,21 205,21\",\n    \"230,18 236,18 236,115 230,115\",\n    \"239,18 245,18 245,115 239,115\",\n    \"247,18 258,18 258,115 247,115\",\n    \"258,18 271,18 271,19 258,19\",\n    \"13,19 75,19 75,107 13,107\",\n    \"204,19 208,19 208,21 204,21\",\n    \"228,19 258,19 258,115 228,115\",\n    \"264,19 266,19 266,21 264,21\",\n    \"266,19 272,19 272,20 266,20\",\n    \"78,20 82,20 82,21 78,21\",\n    \"90,20 92,20 92,21 90,21\",\n    \"150,20 154,20 154,21 150,21\",\n    \"162,20 164,20 164,21 162,21\",\n    \"202,20 204,20 204,22 202,22\",\n    \"263,20 265,20 265,26 263,26\",\n    \"270,20 273,20 273,21 270,21\",\n    \"76,21 78,21 78,23 76,23\",\n    \"78,21 79,21 79,22 78,22\",\n    \"82,21 83,21 83,23 82,23\",\n    \"87,21 89,21 89,23 87,23\",\n    \"91,21 94,21 94,22 91,22\",\n    \"148,21 150,21 150,23 148,23\",\n    \"150,21 151,21 151,22 150,22\",\n    \"154,21 155,21 155,23 154,23\",\n    \"159,21 161,21 161,23 159,23\",\n    \"163,21 166,21 166,22 163,22\",\n    \"201,21 203,21 203,23 201,23\",\n    \"208,21 209,21 209,24 208,24\",\n    \"213,21 258,21 258,23 213,23\",\n    \"271,21 273,21 273,27 271,27\",\n    \"75,22 78,22 78,23 75,23\",\n    \"81,22 89,22 89,23 81,23\",\n    \"92,22 150,22 150,23 92,23\",\n    \"153,22 161,22 161,23 153,23\",\n    \"164,22 203,22 203,23 164,23\",\n    \"207,22 258,22 258,23 207,23\",\n    \"262,22 265,22 265,25 262,25\",\n    \"75,23 76,23 76,115 75,115\",\n    \"83,23 87,23 87,24 83,24\",\n    \"94,23 148,23 148,115 94,115\",\n    \"155,23 159,23 159,24 155,24\",\n    \"166,23 202,23 202,115 166,115\",\n    \"209,23 212,23 212,25 209,25\",\n    \"212,23 214,23 214,24 212,24\",\n    \"215,23 258,23 258,115 215,115\",\n    \"261,23 265,23 265,25 261,25\",\n    \"76,24 77,24 77,115 76,115\",\n    \"82,24 84,24 84,25 82,25\",\n    \"86,24 88,24 88,25 86,25\",\n    \"93,24 149,24 149,115 93,115\",\n    \"154,24 156,24 156,25 154,25\",\n    \"158,24 160,24 160,25 158,25\",\n    \"165,24 203,24 203,115 165,115\",\n    \"259,24 261,24 261,26 259,26\",\n    \"77,25 78,25 78,115 77,115\",\n    \"81,25 83,25 83,27 81,27\",\n    \"87,25 89,25 89,27 87,27\",\n    \"92,25 150,25 150,115 92,115\",\n    \"153,25 155,25 155,27 153,27\",\n    \"159,25 161,25 161,27 159,27\",\n    \"164,25 204,25 204,115 164,115\",\n    \"209,25 211,25 211,26 209,26\",\n    \"258,25 260,25 260,27 258,27\",\n    \"265,25 266,25 266,28 265,28\",\n    \"270,25 273,25 273,27 270,27\",\n    \"78,26 79,26 79,115 78,115\",\n    \"91,26 151,26 151,115 91,115\",\n    \"163,26 205,26 205,115 163,115\",\n    \"208,26 210,26 210,27 208,27\",\n    \"264,26 273,26 273,27 264,27\",\n    \"79,27 82,27 82,115 79,115\",\n    \"88,27 89,27 89,115 88,115\",\n    \"90,27 154,27 154,115 90,115\",\n    \"160,27 161,27 161,115 160,115\",\n    \"162,27 206,27 206,115 162,115\",\n    \"207,27 209,27 209,115 207,115\",\n    \"258,27 259,27 259,109 258,109\",\n    \"266,27 269,27 269,29 266,29\",\n    \"269,27 271,27 271,28 269,28\",\n    \"272,27 273,27 273,42 272,42\",\n    \"89,28 154,28 154,115 89,115\",\n    \"161,28 209,28 209,115 161,115\",\n    \"259,28 260,28 260,106 259,106\",\n    \"82,29 258,29 258,115 82,115\",\n    \"260,29 261,29 261,105 260,105\",\n    \"266,29 268,29 268,30 266,30\",\n    \"261,30 262,30 262,104 261,104\",\n    \"265,30 267,30 267,31 265,31\",\n    \"262,31 263,31 263,103 262,103\",\n    \"264,31 266,31 266,103 264,103\",\n    \"263,32 266,32 266,102 263,102\",\n    \"266,33 273,33 273,42 266,42\",\n    \"266,42 272,42 272,101 266,101\",\n    \"272,91 273,91 273,114 272,114\",\n    \"265,103 267,103 267,104 265,104\",\n    \"2,104 36,104 36,116 2,116\",\n    \"266,104 268,104 268,108 266,108\",\n    \"268,105 269,105 269,108 268,108\",\n    \"0,106 36,106 36,116 0,116\",\n    \"265,106 271,106 271,108 265,108\",\n    \"42,107 44,107 44,109 42,109\",\n    \"44,107 50,107 50,108 44,108\",\n    \"56,107 66,107 66,116 56,116\",\n    \"259,107 260,107 260,110 259,110\",\n    \"264,107 266,107 266,109 264,109\",\n    \"271,107 273,107 273,114 271,114\",\n    \"48,108 50,108 50,109 48,109\",\n    \"260,108 261,108 261,110 260,110\",\n    \"263,108 265,108 265,114 263,114\",\n    \"270,108 273,108 273,109 270,109\",\n    \"41,109 43,109 43,113 41,113\",\n    \"49,109 51,109 51,113 49,113\",\n    \"261,109 265,109 265,111 261,111\",\n    \"262,111 265,111 265,112 262,112\",\n    \"42,113 44,113 44,116 42,116\",\n    \"48,113 50,113 50,116 48,116\",\n    \"265,113 266,113 266,116 265,116\",\n    \"270,113 272,113 272,115 270,115\",\n    \"44,114 50,114 50,116 44,116\",\n    \"264,114 271,114 271,116 264,116\",\n    \"36,115 66,115 66,116 36,116\",\n    \"248,115 271,115 271,116 248,116\",\n  ],\n  \"equalizerws\": Array [\n    \"4,3 29,3 29,13 4,13\",\n    \"48,3 60,3 60,13 48,13\",\n    \"158,3 164,3 164,13 158,13\",\n    \"209,3 249,3 249,13 209,13\",\n    \"255,3 260,3 260,12 255,12\",\n    \"265,3 270,3 270,12 265,12\",\n    \"29,4 271,4 271,12 29,12\",\n    \"273,4 275,4 275,12 273,12\",\n    \"271,5 275,5 275,11 271,11\",\n  ],\n  \"normal\": Array [\n    \"8,3 18,3 18,27 8,27\",\n    \"85,3 95,3 95,111 85,111\",\n    \"95,3 125,3 125,4 95,4\",\n    \"152,3 162,3 162,112 152,112\",\n    \"162,3 192,3 192,4 162,4\",\n    \"245,3 250,3 250,111 245,111\",\n    \"255,3 260,3 260,112 255,112\",\n    \"265,3 270,3 270,15 265,15\",\n    \"2,4 4,4 4,12 2,12\",\n    \"6,4 95,4 95,12 6,12\",\n    \"101,4 103,4 103,6 101,6\",\n    \"103,4 109,4 109,5 103,5\",\n    \"115,4 162,4 162,111 115,111\",\n    \"168,4 170,4 170,6 168,6\",\n    \"170,4 176,4 176,5 170,5\",\n    \"182,4 267,4 267,98 182,98\",\n    \"270,4 271,4 271,12 270,12\",\n    \"273,4 275,4 275,12 273,12\",\n    \"4,5 95,5 95,11 4,11\",\n    \"100,5 102,5 102,11 100,11\",\n    \"107,5 110,5 110,6 107,6\",\n    \"174,5 176,5 176,6 174,6\",\n    \"271,5 275,5 275,11 271,11\",\n    \"108,6 110,6 110,10 108,10\",\n    \"167,6 169,6 169,10 167,10\",\n    \"175,6 177,6 177,10 175,10\",\n    \"98,9 102,9 102,10 98,10\",\n    \"110,9 112,9 112,10 110,10\",\n    \"96,10 98,10 98,12 96,12\",\n    \"98,10 99,10 99,11 98,11\",\n    \"102,10 103,10 103,12 102,12\",\n    \"107,10 109,10 109,12 107,12\",\n    \"111,10 114,10 114,11 111,11\",\n    \"168,10 170,10 170,112 168,112\",\n    \"174,10 176,10 176,111 174,111\",\n    \"95,11 98,11 98,12 95,12\",\n    \"101,11 109,11 109,12 101,12\",\n    \"112,11 162,11 162,12 112,12\",\n    \"170,11 176,11 176,111 170,111\",\n    \"18,12 96,12 96,111 18,111\",\n    \"103,12 107,12 107,13 103,13\",\n    \"114,12 260,12 260,111 114,111\",\n    \"96,13 97,13 97,112 96,112\",\n    \"102,13 104,13 104,14 102,14\",\n    \"106,13 108,13 108,14 106,14\",\n    \"113,13 260,13 260,111 113,111\",\n    \"270,13 273,13 273,15 270,15\",\n    \"97,14 98,14 98,112 97,112\",\n    \"101,14 103,14 103,16 101,16\",\n    \"107,14 109,14 109,16 107,16\",\n    \"112,14 260,14 260,111 112,111\",\n    \"273,14 274,14 274,22 273,22\",\n    \"98,15 99,15 99,112 98,112\",\n    \"111,15 260,15 260,111 111,111\",\n    \"267,15 268,15 268,16 267,16\",\n    \"272,15 275,15 275,16 272,16\",\n    \"99,16 102,16 102,111 99,111\",\n    \"108,16 109,16 109,111 108,111\",\n    \"110,16 260,16 260,111 110,111\",\n    \"274,16 275,16 275,21 274,21\",\n    \"109,17 260,17 260,111 109,111\",\n    \"102,18 260,18 260,111 102,111\",\n    \"267,20 268,20 268,100 267,100\",\n    \"272,20 274,20 274,22 272,22\",\n    \"268,21 272,21 272,97 268,97\",\n    \"272,22 273,22 273,23 272,23\",\n    \"272,24 273,24 273,97 272,97\",\n    \"273,25 274,25 274,97 273,97\",\n    \"274,26 275,26 275,40 274,40\",\n    \"9,27 260,27 260,111 9,111\",\n    \"8,28 260,28 260,111 8,111\",\n    \"274,43 275,43 275,53 274,53\",\n    \"2,59 4,59 4,67 2,67\",\n    \"6,59 275,59 275,67 6,67\",\n    \"4,60 275,60 275,66 4,66\",\n    \"274,67 275,67 275,69 274,69\",\n    \"7,69 274,69 274,71 7,71\",\n    \"6,72 260,72 260,111 6,111\",\n    \"0,73 2,73 2,81 0,81\",\n    \"4,73 274,73 274,81 4,81\",\n    \"2,74 274,74 274,80 2,80\",\n    \"274,87 275,87 275,110 274,110\",\n    \"260,98 263,98 263,101 260,101\",\n    \"263,98 265,98 265,99 263,99\",\n    \"266,98 268,98 268,99 266,99\",\n    \"263,99 264,99 264,100 263,100\",\n    \"268,99 269,99 269,104 268,104\",\n    \"269,100 270,100 270,104 269,104\",\n    \"260,101 262,101 262,102 260,102\",\n    \"270,101 271,101 271,104 270,104\",\n    \"260,102 261,102 261,105 260,105\",\n    \"267,102 273,102 273,104 267,104\",\n    \"0,103 2,103 2,111 0,111\",\n    \"4,103 260,103 260,111 4,111\",\n    \"261,103 262,103 262,105 261,105\",\n    \"266,103 268,103 268,105 266,105\",\n    \"273,103 275,103 275,110 273,110\",\n    \"2,104 260,104 260,110 2,110\",\n    \"262,104 263,104 263,106 262,106\",\n    \"265,104 267,104 267,110 265,110\",\n    \"272,104 275,104 275,105 272,105\",\n    \"263,105 267,105 267,107 263,107\",\n    \"264,107 267,107 267,108 264,108\",\n    \"267,109 268,109 268,112 267,112\",\n    \"272,109 274,109 274,111 272,111\",\n    \"266,110 273,110 273,112 266,112\",\n    \"6,111 16,111 16,112 6,112\",\n    \"21,111 31,111 31,112 21,112\",\n    \"44,111 54,111 54,112 44,112\",\n    \"67,111 77,111 77,112 67,112\",\n    \"90,111 100,111 100,112 90,112\",\n    \"112,111 122,111 122,112 112,112\",\n    \"133,111 173,111 173,112 133,112\",\n    \"249,111 273,111 273,112 249,112\",\n  ],\n  \"windowshade\": Array [\n    \"8,3 18,3 18,13 8,13\",\n    \"78,3 192,3 192,13 78,13\",\n    \"245,3 250,3 250,12 245,12\",\n    \"255,3 260,3 260,12 255,12\",\n    \"265,3 270,3 270,12 265,12\",\n    \"2,4 4,4 4,12 2,12\",\n    \"6,4 271,4 271,12 6,12\",\n    \"273,4 275,4 275,12 273,12\",\n    \"4,5 275,5 275,11 4,11\",\n  ],\n}\n`;\n\nexports[`regionParser parses a file with section headers but no info 1`] = `\nObject {\n  \"equalizer\": Array [\n    \"0,0 0,115 20,20 274,115 274,0\",\n  ],\n  \"normal\": Array [\n    \"1,0 275,0 275,115 1,115\",\n  ],\n}\n`;\n\nexports[`regionParser parses a region.txt where the points have leading commas 1`] = `\nObject {\n  \"equalizer\": Array [\n    \"5,0 3,1 2,2 1,3 0,5 0,116 275,116 275,6 274,3 273,2 272,1 270,0\",\n  ],\n  \"equalizerws\": Array [\n    \"5,0 3,1 2,2 1,3 0,5 0,14 275,14 275,6 274,3 273,2 272,1 270,0\",\n  ],\n  \"normal\": Array [\n    \"5,0 3,1 2,2 1,3 0,5 0,116 275,116 275,6 274,3 273,2 272,1 270,0\",\n  ],\n  \"windowshade\": Array [\n    \"5,0 3,1 2,2 1,3 0,5 0,14 275,14 275,6 274,3 273,2 272,1 270,0\",\n  ],\n}\n`;\n\nexports[`regionParser parses the EVAunit region.txt 1`] = `\nObject {\n  \"equalizer\": Array [\n    \"4,0 4,3 2,3 0,5 0,116 275,116 275,5 273,3 270,3 270,0 237,0 237,3 183,3 183,0 129,0 129,3 17,3 17,0\",\n  ],\n  \"normal\": Array [\n    \"9,0 9,3 2,3 0,5 0,104 2,107 4,107 4,116 17,116 17,107 129,107 129,116 183,116 183,107 237,107 237,116 270,116 270,107 272,107 275,104 275,5 273,3 271,3 272,4 266,4 266,3 261,3 262,4 256,4 256,3 251,3 252,4 246,4 246,3 243,3 243,0\",\n  ],\n  \"windowshade\": Array [\n    \"9,0 9,3 2,3 0,5 0,14 275,14 275,5 273,3 271,3 271,4 266,4 266,3 261,3 261,4 256,4 256,3 251,3 251,4 246,4 246,3 243,3 243,0 157,0 157,3 130,3 130,0\",\n  ],\n}\n`;\n\nexports[`regionParser parses the iTuned region.txt 1`] = `\nObject {\n  \"equalizer\": Array [\n    \"5,0 269,0 269,116 5,116\",\n    \"3,1 5,1 5,115 3,115\",\n    \"2,2 4,2 4,114 2,114\",\n    \"1,3 4,3 4,113 1,113\",\n    \"0,5 5,5 5,111 0,111\",\n    \"267,1 271,1 271,115 267,115\",\n    \"267,2 272,2 272,114 267,114\",\n    \"267,3 273,3 273,113 267,113\",\n    \"267,4 274,4 274,112 267,112\",\n    \"267,6 275,6 275,111 267,111\",\n  ],\n  \"normal\": Array [\n    \"5,0 269,0 269,116 5,116\",\n    \"3,1 5,1 5,115 3,115\",\n    \"2,2 4,2 4,114 2,114\",\n    \"1,3 4,3 4,113 1,113\",\n    \"0,5 5,5 5,111 0,111\",\n    \"267,1 271,1 271,115 267,115\",\n    \"267,2 272,2 272,114 267,114\",\n    \"267,3 273,3 273,113 267,113\",\n    \"267,4 274,4 274,112 267,112\",\n    \"267,6 275,6 275,111 267,111\",\n  ],\n}\n`;\n"
  },
  {
    "path": "webamp/packages/webamp/js/__snapshots__/serialization.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`can serialize the initial state 1`] = `\nObject {\n  \"display\": Object {\n    \"doubled\": false,\n    \"llama\": false,\n    \"marqueeStep\": 0,\n    \"skinColors\": Array [\n      \"rgb(0,0,0)\",\n      \"rgb(24,33,41)\",\n      \"rgb(239,49,16)\",\n      \"rgb(206,41,16)\",\n      \"rgb(214,90,0)\",\n      \"rgb(214,102,0)\",\n      \"rgb(214,115,0)\",\n      \"rgb(198,123,8)\",\n      \"rgb(222,165,24)\",\n      \"rgb(214,181,33)\",\n      \"rgb(189,222,41)\",\n      \"rgb(148,222,33)\",\n      \"rgb(41,206,16)\",\n      \"rgb(50,190,16)\",\n      \"rgb(57,181,16)\",\n      \"rgb(49,156,8)\",\n      \"rgb(41,148,0)\",\n      \"rgb(24,132,8)\",\n      \"rgb(255,255,255)\",\n      \"rgb(214,214,222)\",\n      \"rgb(181,189,189)\",\n      \"rgb(160,170,175)\",\n      \"rgb(148,156,165)\",\n      \"rgb(150,150,150)\",\n    ],\n    \"skinCursors\": null,\n    \"skinGenLetterWidths\": null,\n    \"skinImages\": Object {\n      \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\",\n      \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n    },\n    \"skinPlaylistStyle\": null,\n    \"skinRegion\": Object {},\n    \"visualizerStyle\": 0,\n  },\n  \"equalizer\": Object {\n    \"auto\": false,\n    \"on\": true,\n    \"sliders\": Object {\n      \"1000\": 50,\n      \"12000\": 50,\n      \"14000\": 50,\n      \"16000\": 50,\n      \"170\": 50,\n      \"3000\": 50,\n      \"310\": 50,\n      \"60\": 50,\n      \"600\": 50,\n      \"6000\": 50,\n      \"preamp\": 50,\n    },\n  },\n  \"media\": Object {\n    \"balance\": 0,\n    \"repeat\": false,\n    \"shuffle\": false,\n    \"volume\": 78,\n  },\n  \"version\": 1,\n  \"windows\": Object {\n    \"focused\": \"main\",\n    \"genWindows\": Object {\n      \"equalizer\": Object {\n        \"hidden\": false,\n        \"open\": true,\n        \"position\": Object {\n          \"x\": 0,\n          \"y\": 0,\n        },\n        \"shade\": false,\n        \"size\": Array [\n          0,\n          0,\n        ],\n      },\n      \"main\": Object {\n        \"hidden\": false,\n        \"open\": true,\n        \"position\": Object {\n          \"x\": 0,\n          \"y\": 0,\n        },\n        \"shade\": false,\n        \"size\": Array [\n          0,\n          0,\n        ],\n      },\n      \"playlist\": Object {\n        \"hidden\": false,\n        \"open\": true,\n        \"position\": Object {\n          \"x\": 0,\n          \"y\": 0,\n        },\n        \"shade\": false,\n        \"size\": Array [\n          0,\n          0,\n        ],\n      },\n    },\n    \"positionsAreRelative\": true,\n  },\n}\n`;\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/.eslintrc",
    "content": "{\n  \"env\": {\n    \"jest\": true\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/baseline.integration-test.js",
    "content": "/* global page */\nconst { toMatchImageSnapshot } = require(\"jest-image-snapshot\");\nconst path = require(\"path\");\n\nexpect.extend({ toMatchImageSnapshot });\n\nconst DOMAIN = \"http://localhost:8080\";\nconst snapshotOptions = {\n  // There are some font rendering issues which prevent us from pushing this lower right now.\n  // We could setup some tests which don't render text and set the threshold lower.\n  // Ideally we can resolve the font rendering issue.\n  failureThreshold: \"0.00\",\n  failureThresholdType: \"percent\",\n};\n\n// Hack to ensure changing the hash causes a page reload\nbeforeEach(async () => page.goto(`http://example.com`));\n\ntest(\"should render the default skin\", async () => {\n  await page.goto(`${DOMAIN}/#{\"disableMarquee\":true}`);\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"can 'pose' for a screenshot\", async () => {\n  await page.goto(`${DOMAIN}/?screenshot=1`);\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"can load a skin via the query params\", async () => {\n  await page.goto(\n    // If this test starts to fail, check that the cache-bust location of the skin has not changed.\n    `${DOMAIN}/?skinUrl=/skins/MacOSXAqua1-5-88dbd4e043795c98625462a908a2d965.wsz#{\"disableMarquee\":true}`\n  );\n  await page.evaluate(() => window.__webamp.skinIsLoaded());\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"should render the Topaz skin\", async () => {\n  await page.goto(`${DOMAIN}/#{\"disableMarquee\":true}`);\n  await expect(page).toUploadFile(\n    \"#webamp-file-input\",\n    path.join(__dirname, \"../../demo/skins/TopazAmp1-2.wsz\")\n  );\n  await page.evaluate(() => window.__webamp.skinIsLoaded());\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"should render a skin that defines transparent regions\", async () => {\n  await page.goto(`${DOMAIN}/#{\"disableMarquee\":true}`);\n  await expect(page).toUploadFile(\n    \"#webamp-file-input\",\n    path.join(__dirname, \"../../demo/skins/Green-Dimension-V2.wsz\")\n  );\n  await page.evaluate(() => window.__webamp.skinIsLoaded());\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"should render a skin that has files that only differ by case: main.bmp and main.BMP\", async () => {\n  await page.goto(`${DOMAIN}/#{\"disableMarquee\":true}`);\n  await expect(page).toUploadFile(\n    \"#webamp-file-input\",\n    path.join(__dirname, \"../../demo/skins/My_Funny_Valentine.wsz\")\n  );\n  await page.evaluate(() => window.__webamp.skinIsLoaded());\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"uses the volume spirtes as a fallback when balance spirtes are missing\", async () => {\n  await page.goto(`${DOMAIN}/#{\"disableMarquee\":true}`);\n  await expect(page).toUploadFile(\n    \"#webamp-file-input\",\n    path.join(__dirname, \"../../demo/skins/AmigaPPC-dark.wsz\")\n  );\n  await page.evaluate(() => window.__webamp.skinIsLoaded());\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"pads empty space in the marquee with the space character\", async () => {\n  await page.goto(`${DOMAIN}/#{\"disableMarquee\":true}`);\n  // This skin has noticeable light blue where it expects the marquee to always cover.\n  await expect(page).toUploadFile(\n    \"#webamp-file-input\",\n    path.join(__dirname, \"../../demo/skins/Sonic_Attitude.wsz\")\n  );\n  await page.evaluate(() => window.__webamp.skinIsLoaded());\n  await page.evaluate(() =>\n    window.__webamp.store.dispatch({ type: \"SET_FOCUS\", input: \"balance\" })\n  );\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n\ntest(\"closing winamp shows the icon\", async () => {\n  await page.goto(`${DOMAIN}/#{\"disableMarquee\":true}`);\n  await page.evaluate(() => window.__webamp.skinIsLoaded());\n  await page.evaluate(() =>\n    window.__webamp.store.dispatch({ type: \"CLOSE_WINAMP\" })\n  );\n  expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions);\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/CENTRA_VISCOLOR.TXT",
    "content": "\n 110, 150, 176  // 0\n 165, 165, 165  // 1\n 55, 55, 67  // 2\n 55, 55, 67  // 3\n 55, 55, 67  // 4\n 55, 55, 67  // 5\n 55, 55, 67  // 6\n 55, 55, 67  // 7\n 55, 55, 67  // 8\n 55, 55, 67  // 9\n 55, 55, 67  // 10\n 55, 55, 67  // 11\n 55, 55, 67  // 12\n 55, 55, 67  // 13\n 55, 55, 67  // 14\n 55, 55, 67  // 15\n 55, 55, 67  // 16\n 55, 55, 67  // 17\n 55, 55, 67  // 18\n 55, 55, 67  // 19\n 55, 55, 67  // 20\n 55, 55, 67  // 21\n 55, 55, 67  // 22\nc 2\n181,189,189    // 20 = osc 3\n148,156,165    // 21 = osc 4\n148,156,165    // 22 = osc 5 (dimmest)"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/PLEDIT.TXT",
    "content": "[Text]\nNormal=#00FF00\nCurrent=#FFFFFF\nNormalBG=#000000\nSelectedBG=#0000FF\nFont=Arial\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/PLEDIT_TOPAZ.TXT",
    "content": "[Text]\nNormal=#319593\nCurrent=#89D8D1\nNormalBG=#000000\nSelectedBG=#2B4242\nFont=Arial\nmbBG=#000000\nmbFG=#89D8D1\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/PLEDIT_WITH_EQUALS.TXT",
    "content": "[text]\ncurrent=#606060\t= current song title highlight\nnormal=#000000\t= normal song title color\nselectedbg=#6685A5\t= selected song background\nnormalbg=#7897B7\t= the normal background\nMBFG=#000000\t\t= MiniBrowser's font color\nmbbg=#7897B7\t\t= MiniBrowsere's font background color\nfont=Ariel\t\t= the font\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/PLEDIT_WITH_QUOTES.TXT",
    "content": "[Text]\nNormal= \"#00FF00\"\nCurrent= '#FFFFFF'\nNormalBG= \"#000000\"\nSelectedBG= \"#0000FF\"\nFont= \"Ricky's cool font!\"\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/VISCOLOR.TXT",
    "content": "0,0,0, // color 0 = black\n24,33,41, // color 1 = grey for dots\n239,49,16, // color 2 = top of spec\n206,41,16, // 3\n214,90,0, // 4\n214,102,0, // 5\n214,115,0, // 6\n198,123,8, // 7\n222,165,24, // 8\n214,181,33, // 9\n189,222,41, // 10\n148,222,33, // 11\n41,206,16, // 12\n50,190,16, // 13\n57,181,16, // 14\n49,156,8,  // 15\n41,148,0,  // 16\n24,132,8,   // 17 = bottom of spec\n255,255,255, // 18 = osc 1\n214,214,222, // 19 = osc 2 (slightly dimmer)\n181,189,189, // 20 = osc 3\n160,170,175,  // 21 = osc 4\n148,156,165,  // 22 = osc 4\n150, 150, 150, // 23 = analyzer peak dots\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/region.txt",
    "content": "; I stole this from the Complex skin, cause hey I thought it was cool :)\n; (and cause I'm too lazy to document it myself. :)\n; The original author is Adam Kennedy <adamk@iname.com>\n;\n; Hope you don't mind Adam :)\n;\n;\n; -Justin\n;\n;\n; P.S. you can use the section names [WindowShade] and [Equalizer]\n; for obvious purposes =)\n;\n;\n;                    REGION.TXT STRUCTURE FOR DEFINING SKIN MASKS\n;\n;The region information comes without any supporting documentation\n;so I thought I might as well make some.\n;\n;The region.txt in WinAmp 1.92 allows us to some interesting things with transparencies\n;But how does it work?\n;\n;Well, basically, it lets you define a set of polygons. Anything inside a polygon is drawn. Anything not in a polygon is not drawn. Simple heh?\n;For how to define it have a look below at the first block. Un-comment it now. Don't worry about commenting the actual one lower down, if WinAmp finds multiple definitions, it only does the first and ignores the rest\n;\n;How to make a mask\n;1. Type [Normal]. Real simple that one. (My guess is it is just for forward compatibility)\n;2. Just type the NumPoints= and leave the number blank, we'll fill it in later\n;3. OK, now for the fun part.\n;   The co-ordinates you should type in are the OUTSIDE pixel co-ordinates in x,y format.\n;   Start at the top lefthand corner and work your way CLOCKWISE around you polygon.\n;   Now WinAmp ONLY accepts the PointList as one line of comma seperated variables.\n;   You can use spaces, but DONT GO ONTO A NEW LINE. Clear? Good. :)\n;   One last thing, don't type the first position again at the end, WinAmp joins them.\n;   Putting a space between each pair is simply common sense, right?\n;4. Once your done, count the number of co-ords, and fill in that number for NumPoints.\n;\n;Oh, as a side note, the x variables go from 0 to 275, and the y from 0 to 116.\n;So if you look at the first example you can see I've gone across the second top line, gone down a bit, ducked in one pixel, gone down to the bottom, and across and back up the other side, putting another ledge on the other side.\n\n;This does the outside border, and chops some bits out on the top and edges\n;[Normal]\n;NumPoints=8    ;Do this LAST!\n;PointList=0,1,  275,1,  275,14,  274,14,  274,115,  1,115,  1,14,  0,14  \n\n;Cool heh? Very subtle effect. Now lets try a more complex one, with multiple polygons\n;For your first hard(ish) mask, I suggest defining each element as a seperate mask.\n;It makes them a bit easier to think about.\n\n;First, lets define an area that JUST does the titlebar.\n;[Normal]\n;NumPoints=4\n;PointList=0,1,  275,1,  275,14,  0,14\n\n;Simple as can be :)\n;Go ahead, uncomment it and have a look. Just remember to recomment everything above it\n;Doing your areas one at a time does speed the process up a bit\n\n;Now lets define JUST the area sort of inside the outer ring\n;[Normal]\n;NumPoints = 4\n;PointList = 3,15,  272,15,  272,113,  3,113\n\n;Right, so say we want a mask that has, the titlebar AND the main area.\n;We just add them together\n; [Normal] \n; NumPoints = 4, 4  ;Make sure to get the order right(although it doesnt matter here =P )\n; PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,113, 3,113\n\n;Dont forget to add that extra comma after the first set.\n; Having that bigger gap that lets you \"keep it in your head\" easier, it's a good idea\n\n;OK, now lets try something tricky. We are going to make a mask for just one green line around the outside of the skin\n;This introduces the other \"big thing\" with masks. Have a look at the first three co-ordinates below. You can see the first two moves we make are to go one to the side and then go down to the bottom. Looking at the last co-ordinate you can see we will come back up at the end, making a line two wide, right? \n;WRONG!! Here comes the big important phrase.\n;IF YOU ARNT FOLLOWING THE OUTSIDE EDGE, YOUR CO-ORDINATES MARK TRANSPARENT SPACE LIMITS\n;That's right. Because I don't make a square, because I have to turn \"inside\" the box, I am only marking space, and what I end up with is a mask with one green line.\n;WARNING: Leave your skins dialog open when you do this one. :)\n;[Normal]\n;NumPoints = 8\n;PointList = 1,14,  2,14,  2,114,  273,114,  273,14,  274,14,  274,115,  1,115\n\n;OK, as the final touch lets add lets the border we just made to the other two.\n;You should be able to work this out on your own\n;[Normal]\n;NumPoints = 4, 4, 8\n;PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,113, 3,113,     1,14, 2,14, 2,114, 273,114, 273,14, 274,14, 274,115, 1,115\n\n;hmm... that still looks a bit tacky down the bottom right\n;So I'm going to modify it a bit\n;See if you can work out what I've had to alter just by looking at the display of it\n;[Normal]\n;NumPoints = 4, 4, 8\n;PointList = 0,1, 275,1, 275,14, 0,14,     3,15, 272,15, 272,80, 3,80,     1,14, 2,14, 2,81, 273,81, 273,14, 274,14, 274,115, 1,115\n\n\n; Justin's whacked trans skin :) in one, big lame messy line\n; [Normal]\n; NumPoints=20,4,4,4,8,4,4,6,6,4,4,4,4\n; PointList=0,0,19,0,19,11,114,11,114,0,156,0,156,11,243,11,243,0,275,0,275,13,266,13,266,22,264,22,264,13,111,13,111,22,109,22,109,13,0,13,     109,22,266,22,266,36,109,36, 16,88,130,88,130,105,16,105,    136,89,157,89,157,104,136,104,    22,13,22,62,102,62,102,13,100,13,100,24,24,24,24,13,    0,0,275,0,275,3,0,3,   16,72,264,72,264,81,16,81,  0,13,0,78,16,78,16,75,4,75,4,13,   275,13,275,78,264,78,264,75,272,75,272,13,     14,78,16,78,16,105,14,105,     130,81,132,81,132,105,130,105,     146,81,146,89,148,89,148,81,     130,96,136,96,136,98,130,98\n\n;THE END\n;\n;Post-Script\n;The other good thing about doing your mask in bits and pieces like this is that can make multiple versions so you can change as your whims change\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/region1.txt",
    "content": "[Normal]\n; This region info generated by Winamp region.txt generator which is made by Maxim.\n\nNumPoints=4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4\nPointList=8,3 18,3 18,27 8,27 85,3 95,3 95,111 85,111 95,3 125,3 125,4 95,4 152,3 162,3 162,112 152,112 162,3 192,3 192,4 162,4 245,3 250,3 250,111 245,111 255,3 260,3 260,112 255,112 265,3 270,3 270,15 265,15 2,4 4,4 4,12 2,12 6,4 95,4 95,12 6,12 101,4 103,4 103,6 101,6 103,4 109,4 109,5 103,5 115,4 162,4 162,111 115,111 168,4 170,4 170,6 168,6 170,4 176,4 176,5 170,5 182,4 267,4 267,98 182,98 270,4 271,4 271,12 270,12 273,4 275,4 275,12 273,12 4,5 95,5 95,11 4,11 100,5 102,5 102,11 100,11 107,5 110,5 110,6 107,6 174,5 176,5 176,6 174,6 271,5 275,5 275,11 271,11 108,6 110,6 110,10 108,10 167,6 169,6 169,10 167,10 175,6 177,6 177,10 175,10 98,9 102,9 102,10 98,10 110,9 112,9 112,10 110,10 96,10 98,10 98,12 96,12 98,10 99,10 99,11 98,11 102,10 103,10 103,12 102,12 107,10 109,10 109,12 107,12 111,10 114,10 114,11 111,11 168,10 170,10 170,112 168,112 174,10 176,10 176,111 174,111 95,11 98,11 98,12 95,12 101,11 109,11 109,12 101,12 112,11 162,11 162,12 112,12 170,11 176,11 176,111 170,111 18,12 96,12 96,111 18,111 103,12 107,12 107,13 103,13 114,12 260,12 260,111 114,111 96,13 97,13 97,112 96,112 102,13 104,13 104,14 102,14 106,13 108,13 108,14 106,14 113,13 260,13 260,111 113,111 270,13 273,13 273,15 270,15 97,14 98,14 98,112 97,112 101,14 103,14 103,16 101,16 107,14 109,14 109,16 107,16 112,14 260,14 260,111 112,111 273,14 274,14 274,22 273,22 98,15 99,15 99,112 98,112 111,15 260,15 260,111 111,111 267,15 268,15 268,16 267,16 272,15 275,15 275,16 272,16 99,16 102,16 102,111 99,111 108,16 109,16 109,111 108,111 110,16 260,16 260,111 110,111 274,16 275,16 275,21 274,21 109,17 260,17 260,111 109,111 102,18 260,18 260,111 102,111 267,20 268,20 268,100 267,100 272,20 274,20 274,22 272,22 268,21 272,21 272,97 268,97 272,22 273,22 273,23 272,23 272,24 273,24 273,97 272,97 273,25 274,25 274,97 273,97 274,26 275,26 275,40 274,40 9,27 260,27 260,111 9,111 8,28 260,28 260,111 8,111 274,43 275,43 275,53 274,53 2,59 4,59 4,67 2,67 6,59 275,59 275,67 6,67 4,60 275,60 275,66 4,66 274,67 275,67 275,69 274,69 7,69 274,69 274,71 7,71 6,72 260,72 260,111 6,111 0,73 2,73 2,81 0,81 4,73 274,73 274,81 4,81 2,74 274,74 274,80 2,80 274,87 275,87 275,110 274,110 260,98 263,98 263,101 260,101 263,98 265,98 265,99 263,99 266,98 268,98 268,99 266,99 263,99 264,99 264,100 263,100 268,99 269,99 269,104 268,104 269,100 270,100 270,104 269,104 260,101 262,101 262,102 260,102 270,101 271,101 271,104 270,104 260,102 261,102 261,105 260,105 267,102 273,102 273,104 267,104 0,103 2,103 2,111 0,111 4,103 260,103 260,111 4,111 261,103 262,103 262,105 261,105 266,103 268,103 268,105 266,105 273,103 275,103 275,110 273,110 2,104 260,104 260,110 2,110 262,104 263,104 263,106 262,106 265,104 267,104 267,110 265,110 272,104 275,104 275,105 272,105 263,105 267,105 267,107 263,107 264,107 267,107 267,108 264,108 267,109 268,109 268,112 267,112 272,109 274,109 274,111 272,111 266,110 273,110 273,112 266,112 6,111 16,111 16,112 6,112 21,111 31,111 31,112 21,112 44,111 54,111 54,112 44,112 67,111 77,111 77,112 67,112 90,111 100,111 100,112 90,112 112,111 122,111 122,112 112,112 133,111 173,111 173,112 133,112 249,111 273,111 273,112 249,112\n\n\n[Equalizer]\n\nNumPoints=4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4\nPointList=2,0 9,0 9,2 2,2 9,0 25,0 25,1 9,1 41,0 51,0 51,10 41,10 51,0 81,0 81,1 51,1 82,0 122,0 122,10 82,10 123,0 133,0 133,10 123,10 133,0 163,0 163,1 133,1 1,1 3,1 3,3 1,3 15,1 25,1 25,10 15,10 25,1 51,1 51,9 25,9 57,1 59,1 59,3 57,3 59,1 65,1 65,2 59,2 71,1 81,1 81,10 71,10 81,1 133,1 133,9 81,9 139,1 141,1 141,3 139,3 141,1 147,1 147,2 141,2 152,1 159,1 159,10 152,10 161,1 162,1 162,10 161,10 0,2 2,2 2,9 0,9 7,2 10,2 10,3 7,3 63,2 65,2 65,3 63,3 145,2 148,2 148,3 145,3 159,2 160,2 160,10 159,10 166,2 168,2 168,16 166,16 8,3 10,3 10,8 8,8 56,3 58,3 58,7 56,7 64,3 66,3 66,7 64,7 138,3 140,3 140,7 138,7 146,3 149,3 149,5 146,5 160,3 162,3 162,10 160,10 165,3 172,3 172,13 165,13 172,3 188,3 188,4 172,4 218,3 228,3 228,115 218,115 255,3 260,3 260,12 255,12 264,3 269,3 269,12 264,12 10,4 11,4 11,7 10,7 149,4 150,4 150,7 149,7 164,4 172,4 172,13 164,13 178,4 188,4 188,13 178,13 188,4 269,4 269,12 188,12 271,4 273,4 273,12 271,12 11,5 12,5 12,7 11,7 146,5 148,5 148,7 146,7 150,5 151,5 151,7 150,7 163,5 172,5 172,12 163,12 172,5 173,5 173,11 172,11 269,5 273,5 273,11 269,11 12,6 14,6 14,8 12,8 151,6 173,6 173,10 151,10 2,7 3,7 3,10 2,10 7,7 9,7 9,9 7,9 14,7 18,7 18,11 14,11 57,7 59,7 59,10 57,10 63,7 65,7 65,10 63,10 139,7 141,7 141,10 139,10 145,7 147,7 147,10 145,10 3,8 8,8 8,10 3,10 13,8 51,8 51,9 13,9 59,8 65,8 65,10 59,10 141,8 147,8 147,10 141,10 173,8 174,8 174,10 173,10 0,9 1,9 1,25 0,25 51,9 81,9 81,10 51,10 133,9 174,9 174,10 133,10 4,10 7,10 7,11 4,11 13,10 18,10 18,11 13,11 141,10 143,10 143,11 141,11 150,10 154,10 154,11 150,11 160,10 161,10 161,13 160,13 162,10 173,10 173,11 162,11 5,11 7,11 7,12 5,12 12,11 14,11 14,12 12,12 17,11 19,11 19,13 17,13 142,11 145,11 145,12 142,12 149,11 151,11 151,12 149,12 153,11 155,11 155,13 153,13 159,11 161,11 161,13 159,13 6,12 8,12 8,13 6,13 11,12 13,12 13,13 11,13 19,12 20,12 20,14 19,14 143,12 145,12 145,13 143,13 148,12 150,12 150,13 148,13 172,12 188,12 188,13 172,13 7,13 9,13 9,116 7,116 10,13 12,13 12,14 10,14 20,13 21,13 21,116 20,116 116,13 126,13 126,115 116,115 144,13 148,13 148,16 144,16 148,13 149,13 149,14 148,14 154,13 156,13 156,14 154,14 158,13 160,13 160,14 158,14 165,13 170,13 170,14 165,14 9,14 11,14 11,116 9,116 21,14 22,14 22,116 21,116 24,14 64,14 64,107 24,107 65,14 75,14 75,115 65,115 75,14 105,14 105,15 75,15 137,14 147,14 147,115 137,115 155,14 159,14 159,16 155,16 168,14 177,14 177,115 168,115 190,14 201,14 201,115 190,115 201,14 214,14 214,15 201,15 1,15 11,15 11,104 1,104 14,15 16,15 16,116 14,116 18,15 75,15 75,107 18,107 81,15 83,15 83,17 81,17 83,15 89,15 89,16 83,16 95,15 147,15 147,115 95,115 148,15 150,15 150,17 148,17 153,15 155,15 155,17 153,17 159,15 161,15 161,17 159,17 164,15 166,15 166,17 164,17 177,15 201,15 201,115 177,115 207,15 209,15 209,17 207,17 209,15 215,15 215,16 209,16 16,16 75,16 75,107 16,107 80,16 82,16 82,22 80,22 87,16 90,16 90,17 87,17 150,16 151,16 151,18 150,18 152,16 154,16 154,22 152,22 163,16 166,16 166,17 163,17 167,16 201,16 201,115 167,115 206,16 208,16 208,22 206,22 213,16 216,16 216,17 213,17 11,17 13,17 13,116 11,116 88,17 90,17 90,21 88,21 151,17 154,17 154,18 151,18 160,17 162,17 162,21 160,21 162,17 164,17 164,18 162,18 214,17 216,17 216,23 214,23 205,18 208,18 208,21 205,21 230,18 236,18 236,115 230,115 239,18 245,18 245,115 239,115 247,18 258,18 258,115 247,115 258,18 271,18 271,19 258,19 13,19 75,19 75,107 13,107 204,19 208,19 208,21 204,21 228,19 258,19 258,115 228,115 264,19 266,19 266,21 264,21 266,19 272,19 272,20 266,20 78,20 82,20 82,21 78,21 90,20 92,20 92,21 90,21 150,20 154,20 154,21 150,21 162,20 164,20 164,21 162,21 202,20 204,20 204,22 202,22 263,20 265,20 265,26 263,26 270,20 273,20 273,21 270,21 76,21 78,21 78,23 76,23 78,21 79,21 79,22 78,22 82,21 83,21 83,23 82,23 87,21 89,21 89,23 87,23 91,21 94,21 94,22 91,22 148,21 150,21 150,23 148,23 150,21 151,21 151,22 150,22 154,21 155,21 155,23 154,23 159,21 161,21 161,23 159,23 163,21 166,21 166,22 163,22 201,21 203,21 203,23 201,23 208,21 209,21 209,24 208,24 213,21 258,21 258,23 213,23 271,21 273,21 273,27 271,27 75,22 78,22 78,23 75,23 81,22 89,22 89,23 81,23 92,22 150,22 150,23 92,23 153,22 161,22 161,23 153,23 164,22 203,22 203,23 164,23 207,22 258,22 258,23 207,23 262,22 265,22 265,25 262,25 75,23 76,23 76,115 75,115 83,23 87,23 87,24 83,24 94,23 148,23 148,115 94,115 155,23 159,23 159,24 155,24 166,23 202,23 202,115 166,115 209,23 212,23 212,25 209,25 212,23 214,23 214,24 212,24 215,23 258,23 258,115 215,115 261,23 265,23 265,25 261,25 76,24 77,24 77,115 76,115 82,24 84,24 84,25 82,25 86,24 88,24 88,25 86,25 93,24 149,24 149,115 93,115 154,24 156,24 156,25 154,25 158,24 160,24 160,25 158,25 165,24 203,24 203,115 165,115 259,24 261,24 261,26 259,26 77,25 78,25 78,115 77,115 81,25 83,25 83,27 81,27 87,25 89,25 89,27 87,27 92,25 150,25 150,115 92,115 153,25 155,25 155,27 153,27 159,25 161,25 161,27 159,27 164,25 204,25 204,115 164,115 209,25 211,25 211,26 209,26 258,25 260,25 260,27 258,27 265,25 266,25 266,28 265,28 270,25 273,25 273,27 270,27 78,26 79,26 79,115 78,115 91,26 151,26 151,115 91,115 163,26 205,26 205,115 163,115 208,26 210,26 210,27 208,27 264,26 273,26 273,27 264,27 79,27 82,27 82,115 79,115 88,27 89,27 89,115 88,115 90,27 154,27 154,115 90,115 160,27 161,27 161,115 160,115 162,27 206,27 206,115 162,115 207,27 209,27 209,115 207,115 258,27 259,27 259,109 258,109 266,27 269,27 269,29 266,29 269,27 271,27 271,28 269,28 272,27 273,27 273,42 272,42 89,28 154,28 154,115 89,115 161,28 209,28 209,115 161,115 259,28 260,28 260,106 259,106 82,29 258,29 258,115 82,115 260,29 261,29 261,105 260,105 266,29 268,29 268,30 266,30 261,30 262,30 262,104 261,104 265,30 267,30 267,31 265,31 262,31 263,31 263,103 262,103 264,31 266,31 266,103 264,103 263,32 266,32 266,102 263,102 266,33 273,33 273,42 266,42 266,42 272,42 272,101 266,101 272,91 273,91 273,114 272,114 265,103 267,103 267,104 265,104 2,104 36,104 36,116 2,116 266,104 268,104 268,108 266,108 268,105 269,105 269,108 268,108 0,106 36,106 36,116 0,116 265,106 271,106 271,108 265,108 42,107 44,107 44,109 42,109 44,107 50,107 50,108 44,108 56,107 66,107 66,116 56,116 259,107 260,107 260,110 259,110 264,107 266,107 266,109 264,109 271,107 273,107 273,114 271,114 48,108 50,108 50,109 48,109 260,108 261,108 261,110 260,110 263,108 265,108 265,114 263,114 270,108 273,108 273,109 270,109 41,109 43,109 43,113 41,113 49,109 51,109 51,113 49,113 261,109 265,109 265,111 261,111 262,111 265,111 265,112 262,112 42,113 44,113 44,116 42,116 48,113 50,113 50,116 48,116 265,113 266,113 266,116 265,116 270,113 272,113 272,115 270,115 44,114 50,114 50,116 44,116 264,114 271,114 271,116 264,116 36,115 66,115 66,116 36,116 248,115 271,115 271,116 248,116\n\n\n\n[WindowShade]\n\nNumPoints=4,4,4,4,4,4,4,4,4\nPointList=8,3 18,3 18,13 8,13 78,3 192,3 192,13 78,13 245,3 250,3 250,12 245,12 255,3 260,3 260,12 255,12 265,3 270,3 270,12 265,12 2,4 4,4 4,12 2,12 6,4 271,4 271,12 6,12 273,4 275,4 275,12 273,12 4,5 275,5 275,11 4,11\n\n\n[EqualizerWS]\n\nNumPoints=4,4,4,4,4,4,4,4,4\nPointList=4,3 29,3 29,13 4,13 48,3 60,3 60,13 48,13 158,3 164,3 164,13 158,13 209,3 249,3 249,13 209,13 255,3 260,3 260,12 255,12 265,3 270,3 270,12 265,12 29,4 271,4 271,12 29,12 273,4 275,4 275,12 273,12 271,5 275,5 275,11 271,11"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/region_empty_sections.txt",
    "content": "[Normal]\n; This region info generated by Winamp region.txt generator which is made by Maxim.\n; http://winamp.mwos.cjb.net\n; Note to skin authors: You can remove these comments so long as you leave one copy of the two lines above.\nNumPoints=8,4,6\nPointList= 1,0 275,0 275,115 1,115\n\n\n\n\n[Equalizer]\nNumPoints=12\nPointList= 0,0 0,115 20,20 274,115 274,0\n\n\n[WindowShade]\n\n\n\n[EqualizerWS]\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/region_eva.txt",
    "content": ";Regions for EVA unit-02 Skin!\n;(c) Jasterz 2004\n[Normal]\nNumPoints=36\nPointList=9,0 9,3 2,3 0,5 0,104 2,107 4,107 4,116 17,116 17,107 129,107 129,116 183,116 183,107 237,107 237,116 270,116 270,107 272,107 275,104 275,5 273,3 271,3 272,4 266,4 266,3 261,3 262,4 256,4 256,3 251,3 252,4 246,4 246,3 243,3 243,0\n\n[WindowShade]\nNumPoints=26\nPointList=9,0 9,3 2,3 0,5 0,14 275,14 275,5 273,3 271,3 271,4 266,4 266,3 261,3 261,4 256,4 256,3 251,3 251,4 246,4 246,3 243,3 243,0 157,0 157,3 130,3 130,0\n\n[Equalizer]\nNumPoints=18\nPointList=4,0 4,3 2,3 0,5 0,116 275,116 275,5 273,3 270,3 270,0 237,0 237,3 183,3 183,0 129,0 129,3 17,3 17,0"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/region_ituned.txt",
    "content": "[Normal] \nNumPoints = 4,4,4,4,4,4,4,4,4,4\nPointList = 5,0, 269,0, 269,116, 5,116, 3,1 5,1, 5,115, 3,115,  2,2, 4,2, 4,114, 2,114, 1,3, 4,3, 4,113, 1,113, 0,5, 5,5, 5,111, 0,111, 267,1, 271,1 271,115, 267,115, 267,2, 272,2, 272,114, 267,114, 267,3, 273,3, 273,113, 267,113, 267,4, 274,4, 274,112, 267,112, 267,6, 275,6, 275,111, 267,111,\n\n[Equalizer] \nNumPoints = 4,4,4,4,4,4,4,4,4,4\nPointList = 5,0, 269,0, 269,116, 5,116, 3,1 5,1, 5,115, 3,115,  2,2, 4,2, 4,114, 2,114, 1,3, 4,3, 4,113, 1,113, 0,5, 5,5, 5,111, 0,111, 267,1, 271,1 271,115, 267,115, 267,2, 272,2, 272,114, 267,114, 267,3, 273,3, 273,113, 267,113, 267,4, 274,4, 274,112, 267,112, 267,6, 275,6, 275,111, 267,111,                   \n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/region_leading_comma.txt",
    "content": "[Normal]\nNumPoints=12\nPointList=,5,0, 3,1, 2,2 1,3, 0,5, 0,116, 275,116, 275,6, 274,3, 273,2 272,1, 270,0\n\n[EQUALIZER]\nNumPoints=12\nPointList=,5,0, 3,1, 2,2 1,3, 0,5, 0,116, 275,116, 275,6, 274,3, 273,2 272,1, 270,0\n\n[WindowShade]\nNumPoints=12\nPointList=,5,0, 3,1, 2,2 1,3, 0,5, 0,14, 275,14, 275,6, 274,3, 273,2 272,1, 270,0\n\n[EqualizerWS]\nNumPoints=12\nPointList=,5,0, 3,1, 2,2 1,3, 0,5, 0,14, 275,14, 275,6, 274,3, 273,2 272,1, 270,0"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/region_satellite.txt",
    "content": "[Normal]\n; This region info generated by Winamp region.txt generator which is made by Maxim.\n; http://winamp.mwos.cjb.net\nNumPoints=4,4,4,4\nPointList=4,0 271,0 271,116 4,116 2,1 273,1 273,116 2,116 1,2 274,2 274,116 1,116 0,4 275,4 275,116 0,116\n"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/balance.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 40,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/double-mode.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": true,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": true,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/equalizer-band.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 100,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/equalizer-on.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": false,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 10\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/focused-window.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"equalizer\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/llama-mode.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": true,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/main-window-position.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 100,\n                    \"y\": 100\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/repeat.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": true\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/shuffle.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": true,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/volume.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 50,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/window-hidden.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": true,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/window-open.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": false,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/window-positions-are-relative.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": false,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 100,\n                    \"y\": 100\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/window-shade.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": true,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/serializedState/v1/window-size.json",
    "content": "{\n    \"version\": 1,\n    \"media\": {\n        \"volume\": 78,\n        \"balance\": 0,\n        \"shuffle\": false,\n        \"repeat\": false\n    },\n    \"equalizer\": {\n        \"on\": true,\n        \"auto\": false,\n        \"sliders\": {\n            \"60\": 50,\n            \"170\": 50,\n            \"310\": 50,\n            \"600\": 50,\n            \"1000\": 50,\n            \"3000\": 50,\n            \"6000\": 50,\n            \"12000\": 50,\n            \"14000\": 50,\n            \"16000\": 50,\n            \"preamp\": 50\n        }\n    },\n    \"display\": {\n        \"visualizerStyle\": 0,\n        \"doubled\": false,\n        \"llama\": false,\n        \"marqueeStep\": 0,\n        \"skinImages\": {\n            \"EQ_PREAMP_LINE\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n            \"EQ_GRAPH_LINE_COLORS\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n        },\n        \"skinCursors\": null,\n        \"skinRegion\": {},\n        \"skinGenLetterWidths\": null,\n        \"skinColors\": [\n            \"rgb(0,0,0)\",\n            \"rgb(24,33,41)\",\n            \"rgb(239,49,16)\",\n            \"rgb(206,41,16)\",\n            \"rgb(214,90,0)\",\n            \"rgb(214,102,0)\",\n            \"rgb(214,115,0)\",\n            \"rgb(198,123,8)\",\n            \"rgb(222,165,24)\",\n            \"rgb(214,181,33)\",\n            \"rgb(189,222,41)\",\n            \"rgb(148,222,33)\",\n            \"rgb(41,206,16)\",\n            \"rgb(50,190,16)\",\n            \"rgb(57,181,16)\",\n            \"rgb(49,156,8)\",\n            \"rgb(41,148,0)\",\n            \"rgb(24,132,8)\",\n            \"rgb(255,255,255)\",\n            \"rgb(214,214,222)\",\n            \"rgb(181,189,189)\",\n            \"rgb(160,170,175)\",\n            \"rgb(148,156,165)\",\n            \"rgb(150,150,150)\"\n        ],\n        \"skinPlaylistStyle\": null\n    },\n    \"windows\": {\n        \"positionsAreRelative\": true,\n        \"genWindows\": {\n            \"main\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"equalizer\": {\n                \"size\": [\n                    0,\n                    0\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            },\n            \"playlist\": {\n                \"size\": [\n                    4,\n                    5\n                ],\n                \"open\": true,\n                \"hidden\": false,\n                \"shade\": false,\n                \"position\": {\n                    \"x\": 0,\n                    \"y\": 0\n                }\n            }\n        },\n        \"focused\": \"main\"\n    }\n}"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/viscolor_green_dimension.txt",
    "content": "0,0,0,\n0,0,0,\n0,50,0,\n0,56,0,\n0,63,0,\n0,70,0,\n0,76,0,\n0,83,0,\n0,89,0,\n0,96,0,\n0,103,0,\n0,109,0,\n0,116,0,\n0,123,0,\n0,129,0,\n0,136,0,\n0,143,0,\n0,150,0,\n0,63,0,\n0,76,0,\n0,96,0,\n0,116,0,\n0,150,0,\n0,255,0,\n\n\nThis file Was Modified by Winamp Vis Toolkit\nby Andrew Mackowski\nhttp://home.pacbell.net/mackowsk"
  },
  {
    "path": "webamp/packages/webamp/js/__tests__/fixtures/viscolor_valgaav.txt",
    "content": " 98 111 123 // color 0 = background\n 98 111 123 // color 1 = dots\n 21  21  21 // 2 = top of spec\n223 176 176 // 16\n218 168 168 // 15 \n211 158 158 // 14\n204 147 147 // 13\n198 137 137 // 12\n191 127 127 // 11\n185 117 117 // 10\n178 107 107 // 9\n172 97 97 // 8\n165 86 86 // 7\n158 76 76 // 6\n152 66 66 // 5\n145 56 56 // 4\n138 46 46 // 3\n138 46 46 // 17 = bottom of spec\n138 46 46 // 18 = osc 1\n158 76 76 // 19 = osc 2\n178 107 107 // 20 = osc 3\n198 137 137 // 21 = osc4\n218 168 168 // 22 = osc5\n223 176 176 // 23 = analyzer peak dots\n \n\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/equalizer.ts",
    "content": "import { BANDS } from \"../constants\";\n\nimport {\n  SET_EQ_ON,\n  SET_EQ_OFF,\n  SET_BAND_VALUE,\n  SET_EQ_AUTO,\n} from \"../actionTypes\";\nimport { Band, Thunk, Action } from \"../types\";\n\nconst BAND_SNAP_DISTANCE = 50; // 5 in old scale (0-100), now 50 in new scale (0-2400) to maintain same snap distance in dB\nconst BAND_MID_POINT_VALUE = 1200; // 50 in old scale (0-100), now 1200 in new scale (0-2400)\n\nfunction _snapBandValue(value: number): number {\n  if (\n    value < BAND_MID_POINT_VALUE + BAND_SNAP_DISTANCE &&\n    value > BAND_MID_POINT_VALUE - BAND_SNAP_DISTANCE\n  ) {\n    return BAND_MID_POINT_VALUE;\n  }\n  // Round to nearest 0.1 dB step (value divisible by 1)\n  return Math.round(value);\n}\n\nexport function setEqBand(band: Band, value: number): Action {\n  return { type: SET_BAND_VALUE, band, value: _snapBandValue(value) };\n}\n\nfunction _setEqTo(value: number): Thunk {\n  return (dispatch) => {\n    Object.values(BANDS).forEach((band) => {\n      dispatch({\n        type: SET_BAND_VALUE,\n        value,\n        band: band,\n      });\n    });\n  };\n}\n\nexport function setEqToMax(): Thunk {\n  return _setEqTo(2400);\n}\n\nexport function setEqToMid(): Thunk {\n  return _setEqTo(1200);\n}\n\nexport function setEqToMin(): Thunk {\n  return _setEqTo(0);\n}\n\nexport function setPreamp(value: number): Action {\n  return { type: SET_BAND_VALUE, band: \"preamp\", value: _snapBandValue(value) };\n}\n\nexport function toggleEq(): Thunk {\n  return (dispatch, getState) => {\n    if (getState().equalizer.on) {\n      dispatch({ type: SET_EQ_OFF });\n    } else {\n      dispatch({ type: SET_EQ_ON });\n    }\n  };\n}\n\nexport function toggleEqAuto(): Thunk {\n  return (dispatch) => {\n    // We don't actually support this feature yet so don't let the user ever turn it on.\n    // dispatch({ type: SET_EQ_AUTO, value: !getState().equalizer.auto });\n    dispatch({ type: SET_EQ_AUTO, value: false });\n  };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/files.ts",
    "content": "import { parser, creator } from \"winamp-eqf\";\nimport { BANDS, LOAD_STYLE } from \"../constants\";\n\nimport * as Utils from \"../utils\";\n\nimport {\n  promptForFileReferences,\n  genArrayBufferFromFileReference,\n  genMediaDuration,\n  genMediaTags,\n} from \"../fileUtils\";\nimport skinParser from \"../skinParser\";\nimport {\n  getTracks,\n  getUserTracks,\n  getTrackIsVisibleFunction,\n  getEqfData,\n  getPlaylistURL,\n} from \"../selectors\";\n\nimport {\n  ADD_TRACK_FROM_URL,\n  PLAY_TRACK,\n  BUFFER_TRACK,\n  SET_MEDIA_TAGS,\n  SET_MEDIA_DURATION,\n  MEDIA_TAG_REQUEST_INITIALIZED,\n  MEDIA_TAG_REQUEST_FAILED,\n  SET_SKIN_DATA,\n  LOADED,\n  LOADING,\n} from \"../actionTypes\";\nimport LoadQueue from \"../loadQueue\";\n\nimport { removeAllTracks } from \"./playlist\";\nimport { setPreamp, setEqBand } from \"./equalizer\";\nimport {\n  LoadStyle,\n  Thunk,\n  Track,\n  EqfPreset,\n  SkinData,\n  WindowId,\n} from \"../types\";\n\nconst { ipcRenderer } = window.require('electron');\n\n// Lower is better\nconst DURATION_VISIBLE_PRIORITY = 5;\nconst META_DATA_VISIBLE_PRIORITY = 10;\nconst DURATION_PRIORITY = 15;\nconst META_DATA_PRIORITY = 20;\n\nconst loadQueue = new LoadQueue({ threads: 4 });\n\nexport function addTracksFromReferences(\n  fileReferences: FileList,\n  loadStyle: LoadStyle,\n  atIndex: number | undefined\n): Thunk {\n  const tracks: Track[] = Array.from(fileReferences).map((file) => ({\n    blob: file,\n    defaultName: file.name,\n  }));\n  return loadMediaFiles(tracks, loadStyle, atIndex);\n}\n\nconst SKIN_FILENAME_MATCHER = new RegExp(\"(wsz|zip)$\", \"i\");\nconst EQF_FILENAME_MATCHER = new RegExp(\"eqf$\", \"i\");\nexport function loadFilesFromReferences(\n  fileReferences: FileList,\n  loadStyle: LoadStyle = LOAD_STYLE.PLAY,\n  atIndex: number | undefined = undefined\n): Thunk {\n  return (dispatch) => {\n    if (fileReferences.length < 1) {\n      return;\n    } else if (fileReferences.length === 1) {\n      const fileReference = fileReferences[0];\n      if (SKIN_FILENAME_MATCHER.test(fileReference.name)) {\n        dispatch(setSkinFromBlob(fileReference));\n        return;\n      } else if (EQF_FILENAME_MATCHER.test(fileReference.name)) {\n        dispatch(setEqFromFileReference(fileReference));\n        return;\n      }\n    }\n    dispatch(addTracksFromReferences(fileReferences, loadStyle, atIndex));\n  };\n}\n\nexport function setSkinFromBlob(blob: Blob | Promise<Blob>): Thunk {\n  return async (dispatch, getState, { requireJSZip }) => {\n    if (!requireJSZip) {\n      alert(\"Yaamp has not been configured to support custom skins.\");\n      return;\n    }\n    dispatch({ type: LOADING });\n    let JSZip;\n    try {\n      JSZip = await requireJSZip();\n    } catch (e) {\n      console.error(e);\n      dispatch({ type: LOADED });\n      alert(\"Failed to load the skin parser.\");\n      return;\n    }\n    try {\n      const skinData = await skinParser(blob, JSZip);\n\n      ipcRenderer.invoke(\"setSkin\", {link: JSON.stringify(skinData)}).then(() => {})\n\n      dispatch({\n        type: SET_SKIN_DATA,\n        data: {\n          skinImages: skinData.images,\n          skinColors: skinData.colors,\n          skinPlaylistStyle: skinData.playlistStyle,\n          skinCursors: skinData.cursors,\n          skinRegion: skinData.region,\n          skinGenLetterWidths: skinData.genLetterWidths,\n          skinGenExColors: skinData.genExColors,\n        } as SkinData,\n      });\n    } catch (e) {\n      console.error(e);\n      dispatch({ type: LOADED });\n      alert(`Failed to parse skin`);\n    }\n  };\n}\n\nexport function setSkinFromClient(data: string): Thunk {\n  return async (dispatch, getState, { requireJSZip }) => {\n    if (!requireJSZip) {\n      alert(\"Yaamp has not been configured to support custom skins.\");\n      return;\n    }\n    dispatch({ type: LOADING });\n    let JSZip;\n    try {\n      JSZip = await requireJSZip();\n    } catch (e) {\n      console.error(e);\n      dispatch({ type: LOADED });\n      alert(\"Failed to load the skin parser.\");\n      return;\n    }\n    try {\n      const skinData = JSON.parse(data);\n\n      dispatch({\n        type: SET_SKIN_DATA,\n        data: {\n          skinImages: skinData.images,\n          skinColors: skinData.colors,\n          skinPlaylistStyle: skinData.playlistStyle,\n          skinCursors: skinData.cursors,\n          skinRegion: skinData.region,\n          skinGenLetterWidths: skinData.genLetterWidths,\n          skinGenExColors: skinData.genExColors,\n        } as SkinData,\n      });\n    } catch (e) {\n      console.error(e);\n      dispatch({ type: LOADED });\n      alert(`Failed to parse skin`);\n      ipcRenderer.invoke(\"deleteSkin\").then(() => {})\n    }\n  };\n}\n\nexport function setSkinFromUrl(url: string): Thunk {\n  return async (dispatch) => {\n    dispatch({ type: LOADING });\n    try {\n      const response = await fetch(url);\n      if (!response.ok) {\n        throw new Error(response.statusText);\n      }\n      dispatch(setSkinFromBlob(response.blob()));\n    } catch (e) {\n      console.error(e);\n      dispatch({ type: LOADED });\n      alert(`Failed to download skin from ${url}`);\n    }\n  };\n}\n\n// This function is private, since Winamp consumers can provide means for\n// opening files via other methods. Only use the file type specific\n// versions below, since they can defer to the user-defined behavior.\nfunction _openFileDialog(\n  accept: string | null,\n  expectedType: \"SKIN\" | \"MEDIA\" | \"EQ\"\n): Thunk {\n  return async (dispatch) => {\n    const fileReferences = await promptForFileReferences({ accept });\n    dispatch({\n      type: \"OPENED_FILES\",\n      expectedType,\n      count: fileReferences.length,\n      firstFileName: fileReferences[0]?.name,\n    });\n    dispatch(loadFilesFromReferences(fileReferences));\n  };\n}\n\nexport function openEqfFileDialog(): Thunk {\n  return _openFileDialog(\".eqf\", \"EQ\");\n}\n\nexport function openMediaFileDialog(): Thunk {\n  return _openFileDialog(\".mp3\", \"MEDIA\");\n}\n\nexport function openSkinFileDialog() {\n  return _openFileDialog(\".zip, .wsz\", \"SKIN\");\n}\n\nexport function fetchMediaDuration(url: string, id: number): Thunk {\n  return (dispatch, getState) => {\n    loadQueue.push(\n      async () => {\n        try {\n          const duration = await genMediaDuration(url);\n          dispatch({ type: SET_MEDIA_DURATION, duration, id });\n        } catch (e) {\n          // TODO: Should we update the state to indicate that we don't know the length?\n        }\n      },\n\n      () => {\n        const trackIsVisible = getTrackIsVisibleFunction(getState());\n        return trackIsVisible(id)\n          ? DURATION_VISIBLE_PRIORITY\n          : DURATION_PRIORITY;\n      }\n    );\n  };\n}\n\nexport function loadMedia(\n  e: React.DragEvent<HTMLDivElement>,\n  loadStyle: LoadStyle = LOAD_STYLE.NONE,\n  atIndex = 0\n): Thunk {\n  const { files } = e.dataTransfer;\n  return async (dispatch, getState, { handleTrackDropEvent }) => {\n    if (handleTrackDropEvent) {\n      const tracks = await handleTrackDropEvent(e);\n\n      if (tracks != null) {\n        dispatch(loadMediaFiles(tracks, loadStyle, atIndex));\n        return;\n      }\n    }\n    dispatch(loadFilesFromReferences(files, loadStyle, atIndex));\n  };\n}\n\nexport function loadMediaFiles(\n  tracks: Track[],\n  loadStyle: LoadStyle = LOAD_STYLE.NONE,\n  atIndex = 0\n): Thunk {\n  return (dispatch) => {\n    if (loadStyle === LOAD_STYLE.PLAY) {\n      // I'm the worst. It just so happens that in every case that we autoPlay,\n      // we should also clear all tracks.\n      dispatch(removeAllTracks());\n    }\n    tracks.forEach((track, i) => {\n      const priority = i === 0 ? loadStyle : LOAD_STYLE.NONE;\n      dispatch(loadMediaFile(track, priority, atIndex + i));\n    });\n  };\n}\n\nexport function loadMediaFile(\n  track: Track,\n  priority: LoadStyle = LOAD_STYLE.NONE,\n  atIndex = 0\n): Thunk {\n  return (dispatch) => {\n    const id = Utils.uniqueId();\n    const { defaultName, metaData, duration } = track;\n    let canonicalUrl: string;\n    if (\"url\" in track) {\n      canonicalUrl = track.url.toString();\n    } else if (\"blob\" in track) {\n      canonicalUrl = URL.createObjectURL(track.blob);\n    } else {\n      throw new Error(\"Expected track to have either a blob or a url\");\n    }\n\n    dispatch({\n      type: ADD_TRACK_FROM_URL,\n      url: canonicalUrl,\n      duration: track.duration,\n      defaultName,\n      id,\n      atIndex,\n    });\n    switch (priority) {\n      case LOAD_STYLE.BUFFER:\n        dispatch({ type: BUFFER_TRACK, id });\n        break;\n      case LOAD_STYLE.PLAY:\n        dispatch({ type: PLAY_TRACK, id });\n        break;\n      case LOAD_STYLE.NONE:\n      default:\n        // If we're not going to load this right away,\n        // we should set duration on our own\n        if (duration != null) {\n          dispatch({ type: SET_MEDIA_DURATION, duration, id });\n        } else {\n          dispatch(fetchMediaDuration(canonicalUrl, id));\n        }\n    }\n\n    if (metaData != null) {\n      const { artist, title, album } = metaData;\n      dispatch({\n        type: SET_MEDIA_TAGS,\n        artist,\n        title,\n        album,\n        // For now, we lie about these next three things.\n        // TODO: Ideally we would leave these as null and force a media data\n        // fetch when the user starts playing.\n        sampleRate: 44000,\n        bitrate: 320000,\n        numberOfChannels: 2,\n        id,\n      });\n    } else if (\"blob\" in track) {\n      // Blobs can be loaded quickly\n      dispatch(fetchMediaTags(track.blob, id));\n    } else {\n      dispatch(queueFetchingMediaTags(id));\n    }\n  };\n}\n\nfunction queueFetchingMediaTags(id: number): Thunk {\n  return (dispatch, getState) => {\n    const track = getTracks(getState())[id];\n    loadQueue.push(\n      () => dispatch(fetchMediaTags(track.url, id)),\n      () => {\n        const trackIsVisible = getTrackIsVisibleFunction(getState());\n        return trackIsVisible(id)\n          ? META_DATA_VISIBLE_PRIORITY\n          : META_DATA_PRIORITY;\n      }\n    );\n  };\n}\n\nexport function fetchMediaTags(file: string | Blob, id: number): Thunk {\n  return async (dispatch, getState, { requireMusicMetadata }) => {\n    dispatch({ type: MEDIA_TAG_REQUEST_INITIALIZED, id });\n\n    try {\n      const metadata = await genMediaTags(file, await requireMusicMetadata());\n      // There's more data here, but we don't have a use for it yet:\n      const { artist, title, album, picture } = metadata.common;\n      const { numberOfChannels, bitrate, sampleRate } = metadata.format;\n      let albumArtUrl = null;\n      if (picture && picture.length >= 1) {\n        const byteArray = new Uint8Array(picture[0].data);\n        const blob = new Blob([byteArray], { type: picture[0].format });\n        albumArtUrl = URL.createObjectURL(blob);\n      }\n      dispatch({\n        type: SET_MEDIA_TAGS,\n        artist: artist ? artist : \"\",\n        title: title ? title : \"\",\n        album,\n        albumArtUrl,\n        numberOfChannels,\n        bitrate,\n        sampleRate,\n        id,\n      });\n    } catch (e) {\n      dispatch({ type: MEDIA_TAG_REQUEST_FAILED, id });\n    }\n  };\n}\n\nexport function setEqFromFileReference(fileReference: File): Thunk {\n  return async (dispatch) => {\n    const arrayBuffer = await genArrayBufferFromFileReference(fileReference);\n    const eqf = parser(arrayBuffer);\n    const preset: EqfPreset = eqf.presets[0];\n    dispatch(setEqFromObject(preset));\n  };\n}\n\nexport function setEqFromClient(data: string): Thunk {\n  return async (dispatch) => {\n    const eqf = JSON.parse(data);\n    const preset: EqfPreset = eqf.presets[0];\n    dispatch(setEqFromObject(preset));\n  };\n}\n\nexport function setEqFromObject(preset: EqfPreset): Thunk {\n  return (dispatch) => {\n    dispatch(setPreamp(Utils.normalizeEqBand(preset.preamp)));\n    BANDS.forEach((band) => {\n      // @ts-ignore band and EqfPreset align\n      dispatch(setEqBand(band, Utils.normalizeEqBand(preset[`hz${band}`])));\n    });\n  };\n}\n\nexport function downloadPreset(): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const data = getEqfData(state);\n    console.log(data);\n    const arrayBuffer = creator(data);\n    // const base64 = Utils.base64FromArrayBuffer(arrayBuffer);\n    // const dataURI = `data:application/zip;base64,${base64}`;\n    ipcRenderer.invoke(\"setEQ\", { link: JSON.stringify(data) }).then(() => {})\n\n    // Utils.downloadURI(dataURI, \"entry.eqf\");\n  };\n}\n\nexport function downloadHtmlPlaylist(): Thunk {\n  return (dispatch, getState) => {\n    const uri = getPlaylistURL(getState());\n    Utils.downloadURI(uri, \"Winamp Playlist.html\");\n  };\n}\n\nlet el: HTMLInputElement | null = document.createElement(\"input\");\nel.type = \"file\";\n// @ts-ingore\nconst DIR_SUPPORT =\n  // @ts-ignore\n  typeof el.webkitdirectory !== \"undefined\" ||\n  // @ts-ignore\n  typeof el.mozdirectory !== \"undefined\" ||\n  // @ts-ignore\n  typeof el.directory !== \"undefined\";\n// Release our reference\nel = null;\n\nexport function addFilesAtIndex(nextIndex: number): Thunk {\n  return async (dispatch) => {\n    const fileReferences = await promptForFileReferences();\n    dispatch(\n      addTracksFromReferences(fileReferences, LOAD_STYLE.NONE, nextIndex)\n    );\n  };\n}\n\nexport function addDirAtIndex(nextIndex: number): Thunk {\n  return async (dispatch) => {\n    if (!DIR_SUPPORT) {\n      alert(\"Not supported in your browser\");\n      return;\n    }\n    const fileReferences = await promptForFileReferences({ directory: true });\n    dispatch(\n      addTracksFromReferences(fileReferences, LOAD_STYLE.NONE, nextIndex)\n    );\n  };\n}\n\nexport function addFilesFromUrl(atIndex = 0): Thunk {\n  return async (dispatch, getState, { handleAddUrlEvent }) => {\n    if (handleAddUrlEvent) {\n      const tracks = await handleAddUrlEvent();\n\n      if (tracks != null) {\n        dispatch(loadMediaFiles(tracks, LOAD_STYLE.NONE, atIndex));\n        return;\n      }\n    } else {\n      alert(\"Not supported in Yaamp\");\n    }\n  };\n}\n\nexport function addFilesFromList(): Thunk {\n  return async (dispatch, getState, { handleLoadListEvent }) => {\n    if (handleLoadListEvent) {\n      const tracks = await handleLoadListEvent();\n\n      if (tracks != null) {\n        dispatch(removeAllTracks());\n\n        dispatch(loadMediaFiles(tracks, LOAD_STYLE.NONE, 0));\n        return;\n      }\n    } else {\n      alert(\"Not supported in Yaamp\");\n    }\n  };\n}\n\nexport function saveFilesToList(): Thunk {\n  return (dispatch, getState, { handleSaveListEvent }) => {\n    if (handleSaveListEvent) {\n      handleSaveListEvent(getUserTracks(getState()));\n    } else {\n      alert(\"Not supported in Yaamp\");\n    }\n  };\n}\n\nexport function droppedFiles(e: React.DragEvent, windowId: WindowId): Thunk {\n  return (dispatch) =>\n    dispatch({\n      type: \"DROPPED_FILES\",\n      count: e.dataTransfer.files.length,\n      firstFileName: e.dataTransfer.files[0]?.name,\n      windowId,\n    });\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/index.test.js",
    "content": "// TODO: Split these out into individual files.\nimport { BANDS } from \"../constants\";\nimport {\n  STOP,\n  SET_VOLUME,\n  SET_BALANCE,\n  TOGGLE_REPEAT,\n  TOGGLE_SHUFFLE,\n  SET_BAND_VALUE,\n} from \"../actionTypes\";\n\nimport {\n  stop,\n  setVolume,\n  setBalance,\n  toggleRepeat,\n  toggleShuffle,\n  setPreamp,\n  setEqBand,\n  setEqToMax,\n  setEqToMin,\n  setEqToMid,\n} from \"./\";\n\ntest(\"stop\", () => {\n  const expectedAction = { type: STOP };\n  expect(stop()).toEqual(expectedAction);\n});\n\ndescribe(\"setVolume\", () => {\n  it(\"enforces a mimimum value\", () => {\n    const expectedAction = {\n      type: SET_VOLUME,\n      volume: 0,\n    };\n    expect(setVolume(-10)).toEqual(expectedAction);\n  });\n  it(\"enforces a maximum value\", () => {\n    const expectedAction = {\n      type: SET_VOLUME,\n      volume: 100,\n    };\n    expect(setVolume(110)).toEqual(expectedAction);\n  });\n});\n\ndescribe(\"setBalance\", () => {\n  it(\"enforces a mimimum value\", () => {\n    const expectedAction = {\n      type: SET_BALANCE,\n      balance: -100,\n    };\n    expect(setBalance(-110)).toEqual(expectedAction);\n  });\n  it(\"enforces a maximum value\", () => {\n    const expectedAction = {\n      type: SET_BALANCE,\n      balance: 100,\n    };\n    expect(setBalance(110)).toEqual(expectedAction);\n  });\n  it(\"snaps to zero for positive values close to zero\", () => {\n    const expectedAction = {\n      type: SET_BALANCE,\n      balance: 0,\n    };\n    expect(setBalance(24)).toEqual(expectedAction);\n  });\n  it(\"snaps to zero for negative values close to zero\", () => {\n    const expectedAction = {\n      type: SET_BALANCE,\n      balance: 0,\n    };\n    expect(setBalance(-24)).toEqual(expectedAction);\n  });\n});\n\ntest(\"toggleRepeat\", () => {\n  const expectedAction = { type: TOGGLE_REPEAT };\n  expect(toggleRepeat()).toEqual(expectedAction);\n});\n\ntest(\"toggleShuffle\", () => {\n  const expectedAction = { type: TOGGLE_SHUFFLE };\n  expect(toggleShuffle()).toEqual(expectedAction);\n});\n\ntest(\"setPreamp\", () => {\n  const expectedAction = { type: SET_BAND_VALUE, band: \"preamp\", value: 100 };\n  expect(setPreamp(100)).toEqual(expectedAction);\n});\n\ntest(\"setEqBand\", () => {\n  const expectedAction = { type: SET_BAND_VALUE, band: 3, value: 100 };\n  expect(setEqBand(3, 100)).toEqual(expectedAction);\n});\n\ntest(\"setEqToMax\", () => {\n  const mockDispatch = jest.fn();\n  const dispatcher = setEqToMax();\n  dispatcher(mockDispatch);\n  const expectedCalls = BANDS.map((band) => [\n    { type: SET_BAND_VALUE, band, value: 100 },\n  ]);\n  expect(mockDispatch.mock.calls).toEqual(expectedCalls);\n});\n\ntest(\"setEqToMin\", () => {\n  const mockDispatch = jest.fn();\n  const dispatcher = setEqToMin();\n  dispatcher(mockDispatch);\n  const expectedCalls = BANDS.map((band) => [\n    { type: SET_BAND_VALUE, band, value: 0 },\n  ]);\n  expect(mockDispatch.mock.calls).toEqual(expectedCalls);\n});\n\ntest(\"setEqToMid\", () => {\n  const mockDispatch = jest.fn();\n  const dispatcher = setEqToMid();\n  dispatcher(mockDispatch);\n  const expectedCalls = BANDS.map((band) => [\n    { type: SET_BAND_VALUE, band, value: 50 },\n  ]);\n  expect(mockDispatch.mock.calls).toEqual(expectedCalls);\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/index.ts",
    "content": "import {\n  CLOSE_WINAMP,\n  OPEN_WINAMP,\n  STOP,\n  TOGGLE_VISUALIZER_STYLE,\n  CLOSE_REQUESTED,\n  MINIMIZE_WINAMP,\n  SET_FOCUS,\n  UNSET_FOCUS,\n  LOAD_SERIALIZED_STATE,\n  LOAD_DEFAULT_SKIN,\n  SET_MILKDROP_DESKTOP,\n  SET_MILKDROP_FULLSCREEN,\n  SET_MILKDROP_LOCK,\n  TOGGLE_PRESET_OVERLAY,\n  STEP_MARQUEE,\n  SET_BAND_FOCUS,\n} from \"../actionTypes\";\nimport { WINDOWS } from \"../constants\";\nimport { Thunk, Action, Slider } from \"../types\";\nimport { SerializedStateV1 } from \"../serializedStates/v1Types\";\nimport * as Selectors from \"../selectors\";\nimport {\n  ensureWindowsAreOnScreen,\n  showWindow,\n  hideWindow,\n  setFocusedWindow,\n} from \"./windows\";\n\nconst { ipcRenderer } = window.require('electron');\n\nexport {\n  toggleDoubleSizeMode,\n  toggleEqualizerShadeMode,\n  togglePlaylistShadeMode,\n  closeWindow,\n  hideWindow,\n  showWindow,\n  setWindowSize,\n  toggleWindow,\n  updateWindowPositions,\n  toggleMainWindowShadeMode,\n  centerWindowsInContainer,\n  centerWindowsInView,\n  resetWindowSizes,\n  browserWindowSizeChanged,\n  ensureWindowsAreOnScreen,\n  stackWindows,\n  toggleLlamaMode,\n  setFocusedWindow,\n} from \"./windows\";\nexport {\n  play,\n  pause,\n  stop,\n  nextN,\n  next,\n  previous,\n  seekToTime,\n  seekForward,\n  seekBackward,\n  setVolume,\n  playTrack,\n  playTrackNow,\n  adjustVolume,\n  scrollVolume,\n  setBalance,\n  toggleRepeat,\n  toggleShuffle,\n  toggleTimeMode,\n} from \"./media\";\nexport {\n  setEqBand,\n  setEqToMax,\n  setEqToMid,\n  setEqToMin,\n  setPreamp,\n  toggleEq,\n  toggleEqAuto,\n} from \"./equalizer\";\nexport {\n  addTracksFromReferences,\n  loadFilesFromReferences,\n  setSkinFromUrl,\n  setSkinFromClient,\n  setEqFromClient,\n  openEqfFileDialog,\n  openMediaFileDialog,\n  openSkinFileDialog,\n  fetchMediaDuration,\n  loadMedia,\n  loadMediaFiles,\n  loadMediaFile,\n  fetchMediaTags,\n  setEqFromFileReference,\n  downloadPreset,\n  setEqFromObject,\n  downloadHtmlPlaylist,\n  addDirAtIndex,\n  addFilesAtIndex,\n  addFilesFromUrl,\n  addFilesFromList,\n  saveFilesToList,\n  droppedFiles,\n} from \"./files\";\nexport {\n  cropPlaylist,\n  removeSelectedTracks,\n  removeAllTracks,\n  reverseList,\n  randomizeList,\n  sortListByTitle,\n  setPlaylistScrollPosition,\n  scrollNTracks,\n  scrollPlaylistByDelta,\n  scrollUpFourTracks,\n  scrollDownFourTracks,\n  dragSelected,\n  selectAll,\n  selectZero,\n  invertSelection,\n} from \"./playlist\";\nexport {\n  initializePresets,\n  requestPresetAtIndex,\n  selectRandomPreset,\n  selectNextPreset,\n  selectPreset,\n  selectPreviousPreset,\n  appendPresetFileList,\n  handlePresetDrop,\n  loadPresets,\n  toggleRandomizePresets,\n  togglePresetCycling,\n  scheduleMilkdropMessage,\n} from \"./milkdrop\";\n\nexport function close(): Thunk {\n  return (dispatch) => {\n    // TODO: This could probably be improved by adding a \"PREVENT_CLOSE\" action\n    // or something, but this works okay for now.\n    let defaultPrevented = false;\n    const cancel = () => {\n      defaultPrevented = true;\n    };\n    dispatch({ type: CLOSE_REQUESTED, cancel });\n    if (!defaultPrevented) {\n      dispatch({ type: STOP });\n      dispatch({ type: CLOSE_WINAMP });\n    }\n  };\n}\n\nexport function open(): Action {\n  return { type: OPEN_WINAMP };\n}\n\nexport function toggleVisualizerStyle(): Action {\n  return { type: TOGGLE_VISUALIZER_STYLE };\n}\n\nexport function minimize(): Action {\n  return { type: MINIMIZE_WINAMP };\n}\n\nexport function setFocus(input: string): Action {\n  return { type: SET_FOCUS, input };\n}\n\nexport function unsetFocus(): Action {\n  return { type: UNSET_FOCUS };\n}\n\nexport function focusBand(band: Slider): Action {\n  return { type: SET_BAND_FOCUS, input: \"eq\", bandFocused: band };\n}\n\nexport function loadSerializedState(\n  // In the future this type should be the union of all versioned types.\n  serializedState: SerializedStateV1\n): Thunk {\n  return (dispatch) => {\n    dispatch({ type: LOAD_SERIALIZED_STATE, serializedState });\n    dispatch(ensureWindowsAreOnScreen());\n  };\n}\n\nexport function loadDefaultSkin(): Action {\n  return { type: LOAD_DEFAULT_SKIN };\n}\n\nexport function toggleMilkdropDesktop(): Thunk {\n  return (dispatch, getState) => {\n    if (Selectors.getMilkdropDesktopEnabled(getState())) {\n      dispatch(showWindow(WINDOWS.MILKDROP));\n      dispatch({ type: SET_MILKDROP_DESKTOP, enabled: false });\n    } else {\n      dispatch(hideWindow(WINDOWS.MILKDROP));\n      dispatch({ type: SET_MILKDROP_DESKTOP, enabled: true });\n    }\n  };\n}\n\nexport function setMilkdropFullscreen(enabled: boolean): Thunk {\n  return (dispatch, getState) => {\n    dispatch({ type: SET_MILKDROP_FULLSCREEN, enabled });\n    ipcRenderer.invoke('toggle-milkdrop-fullscreen', enabled);\n  };\n}\n\nexport function toggleMilkdropFullscreen(): Thunk {\n  return (dispatch, getState) => {\n    const currentState = Selectors.getMilkdropFullscreenEnabled(getState());\n    dispatch(setMilkdropFullscreen(!currentState));\n  };\n}\n\nexport function setMilkdropLock(enabled: boolean): Thunk {\n  return (dispatch, getState) => {\n    dispatch({ type: SET_MILKDROP_LOCK, enabled });\n  };\n}\n\nexport function toggleMilkdropLock(): Thunk {\n  return (dispatch, getState) => {\n    const currentState = Selectors.getMilkdropLockEnabled(getState());\n    dispatch(setMilkdropLock(!currentState));\n  };\n}\n\nexport function togglePresetOverlay(): Thunk {\n  return (dispatch, getState) => {\n    if (Selectors.getPresetOverlayOpen(getState())) {\n      dispatch(setFocusedWindow(WINDOWS.MILKDROP));\n    }\n\n    dispatch({ type: TOGGLE_PRESET_OVERLAY });\n  };\n}\n\nexport function stepMarquee(): Action {\n  return { type: STEP_MARQUEE };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/media.ts",
    "content": "import { clamp } from \"../utils\";\nimport {\n  SEEK_TO_PERCENT_COMPLETE,\n  SET_BALANCE,\n  SET_VOLUME,\n  STOP,\n  TOGGLE_REPEAT,\n  TOGGLE_SHUFFLE,\n  PLAY,\n  PAUSE,\n  PLAY_TRACK,\n  TOGGLE_TIME_MODE,\n  BUFFER_TRACK,\n  IS_STOPPED,\n} from \"../actionTypes\";\n\nimport { MEDIA_STATUS } from \"../constants\";\nimport { openMediaFileDialog } from \"./\";\nimport { GetState, Dispatch, Thunk, Action } from \"../types\";\nimport * as Selectors from \"../selectors\";\n\nexport function playTrack(id: number): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const isStopped = Selectors.getMediaStatus(state) === MEDIA_STATUS.STOPPED;\n    if (isStopped) {\n      dispatch({ type: BUFFER_TRACK, id });\n    } else {\n      dispatch({ type: PLAY_TRACK, id });\n    }\n  };\n}\n\nexport function playTrackNow(id: number): Action {\n  return { type: PLAY_TRACK, id };\n}\n\nexport function play(): Thunk {\n  return (dispatch: Dispatch, getState: GetState) => {\n    const state = getState();\n    if (\n      state.media.status === MEDIA_STATUS.STOPPED &&\n      state.playlist.currentTrack == null &&\n      state.playlist.trackOrder.length === 0\n    ) {\n      dispatch(openMediaFileDialog());\n    } else {\n      dispatch({ type: PLAY });\n    }\n  };\n}\n\nexport function pause(): Thunk {\n  return (dispatch, getState) => {\n    const { status } = getState().media;\n    if (status === MEDIA_STATUS.PLAYING) {\n      dispatch({ type: PAUSE });\n    } else {\n      dispatch({ type: PLAY });\n    }\n  };\n}\n\nexport function stop(): Action {\n  return { type: STOP };\n}\n\nexport function nextN(n: number): Thunk {\n  return (dispatch, getState) => {\n    const nextTrackId = Selectors.getNextTrackId(getState(), n);\n    if (nextTrackId == null) {\n      dispatch({ type: IS_STOPPED });\n      return;\n    }\n    dispatch(playTrack(nextTrackId));\n  };\n}\n\nexport function next(): Thunk {\n  return nextN(1);\n}\n\nexport function previous(): Thunk {\n  return nextN(-1);\n}\n\nexport function seekToTime(seconds: number): Thunk {\n  return function (dispatch, getState) {\n    const state = getState();\n    const duration = Selectors.getDuration(state);\n    if (duration == null) {\n      return;\n    }\n    dispatch({\n      type: SEEK_TO_PERCENT_COMPLETE,\n      percent: (seconds / duration) * 100,\n    });\n  };\n}\nexport function seekForward(seconds: number): Thunk {\n  return function (dispatch, getState) {\n    const timeElapsed = Selectors.getTimeElapsed(getState());\n    dispatch(seekToTime(timeElapsed + seconds));\n  };\n}\n\nexport function seekBackward(seconds: number): Thunk {\n  return seekForward(-seconds);\n}\n\nexport function setVolume(volume: number): Action {\n  return {\n    type: SET_VOLUME,\n    volume: clamp(volume, 0, 100),\n  };\n}\n\nexport function adjustVolume(volumeDiff: number): Thunk {\n  return (dispatch, getState) => {\n    const currentVolume = getState().media.volume;\n    return dispatch(setVolume(currentVolume + volumeDiff));\n  };\n}\n\nexport function scrollVolume(e: React.WheelEvent<HTMLDivElement>): Thunk {\n  e.preventDefault();\n  return (dispatch, getState) => {\n    const currentVolume = getState().media.volume;\n    // Using pixels as percentage difference here is a bit arbirary, but... oh well.\n    return dispatch(setVolume(currentVolume + e.deltaY));\n  };\n}\n\nexport function setBalance(balance: number): Action {\n  balance = clamp(balance, -100, 100);\n  // The balance clips to the center\n  if (Math.abs(balance) < 25) {\n    balance = 0;\n  }\n  return {\n    type: SET_BALANCE,\n    balance,\n  };\n}\n\nexport function toggleRepeat(): Action {\n  return { type: TOGGLE_REPEAT };\n}\n\nexport function toggleShuffle(): Action {\n  return { type: TOGGLE_SHUFFLE };\n}\n\nexport function toggleTimeMode(): Action {\n  return { type: TOGGLE_TIME_MODE };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/milkdrop.ts",
    "content": "import {\n  GOT_BUTTERCHURN_PRESETS,\n  GOT_BUTTERCHURN,\n  SELECT_PRESET_AT_INDEX,\n  RESOLVE_PRESET_AT_INDEX,\n  PRESET_REQUESTED,\n  TOGGLE_RANDOMIZE_PRESETS,\n  TOGGLE_PRESET_CYCLING,\n  SCHEDULE_MILKDROP_MESSAGE,\n} from \"../actionTypes\";\nimport * as Selectors from \"../selectors\";\nimport {\n  TransitionType,\n  Preset,\n  ButterchurnOptions,\n  StatePreset,\n  Thunk,\n  Action,\n} from \"../types\";\nimport * as FileUtils from \"../fileUtils\";\n// @ts-ignore\nimport butterchurnPresets from 'butterchurn-presets';\n\nfunction normalizePresetTypes(preset: Preset): StatePreset {\n  const { name } = preset;\n  if (\"butterchurnPresetObject\" in preset) {\n    return {\n      type: \"RESOLVED\",\n      name,\n      preset: preset.butterchurnPresetObject,\n    };\n  } else if (\"getButterchrunPresetObject\" in preset) {\n    return {\n      type: \"UNRESOLVED\",\n      name,\n      getPreset: preset.getButterchrunPresetObject,\n    };\n  } else if (\"butterchurnPresetUrl\" in preset) {\n    return {\n      type: \"UNRESOLVED\",\n      name,\n      getPreset: async () => {\n        const resp = await fetch(preset.butterchurnPresetUrl);\n        return resp.json();\n      },\n    };\n  }\n  throw new Error(\"Invalid preset object\");\n}\n\nexport function initializePresets(presetOptions: ButterchurnOptions): Thunk {\n  return async (dispatch) => {\n    const { getPresets, importButterchurn } = presetOptions;\n    importButterchurn().then((butterchurn) => {\n      dispatch({ type: GOT_BUTTERCHURN, butterchurn: butterchurn.default });\n    });\n\n    const presets = await getPresets();\n    const normalizePresets = presets.map(normalizePresetTypes);\n    dispatch(loadPresets(normalizePresets));\n  };\n}\n\nexport function loadPresets(presets: StatePreset[]): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const presetsLength = state.milkdrop.presets.length;\n    dispatch({ type: GOT_BUTTERCHURN_PRESETS, presets });\n    if (presetsLength === 0 && Selectors.getRandomizePresets(state)) {\n      dispatch(selectRandomPreset());\n    } else {\n      dispatch(\n        requestPresetAtIndex(presetsLength, TransitionType.IMMEDIATE, true)\n      );\n    }\n  };\n}\n\nexport function appendPresetFileList(fileList: FileList): Thunk {\n  return async (dispatch, getState, { convertPreset }) => {\n    const presets = butterchurnPresets.getPresets();\n    dispatch(loadPresets(presets));\n  };\n}\n\nexport function selectNextPreset(\n  transitionType: TransitionType = TransitionType.DEFAULT\n): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    if (Selectors.getRandomizePresets(state)) {\n      return dispatch(selectRandomPreset(transitionType));\n    }\n    const currentPresetIndex = Selectors.getCurrentPresetIndex(state);\n    if (currentPresetIndex == null) {\n      return;\n    }\n    const nextPresetIndex = currentPresetIndex + 1;\n    dispatch(requestPresetAtIndex(nextPresetIndex, transitionType, true));\n  };\n}\n\nexport function selectPreset(\n  presetKey: string,\n  transitionType: TransitionType = TransitionType.DEFAULT\n): Thunk {\n  return (dispatch, getState) => {\n    dispatch({ type: SELECT_PRESET_AT_INDEX, index: presetKey, transitionType });\n    const state = getState();\n    const currentPresetIndex = Selectors.getCurrentPresetIndex(state);\n    console.log(currentPresetIndex);\n  };\n}\n\nexport function selectPreviousPreset(\n  transitionType: TransitionType = TransitionType.DEFAULT\n): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const { presetHistory } = state.milkdrop;\n    if (presetHistory.length < 1) {\n      return;\n    }\n    // Awkward. We do -2 becuase the the last track is the current track.\n    const lastPresetIndex = presetHistory[presetHistory.length - 2];\n\n    dispatch(requestPresetAtIndex(lastPresetIndex, transitionType, false));\n  };\n}\n\nexport function selectRandomPreset(\n  transitionType: TransitionType = TransitionType.DEFAULT\n): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    // TODO: Make this a selector.\n    const randomIndex = Math.floor(\n      Math.random() * state.milkdrop.presets.length\n    );\n    dispatch(requestPresetAtIndex(randomIndex, transitionType, true));\n  };\n}\n\n// TODO: Technically there's a race here. If you request two presets in a row, the\n// first one may resolve before the second.\nexport function requestPresetAtIndex(\n  index: number,\n  transitionType: TransitionType,\n  addToHistory: boolean\n): Thunk {\n  return async (dispatch, getState) => {\n    const state = getState();\n    const preset = state.milkdrop.presets[index];\n    if (preset == null) {\n      // Index might be out of range.\n      return;\n    }\n    dispatch({ type: PRESET_REQUESTED, index, addToHistory });\n    switch (preset.type) {\n      case \"RESOLVED\":\n        dispatch({ type: SELECT_PRESET_AT_INDEX, index, transitionType });\n        return;\n      case \"UNRESOLVED\":\n        const json = await preset.getPreset();\n        // TODO: Ensure that this works correctly even if requests resolve out of order\n        dispatch({ type: RESOLVE_PRESET_AT_INDEX, index, json });\n        dispatch({ type: SELECT_PRESET_AT_INDEX, index, transitionType });\n        return;\n    }\n  };\n}\n\nexport function handlePresetDrop(e: React.DragEvent): Thunk {\n  return appendPresetFileList(e.dataTransfer.files);\n}\n\nexport function toggleRandomizePresets(): Action {\n  return { type: TOGGLE_RANDOMIZE_PRESETS };\n}\n\nexport function togglePresetCycling(): Action {\n  return { type: TOGGLE_PRESET_CYCLING };\n}\n\nexport function scheduleMilkdropMessage(message: string): Action {\n  return { type: SCHEDULE_MILKDROP_MESSAGE, message };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/playlist.ts",
    "content": "import { TRACK_HEIGHT } from \"../constants\";\nimport * as Selectors from \"../selectors\";\n\nimport { clamp, sort, findLastIndex } from \"../utils\";\nimport {\n  STOP,\n  REMOVE_TRACKS,\n  REMOVE_ALL_TRACKS,\n  REVERSE_LIST,\n  RANDOMIZE_LIST,\n  SET_TRACK_ORDER,\n  SET_PLAYLIST_SCROLL_POSITION,\n  DRAG_SELECTED,\n  SELECT_ALL,\n  SELECT_ZERO,\n  INVERT_SELECTION,\n} from \"../actionTypes\";\nimport { Thunk, Action } from \"../types\";\n\nexport function cropPlaylist(): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    if (Selectors.getSelectedTrackObjects(state).length === 0) {\n      return;\n    }\n    const selectedTrackIds = Selectors.getSelectedTrackIds(state);\n    const {\n      playlist: { trackOrder },\n    } = state;\n    dispatch({\n      type: REMOVE_TRACKS,\n      // @ts-ignore The keys are numbers, but TypeScript does not trust us.\n      // https://github.com/Microsoft/TypeScript/pull/12253#issuecomment-263132208\n      ids: trackOrder.filter((id) => !selectedTrackIds.has(id)),\n    });\n  };\n}\n\nexport function removeSelectedTracks(): Thunk {\n  return (dispatch, getState) => {\n    dispatch({\n      type: REMOVE_TRACKS,\n      // @ts-ignore The keys are numbers, but TypeScript does not trust us.\n      // https://github.com/Microsoft/TypeScript/pull/12253#issuecomment-263132208\n      ids: Array.from(Selectors.getSelectedTrackIds(getState())),\n    });\n  };\n}\n\nexport function removeAllTracks(): Thunk {\n  return (dispatch) => {\n    // It's a bit funky that we need to do both of these.\n    dispatch({ type: STOP });\n    dispatch({ type: REMOVE_ALL_TRACKS });\n  };\n}\n\nexport function reverseList(): Action {\n  return { type: REVERSE_LIST };\n}\n\nexport function randomizeList(): Action {\n  return { type: RANDOMIZE_LIST };\n}\n\nexport function sortListByTitle(): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const tracks = Selectors.getTracks(state);\n    const trackOrder = sort(Selectors.getTrackOrder(state), (i) =>\n      `${tracks[i].title}`.toLowerCase()\n    );\n    return dispatch({ type: SET_TRACK_ORDER, trackOrder });\n  };\n}\n\nexport function setPlaylistScrollPosition(position: number): Action {\n  return { type: SET_PLAYLIST_SCROLL_POSITION, position };\n}\n\nexport function scrollNTracks(n: number): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const overflow = Selectors.getOverflowTrackCount(state);\n    const currentOffset = Selectors.getScrollOffset(state);\n    const position = overflow ? clamp((currentOffset + n) / overflow, 0, 1) : 0;\n    return dispatch({\n      type: SET_PLAYLIST_SCROLL_POSITION,\n      position: position * 100,\n    });\n  };\n}\n\nexport function scrollPlaylistByDelta(\n  e: React.WheelEvent<HTMLDivElement>\n): Thunk {\n  e.preventDefault();\n  return (dispatch, getState) => {\n    const state = getState();\n    if (Selectors.getOverflowTrackCount(state)) {\n      e.stopPropagation();\n    }\n    const totalPixelHeight = state.playlist.trackOrder.length * TRACK_HEIGHT;\n    const percentDelta = (e.deltaY / totalPixelHeight) * 100;\n    dispatch({\n      type: SET_PLAYLIST_SCROLL_POSITION,\n      position: clamp(\n        state.display.playlistScrollPosition + percentDelta,\n        0,\n        100\n      ),\n    });\n  };\n}\n\nexport function scrollUpFourTracks(): Thunk {\n  return scrollNTracks(-4);\n}\n\nexport function scrollDownFourTracks(): Thunk {\n  return scrollNTracks(4);\n}\n\nexport function dragSelected(offset: number): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const tracks = Selectors.getTracks(state);\n    const trackOrder = Selectors.getTrackOrder(state);\n    const selectedIds = Selectors.getSelectedTrackIds(state);\n    const firstSelected = trackOrder.findIndex(\n      (trackId) => tracks[trackId] && selectedIds.has(trackId)\n    );\n    if (firstSelected === -1) {\n      return;\n    }\n    const lastSelected = findLastIndex(\n      trackOrder,\n      (trackId) => tracks[trackId] && selectedIds.has(trackId)\n    );\n    if (lastSelected === -1) {\n      throw new Error(\"We found a first selected, but not a last selected.\");\n    }\n    // Ensure we don't try to drag off either end.\n    const min = -firstSelected;\n    const max = trackOrder.length - 1 - lastSelected;\n    const normalizedOffset = clamp(offset, min, max);\n    if (normalizedOffset !== 0) {\n      dispatch({ type: DRAG_SELECTED, offset: normalizedOffset });\n    }\n  };\n}\n\nexport function invertSelection(): Action {\n  return { type: INVERT_SELECTION };\n}\nexport function selectZero(): Action {\n  return { type: SELECT_ZERO };\n}\n\nexport function selectAll(): Action {\n  return { type: SELECT_ALL };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionCreators/windows.ts",
    "content": "import * as Selectors from \"../selectors\";\n\nimport * as Utils from \"../utils\";\nimport {\n  UPDATE_WINDOW_POSITIONS,\n  TOGGLE_DOUBLESIZE_MODE,\n  WINDOW_SIZE_CHANGED,\n  TOGGLE_WINDOW,\n  CLOSE_WINDOW,\n  TOGGLE_WINDOW_SHADE_MODE,\n  SET_WINDOW_VISIBILITY,\n  BROWSER_WINDOW_SIZE_CHANGED,\n  RESET_WINDOW_SIZES,\n  TOGGLE_LLAMA_MODE,\n  SET_FOCUSED_WINDOW,\n} from \"../actionTypes\";\n\nimport { getPositionDiff, SizeDiff } from \"../resizeUtils\";\nimport { applyDiff } from \"../snapUtils\";\nimport { Action, Thunk, WindowId, WindowPositions, Dispatch } from \"../types\";\n\n// Dispatch an action and, if needed rearrange the windows to preserve\n// the existing edge relationship.\n//\n// Works by checking the edges before the action is dispatched. Then,\n// after disatching, calculating what position change would be required\n// to restore those relationships.\nfunction withWindowGraphIntegrity(action: Action): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const graph = Selectors.getWindowGraph(state);\n    const originalSizes = Selectors.getWindowSizes(state);\n\n    dispatch(action);\n\n    const newSizes = Selectors.getWindowSizes(getState());\n    const sizeDiff: SizeDiff = {};\n    for (const window of Object.keys(newSizes)) {\n      const original = originalSizes[window];\n      const current = newSizes[window];\n      sizeDiff[window] = {\n        height: current.height - original.height,\n        width: current.width - original.width,\n      };\n    }\n\n    const positionDiff = getPositionDiff(graph, sizeDiff);\n    const windowPositions = Selectors.getWindowPositions(state);\n\n    const newPositions = Utils.objectMap(windowPositions, (position, key) =>\n      applyDiff(position, positionDiff[key])\n    );\n\n    dispatch(updateWindowPositions(newPositions));\n  };\n}\n\nexport function toggleDoubleSizeMode(): Thunk {\n  return withWindowGraphIntegrity({ type: TOGGLE_DOUBLESIZE_MODE });\n}\n\nexport function toggleLlamaMode(): Action {\n  return { type: TOGGLE_LLAMA_MODE };\n}\n\nexport function toggleEqualizerShadeMode(): Thunk {\n  return withWindowGraphIntegrity({\n    type: TOGGLE_WINDOW_SHADE_MODE,\n    windowId: \"equalizer\",\n  });\n}\n\nexport function toggleMainWindowShadeMode(): Thunk {\n  return withWindowGraphIntegrity({\n    type: TOGGLE_WINDOW_SHADE_MODE,\n    windowId: \"main\",\n  });\n}\n\nexport function togglePlaylistShadeMode(): Thunk {\n  return withWindowGraphIntegrity({\n    type: TOGGLE_WINDOW_SHADE_MODE,\n    windowId: \"playlist\",\n  });\n}\n\nexport function closeWindow(windowId: WindowId): Action {\n  return { type: CLOSE_WINDOW, windowId };\n}\n\nexport function hideWindow(windowId: WindowId): Action {\n  return { type: SET_WINDOW_VISIBILITY, windowId, hidden: true };\n}\n\nexport function showWindow(windowId: WindowId): Action {\n  return { type: SET_WINDOW_VISIBILITY, windowId, hidden: false };\n}\n\nexport function setFocusedWindow(window: WindowId | null): Action {\n  return { type: SET_FOCUSED_WINDOW, window };\n}\n\nexport function setWindowSize(\n  windowId: WindowId,\n  size: [number, number]\n): Action {\n  return { type: WINDOW_SIZE_CHANGED, windowId, size };\n}\n\nexport function toggleWindow(windowId: WindowId): Action {\n  return { type: TOGGLE_WINDOW, windowId };\n}\n\nexport function updateWindowPositions(\n  positions: WindowPositions,\n  absolute?: boolean\n): Action {\n  return { type: UPDATE_WINDOW_POSITIONS, positions, absolute };\n}\n\nexport function centerWindowsInContainer(container: HTMLElement): Thunk {\n  return (dispatch, getState) => {\n    if (!Selectors.getPositionsAreRelative(getState())) {\n      return;\n    }\n    const { left, top } = container.getBoundingClientRect();\n    const { scrollWidth: width, scrollHeight: height } = container;\n    dispatch(centerWindows({ left, top, width, height }));\n  };\n}\n\nexport function centerWindowsInView(): Thunk {\n  return centerWindows({\n    left: window.scrollX,\n    top: window.scrollY,\n    width: window.innerWidth,\n    height: window.innerHeight,\n  });\n}\n\nexport function centerWindows(box: {\n  left: number;\n  top: number;\n  width: number;\n  height: number;\n}): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n    const windowsInfo = Selectors.getWindowsInfo(state);\n    const getOpen = Selectors.getWindowOpen(state);\n    const { top, left, width, height } = box;\n\n    const offsetLeft = left + window.scrollX;\n    const offsetTop = top + window.scrollY;\n\n    // A layout has been suplied. We will compute the bounding box and\n    // center the given layout.\n    const bounding = Utils.calculateBoundingBox(\n      windowsInfo.filter((w) => getOpen(w.key))\n    );\n\n    if (bounding == null) {\n      // There are no windows to center\n      return;\n    }\n\n    const boxHeight = bounding.bottom - bounding.top;\n    const boxWidth = bounding.right - bounding.left;\n\n    const move = {\n      x: Math.ceil(offsetLeft - bounding.left + (width - boxWidth) / 2),\n      y: Math.ceil(offsetTop - bounding.top + (height - boxHeight) / 2),\n    };\n\n    const newPositions = windowsInfo.reduce(\n      (pos, w) => ({\n        ...pos,\n        [w.key]: { x: move.x + w.x, y: move.y + w.y },\n      }),\n      {}\n    );\n\n    dispatch(updateWindowPositions(newPositions, true));\n  };\n}\n\nexport function browserWindowSizeChanged(size: {\n  height: number;\n  width: number;\n}): Thunk {\n  return (dispatch: Dispatch) => {\n    dispatch({ type: BROWSER_WINDOW_SIZE_CHANGED, ...size });\n    dispatch(ensureWindowsAreOnScreen());\n  };\n}\n\nexport function resetWindowSizes(): Action {\n  return { type: RESET_WINDOW_SIZES };\n}\n\nexport function stackWindows(): Thunk {\n  return (dispatch, getState) => {\n    dispatch(\n      updateWindowPositions(Selectors.getStackedLayoutPositions(getState()))\n    );\n  };\n}\n\nexport function ensureWindowsAreOnScreen(): Thunk {\n  return (dispatch, getState) => {\n    const state = getState();\n\n    const windowsInfo = Selectors.getWindowsInfo(state);\n    const getOpen = Selectors.getWindowOpen(state);\n    const { height, width } = Utils.getWindowSize();\n    const bounding = Utils.calculateBoundingBox(\n      windowsInfo.filter((w) => getOpen(w.key))\n    );\n    if (bounding == null) {\n      // There are no windows visible, so there's no work to do.\n      return;\n    }\n    const positions = Selectors.getWindowPositions(state);\n\n    // Are we good?\n    if (\n      bounding.left >= 0 &&\n      bounding.top >= 0 &&\n      bounding.right <= width &&\n      bounding.bottom <= height\n    ) {\n      // My work here is done.\n      return;\n    }\n\n    const boundingHeight = bounding.bottom - bounding.top;\n    const boundingWidth = bounding.right - bounding.left;\n\n    // Could we simply shift all the windows by a constant offset?\n    if (boundingWidth <= width && boundingHeight <= height) {\n      let moveY = 0;\n      let moveX = 0;\n      if (bounding.top <= 0) {\n        moveY = bounding.top;\n      } else if (bounding.bottom > height) {\n        moveY = bounding.bottom - height;\n      }\n\n      if (bounding.left <= 0) {\n        moveX = bounding.left;\n      } else if (bounding.right > width) {\n        moveX = bounding.right - width;\n      }\n\n      const newPositions = Utils.objectMap(positions, (position) => ({\n        x: position.x - moveX,\n        y: position.y - moveY,\n      }));\n\n      dispatch(updateWindowPositions(newPositions));\n      return;\n    }\n\n    // TODO: Try moving the individual groups to try to fit them in\n\n    // I give up. Just reset everything.\n    dispatch(resetWindowSizes());\n    dispatch(stackWindows());\n    dispatch(centerWindowsInView());\n  };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/actionTypes.ts",
    "content": "export const ADD_TRACK_FROM_URL = \"ADD_TRACK_FROM_URL\";\nexport const CLOSE_WINAMP = \"CLOSE_WINAMP\";\nexport const OPEN_WINAMP = \"OPEN_WINAMP\";\nexport const MINIMIZE_WINAMP = \"MINIMIZE_WINAMP\";\nexport const IS_PLAYING = \"IS_PLAYING\";\nexport const IS_STOPPED = \"IS_STOPPED\";\nexport const PAUSE = \"PAUSE\";\nexport const PLAY = \"PLAY\";\nexport const SEEK_TO_PERCENT_COMPLETE = \"SEEK_TO_PERCENT_COMPLETE\";\nexport const SET_BALANCE = \"SET_BALANCE\";\nexport const SET_BAND_VALUE = \"SET_BAND_VALUE\";\nexport const SET_FOCUS = \"SET_FOCUS\";\nexport const SET_BAND_FOCUS = \"SET_BAND_FOCUS\";\nexport const SET_FOCUSED_WINDOW = \"SET_FOCUSED_WINDOW\";\nexport const SET_MEDIA = \"SET_MEDIA\";\nexport const SET_SCRUB_POSITION = \"SET_SCRUB_POSITION\";\nexport const SET_SKIN_DATA = \"SET_SKIN_DATA\";\nexport const SET_VOLUME = \"SET_VOLUME\";\nexport const START_WORKING = \"START_WORKING\";\nexport const STEP_MARQUEE = \"STEP_MARQUEE\";\nexport const STOP = \"STOP\";\nexport const STOP_WORKING = \"STOP_WORKING\";\nexport const TOGGLE_DOUBLESIZE_MODE = \"TOGGLE_DOUBLESIZE_MODE\";\nexport const SET_EQ_AUTO = \"SET_EQ_AUTO\";\nexport const SET_EQ_ON = \"SET_EQ_ON\";\nexport const SET_EQ_OFF = \"SET_EQ_OFF\";\nexport const TOGGLE_LLAMA_MODE = \"TOGGLE_LLAMA_MODE\";\nexport const TOGGLE_REPEAT = \"TOGGLE_REPEAT\";\nexport const TOGGLE_SHUFFLE = \"TOGGLE_SHUFFLE\";\nexport const TOGGLE_TIME_MODE = \"TOGGLE_TIME_MODE\";\nexport const TOGGLE_VISUALIZER_STYLE = \"TOGGLE_VISUALIZER_STYLE\";\nexport const UNSET_FOCUS = \"UNSET_FOCUS\";\nexport const UPDATE_TIME_ELAPSED = \"UPDATE_TIME_ELAPSED\";\nexport const SET_USER_MESSAGE = \"SET_USER_MESSAGE\";\nexport const UNSET_USER_MESSAGE = \"UNSET_USER_MESSAGE\";\nexport const SET_PLAYLIST_SCROLL_POSITION = \"SET_PLAYLIST_SCROLL_POSITION\";\nexport const CLICKED_TRACK = \"CLICKED_TRACK\";\nexport const CTRL_CLICKED_TRACK = \"CTRL_CLICKED_TRACK\";\nexport const SHIFT_CLICKED_TRACK = \"SHIFT_CLICKED_TRACK\";\nexport const SELECT_ALL = \"SELECT_ALL\";\nexport const SELECT_ZERO = \"SELECT_ZERO\";\nexport const INVERT_SELECTION = \"INVERT_SELECTION\";\nexport const REMOVE_ALL_TRACKS = \"REMOVE_ALL_TRACKS\";\nexport const CROP_TRACKS = \"CROP_TRACKS\";\nexport const FILE_INFO = \"FILE_INFO\";\nexport const REMOVE_TRACKS = \"REMOVE_TRACKS\";\nexport const SET_AVAILABLE_SKINS = \"SET_AVAILABLE_SKINS\";\nexport const REVERSE_LIST = \"REVERSE_LIST\";\nexport const RANDOMIZE_LIST = \"RANDOMIZE_LIST\";\nexport const SET_TRACK_ORDER = \"SET_TRACK_ORDER\";\nexport const PLAY_TRACK = \"PLAY_TRACK\";\nexport const BUFFER_TRACK = \"BUFFER_TRACK\";\nexport const DRAG_SELECTED = \"DRAG_SELECTED\";\nexport const SET_MEDIA_TAGS = \"SET_MEDIA_TAGS\";\nexport const SET_MEDIA_DURATION = \"SET_MEDIA_DURATION\";\nexport const TOGGLE_WINDOW = \"TOGGLE_WINDOW\";\nexport const CLOSE_WINDOW = \"CLOSE_WINDOW\";\nexport const MEDIA_TAG_REQUEST_INITIALIZED = \"MEDIA_TAG_REQUEST_INITIALIZED\";\nexport const MEDIA_TAG_REQUEST_FAILED = \"MEDIA_TAG_REQUEST_FAILED\";\nexport const NETWORK_CONNECTED = \"NETWORK_CONNECTED\";\nexport const NETWORK_DISCONNECTED = \"NETWORK_DISCONNECTED\";\nexport const UPDATE_WINDOW_POSITIONS = \"UPDATE_WINDOW_POSITIONS\";\nexport const WINDOW_SIZE_CHANGED = \"WINDOW_SIZE_CHANGED\";\nexport const TOGGLE_WINDOW_SHADE_MODE = \"TOGGLE_WINDOW_SHADE_MODE\";\nexport const LOADED = \"LOADED\";\nexport const SET_Z_INDEX = \"SET_Z_INDEX\";\nexport const DISABLE_MARQUEE = \"DISABLE_MARQUEE\";\nexport const SET_DUMMY_VIZ_DATA = \"SET_DUMMY_VIZ_DATA\";\nexport const SET_WINDOW_VISIBILITY = \"SET_WINDOW_VISIBILITY\";\nexport const LOADING = \"LOADING\";\nexport const CLOSE_REQUESTED = \"CLOSE_REQUESTED\";\nexport const LOAD_SERIALIZED_STATE = \"LOAD_SERIALIZED_STATE\";\nexport const RESET_WINDOW_SIZES = \"RESET_WINDOW_SIZES\";\nexport const BROWSER_WINDOW_SIZE_CHANGED = \"BROWSER_WINDOW_SIZE_CHANGED\";\nexport const LOAD_DEFAULT_SKIN = \"LOAD_DEFAULT_SKIN\";\nexport const ENABLE_MILKDROP = \"ENABLE_MILKDROP\";\nexport const SET_MILKDROP_DESKTOP = \"SET_MILKDROP_DESKTOP\";\nexport const SET_VISUALIZER_STYLE = \"SET_VISUALIZER_STYLE\";\nexport const GOT_BUTTERCHURN_PRESETS = \"GOT_BUTTERCHURN_PRESETS\";\nexport const GOT_BUTTERCHURN = \"GOT_BUTTERCHURN\";\nexport const RESOLVE_PRESET_AT_INDEX = \"RESOLVE_PRESET_AT_INDEX\";\nexport const SELECT_PRESET_AT_INDEX = \"SELECT_PRESET_AT_INDEX\";\nexport const TOGGLE_PRESET_OVERLAY = \"TOGGLE_PRESET_OVERLAY\";\nexport const PRESET_REQUESTED = \"PRESET_REQUESTED\";\nexport const TOGGLE_RANDOMIZE_PRESETS = \"TOGGLE_RANDOMIZE_PRESETS\";\nexport const TOGGLE_PRESET_CYCLING = \"TOGGLE_PRESET_CYCLING\";\nexport const SCHEDULE_MILKDROP_MESSAGE = \"SCHEDULE_MILKDROP_MESSAGE\";\nexport const SET_MILKDROP_FULLSCREEN = \"SET_MILKDROP_FULLSCREEN\";\nexport const SET_MILKDROP_LOCK = \"SET_MILKDROP_LOCK\";\n"
  },
  {
    "path": "webamp/packages/webamp/js/baseSkin.json",
    "content": "{\n  \"images\": {\n    \"EQ_PREAMP_LINE\":\n      \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==\",\n    \"EQ_GRAPH_LINE_COLORS\":\n      \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=\"\n  },\n  \"colors\": [\n    \"rgb(0,0,0)\",\n    \"rgb(24,33,41)\",\n    \"rgb(239,49,16)\",\n    \"rgb(206,41,16)\",\n    \"rgb(214,90,0)\",\n    \"rgb(214,102,0)\",\n    \"rgb(214,115,0)\",\n    \"rgb(198,123,8)\",\n    \"rgb(222,165,24)\",\n    \"rgb(214,181,33)\",\n    \"rgb(189,222,41)\",\n    \"rgb(148,222,33)\",\n    \"rgb(41,206,16)\",\n    \"rgb(50,190,16)\",\n    \"rgb(57,181,16)\",\n    \"rgb(49,156,8)\",\n    \"rgb(41,148,0)\",\n    \"rgb(24,132,8)\",\n    \"rgb(255,255,255)\",\n    \"rgb(214,214,222)\",\n    \"rgb(181,189,189)\",\n    \"rgb(160,170,175)\",\n    \"rgb(148,156,165)\",\n    \"rgb(150,150,150)\"\n  ],\n  \"playlistStyle\": {\n    \"normal\": \"#00FF00\",\n    \"current\": \"#FFFFFF\",\n    \"normalbg\": \"#000000\",\n    \"selectedbg\": \"#0000FF\",\n    \"font\": \"Arial\"\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/App.tsx",
    "content": "import {\n  useLayoutEffect,\n  useEffect,\n  useState,\n  useCallback,\n  StrictMode,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { FilePicker } from \"../types\";\nimport { WINDOWS } from \"../constants\";\nimport * as Selectors from \"../selectors\";\nimport * as Actions from \"../actionCreators\";\nimport * as Utils from \"../utils\";\nimport MilkdropWindow from \"../components/MilkdropWindow\";\nimport ContextMenuWrapper from \"./ContextMenuWrapper\";\nimport MainContextMenu from \"./MainWindow/MainContextMenu\";\nimport WindowManager from \"./WindowManager\";\nimport MainWindow from \"./MainWindow\";\nimport PlaylistWindow from \"./PlaylistWindow\";\nimport EqualizerWindow from \"./EqualizerWindow\";\nimport Skin from \"./Skin\";\n\nimport \"../../css/webamp.css\";\nimport Media from \"../media\";\nimport { useTypedSelector, useActionCreator } from \"../hooks\";\n\ninterface Props {\n  filePickers: FilePicker[];\n  media: Media;\n}\n\n/**\n * Constructs the windows to render\n */\nexport default function App({ media, filePickers }: Props) {\n  const closed = useTypedSelector(Selectors.getClosed);\n  const genWindowsInfo = useTypedSelector(Selectors.getGenWindows);\n  const zIndex = useTypedSelector(Selectors.getZIndex);\n\n  const browserWindowSizeChanged = useActionCreator(\n    Actions.browserWindowSizeChanged\n  );\n  const setFocusedWindow = useActionCreator(Actions.setFocusedWindow);\n\n  const [webampNode] = useState(() => {\n    const node = document.createElement(\"div\");\n    node.id = \"webamp\";\n    // @ts-ignore I think I'm supposed to set this with setAttribute, but I can't confirm.\n    node.role = \"application\";\n    return node;\n  });\n\n  useLayoutEffect(() => {\n    webampNode.style.zIndex = String(zIndex);\n  }, [webampNode, zIndex]);\n\n  useLayoutEffect(() => {\n    document.body.appendChild(webampNode);\n    return () => {\n      document.body.removeChild(webampNode);\n    };\n  }, [webampNode]);\n\n  useEffect(() => {\n    const handleWindowResize = () => {\n      if (webampNode == null) {\n        return;\n      }\n      // It's a bit tricky to measure the \"natural\" size of the browser window.\n      // Specifically we want to know how large the window would be without our\n      // own Webamp windows influencing it. To achieve this, we temporarily make\n      // our container `overflow: hidden;`. We then make our container full\n      // screen by setting the bottom/right properties to zero. This second part\n      // allows our Webamp windows to stay visible during the resize. After we\n      // measure, we set the style back so that we don't end up interfering with\n      // click events outside of our Webamp windows.\n      webampNode.style.right = \"0\";\n      webampNode.style.bottom = \"0\";\n      webampNode.style.overflow = \"hidden\";\n      browserWindowSizeChanged(Utils.getWindowSize());\n      webampNode.style.right = \"auto\";\n      webampNode.style.bottom = \"auto\";\n      webampNode.style.overflow = \"visible\";\n    };\n\n    handleWindowResize();\n\n    window.addEventListener(\"resize\", handleWindowResize);\n\n    return () => {\n      window.removeEventListener(\"resize\", handleWindowResize);\n    };\n  }, [browserWindowSizeChanged, webampNode]);\n\n  const renderWindows = useCallback(() => {\n    return Utils.objectMap(genWindowsInfo, (w, id) => {\n      if (!w.open) {\n        return null;\n      }\n      switch (id) {\n        case WINDOWS.MAIN:\n          return (\n            <MainWindow\n              analyser={media.getAnalyser()}\n              filePickers={filePickers}\n            />\n          );\n        case WINDOWS.EQUALIZER:\n          return <EqualizerWindow />;\n        case WINDOWS.PLAYLIST:\n          return <PlaylistWindow analyser={media.getAnalyser()} />;\n        case WINDOWS.MILKDROP:\n          return <MilkdropWindow analyser={media.getAnalyser()} />;\n        default:\n          throw new Error(`Tried to render an unknown window: ${id}`);\n      }\n    });\n  }, [media, filePickers, genWindowsInfo]);\n\n  const handleBlur = (e: React.FocusEvent<HTMLElement>) => {\n    if (!e.currentTarget.contains(e.relatedTarget as Element)) {\n      setFocusedWindow(null);\n    }\n  };\n\n  if (closed) {\n    return null;\n  }\n\n  return ReactDOM.createPortal(\n    <StrictMode>\n      <div onBlur={handleBlur}>\n        <Skin />\n        <ContextMenuWrapper\n          renderContents={() => <MainContextMenu filePickers={filePickers} />}\n        >\n          <WindowManager windows={renderWindows()} />\n        </ContextMenuWrapper>\n      </div>\n    </StrictMode>,\n    webampNode\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Balance.tsx",
    "content": "import * as React from \"react\";\n\nimport * as Actions from \"../actionCreators\";\nimport * as Selectors from \"../selectors\";\nimport { useTypedSelector, useActionCreator } from \"../hooks\";\n\ninterface Props {\n  id?: string;\n  style?: React.CSSProperties;\n  className?: string;\n}\n\nexport default function Balance({ style, className, id }: Props) {\n  const balance = useTypedSelector(Selectors.getBalance);\n  const setBalance = useActionCreator(Actions.setBalance);\n  const setFocus = useActionCreator(Actions.setFocus);\n  const unsetFocus = useActionCreator(Actions.unsetFocus);\n  return (\n    <input\n      id={id}\n      className={className}\n      type=\"range\"\n      min=\"-100\"\n      max=\"100\"\n      step=\"1\"\n      value={balance}\n      style={style}\n      onChange={(e) => setBalance(Number(e.target.value))}\n      onMouseDown={() => setFocus(\"balance\")}\n      onMouseUp={unsetFocus}\n      title=\"Balance\"\n    />\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Character.test.js",
    "content": "import { characterClassName } from \"./Character\";\n\ndescribe(\"characterClassName\", () => {\n  it(\"is not case sensitive\", () => {\n    expect(characterClassName(\"a\")).toBe(\"character-97\");\n    expect(characterClassName(\"A\")).toBe(\"character-97\");\n  });\n  it(\"handles integers\", () => {\n    expect(characterClassName(\"1\")).toBe(\"character-49\");\n    expect(characterClassName(1)).toBe(\"character-49\");\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Character.tsx",
    "content": "import * as React from \"react\";\nimport deburr from \"lodash/deburr\";\n\ninterface Props extends React.HTMLAttributes<HTMLSpanElement> {\n  children: string | number;\n  className?: string;\n}\n\nexport const characterClassName = (char: string | number) =>\n  `character-${deburr(char.toString()).toLowerCase().charCodeAt(0)}`;\n\nconst Character = React.memo(\n  ({ children: char, className, ...passThrough }: Props) => {\n    return (\n      <span\n        {...passThrough}\n        className={`${className || \"\"} character ${characterClassName(char)}`}\n      >\n        {char}\n      </span>\n    );\n  }\n);\n\nexport default Character;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/CharacterString.tsx",
    "content": "import { memo, Fragment } from \"react\";\nimport Character from \"./Character\";\n\ninterface Props {\n  children: string;\n}\n\nconst CharacterString = memo((props: Props) => {\n  const text = `${props.children}` || \"\";\n  const chars = text.split(\"\");\n  return (\n    <Fragment>\n      {chars.map((character, index) => (\n        <Character key={index + character}>{character}</Character>\n      ))}\n    </Fragment>\n  );\n});\n\nexport default CharacterString;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/ClickedDiv.tsx",
    "content": "import { useState } from \"react\";\nimport classnames from \"classnames\";\n\ninterface Props extends React.HTMLAttributes<HTMLDivElement> {\n  className?: string;\n  onMouseDown?: (e: React.MouseEvent<HTMLDivElement>) => void;\n}\n\n// Winamp has a strange behavior for the buttons at the top of the main window.\n// It shows through to the main background sprite until the first time that it's\n// clicked, and then it shows the dedicated undepressed sprite thereafter.\n// This component is an abstraction that tracks if a div has ever been clicked.\n// Look in `skinSelectors` for CSS selectors that look like `#some-id.clicked`\n// for examples of this functionality in use.\nfunction ClickedDiv(props: Props) {\n  const [clicked, setClicked] = useState(false);\n  function handleMouseDown(e: React.MouseEvent<HTMLDivElement>) {\n    setClicked(true);\n    if (props.onMouseDown) {\n      props.onMouseDown(e);\n    }\n  }\n  return (\n    <div\n      {...props}\n      className={classnames(props.className, { clicked })}\n      onMouseDown={handleMouseDown}\n    />\n  );\n}\n\nexport default ClickedDiv;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/ClipPaths.tsx",
    "content": "import { useMemo, useLayoutEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype Props = {\n  children: { [id: string]: string[] };\n};\n\n// this.props.children should be an object containing arrays of strings. The\n// keys are ids, and the arrays are arrays of polygon point strings\nexport default function ClipPaths({ children }: Props) {\n  const paths = useMemo(() => {\n    return document.createElement(\"div\");\n  }, []);\n\n  useLayoutEffect(() => {\n    document.body.appendChild(paths);\n    return () => paths.remove();\n  }, [paths]);\n\n  return createPortal(\n    <svg height={0} width={0}>\n      <defs>\n        {Object.keys(children).map((id) => (\n          <clipPath id={id} key={id}>\n            {children[id].map((points, i) => (\n              <polygon points={points} key={i} />\n            ))}\n          </clipPath>\n        ))}\n      </defs>\n    </svg>,\n    paths\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/ContextMenu.tsx",
    "content": "import { useMemo, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classnames from \"classnames\";\n\nimport \"../../css/context-menu.css\";\nimport { useTypedSelector } from \"../hooks\";\nimport * as Selectors from \"../selectors\";\n\ninterface PortalProps {\n  zIndex: number;\n  top: number;\n  left: number;\n  children: JSX.Element[] | JSX.Element;\n}\n\nconst Portal = (props: PortalProps) => {\n  const node: HTMLDivElement = useMemo(() => {\n    const div = document.createElement(\"div\");\n    div.id = \"webamp-context-menu\";\n    div.style.position = \"absolute\";\n    div.style.top = \"0\";\n    div.style.left = \"0\";\n    div.style.zIndex = String(props.zIndex + 1);\n    return div;\n  }, [props.zIndex]);\n\n  useEffect(() => {\n    document.body.appendChild(node);\n    return () => {\n      document.body.removeChild(node);\n    };\n  }, [node]);\n\n  const style: React.CSSProperties = {\n    top: props.top,\n    left: props.left,\n    position: \"absolute\",\n  };\n  return createPortal(<div style={style}>{props.children}</div>, node);\n};\n\nexport const Hr = () => (\n  <li className=\"hr\">\n    <hr />\n  </li>\n);\n\ninterface ParentProps {\n  label: string;\n  children: React.ReactNode;\n}\n\nexport const Parent = ({ children, label }: ParentProps) => (\n  <li className=\"parent\">\n    <ul>{children}</ul>\n    {label}\n  </li>\n);\n\ninterface LinkNodeProps {\n  label: string;\n  href: string;\n  target?: string;\n}\n\nexport const LinkNode = (props: LinkNodeProps) => (\n  <li>\n    <a {...props}>{props.label}</a>\n  </li>\n);\n\ninterface NodeProps {\n  label: string;\n  checked?: boolean;\n  hotkey?: string;\n  className?: string;\n  // TODO: Figure out how to do passthrough props\n  onClick?: () => void;\n}\n\nexport const Node = (props: NodeProps) => {\n  const { label, checked, className = \"\", ...passThroughProps } = props;\n  return (\n    <li className={classnames(className, { checked })} {...passThroughProps}>\n      {label}\n    </li>\n  );\n};\n\ninterface ContextMenuProps {\n  children: React.ReactNode;\n  offsetTop: number;\n  offsetLeft: number;\n  top?: boolean;\n  bottom?: boolean;\n  // TODO: Remove this. Just conditionally render in the parent.\n  selected: boolean;\n}\n\nexport default function ContextMenu({\n  children,\n  offsetTop,\n  offsetLeft,\n  top,\n  bottom,\n  selected,\n}: ContextMenuProps) {\n  const zIndex = useTypedSelector(Selectors.getZIndex);\n  if (!selected) {\n    return null;\n  }\n  return (\n    <Portal top={offsetTop} left={offsetLeft} zIndex={zIndex}>\n      <ul className={classnames(\"context-menu\", { top, bottom })}>\n        {children}\n      </ul>\n    </Portal>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/ContextMenuTarget.tsx",
    "content": "import { useState, useRef, useEffect, useMemo } from \"react\";\nimport ContextMenu from \"./ContextMenu\";\n\ninterface Props extends React.HTMLAttributes<HTMLDivElement> {\n  renderMenu: () => React.ReactNode;\n  top?: boolean;\n  bottom?: boolean;\n}\n\nfunction getNodeOffset(node: HTMLDivElement | null) {\n  if (node == null) {\n    return { top: 0, left: 0 };\n  }\n\n  const rect = node.getBoundingClientRect();\n  const scrollLeft = window.pageXOffset || document.documentElement!.scrollLeft;\n  const scrollTop = window.pageYOffset || document.documentElement!.scrollTop;\n  return { top: rect.top + scrollTop, left: rect.left + scrollLeft };\n}\n\n// Trigger a context menu relative to the child element when the user\n// left-clicks on the child.\n//\n// For a component that triggers relative to the user's cursor on right-click\n// see `<ContextMenuWrapper />`.\nfunction ContextMenuTarget(props: Props) {\n  const handleNode = useRef<HTMLDivElement>(null);\n  const [selected, setSelected] = useState(false);\n  useEffect(() => {\n    if (!selected) {\n      return;\n    }\n    function handleGlobalClick(e: MouseEvent) {\n      if (\n        selected &&\n        // Typescript does not believe that these click events are always fired on DOM nodes.\n        e.target instanceof Element &&\n        selected &&\n        // Not sure how, but it's possible for this to get called when handleNode is null/undefined.\n        // https://sentry.io/share/issue/2066cd79f21e4f279791319f4d2ea35d/\n        handleNode.current &&\n        !handleNode.current.contains(e.target!)\n      ) {\n        setSelected(false);\n      }\n    }\n    document.addEventListener(\"click\", handleGlobalClick);\n    return () => {\n      document.removeEventListener(\"click\", handleGlobalClick);\n    };\n  }, [selected]);\n\n  const offset = useMemo(() => {\n    return selected\n      ? getNodeOffset(handleNode.current)\n      : // Kinda awkward. This is a nonsense return value since we only use\n        //this value when we are selected.\n        { top: 0, left: 0 };\n  }, [selected]);\n\n  const { renderMenu, children, top, bottom, ...passThroughProps } = props;\n  return (\n    <div {...passThroughProps}>\n      <div\n        className=\"handle\"\n        style={{ width: \"100%\", height: \"100%\" }}\n        ref={handleNode}\n        onClick={() => setSelected(!selected)}\n      >\n        {children}\n      </div>\n      <ContextMenu\n        selected={selected}\n        offsetTop={offset.top}\n        offsetLeft={offset.left}\n        top={top}\n        bottom={bottom}\n      >\n        {renderMenu()}\n      </ContextMenu>\n    </div>\n  );\n}\n\nexport default ContextMenuTarget;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/ContextMenuWrapper.tsx",
    "content": "import { ReactNode, useState, useEffect, useCallback } from \"react\";\nimport ContextMenu from \"./ContextMenu\";\n\ninterface Props {\n  renderContents(): ReactNode;\n  children: ReactNode;\n}\n\n// Trigger a context menu at the user's cursor position when the user right\n// clicks within this component.\n// For a component that triggers relative to a given component when the user\n// left-clicks see `<ContextMenuTarget />`.\n\n// TODO: Consider using nested contexts to ensure we don't ever have multiple\n// non-nested context menus open at a time.\nexport default function ContextMenuWraper({\n  children,\n  renderContents,\n  ...passThroughProps\n}: Props) {\n  const [openPosition, setOpenPosition] = useState<{\n    x: number;\n    y: number;\n  } | null>(null);\n\n  const closeMenu = useCallback(() => {\n    setOpenPosition(null);\n  }, []);\n\n  const handleGlobalClick = useCallback(\n    (e: MouseEvent) => {\n      if (e.button !== 2) {\n        if (e.target instanceof Element && e.target.id !== \"notClose\") {\n          closeMenu();\n        }\n      }\n    },\n    [closeMenu]\n  );\n\n  const handleRightClick = useCallback(\n    (e: React.MouseEvent<HTMLDivElement>) => {\n      const { pageX, pageY } = e;\n      // TODO: We could do an initial render to see if the menu fits here\n      // and do a second render if it does not.\n      setOpenPosition({ x: pageX, y: pageY });\n      e.preventDefault();\n      e.stopPropagation();\n    },\n    []\n  );\n\n  // Add click-away listeners when window is open\n  useEffect(() => {\n    if (openPosition == null) {\n      return;\n    }\n    document.addEventListener(\"click\", handleGlobalClick);\n    document.body.addEventListener(\"contextmenu\", closeMenu);\n\n    return () => {\n      document.removeEventListener(\"click\", handleGlobalClick);\n      document.body.removeEventListener(\"contextmenu\", closeMenu);\n    };\n  }, [openPosition, closeMenu, handleGlobalClick]);\n\n  return (\n    <div\n      onContextMenu={handleRightClick}\n      style={{ width: \"100%\", height: \"100%\" }}\n      {...passThroughProps}\n    >\n      <ContextMenu\n        selected={openPosition != null}\n        offsetTop={openPosition?.y ?? 0}\n        offsetLeft={openPosition?.x ?? 0}\n      >\n        {renderContents()}\n      </ContextMenu>\n      {children}\n    </div>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Css.tsx",
    "content": "import { createPortal } from \"react-dom\";\nimport { useMemo, useLayoutEffect } from \"react\";\n\ntype Props = {\n  children: string;\n  id: string;\n};\n\nexport default function Css({ children, id }: Props) {\n  const style = useMemo(() => {\n    const s = document.createElement(\"style\");\n    s.type = \"text/css\";\n    s.id = id;\n    return s;\n  }, [id]);\n\n  useLayoutEffect(() => {\n    document.head.appendChild(style);\n    return () => style.remove();\n  }, [style]);\n\n  return createPortal(children, style);\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/DropTarget.tsx",
    "content": "import { useCallback } from \"react\";\nimport { useActionCreator } from \"../hooks\";\nimport * as Actions from \"../actionCreators\";\nimport { WindowId } from \"../types\";\n\ninterface Coord {\n  x: number;\n  y: number;\n}\n\ninterface Props extends React.HTMLAttributes<HTMLDivElement> {\n  handleDrop(e: React.DragEvent<HTMLDivElement>, coord: Coord): void;\n  windowId: WindowId;\n}\n\nfunction supress(e: React.DragEvent<HTMLDivElement>) {\n  e.stopPropagation();\n  e.preventDefault();\n  e.dataTransfer.dropEffect = \"link\";\n  e.dataTransfer.effectAllowed = \"link\";\n}\n\nconst DropTarget = (props: Props) => {\n  const {\n    // eslint-disable-next-line no-shadow, no-unused-vars\n    handleDrop,\n    windowId,\n    ...passThroughProps\n  } = props;\n\n  const droppedFiles = useActionCreator(Actions.droppedFiles);\n\n  const onDrop = useCallback(\n    (e: React.DragEvent<HTMLDivElement>) => {\n      supress(e);\n      droppedFiles(e, windowId);\n      // TODO: We could probably move this coordinate logic into the playlist.\n      // I think that's the only place it gets used.\n      const { currentTarget } = e;\n      if (!(currentTarget instanceof Element)) {\n        return;\n      }\n\n      const { left: x, top: y } = currentTarget.getBoundingClientRect();\n      handleDrop(e, { x, y });\n    },\n    [handleDrop, droppedFiles, windowId]\n  );\n  return (\n    <div\n      {...passThroughProps}\n      onDragStart={supress}\n      onDragEnter={supress}\n      onDragOver={supress}\n      onDrop={onDrop}\n    />\n  );\n};\n\nexport default DropTarget;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/Band.test.js",
    "content": "import { spriteNumber, spriteOffsets } from \"./Band\";\n\ndescribe(\"spriteNumber\", () => {\n  it(\"gives the first sprite\", () => {\n    const actual = spriteNumber(0);\n    const expected = 0;\n    expect(actual).toEqual(expected);\n  });\n  it(\"gives the middle sprite\", () => {\n    const actual = spriteNumber(50);\n    const expected = 14;\n    expect(actual).toEqual(expected);\n  });\n  it(\"gives the last sprite\", () => {\n    const actual = spriteNumber(100);\n    const expected = 27;\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"spriteOffsets\", () => {\n  it(\"gives the first sprite\", () => {\n    const actual = spriteOffsets(0);\n    const expected = { x: 0, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"gives the middle sprite\", () => {\n    const actual = spriteOffsets(14);\n    const expected = { x: 0, y: 1 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"gives the last sprite\", () => {\n    const actual = spriteOffsets(27);\n    const expected = { x: 13, y: 1 };\n    expect(actual).toEqual(expected);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/Band.tsx",
    "content": "import { useMemo } from \"react\";\nimport { Slider as SliderType } from \"../../types\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport VerticalSlider from \"../VerticalSlider\";\n\ninterface Props {\n  id: string;\n  band: SliderType;\n  onChange(value: number): void;\n}\n\nconst MAX_VALUE = 2400; // New range for 0.1 dB precision\n\n// Given a value between 0-2400, return the sprite number (0-27)\nexport const spriteNumber = (value: number): number => {\n  const percent = value / MAX_VALUE;\n  return Math.round(percent * 27);\n};\n\n// Given a sprite number, return the x,y\nexport const spriteOffsets = (number: number): { x: number; y: number } => {\n  const x = number % 14;\n  const y = Math.floor(number / 14);\n  return { x, y };\n};\n\nconst Handle = () => {\n  const style = { width: 11, height: 11, marginLeft: 1 };\n  return <div style={style} className=\"slider-handle\" />;\n};\n\nexport default function Band({ id, onChange, band }: Props) {\n  const sliders = useTypedSelector(Selectors.getSliders);\n  const value = sliders[band];\n  const backgroundPosition = useMemo(() => {\n    const { x, y } = spriteOffsets(spriteNumber(value));\n    const xOffset = x * 15; // Each sprite is 15px wide\n    const yOffset = y * 65; // Each sprite is 15px tall\n    return `-${xOffset}px -${yOffset}px`;\n  }, [value]);\n  const focusBand = useActionCreator(Actions.focusBand);\n  const usetFocus = useActionCreator(Actions.unsetFocus);\n\n  // Round to nearest 0.1 dB step (24 dB / 2400 = 0.01 dB per unit, but we want 0.1 dB steps)\n  // Each 0.1 dB step = 10 units in our 0-2400 range\n  const roundToStep = (val: number): number => {\n    return Math.round(val / 10) * 10;\n  };\n\n  // Note: The band background is actually one pixel taller (63) than the slider\n  // it contains (62).\n  return (\n    <div id={id} className=\"band\" style={{ backgroundPosition, height: 63 }}>\n      <VerticalSlider\n        height={62}\n        width={14}\n        handleHeight={11}\n        value={1 - value / MAX_VALUE}\n        onBeforeChange={() => focusBand(band)}\n        onChange={(val) => {\n          const newValue = (1 - val) * MAX_VALUE;\n          onChange(roundToStep(newValue));\n        }}\n        onAfterChange={usetFocus}\n        handle={<Handle />}\n      />\n    </div>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/EqAuto.tsx",
    "content": "import { memo } from \"react\";\nimport classnames from \"classnames\";\n\nimport * as Actions from \"../../actionCreators\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nconst EqAuto = memo(() => {\n  const selected = useTypedSelector((state) => state.equalizer.auto);\n  const toggleAuto = useActionCreator(Actions.toggleEqAuto);\n  return (\n    <div id=\"auto\" className={classnames({ selected })} onClick={toggleAuto} />\n  );\n});\n\nexport default EqAuto;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/EqGraph.tsx",
    "content": "import { useState, useMemo, useLayoutEffect } from \"react\";\nimport { percentToRange, clamp } from \"../../utils\";\nimport { BANDS } from \"../../constants\";\nimport spline from \"./spline\";\nimport * as Selectors from \"../../selectors\";\nimport { usePromiseValueOrNull, useTypedSelector } from \"../../hooks\";\nimport { Slider } from \"../../types\";\n\nconst GRAPH_HEIGHT = 19;\nconst GRAPH_WIDTH = 113;\n\nfunction EqGraph() {\n  const sliders = useTypedSelector(Selectors.getSliders);\n\n  const preampLineImagePromise = useTypedSelector(Selectors.getPreampLineImage);\n  const preampLineImage = usePromiseValueOrNull(preampLineImagePromise);\n\n  const [canvasNode, setCanvasNode] = useState<HTMLCanvasElement | null>(null);\n\n  const canvasCtx = useMemo(() => canvasNode?.getContext(\"2d\") ?? null, [\n    canvasNode,\n  ]);\n  const colorPattern = useColorPattern(canvasCtx);\n\n  useLayoutEffect(() => {\n    if (\n      canvasCtx == null ||\n      canvasNode == null ||\n      preampLineImage == null ||\n      colorPattern == null\n    ) {\n      return;\n    }\n    const width = Number(canvasNode.width);\n    const height = Number(canvasNode.height);\n    canvasCtx.clearRect(0, 0, width, height);\n    drawEqLine({ colorPattern, sliders, canvasCtx, preampLineImage });\n  }, [canvasCtx, canvasNode, colorPattern, preampLineImage, sliders]);\n\n  return (\n    <canvas\n      id=\"eqGraph\"\n      ref={setCanvasNode}\n      width={GRAPH_WIDTH}\n      height={GRAPH_HEIGHT}\n    />\n  );\n}\n\nfunction useColorPattern(canvasCtx: CanvasRenderingContext2D | null) {\n  const lineColorsImagePromise = useTypedSelector(Selectors.getLineColorsImage);\n  const lineColorsImage = usePromiseValueOrNull(lineColorsImagePromise);\n  return useMemo(() => {\n    if (canvasCtx == null || lineColorsImage == null) {\n      return null;\n    }\n    return canvasCtx.createPattern(lineColorsImage, \"repeat-x\");\n  }, [canvasCtx, lineColorsImage]);\n}\n\nfunction drawEqLine({\n  colorPattern,\n  sliders,\n  canvasCtx,\n  preampLineImage,\n}: {\n  sliders: Record<Slider, number>;\n  colorPattern: CanvasPattern;\n  preampLineImage: HTMLImageElement;\n  canvasCtx: CanvasRenderingContext2D;\n}) {\n  const preampValue = percentToRange(sliders.preamp / 100, 0, GRAPH_HEIGHT - 1);\n  canvasCtx.drawImage(\n    preampLineImage,\n    0,\n    preampValue,\n    preampLineImage.width,\n    preampLineImage.height\n  );\n\n  const amplitudes = BANDS.map((band) => sliders[band]);\n\n  canvasCtx.fillStyle = colorPattern;\n  const paddingLeft = 2; // TODO: This should be 1.5\n\n  const min = 0;\n  const max = GRAPH_HEIGHT - 1;\n\n  const xs: number[] = [];\n  const ys: number[] = [];\n  amplitudes.forEach((value, i) => {\n    const percent = (100 - value) / 100;\n    // Each band is 12 pixels widex\n    xs.push(i * 12);\n    ys.push(percentToRange(percent, min, max));\n  });\n\n  const allYs = spline(xs, ys);\n\n  const maxX = xs[xs.length - 1];\n  let lastY = ys[0];\n  for (let x = 0; x <= maxX; x++) {\n    const y = clamp(Math.round(allYs[x]), 0, GRAPH_HEIGHT - 1);\n    const yTop = Math.min(y, lastY);\n    const height = 1 + Math.abs(lastY - y);\n    canvasCtx.fillRect(paddingLeft + x, yTop, 1, height);\n    lastY = y;\n  }\n}\n\nexport default EqGraph;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/EqOn.tsx",
    "content": "import classnames from \"classnames\";\n\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport { useActionCreator, useTypedSelector } from \"../../hooks\";\n\nconst EqOn = () => {\n  const toggleEq = useActionCreator(Actions.toggleEq);\n  const on = useTypedSelector(Selectors.getEqualizerEnabled);\n  return (\n    <div id=\"on\" className={classnames({ selected: on })} onClick={toggleEq} />\n  );\n};\n\nexport default EqOn;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/EqTitleButtons.tsx",
    "content": "import ClickedDiv from \"../ClickedDiv\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport { WINDOWS } from \"../../constants\";\n\nexport default function EqTitleButtons() {\n  const focusedWindow = useTypedSelector(Selectors.getFocusedWindow);\n\n  const selected = focusedWindow === WINDOWS.EQUALIZER;\n  const closeWindow = useActionCreator(Actions.closeWindow);\n  const toggleEqualizerShadeMode = useActionCreator(\n    Actions.toggleEqualizerShadeMode\n  );\n  return (\n    <ClickedDiv id=\"eq-buttons\" key={selected ? \"selected\" : \"unselected\"}>\n      <div id=\"equalizer-shade\" onClick={toggleEqualizerShadeMode} />\n      <div\n        id=\"equalizer-close\"\n        onClick={() => closeWindow(WINDOWS.EQUALIZER)}\n      />\n    </ClickedDiv>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/EqualizerShade.tsx",
    "content": "import Volume from \"../Volume\";\nimport Balance from \"../Balance\";\nimport { segment } from \"../../utils\";\nimport EqTitleButtons from \"./EqTitleButtons\";\n\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nconst EqualizerShade = () => {\n  const volume = useTypedSelector(Selectors.getVolume);\n  const balance = useTypedSelector(Selectors.getBalance);\n  const toggleEqualizerShadeMode = useActionCreator(\n    Actions.toggleEqualizerShadeMode\n  );\n\n  const classes = [\"left\", \"center\", \"right\"];\n  const eqVolumeClassName = segment(0, 100, volume, classes);\n  const eqBalanceClassName = segment(-100, 100, balance, classes);\n  return (\n    <div\n      className=\"draggable\"\n      onDoubleClick={toggleEqualizerShadeMode}\n      style={{ width: \"100%\", height: \"100%\" }}\n    >\n      <EqTitleButtons />\n      <Volume id=\"equalizer-volume\" className={eqVolumeClassName} />\n      <Balance id=\"equalizer-balance\" className={eqBalanceClassName} />\n    </div>\n  );\n};\nexport default EqualizerShade;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/PresetsContextMenu.tsx",
    "content": "import builtin from \"../../../presets/builtin.json\";\nimport * as Actions from \"../../actionCreators\";\nimport { Node, Parent, Hr } from \"../ContextMenu\";\nimport ContextMenuTarget from \"../ContextMenuTarget\";\nimport { useActionCreator } from \"../../hooks\";\n\nconst PresetsContextMenu = () => {\n  const openEqfFileDialog = useActionCreator(Actions.openEqfFileDialog);\n  const downloadPreset = useActionCreator(Actions.downloadPreset);\n  const setEqFromObject = useActionCreator(Actions.setEqFromObject);\n  return (\n    <ContextMenuTarget\n      top\n      id=\"presets-context\"\n      renderMenu={() => (\n        <>\n          <Parent label=\"Load\">\n            {builtin.presets.map((preset) => (\n              <Node\n                key={preset.name}\n                onClick={() => setEqFromObject(preset)}\n                label={preset.name}\n              />\n            ))}\n            <Hr />\n            <Node onClick={openEqfFileDialog} label=\"From Eqf...\" />\n          </Parent>\n          <Node onClick={downloadPreset} label=\"Save\" />\n        </>\n      )}\n    >\n      <div id=\"presets\" />\n    </ContextMenuTarget>\n  );\n};\n\nexport default PresetsContextMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/index.tsx",
    "content": "import classnames from \"classnames\";\n\nimport { BANDS, WINDOWS } from \"../../constants\";\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\n\nimport Band from \"./Band\";\nimport EqOn from \"./EqOn\";\nimport EqAuto from \"./EqAuto\";\nimport EqGraph from \"./EqGraph\";\nimport PresetsContextMenu from \"./PresetsContextMenu\";\nimport EqualizerShade from \"./EqualizerShade\";\n\nimport \"../../../css/equalizer-window.css\";\nimport { Band as BandType } from \"../../types\";\nimport FocusTarget from \"../FocusTarget\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\nimport EqTitleButtons from \"./EqTitleButtons\";\n\nconst bandClassName = (band: BandType) => `band-${band}`;\n\nconst EqualizerWindow = () => {\n  const doubled = useTypedSelector(Selectors.getDoubled);\n  const focusedWindow = useTypedSelector(Selectors.getFocusedWindow);\n  const getWindowShade = useTypedSelector(Selectors.getWindowShade);\n\n  const selected = focusedWindow === WINDOWS.EQUALIZER;\n  const shade = getWindowShade(WINDOWS.EQUALIZER);\n\n  const setPreampValue = useActionCreator(Actions.setPreamp);\n  const setEqToMin = useActionCreator(Actions.setEqToMin);\n  const setEqToMid = useActionCreator(Actions.setEqToMid);\n  const setEqToMax = useActionCreator(Actions.setEqToMax);\n  const setHertzValue = useActionCreator(Actions.setEqBand);\n  const toggleEqualizerShadeMode = useActionCreator(\n    Actions.toggleEqualizerShadeMode\n  );\n\n  const className = classnames({\n    selected,\n    doubled,\n    shade,\n    window: true,\n    draggable: true,\n  });\n  return (\n    <div id=\"equalizer-window\" className={className}>\n      <FocusTarget windowId={WINDOWS.EQUALIZER}>\n        {shade ? (\n          <EqualizerShade />\n        ) : (\n          <div>\n            <div\n              className=\"equalizer-top title-bar draggable\"\n              onDoubleClick={toggleEqualizerShadeMode}\n            >\n              <EqTitleButtons />\n            </div>\n            <EqOn />\n            <EqAuto />\n            <EqGraph />\n            <PresetsContextMenu />\n            <Band id=\"preamp\" band=\"preamp\" onChange={setPreampValue} />\n            <div id=\"plus12db\" onClick={setEqToMax} />\n            <div id=\"zerodb\" onClick={setEqToMid} />\n            <div id=\"minus12db\" onClick={setEqToMin} />\n            {BANDS.map((hertz) => (\n              <Band\n                key={hertz}\n                id={bandClassName(hertz)}\n                band={hertz}\n                onChange={(value) => setHertzValue(hertz, value)}\n              />\n            ))}\n          </div>\n        )}\n      </FocusTarget>\n    </div>\n  );\n};\nexport default EqualizerWindow;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/EqualizerWindow/spline.js",
    "content": "// Adapted from https://github.com/morganherlocker/cubic-spline\n\nexport default function spline(xs, ys) {\n  const ks = getNaturalKs(xs, ys);\n  const maxX = xs[xs.length - 1];\n  const allYs = [];\n  let i = 1;\n  for (let x = 0; x <= maxX; x++) {\n    while (xs[i] < x) i++;\n    const t = (x - xs[i - 1]) / (xs[i] - xs[i - 1]);\n    const a = ks[i - 1] * (xs[i] - xs[i - 1]) - (ys[i] - ys[i - 1]);\n    const b = -ks[i] * (xs[i] - xs[i - 1]) + (ys[i] - ys[i - 1]);\n    const q =\n      (1 - t) * ys[i - 1] + t * ys[i] + t * (1 - t) * (a * (1 - t) + b * t);\n    allYs.push(q);\n  }\n  return allYs;\n}\n\nfunction getNaturalKs(xs, ys) {\n  const ks = xs.map(() => 0);\n  const n = xs.length - 1;\n  const matrix = zerosMatrix(n + 1, n + 2);\n\n  for (\n    let i = 1;\n    i < n;\n    i++ // rows\n  ) {\n    matrix[i][i - 1] = 1 / (xs[i] - xs[i - 1]);\n    matrix[i][i] = 2 * (1 / (xs[i] - xs[i - 1]) + 1 / (xs[i + 1] - xs[i]));\n    matrix[i][i + 1] = 1 / (xs[i + 1] - xs[i]);\n    matrix[i][n + 1] =\n      3 *\n      ((ys[i] - ys[i - 1]) / ((xs[i] - xs[i - 1]) * (xs[i] - xs[i - 1])) +\n        (ys[i + 1] - ys[i]) / ((xs[i + 1] - xs[i]) * (xs[i + 1] - xs[i])));\n  }\n\n  matrix[0][0] = 2 / (xs[1] - xs[0]);\n  matrix[0][1] = 1 / (xs[1] - xs[0]);\n  matrix[0][n + 1] =\n    (3 * (ys[1] - ys[0])) / ((xs[1] - xs[0]) * (xs[1] - xs[0]));\n\n  matrix[n][n - 1] = 1 / (xs[n] - xs[n - 1]);\n  matrix[n][n] = 2 / (xs[n] - xs[n - 1]);\n  matrix[n][n + 1] =\n    (3 * (ys[n] - ys[n - 1])) / ((xs[n] - xs[n - 1]) * (xs[n] - xs[n - 1]));\n\n  return solve(matrix, ks);\n}\n\nfunction solve(matrix, ks) {\n  const m = matrix.length;\n  // column\n  for (let k = 0; k < m; k++) {\n    // pivot for column\n    let iMax = 0;\n    let vali = Number.NEGATIVE_INFINITY;\n    for (let i = k; i < m; i++)\n      if (matrix[i][k] > vali) {\n        iMax = i;\n        vali = matrix[i][k];\n      }\n    swapRows(matrix, k, iMax);\n\n    // for all rows below pivot\n    for (let i = k + 1; i < m; i++) {\n      for (let j = k + 1; j < m + 1; j++)\n        matrix[i][j] =\n          matrix[i][j] - matrix[k][j] * (matrix[i][k] / matrix[k][k]);\n      matrix[i][k] = 0;\n    }\n  }\n  // rows = columns\n  for (let i = m - 1; i >= 0; i--) {\n    const v = matrix[i][m] / matrix[i][i];\n    ks[i] = v;\n    // rows\n    for (let j = i - 1; j >= 0; j--) {\n      matrix[j][m] -= matrix[j][i] * v;\n      matrix[j][i] = 0;\n    }\n  }\n  return ks;\n}\n\nfunction zerosMatrix(rows, columns) {\n  const matrix = [];\n  for (let i = 0; i < rows; i++) {\n    matrix.push([]);\n    for (let j = 0; j < columns; j++) {\n      matrix[i].push(0);\n    }\n  }\n  return matrix;\n}\n\nfunction swapRows(m, k, l) {\n  const p = m[k];\n  m[k] = m[l];\n  m[l] = p;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/FocusTarget.tsx",
    "content": "import { useCallback, useState, useEffect } from \"react\";\nimport { WindowId } from \"../types\";\nimport * as Actions from \"../actionCreators\";\nimport * as Selectors from \"../selectors\";\nimport { useActionCreator, useTypedSelector } from \"../hooks\";\n\ninterface Props {\n  onKeyDown?(e: KeyboardEvent): void;\n  windowId: WindowId;\n  children: React.ReactNode;\n}\n\nfunction FocusTarget({ onKeyDown, windowId, children }: Props) {\n  const focusedWindowId = useTypedSelector(Selectors.getFocusedWindow);\n  const setFocus = useActionCreator(Actions.setFocusedWindow);\n\n  const focusHandler = useCallback(() => {\n    if (windowId !== focusedWindowId) {\n      setFocus(windowId);\n    }\n  }, [windowId, focusedWindowId, setFocus]);\n\n  const [ref, setRef] = useState<HTMLDivElement | null>(null);\n\n  useEffect(() => {\n    if (ref == null || onKeyDown == null) {\n      return;\n    }\n    ref.addEventListener(\"keydown\", onKeyDown);\n    return () => ref.removeEventListener(\"keydown\", onKeyDown);\n  }, [onKeyDown, windowId, focusedWindowId, ref]);\n\n  // It's possible for a child component to gain focus and then become\n  // unmounted. In that case, the browser will return focus to the `<body>`.\n  // In the following hook, use a `MutationObserver` to watch for that behavior\n  // and refocus the containing FocusTarget when it happens.\n  //\n  // I tried a number of other approaches using `focus/blur/focusin/focusout` on\n  // various DOM nodes, and was unable to find a solution which would trigger in\n  // this senario in Firefox. Therefore we use this `MutationObserver` approach.\n  useEffect(() => {\n    // Only create the `MutationObserver` within the currently focused target.\n    if (ref == null || windowId !== focusedWindowId) {\n      return;\n    }\n\n    const observer = new MutationObserver((mutations) => {\n      // In the common case we won't have focused the body, so we can do this\n      // inexpensive check first to avoid calling the more expensive `O(n)`\n      // check of the individual mutations.\n      if (document.activeElement !== document.body) {\n        return;\n      }\n      if (mutations.some((mutation) => mutation.removedNodes.length > 0)) {\n        ref.focus();\n      }\n    });\n\n    observer.observe(ref, {\n      subtree: true,\n      attributes: false,\n      childList: true,\n    });\n\n    return () => observer.disconnect();\n  }, [windowId, focusedWindowId, ref]);\n\n  return (\n    <div\n      ref={setRef}\n      onMouseDown={focusHandler}\n      onFocus={focusHandler}\n      tabIndex={-1}\n      style={{ height: \"100%\", width: \"100%\" }}\n    >\n      {children}\n    </div>\n  );\n}\n\nexport default FocusTarget;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Fullscreen.tsx",
    "content": "// Adapted from https://github.com/snakesilk/react-fullscreen\nimport { ReactNode, useRef, useLayoutEffect, useEffect } from \"react\";\nimport fscreen from \"fscreen\";\n\ninterface Props {\n  enabled: boolean;\n  children: ReactNode;\n  onChange(fullscreen: boolean): void;\n}\n\nfunction leaveFullScreen() {\n  if (fscreen.fullscreenEnabled) {\n    fscreen.exitFullscreen();\n  }\n}\n\nfunction enterFullScreen(node: HTMLDivElement) {\n  if (fscreen.fullscreenEnabled) {\n    fscreen.requestFullscreen(node);\n  }\n}\n\nfunction FullScreen(props: Props) {\n  const { onChange, enabled } = props;\n  const ref = useRef<HTMLDivElement | null>(null);\n\n  useEffect(() => {\n    function detectFullScreen() {\n      if (onChange) {\n        onChange(fscreen.fullscreenElement === ref.current);\n      }\n    }\n    fscreen.addEventListener(\"fullscreenchange\", detectFullScreen);\n    return () => {\n      fscreen.removeEventListener(\"fullscreenchange\", detectFullScreen);\n    };\n  }, [onChange]);\n\n  // This must run in response to a click event, so we'll use useLayoutEffect just in case.\n  useLayoutEffect(() => {\n    const isEnabled = fscreen.fullscreenElement === ref.current;\n    if (isEnabled && !enabled) {\n      leaveFullScreen();\n    } else if (!isEnabled && enabled && ref.current != null) {\n      enterFullScreen(ref.current);\n    }\n  }, [enabled]);\n\n  return (\n    <div\n      ref={ref}\n      style={props.enabled ? { height: \"100%\", width: \"100%\" } : undefined}\n    >\n      {props.children}\n    </div>\n  );\n}\n\nexport default FullScreen;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/GenWindow/index.tsx",
    "content": "import * as React from \"react\";\nimport classnames from \"classnames\";\nimport \"../../../css/gen-window.css\";\n\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport ResizeTarget from \"../ResizeTarget\";\nimport { WindowId } from \"../../types\";\nimport FocusTarget from \"../FocusTarget\";\nimport { useActionCreator, useTypedSelector } from \"../../hooks\";\n\ninterface TextProps {\n  children: string;\n}\n\nconst Text = ({ children }: TextProps) => {\n  const letters = children.split(\"\");\n  return (\n    <React.Fragment>\n      {letters.map((letter, i) => (\n        <div\n          key={i}\n          className={`draggable gen-text-letter gen-text-${\n            letter === \" \" ? \"space\" : letter.toLowerCase()\n          }`}\n        />\n      ))}\n    </React.Fragment>\n  );\n};\n\nconst CHROME_WIDTH = 19;\nconst CHROME_HEIGHT = 34;\n\ninterface WindowSize {\n  width: number;\n  height: number;\n}\n\ninterface Props {\n  windowId: WindowId;\n  children: (windowSize: WindowSize) => React.ReactNode;\n  title: string;\n  onKeyDown?(e: KeyboardEvent): void;\n}\n\n// Named export for testing\nexport const GenWindow = ({ children, title, windowId, onKeyDown }: Props) => {\n  const setWindowSize = useActionCreator(Actions.setWindowSize);\n  const closeWindow = useActionCreator(Actions.closeWindow);\n  const getWindowPixelSize = useTypedSelector(Selectors.getWindowPixelSize);\n  const focusedWindow = useTypedSelector(Selectors.getFocusedWindow);\n  const getWindowSize = useTypedSelector(Selectors.getWindowSize);\n  const windowSize = getWindowSize(windowId);\n  const selected = focusedWindow === windowId;\n  const { width, height } = getWindowPixelSize(windowId);\n  return (\n    <FocusTarget windowId={windowId} onKeyDown={onKeyDown}>\n      <div\n        id=\"gen-window\"\n        className={classnames(\"gen-window\", \"window\", { selected })}\n        style={{ width, height }}\n      >\n        <div className=\"gen-top draggable\">\n          <div className=\"gen-top-left draggable\" />\n          <div className=\"gen-top-left-fill draggable\" />\n          <div className=\"gen-top-left-end draggable\" />\n          <div className=\"gen-top-title draggable\">\n            <Text>{title}</Text>\n          </div>\n          <div className=\"gen-top-right-end draggable\" />\n          <div className=\"gen-top-right-fill draggable\" />\n          <div className=\"gen-top-right draggable\">\n            <div\n              className=\"gen-close selected\"\n              onClick={() => closeWindow(windowId)}\n            />\n          </div>\n        </div>\n        <div className=\"gen-middle\">\n          <div className=\"gen-middle-left draggable\">\n            <div className=\"gen-middle-left-bottom draggable\" />\n          </div>\n          <div className=\"gen-middle-center\">\n            {children({\n              width: width - CHROME_WIDTH,\n              height: height - CHROME_HEIGHT,\n            })}\n          </div>\n          <div className=\"gen-middle-right draggable\">\n            <div className=\"gen-middle-right-bottom draggable\" />\n          </div>\n        </div>\n        <div className=\"gen-bottom draggable\">\n          <div className=\"gen-bottom-left draggable\" />\n          <div className=\"gen-bottom-right draggable\">\n            <ResizeTarget\n              currentSize={windowSize}\n              setWindowSize={(size) => setWindowSize(windowId, size)}\n              id={\"gen-resize-target\"}\n            />\n          </div>\n        </div>\n      </div>\n    </FocusTarget>\n  );\n};\n\nexport default GenWindow;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/ActionButtons.tsx",
    "content": "import { memo } from \"react\";\nimport * as Actions from \"../../actionCreators\";\nimport { useActionCreator } from \"../../hooks\";\n\nconst ActionButtons = memo(() => {\n  const previous = useActionCreator(Actions.previous);\n  const play = useActionCreator(Actions.play);\n  const pause = useActionCreator(Actions.pause);\n  const next = useActionCreator(Actions.next);\n  const stop = useActionCreator(Actions.stop);\n  return (\n    <div className=\"actions\">\n      <div id=\"previous\" onClick={previous} title=\"Previous Track\" />\n      <div id=\"play\" onClick={play} title=\"Play\" />\n      <div id=\"pause\" onClick={pause} title=\"Pause\" />\n      <div id=\"stop\" onClick={stop} title=\"Stop\" />\n      <div id=\"next\" onClick={next} title=\"Next Track\" />\n    </div>\n  );\n});\n\nexport default ActionButtons;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Close.tsx",
    "content": "import { memo } from \"react\";\nimport ClickedDiv from \"../ClickedDiv\";\nimport { useActionCreator } from \"../../hooks\";\n\nimport * as Actions from \"../../actionCreators\";\n\nconst Close = memo(() => {\n  const close = useActionCreator(Actions.close);\n  return <ClickedDiv id=\"close\" onClick={close} title=\"Close\" />;\n});\n\nexport default Close;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/ClutterBar.tsx",
    "content": "import { memo } from \"react\";\nimport classnames from \"classnames\";\n\nimport * as Actions from \"../../actionCreators\";\nimport { Action, Thunk } from \"../../types\";\nimport OptionsContextMenu from \"../OptionsContextMenu\";\nimport ContextMenuTarget from \"../ContextMenuTarget\";\nimport { useActionCreator, useTypedSelector } from \"../../hooks\";\nimport * as Selectors from \"../../selectors\";\n\nconst { ipcRenderer } = window.require('electron');\n\nfunction setFocusDouble(): Action {\n  return Actions.setFocus(\"double\");\n}\n\nfunction mouseUp(): Thunk {\n  return (dispatch) => {\n    dispatch(Actions.toggleDoubleSizeMode());\n    dispatch(Actions.unsetFocus());\n  };\n}\n\nconst ClutterBar = memo(() => {\n  const handleMouseDown = useActionCreator(setFocusDouble);\n  const handleMouseUp = useActionCreator(mouseUp);\n  const doubled = useTypedSelector(Selectors.getDoubled);\n  return (\n    <div id=\"clutter-bar\">\n      <ContextMenuTarget bottom renderMenu={() => <OptionsContextMenu />}>\n        <div id=\"button-o\" />\n      </ContextMenuTarget>\n      <div id=\"button-a\"\n        title={\"Лайк\"}\n        onMouseUp={async () => {\n          ipcRenderer.invoke(\"setLike\").then(() => {})\n        }}\n      />\n      <div id=\"button-i\"\n        title={\"Моя волна\"}\n        onMouseUp={async () => {\n          ipcRenderer.invoke(\"setMywave\").then(() => {})\n        }}\n        />\n      <div\n        title={\"Toggle Doublesize Mode\"}\n        id=\"button-d\"\n        className={classnames({ selected: doubled })}\n        onMouseUp={handleMouseUp}\n        onMouseDown={handleMouseDown}\n      />\n      <div id=\"button-v\" />\n    </div>\n  );\n});\n\nexport default ClutterBar;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Eject.tsx",
    "content": "import { memo } from \"react\";\n\nimport * as Actions from \"../../actionCreators\";\nimport { useActionCreator } from \"../../hooks\";\n\nconst Eject = memo(() => {\n  const openMediaFileDialog = useActionCreator(Actions.openMediaFileDialog);\n  return <div id=\"eject\" onClick={openMediaFileDialog} title=\"Open File(s)\" />;\n});\n\nexport default Eject;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/EqToggleButton.tsx",
    "content": "import { memo } from \"react\";\nimport classnames from \"classnames\";\n\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport { useActionCreator, useTypedSelector } from \"../../hooks\";\n\nfunction toggleEqualizer() {\n  return Actions.toggleWindow(\"equalizer\");\n}\n\nconst EqToggleButton = memo(() => {\n  const handleClick = useActionCreator(toggleEqualizer);\n  const windowOpen = useTypedSelector(Selectors.getWindowOpen)(\"equalizer\");\n  return (\n    <div\n      id=\"equalizer-button\"\n      className={classnames({ selected: windowOpen })}\n      onClick={handleClick}\n      title=\"Toggle Graphical Equalizer\"\n    />\n  );\n});\n\nexport default EqToggleButton;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Kbps.tsx",
    "content": "import { memo } from \"react\";\n\nimport CharacterString from \"../CharacterString\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector } from \"../../hooks\";\n\nconst Kbps = memo(() => {\n  const kbps = useTypedSelector(Selectors.getKbps);\n  return (\n    <div id=\"kbps\">\n      <CharacterString>{kbps || \"\"}</CharacterString>\n    </div>\n  );\n});\n\nexport default Kbps;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Khz.tsx",
    "content": "import { memo } from \"react\";\n\nimport CharacterString from \"../CharacterString\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector } from \"../../hooks\";\n\nconst Khz = memo(() => {\n  const khz = useTypedSelector(Selectors.getKhz);\n  return (\n    <div id=\"khz\">\n      <CharacterString>{khz || \"\"}</CharacterString>\n    </div>\n  );\n});\n\nexport default Khz;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/MainBalance.test.js",
    "content": "import { offsetFromBalance } from \"./MainBalance\";\n\ndescribe(\"offsetFromBalance\", () => {\n  it(\"works for positive numbers\", () => {\n    expect(offsetFromBalance(0)).toBe(0);\n    expect(offsetFromBalance(50)).toBe(195);\n    expect(offsetFromBalance(100)).toBe(405);\n  });\n  it(\"works for negative numbers\", () => {\n    expect(offsetFromBalance(-0)).toBe(0);\n    expect(offsetFromBalance(-50)).toBe(195);\n    expect(offsetFromBalance(-100)).toBe(405);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/MainBalance.tsx",
    "content": "import { memo } from \"react\";\n\nimport Balance from \"../Balance\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector } from \"../../hooks\";\n\nexport const offsetFromBalance = (balance: number): number => {\n  const percent = Math.abs(balance) / 100;\n  const sprite = Math.floor(percent * 27);\n  const offset = sprite * 15;\n  return offset;\n};\n\nconst MainBalance = memo(() => {\n  const balance = useTypedSelector(Selectors.getBalance);\n  return (\n    <Balance\n      id=\"balance\"\n      style={{ backgroundPosition: `0 -${offsetFromBalance(balance)}px` }}\n    />\n  );\n});\n\nexport default MainBalance;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/MainContextMenu.tsx",
    "content": "import { memo, Fragment, useEffect, useState, SetStateAction } from \"react\";\nconst { ipcRenderer } = window.require('electron');\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport { LOAD_STYLE } from \"../../constants\";\nimport { Hr, Node, Parent, LinkNode } from \"../ContextMenu\";\nimport PlaybackContextMenu from \"../PlaybackContextMenu\";\nimport OptionsContextMenu from \"../OptionsContextMenu\";\nimport SkinsContextMenu from \"../SkinsContextMenu\";\nimport { FilePicker } from \"../../types\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\ninterface Props {\n  filePickers: FilePicker[];\n}\n\nconst MainContextMenu = memo(({ filePickers }: Props) => {\n  const networkConnected = useTypedSelector(Selectors.getNetworkConnected);\n  const genWindows = useTypedSelector(Selectors.getGenWindows);\n\n  const close = useActionCreator(Actions.close);\n  const openMediaFileDialog = useActionCreator(Actions.openMediaFileDialog);\n  const loadMediaFiles = useActionCreator(Actions.loadMediaFiles);\n  const toggleWindow = useActionCreator(Actions.toggleWindow);\n  const menuOpened = useActionCreator(() => ({\n    type: \"MAIN_CONTEXT_MENU_OPENED\",\n  }));\n  const [playlists, setPlaylists] = useState([]);\n  const [artists, setArtists] = useState([]);\n  const [albums, setAlbums] = useState([]);\n  const [rotors, setRotors] = useState([]);\n  const [playlistgetted, setPlaylistgetted] = useState(false);\n  const [searchResult, setsearchResult] = useState([]);\n  const [lendings, setLendings] = useState([]);\n  const [data, setData] = useState<any>([]);\n  const [userSettings, setUserSettings] = useState<any>([]);\n  const [apiPort, setApiPort] = useState<string>('8080');\n\n  const handleChange = (event: { target: { value: SetStateAction<string>; }; }) => {\n    ipcRenderer.invoke(\"search\", {searchText: event.target.value}).then((rs: any) => {\n      setsearchResult(rs);\n    })\n  };\n\n  const handleApiPortChange = (event: { target: { value: SetStateAction<string>; }; }) => {\n    const port = event.target.value.toString();\n    setApiPort(port);\n  };\n\n  const handleApiPortSave = async () => {\n    const port = parseInt(apiPort) || 8080;\n    await ipcRenderer.invoke(\"setApiSettings\", { port: port });\n    ipcRenderer.invoke('getSettings').then((rs: any) => {\n      setUserSettings(JSON.parse(rs));\n    });\n  };\n\n  const handleApiToggle = async () => {\n    const newEnabled = !(userSettings.api?.enabled || false);\n    await ipcRenderer.invoke(\"setApiSettings\", { enabled: newEnabled });\n    ipcRenderer.invoke('getSettings').then((rs: any) => {\n      setUserSettings(JSON.parse(rs));\n    });\n  };\n\n  useEffect(() => {\n    if (!playlistgetted) {\n      setPlaylistgetted(true);\n      ipcRenderer.invoke(\"nowPlaylist\").then((data: any) => {\n        setData(data);\n      })\n      ipcRenderer.invoke('getUserPlaylists').then((rs: any) => {\n        setPlaylists(rs);\n      })\n      ipcRenderer.invoke('getUserArtists').then((rs: any) => {\n        setArtists(rs);\n      })\n      ipcRenderer.invoke('getUserAlbums').then((rs: any) => {\n        setAlbums(rs);\n      })\n      ipcRenderer.invoke('getRotor').then((rs: any) => {\n        setRotors(rs);\n      })\n      ipcRenderer.invoke('lendings').then((rs: any) => {\n        setLendings(rs);\n      })\n      ipcRenderer.invoke('getSettings').then((rs: any) => {\n        const settings = JSON.parse(rs);\n        setUserSettings(settings);\n        if (settings.api?.port) {\n          setApiPort(settings.api.port.toString());\n        }\n      })\n    }\n\n    menuOpened();\n  }, [menuOpened]);\n\n  return (\n    <Fragment>\n      {\n        (data.uid) ? (\n          <>\n          <Node onClick={async () => {\n            ipcRenderer.invoke(\"openLink\", { link: \"https://yaamp.ru/\" }).then(() => { });\n          } } label={data.title} />\n          <Node onClick={async () => {\n            ipcRenderer.invoke(\"setPlaylistRecomendation\", { uid: data.uid, kind: data.kind }).then(() => { });\n          } } label=\"Рекомендации по плейлисту\" />\n        </>\n        ) : (\n          <Node onClick={async () => {\n            ipcRenderer.invoke(\"openLink\", {link: \"https://yaamp.ru/\"}).then(() => {})\n          }} label=\"Yaamp\" />\n        )\n      }\n      <Hr />\n      <Node onClick={async () => {\n        ipcRenderer.invoke(\"setMywave\").then(() => {})\n      }} label=\"Моя волна\" />\n      <Node onClick={async () => {\n        ipcRenderer.invoke(\"setMyloved\").then(() => {})\n      }} label=\"Любимые треки\" />\n      <Hr />\n      <Parent label=\"Начальные плейлисты\">\n        {lendings.map((result: any) => {\n          return (\n            <Node onClick={async () => {\n              ipcRenderer.invoke(\"setPlaylist\", {uid: result.data.data.uid, kind: result.data.data.kind }).then(() => {})\n            }} label={result.data.data.title} />\n          );\n        })}\n      </Parent>\n      <Hr />\n      <Parent label=\"Поиск...\">\n        <li className=\"input\" id=\"notClose\"><input className=\"searchField\" type=\"text\" id=\"notClose\" placeholder=\"Введите текст...\" onChange={handleChange} /></li>\n        <Hr />\n        {searchResult.map((result: any) => {\n          return (\n            <Node onClick={async () => {\n              if (result.type == 'artist') {\n                ipcRenderer.invoke(\"setArtist\", {id: result.id }).then(() => {})\n              }\n              if (result.type == 'album') {\n                ipcRenderer.invoke(\"setAlbum\", {id: result.id }).then(() => {})\n              }\n            }} label={result.name} />\n          );\n        })}\n      </Parent>\n      <Hr />\n      <Parent label=\"Плейлисты\">\n        {playlists.map((playlist: any) => {\n          return (\n            <Node onClick={async () => {\n              ipcRenderer.invoke(\"setPlaylist\", {uid: playlist.uid, kind: playlist.kind }).then(() => {})\n            }} label={playlist.title} />\n          );\n        })}\n      </Parent>\n      <Parent label=\"Исполнители\">\n        {artists.map((artist: any) => {\n          return (\n            <Node onClick={async () => {\n              ipcRenderer.invoke(\"setArtist\", {id: artist.id }).then(() => {})\n            }} label={artist.title} />\n          );\n        })}\n      </Parent>\n      <Parent label=\"Альбомы\">\n        {albums.map((album: any) => {\n          return (\n            <Node onClick={async () => {\n              ipcRenderer.invoke(\"setAlbum\", {id: album.id }).then(() => {})\n            }} label={album.title} />\n          );\n        })}\n      </Parent>\n      <Parent label=\"Станции\">\n        {rotors.map((rotor: any) => {\n          return (\n            <Node onClick={async () => {\n              ipcRenderer.invoke(\"setRotor\", {id: rotor.id }).then(() => {})\n            }} label={rotor.title} />\n          );\n        })}\n      </Parent>\n      <Hr />\n      <Node onClick={async () => {\n        ipcRenderer.invoke(\"openPlayNow\").then(() => {})\n      }} label=\"Сейчас играет...\" />\n      <Node onClick={async () => {\n        ipcRenderer.invoke(\"setLike\").then(() => {})\n      }} label=\"Лайк\" />\n      <Node onClick={async () => {\n        ipcRenderer.invoke(\"setDislike\").then(() => {})\n      }} label=\"Дизлайк\" />\n      <Hr />\n      {Object.keys(genWindows).map((i) => (\n        <Node\n          key={i}\n          label={genWindows[i].title}\n          checked={genWindows[i].open}\n          onClick={() => toggleWindow(i)}\n          hotkey={genWindows[i].hotkey}\n        />\n      ))}\n      <Hr />\n      <SkinsContextMenu />\n      <Hr />\n      <Parent label=\"Увеличение\">\n        <Node onClick={async () => {\n          ipcRenderer.invoke(\"setRatio\", {value: 1}).then(() => {})\n        }}\n          label=\"x1\"\n          checked={ userSettings.zoom === 1 }\n         />\n        <Node onClick={async () => {\n          ipcRenderer.invoke(\"setRatio\", {value: 1.2}).then(() => {})\n        }}\n          label=\"x1.2\"\n          checked={ userSettings.zoom === 1.2 }\n        />\n        <Node onClick={async () => {\n          ipcRenderer.invoke(\"setRatio\", {value: 1.4}).then(() => {})\n        }}\n          label=\"x1.4\"\n          checked={ userSettings.zoom === 1.4 }\n        />\n        <Node onClick={async () => {\n          ipcRenderer.invoke(\"setRatio\", {value: 1.6}).then(() => {})\n        }}\n          label=\"x1.6\"\n          checked={ userSettings.zoom === 1.6 }\n        />\n        <Node onClick={async () => {\n          ipcRenderer.invoke(\"setRatio\", {value: 1.8}).then(() => {})\n        }}\n          label=\"x1.8\"\n          checked={ userSettings.zoom === 1.8 }\n        />\n      </Parent>\n      <Parent label=\"Options\">\n        <OptionsContextMenu />\n      </Parent>\n      <Parent label=\"Playback\">\n        <PlaybackContextMenu />\n      </Parent>\n      <Hr />\n      <Parent label=\"API\">\n        <Node \n          onClick={handleApiToggle}\n          label={userSettings.api?.enabled ? \"Выключить API\" : \"Включить API\"}\n          checked={userSettings.api?.enabled || false}\n        />\n        <Hr />\n        <li className=\"input\" id=\"notClose\">\n          <input \n            className=\"searchField\" \n            type=\"number\" \n            id=\"notClose\" \n            placeholder=\"Порт (8080)\" \n            value={apiPort}\n            onChange={handleApiPortChange}\n            onBlur={handleApiPortSave}\n            min=\"1024\"\n            max=\"65535\"\n          />\n        </li>\n        <Hr />\n        <Node \n          onClick={handleApiPortSave}\n          label=\"Сохранить порт\"\n        />\n      </Parent>\n      <Hr />\n      <Node onClick={async () => {\n        ipcRenderer.invoke(\"openLink\", {link: \"https://yaamp.ru/donate.php\"}).then(() => {})\n      }} label=\"Поддержать проект\" />\n      <Hr />\n      <Node onClick={async () => {\n        ipcRenderer.invoke(\"logout\").then(() => {})\n      }} label=\"Выйти из аккаунта\" />\n      <Node onClick={close} label=\"Exit\" />\n    </Fragment>\n  );\n});\n\nexport default MainContextMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/MainVolume.tsx",
    "content": "import { memo } from \"react\";\nimport * as Selectors from \"../../selectors\";\n\nimport Volume from \"../Volume\";\nimport { useTypedSelector } from \"../../hooks\";\n\nconst MainVolume = memo(() => {\n  const volume = useTypedSelector(Selectors.getVolume);\n  const percent = volume / 100;\n  const sprite = Math.round(percent * 28);\n  const offset = (sprite - 1) * 15;\n\n  const style = {\n    backgroundPosition: `0 -${offset}px`,\n  };\n  return (\n    <div id=\"volume\" style={style}>\n      <Volume />\n    </div>\n  );\n});\n\nexport default MainVolume;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Marquee.test.js",
    "content": "import { mod, stepOffset, pixelUnits, loopText } from \"./Marquee\";\n\ndescribe(\"mod\", () => {\n  it(\"behaves differently than % for negative numbers\", () => {\n    expect(mod(-17, 5)).not.toBe(-17 % 5);\n  });\n  it(\"always returns positive\", () => {\n    expect(mod(-17, 5)).toBe(3);\n  });\n});\n\ndescribe(\"stepOffset\", () => {\n  const long = \"This is a long string. Longer than 30 characters!\";\n  it(\"starts at 0\", () => {\n    const actual = stepOffset(long, 0, 0);\n    const expected = 0;\n    expect(actual).toEqual(expected);\n  });\n  it(\"first step offsets by one character\", () => {\n    const actual = stepOffset(long, 1, 0);\n    const expected = 5;\n    expect(actual).toEqual(expected);\n  });\n  it(\"resets to 0 when step === string.length + the separator length\", () => {\n    const actual = stepOffset(long, long.length + 7, 0);\n    const expected = 0;\n    expect(actual).toEqual(expected);\n  });\n  it(\"offsets by one char when step = string.length the separator length + 1\", () => {\n    const actual = stepOffset(long, long.length + 7 + 1, 0);\n    const expected = 5;\n    expect(actual).toEqual(expected);\n  });\n  it(\"does not try to offset strings shorter than 30 characters\", () => {\n    const actual = stepOffset(\"hello\", 15, 0);\n    const expected = 0;\n    expect(actual).toEqual(expected);\n  });\n  it(\"applies an additional pixel offset\", () => {\n    const actual = stepOffset(\"hello\", 1, 51); // WAT?\n    const expected = 0;\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"pixelUnits\", () => {\n  it(\"converts an integer into a CSS offset\", () => {\n    const actual = pixelUnits(1);\n    const expected = \"1px\";\n    expect(actual).toEqual(expected);\n  });\n  it(\"handles 0\", () => {\n    const actual = pixelUnits(0);\n    const expected = \"0px\";\n    expect(actual).toEqual(expected);\n  });\n  it(\"handles negative values\", () => {\n    const actual = pixelUnits(-10);\n    const expected = \"-10px\";\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"loopText\", () => {\n  const long = \"This is a long string. Longer than 30 characters!\";\n  const short = \"This is a short string.\";\n  it(\"loops long string\", () => {\n    const actual = loopText(long);\n    const expected = `${long}  ***  ${long}`;\n    expect(actual).toEqual(expected);\n  });\n  it(\"does not loop sort strings\", () => {\n    const actual = loopText(short);\n    const expected = short;\n    expect(actual.trim()).toEqual(expected);\n  });\n  it(\"pads a sort strings\", () => {\n    const actual = loopText(short);\n    expect(actual.length).toBe(31);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Marquee.tsx",
    "content": "// Single line text display that can animate and hold multiple registers\n// Knows how to display various modes like tracking, volume, balance, etc.\nimport * as React from \"react\";\nimport CharacterString from \"../CharacterString\";\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nconst SEPARATOR = \"  ***  \";\n\nconst CHAR_WIDTH = 5;\nconst MARQUEE_MAX_LENGTH = 31;\n\n// Always positive modulus\nexport const mod = (n: number, m: number): number => ((n % m) + m) % m;\n\nconst isLong = (text: string): boolean => text.length >= MARQUEE_MAX_LENGTH;\n\n// Given text and step, how many pixels should it be shifted?\nexport const stepOffset = (\n  text: string,\n  step: number,\n  pixels: number\n): number => {\n  if (!isLong(text)) {\n    return 0;\n  }\n\n  const stepOffsetWidth = step * CHAR_WIDTH; // Steps move one char at a time\n  const offset = stepOffsetWidth + pixels;\n  const stringLength = (text.length + SEPARATOR.length) * CHAR_WIDTH;\n\n  return mod(offset, stringLength);\n};\n\n// Format an int as pixels\nexport const pixelUnits = (pixels: number): string => `${pixels}px`;\n\n// If text is wider than the marquee, it needs to loop\nexport const loopText = (text: string): string =>\n  isLong(text)\n    ? `${text}${SEPARATOR}${text}`\n    : text.padEnd(MARQUEE_MAX_LENGTH, \" \");\n\ninterface UseStepperArgs {\n  step: () => void;\n  dragging: boolean;\n}\n\n// Call `step` every second, except when dragging. Resume stepping 1 second after dragging ceases.\nfunction useStepper({ step, dragging }: UseStepperArgs): void {\n  const [stepping, setStepping] = React.useState(true);\n  React.useEffect(() => {\n    if (stepping === false) {\n      return;\n    }\n    const stepHandle = setInterval(step, 220);\n    return () => clearInterval(stepHandle);\n  }, [step, stepping]);\n\n  React.useEffect(() => {\n    if (dragging) {\n      setStepping(false);\n      return;\n    }\n    const steppingTimeout = window.setTimeout(() => {\n      setStepping(true);\n    }, 1000);\n    return () => {\n      window.clearTimeout(steppingTimeout);\n    };\n  }, [dragging]);\n}\n\n// When user calls `handleMouseDown`, and moves the mouse, `dragOffset` will update as they drag.\nfunction useDragX() {\n  const [mouseDownX, setMouseDownX] = React.useState<number | null>(null);\n  const [dragOffset, setDragOffset] = React.useState(0);\n\n  React.useEffect(() => {\n    if (mouseDownX == null) {\n      return;\n    }\n    const xStart = mouseDownX;\n    const handleMouseMove = (ee: MouseEvent) => {\n      const diff = ee.clientX - xStart;\n      setDragOffset(-diff);\n    };\n\n    // TODO: Use `once` or something instead of this flag nonsense\n    let cleanedUp = false;\n    const handleMouseUp = () => {\n      if (cleanedUp) {\n        return;\n      }\n      document.removeEventListener(\"mousemove\", handleMouseMove);\n      document.removeEventListener(\"mouseUp\", handleMouseUp);\n      setMouseDownX(null);\n      cleanedUp = true;\n    };\n\n    document.addEventListener(\"mousemove\", handleMouseMove);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n\n    return handleMouseUp;\n  }, [mouseDownX]);\n\n  const handleMouseDown = React.useCallback(\n    (e: React.MouseEvent<HTMLDivElement>): void => {\n      setMouseDownX(e.clientX);\n    },\n    []\n  );\n\n  return { handleMouseDown, dragOffset, dragging: mouseDownX != null };\n}\n\nconst Marquee = React.memo(() => {\n  const text = useTypedSelector(Selectors.getMarqueeText);\n  const doubled = useTypedSelector(Selectors.getDoubled);\n  const marqueeStep = useTypedSelector(Selectors.getMarqueeStep);\n  const stepMarquee = useActionCreator(Actions.stepMarquee);\n  const { handleMouseDown, dragOffset, dragging } = useDragX();\n  const offset = stepOffset(text, marqueeStep, dragOffset);\n  const offsetPixels = pixelUnits(-offset);\n\n  useStepper({ step: stepMarquee, dragging });\n\n  return (\n    <div\n      id=\"marquee\"\n      className=\"text\"\n      onMouseDown={handleMouseDown}\n      title=\"Song Title\"\n    >\n      <div\n        style={{\n          whiteSpace: \"nowrap\",\n          willChange: \"transform\",\n          transform: `translateX(${offsetPixels})`,\n        }}\n        // Force the DOM node to be recreated when the doubled size changes.\n        // This works around a Chrome browser bug where the `will-change: transform;`\n        // on this node seems to cause a change to the `image-rendering:\n        // pixelated;` which we inherit from `#webamp` not to be respected.\n        key={doubled ? \"doubled\" : \"not-doubled\"}\n      >\n        <CharacterString>{loopText(text)}</CharacterString>\n      </div>\n    </div>\n  );\n});\n\nexport default Marquee;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Minimize.tsx",
    "content": "import { memo } from \"react\";\nimport ClickedDiv from \"../ClickedDiv\";\nimport * as Actions from \"../../actionCreators\";\nimport { useActionCreator } from \"../../hooks\";\n\nconst Minimize = memo(() => {\n  const minimize = useActionCreator(Actions.minimize);\n  return <ClickedDiv id=\"minimize\" title=\"Minimize\" onClick={minimize} />;\n});\n\nexport default Minimize;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/MonoStereo.tsx",
    "content": "import { memo } from \"react\";\nimport classnames from \"classnames\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector } from \"../../hooks\";\n\nconst MonoStereo = memo(() => {\n  const channels = useTypedSelector(Selectors.getChannels);\n  return (\n    <div className=\"mono-stereo\">\n      <div id=\"stereo\" className={classnames({ selected: channels === 2 })} />\n      <div id=\"mono\" className={classnames({ selected: channels === 1 })} />\n    </div>\n  );\n});\n\nexport default MonoStereo;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/PlaylistToggleButton.tsx",
    "content": "import { memo } from \"react\";\nimport classnames from \"classnames\";\n\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nfunction togglePlaylist() {\n  return Actions.toggleWindow(\"playlist\");\n}\n\nconst PlaylistToggleButton = memo(() => {\n  const selected = useTypedSelector(Selectors.getWindowOpen)(\"playlist\");\n  const handleClick = useActionCreator(togglePlaylist);\n  return (\n    <div\n      id=\"playlist-button\"\n      className={classnames({ selected })}\n      onClick={handleClick}\n      title=\"Toggle Playlist Editor\"\n    />\n  );\n});\n\nexport default PlaylistToggleButton;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Position.tsx",
    "content": "import { memo, useCallback } from \"react\";\n\nimport {\n  SEEK_TO_PERCENT_COMPLETE,\n  SET_FOCUS,\n  UNSET_FOCUS,\n  SET_SCRUB_POSITION,\n} from \"../../actionTypes\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector, useTypedDispatch } from \"../../hooks\";\n\nfunction usePosition() {\n  const duration = useTypedSelector(Selectors.getDuration);\n  const timeElapsed = useTypedSelector(Selectors.getTimeElapsed);\n  const position = duration ? (Math.floor(timeElapsed) / duration) * 100 : 0;\n  const scrubPosition = useTypedSelector(Selectors.getUserInputScrubPosition);\n  const userInputFocus = useTypedSelector(Selectors.getUserInputFocus);\n\n  const displayedPosition =\n    userInputFocus === \"position\" ? scrubPosition : position;\n\n  return [position, displayedPosition];\n}\n\nconst Position = memo(() => {\n  const [position, displayedPosition] = usePosition();\n  const dispatch = useTypedDispatch();\n\n  const seekToPercentComplete = useCallback(\n    (e) => {\n      dispatch({\n        type: SEEK_TO_PERCENT_COMPLETE,\n        percent: Number((e.target as HTMLInputElement).value),\n      });\n      dispatch({ type: UNSET_FOCUS });\n    },\n    [dispatch]\n  );\n\n  const setPosition = useCallback(\n    (e) => {\n      dispatch({ type: SET_FOCUS, input: \"position\" });\n      dispatch({\n        type: SET_SCRUB_POSITION,\n        position: Number((e.target as HTMLInputElement).value),\n      });\n    },\n    [dispatch]\n  );\n\n  // In shade mode, the position slider shows up differently depending on if\n  // it's near the start, middle or end of its progress\n  let className = \"\";\n  if (position <= 33) {\n    className = \"left\";\n  } else if (position >= 66) {\n    className = \"right\";\n  }\n\n  return (\n    <input\n      id=\"position\"\n      className={className}\n      type=\"range\"\n      min=\"0\"\n      max=\"100\"\n      step=\"1\"\n      value={displayedPosition}\n      onInput={setPosition}\n      onChange={\n        () => {} /* React complains without this, can probably rename onInput to onChange */\n      }\n      onMouseUp={seekToPercentComplete}\n      onMouseDown={setPosition}\n      title=\"Seeking Bar\"\n    />\n  );\n});\n\nexport default Position;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Repeat.tsx",
    "content": "import { memo } from \"react\";\nimport classnames from \"classnames\";\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport ContextMenuWraper from \"../ContextMenuWrapper\";\nimport { Node } from \"../ContextMenu\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nconst Repeat = memo(() => {\n  const repeat = useTypedSelector(Selectors.getRepeat);\n  const handleClick = useActionCreator(Actions.toggleRepeat);\n  return (\n    <ContextMenuWraper\n      renderContents={() => (\n        <Node\n          checked={repeat}\n          label=\"Repeat\"\n          onClick={handleClick}\n          hotkey=\"(R)\"\n        />\n      )}\n    >\n      <div\n        id=\"repeat\"\n        className={classnames({ selected: repeat })}\n        onClick={handleClick}\n        title=\"Toggle Repeat\"\n      />\n    </ContextMenuWraper>\n  );\n});\n\nexport default Repeat;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Shade.tsx",
    "content": "import { memo } from \"react\";\nimport ClickedDiv from \"../ClickedDiv\";\n\nimport * as Actions from \"../../actionCreators\";\nimport { useActionCreator } from \"../../hooks\";\n\nconst Shade = memo(() => {\n  const handleClick = useActionCreator(Actions.toggleMainWindowShadeMode);\n  return (\n    <ClickedDiv\n      id=\"shade\"\n      onMouseDown={handleClick}\n      onDoubleClick={(e) => e.stopPropagation()}\n      title=\"Toggle Windowshade Mode\"\n    />\n  );\n});\n\nexport default Shade;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Shuffle.tsx",
    "content": "import { memo } from \"react\";\nimport classnames from \"classnames\";\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport ContextMenuWraper from \"../ContextMenuWrapper\";\nimport { Node } from \"../ContextMenu\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nconst Shuffle = memo(() => {\n  const shuffle = useTypedSelector(Selectors.getShuffle);\n  const handleClick = useActionCreator(Actions.toggleShuffle);\n  return (\n    <ContextMenuWraper\n      renderContents={() => (\n        <Node\n          checked={shuffle}\n          label=\"Shuffle\"\n          onClick={handleClick}\n          hotkey=\"(S)\"\n        />\n      )}\n    >\n      <div\n        id=\"shuffle\"\n        className={classnames({ selected: shuffle })}\n        onClick={handleClick}\n        title=\"Toggle Shuffle\"\n      />\n    </ContextMenuWraper>\n  );\n});\n\nexport default Shuffle;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/Time.tsx",
    "content": "import { memo } from \"react\";\nimport * as Utils from \"../../utils\";\n\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport { TIME_MODE } from \"../../constants\";\nimport { useActionCreator, useTypedSelector } from \"../../hooks\";\n\nconst Time = memo(() => {\n  const toggleTimeMode = useActionCreator(Actions.toggleTimeMode);\n  const timeElapsed = useTypedSelector(Selectors.getTimeElapsed);\n  const duration = useTypedSelector(Selectors.getDuration) || 0;\n  const timeMode = useTypedSelector(Selectors.getTimeMode);\n  const seconds =\n    timeMode === TIME_MODE.ELAPSED ? timeElapsed : duration - timeElapsed;\n\n  const timeObj = Utils.getTimeObj(seconds);\n  return (\n    <div id=\"time\" onClick={toggleTimeMode} className=\"countdown\">\n      {timeMode === TIME_MODE.REMAINING && <div id=\"minus-sign\" />}\n      <div\n        id=\"minute-first-digit\"\n        className={`digit digit-${timeObj.minutesFirstDigit}`}\n      />\n      <div\n        id=\"minute-second-digit\"\n        className={`digit digit-${timeObj.minutesSecondDigit}`}\n      />\n      <div\n        id=\"second-first-digit\"\n        className={`digit digit-${timeObj.secondsFirstDigit}`}\n      />\n      <div\n        id=\"second-second-digit\"\n        className={`digit digit-${timeObj.secondsSecondDigit}`}\n      />\n    </div>\n  );\n});\n\nexport default Time;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MainWindow/index.tsx",
    "content": "import * as React from \"react\";\nimport classnames from \"classnames\";\nimport { WINDOWS, MEDIA_STATUS, LOAD_STYLE } from \"../../constants\";\nimport * as Actions from \"../../actionCreators\";\n\nimport DropTarget from \"../DropTarget\";\nimport MiniTime from \"../MiniTime\";\n\nimport ClickedDiv from \"../ClickedDiv\";\nimport ContextMenuTarget from \"../ContextMenuTarget\";\nimport Visualizer from \"../Visualizer\";\nimport ActionButtons from \"./ActionButtons\";\nimport MainBalance from \"./MainBalance\";\nimport Close from \"./Close\";\nimport ClutterBar from \"./ClutterBar\";\nimport MainContextMenu from \"./MainContextMenu\";\nimport Eject from \"./Eject\";\nimport EqToggleButton from \"./EqToggleButton\";\nimport PlaylistToggleButton from \"./PlaylistToggleButton\";\nimport Kbps from \"./Kbps\";\nimport Khz from \"./Khz\";\nimport Marquee from \"./Marquee\";\nimport MonoStereo from \"./MonoStereo\";\nimport Position from \"./Position\";\nimport Repeat from \"./Repeat\";\nimport Shade from \"./Shade\";\nimport Minimize from \"./Minimize\";\nimport Shuffle from \"./Shuffle\";\nimport Time from \"./Time\";\nimport MainVolume from \"./MainVolume\";\nimport * as Selectors from \"../../selectors\";\n\nimport \"../../../css/main-window.css\";\nimport { FilePicker } from \"../../types\";\nimport FocusTarget from \"../FocusTarget\";\nimport { useActionCreator, useTypedSelector } from \"../../hooks\";\n\nconst { ipcRenderer } = window.require('electron');\n\ninterface Props {\n  analyser: AnalyserNode;\n  filePickers: FilePicker[];\n}\n\nfunction loadMediaAndPlay(e: React.DragEvent<HTMLDivElement>) {\n  return Actions.loadMedia(e, LOAD_STYLE.PLAY);\n}\n\nconst MainWindow = React.memo(({ analyser, filePickers }: Props) => {\n  const mainShade = useTypedSelector(Selectors.getWindowShade)(\"main\");\n  const status = useTypedSelector(Selectors.getMediaStatus);\n  const focused = useTypedSelector(Selectors.getFocusedWindow);\n  const loading = useTypedSelector(Selectors.getLoading);\n  const doubled = useTypedSelector(Selectors.getDoubled);\n  const llama = useTypedSelector(Selectors.getLlamaMode);\n  const working = useTypedSelector(Selectors.getWorking);\n\n  const className = classnames({\n    window: true,\n    play: status === MEDIA_STATUS.PLAYING,\n    stop: status === MEDIA_STATUS.STOPPED,\n    pause: status === MEDIA_STATUS.PAUSED,\n    selected: focused === WINDOWS.MAIN,\n    shade: mainShade,\n    draggable: true,\n    loading,\n    doubled,\n    llama,\n  });\n\n  const toggleMainWindowShadeMode = useActionCreator(\n    Actions.toggleMainWindowShadeMode\n  );\n  const scrollVolume = useActionCreator(Actions.scrollVolume);\n  const loadMedia = useActionCreator(loadMediaAndPlay);\n\n  return (\n    <DropTarget\n      id=\"main-window\"\n      windowId={WINDOWS.MAIN}\n      className={className}\n      handleDrop={loadMedia}\n    >\n      <FocusTarget windowId={WINDOWS.MAIN}>\n        <div\n          id=\"title-bar\"\n          className=\"selected draggable\"\n          onDoubleClick={toggleMainWindowShadeMode}\n        >\n          <ContextMenuTarget\n            id=\"option-context\"\n            bottom\n            renderMenu={() => <MainContextMenu filePickers={filePickers} />}\n          >\n            <ClickedDiv id=\"option\" title=\"Winamp Menu\" />\n          </ContextMenuTarget>\n          {mainShade && <MiniTime />}\n          <Minimize />\n          <Shade />\n          <Close />\n        </div>\n        <div className=\"status\">\n          <ClutterBar />\n          {!working && <div id=\"play-pause\" />}\n          <div\n            id=\"work-indicator\"\n            className={classnames({ selected: working })}\n          />\n          <Time />\n        </div>\n        <Visualizer\n          // @ts-ignore Visualizer is not typed yet\n          analyser={analyser}\n        />\n        <div className=\"media-info\">\n          <Marquee />\n          <Kbps />\n          <Khz />\n          <MonoStereo />\n        </div>\n        <MainVolume />\n        <MainBalance />\n        <div className=\"windows\">\n          <EqToggleButton />\n          <PlaylistToggleButton />\n        </div>\n        <Position />\n        <ActionButtons />\n        <Eject />\n        <div className=\"shuffle-repeat\">\n          <Shuffle />\n          <Repeat />\n        </div>\n        <a\n          id=\"about\"\n          href=\"#\"\n          title=\"Yaamp\"\n          onClick={async () => {\n            ipcRenderer.invoke(\"openLink\", {link: \"https://yaamp.ru/\"}).then(() => {})\n          }}\n        />\n      </FocusTarget>\n    </DropTarget>\n  );\n});\n\nexport default MainWindow;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MilkdropWindow/Background.tsx",
    "content": "import * as React from \"react\";\n\ninterface Props {\n  innerRef?: (node: HTMLDivElement) => void;\n  children: React.ReactNode;\n}\n\nconst Background = (props: Props) => {\n  const { innerRef } = props;\n  return (\n    <div\n      ref={innerRef}\n      className=\"draggable\"\n      style={{\n        // This color will be used until Butterchurn is loaded\n        backgroundColor: \"#000\",\n        position: \"absolute\",\n        top: 0,\n        bottom: 0,\n        left: 0,\n        right: 0,\n        height: \"100%\",\n        width: \"100%\",\n      }}\n      tabIndex={0}\n    >\n      {props.children}\n    </div>\n  );\n};\n\nexport default Background;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MilkdropWindow/Desktop.tsx",
    "content": "import * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport ReactDOM from \"react-dom\";\n\ninterface Props {\n  children: ReactNode;\n}\n\nconst Desktop = React.memo(({ children }: Props) => {\n  const [desktopNode] = React.useState(() => document.createElement(\"div\"));\n\n  React.useEffect(() => {\n    desktopNode.classList.add(\"webamp-desktop\");\n    document.body.appendChild(desktopNode);\n    return () => {\n      document.body.removeChild(desktopNode);\n    };\n  }, [desktopNode]);\n\n  return ReactDOM.createPortal(children, desktopNode);\n});\n\nexport default Desktop;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MilkdropWindow/MilkdropContextMenu.tsx",
    "content": "import { ReactNode } from \"react\";\nimport { Hr, Node, Parent } from \"../ContextMenu\";\nimport { WINDOWS } from \"../../constants\";\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport ContextMenuWraper from \"../ContextMenuWrapper\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n// @ts-ignore\nimport butterchurnPresets from 'butterchurn-presets';\nimport _ from \"lodash\";\n\ninterface Props {\n  children: ReactNode;\n}\n\nconst MilkdropContextMenu = (props: Props) => {\n  const desktop = useTypedSelector(Selectors.getMilkdropDesktopEnabled);\n  const currentPreset = useTypedSelector(Selectors.getCurrentPreset);\n  const currentLock = useTypedSelector(Selectors.getMilkdropLockEnabled);\n\n  const closeWindow = useActionCreator(Actions.closeWindow);\n  const toggleDesktop = useActionCreator(Actions.toggleMilkdropDesktop);\n  const toggleFullscreen = useActionCreator(Actions.toggleMilkdropFullscreen);\n  const toggleLock = useActionCreator(Actions.toggleMilkdropLock);\n  const selectNextPreset = useActionCreator(Actions.selectNextPreset);\n  const selectPreset = useActionCreator(Actions.selectPreset);\n\n  const presets = butterchurnPresets.getPresets();\n  const presetKeys = _.keys(presets);\n  \n  return (\n    <ContextMenuWraper\n      renderContents={() => {\n        return (\n          <>\n            <Node\n              onClick={toggleFullscreen}\n              label=\"Fullscreen\"\n              hotkey=\"Alt+Enter\"\n            />\n            <Node onClick={toggleLock} label=\"Lock preset\" checked={currentLock} />\n            <Parent label=\"Select preset\">\n                {presetKeys.map((presetKey: any) => {\n                  return (\n                    <Node onClick={() => selectPreset(presetKey)} label={presetKey} checked={presetKey == currentPreset} />\n                  );\n                })}\n            </Parent>\n            {/* <Node\n              onClick={toggleDesktop}\n              checked={desktop}\n              label=\"Desktop Mode\"\n              hotkey=\"Alt+D\"\n            /> */}\n            <Hr />\n            <Node onClick={() => closeWindow(WINDOWS.MILKDROP)} label=\"Quit\" />\n          </>\n        );\n      }}\n    >\n      {props.children}\n    </ContextMenuWraper>\n  );\n};\n\nexport default MilkdropContextMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MilkdropWindow/PresetOverlay.tsx",
    "content": "import { useState, useCallback } from \"react\";\nimport { promptForFileReferences } from \"../../fileUtils\";\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport { clamp } from \"../../utils\";\nimport { TransitionType } from \"../../types\";\nimport {\n  useUnmountedRef,\n  useActionCreator,\n  useTypedSelector,\n} from \"../../hooks\";\n\nconst ENTRY_HEIGHT = 14;\nconst HEIGHT_PADDING = 15;\nconst WIDTH_PADDING = 20;\n\nconst LOADING_STYLE: React.CSSProperties = {\n  position: \"absolute\",\n  top: 0,\n  left: 0,\n  color: \"white\",\n  background: \"rgba(0.33, 0.33, 0.33, 0.33)\",\n};\n\nconst OUTER_WRAPPER_STYLE: React.CSSProperties = {\n  position: \"absolute\",\n  top: 0,\n  left: 0,\n  padding: \"15px 10px 0 10px\",\n};\n\nconst INNER_WRAPPER_STYLE: React.CSSProperties = {\n  display: \"inline-block\",\n  whiteSpace: \"nowrap\",\n  overflow: \"hidden\",\n  background: \"rgba(0, 0, 0, 0.815)\",\n  fontSize: \"12px\",\n};\n\ninterface Props {\n  height: number;\n  width: number;\n}\n\nfunction presetIndexFromListIndex(listIndex: number) {\n  return listIndex - 1;\n}\n\nfunction listIndexFromPresetIndex(listIndex: number) {\n  return listIndex + 1;\n}\n\nfunction PresetOverlay({ height, width }: Props) {\n  const presetKeys = useTypedSelector(Selectors.getPresetNames);\n  const currentPresetIndex = useTypedSelector(Selectors.getCurrentPresetIndex);\n  const requestPresetAtIndex = useActionCreator(Actions.requestPresetAtIndex);\n  const togglePresetOverlay = useActionCreator(Actions.togglePresetOverlay);\n  const appendPresetFileList = useActionCreator(Actions.appendPresetFileList);\n\n  const unmountedRef = useUnmountedRef();\n  const [selectedListIndex, setSelectedListIndex] = useState(() => {\n    if (currentPresetIndex != null) {\n      return listIndexFromPresetIndex(currentPresetIndex);\n    }\n    return 0;\n  });\n\n  // Number of presets, plus one for the \"Load Local Directory\" option, minus\n  // one to convert a length to an index.\n  const maxListIndex = presetKeys.length; // - 1 + 1;\n\n  const renderList = useCallback(() => {\n    const maxVisibleRows = Math.floor((height - HEIGHT_PADDING) / ENTRY_HEIGHT);\n    const rowsToShow = Math.floor(maxVisibleRows * 0.75); // Only fill 3/4 of the screen.\n    const [startIndex, endIndex] = getRangeCenteredOnIndex(\n      maxListIndex + 1, // Add one to convert an index to a length\n      rowsToShow,\n      selectedListIndex\n    );\n\n    const presetElms = [];\n    for (let i = startIndex; i <= endIndex; i++) {\n      const presetIndex = presetIndexFromListIndex(i);\n      const isSelected = i === selectedListIndex;\n      const isCurrent = presetIndex === currentPresetIndex;\n      let color: string;\n      if (isSelected) {\n        color = isCurrent ? \"#FFCC22\" : \"#FF5050\";\n      } else {\n        color = isCurrent ? \"#CCFF03\" : \"#CCCCCC\";\n      }\n      presetElms.push(\n        <li key={i} style={{ color, lineHeight: `${ENTRY_HEIGHT}px` }}>\n          {i === 0 ? \"Load Local Directory\" : presetKeys[presetIndex]}\n        </li>\n      );\n    }\n\n    return presetElms;\n  }, [currentPresetIndex, height, maxListIndex, presetKeys, selectedListIndex]);\n\n  const loadLocalDir = useCallback(async () => {\n    const fileReferences = await promptForFileReferences({ directory: true });\n    if (unmountedRef.current) {\n      return;\n    }\n    appendPresetFileList(fileReferences);\n  }, [appendPresetFileList, unmountedRef]);\n\n  const handleFocusedKeyboardInput = useCallback(\n    (e: React.KeyboardEvent<HTMLDivElement>) => {\n      switch (e.keyCode) {\n        case 38: // up arrow\n          setSelectedListIndex((value) => Math.max(value - 1, 0));\n          e.stopPropagation();\n          break;\n        case 40: // down arrow\n          setSelectedListIndex((value) => Math.min(value + 1, maxListIndex));\n          e.stopPropagation();\n          break;\n        case 13: // enter\n          if (selectedListIndex === 0) {\n            loadLocalDir();\n          } else {\n            requestPresetAtIndex(\n              presetIndexFromListIndex(selectedListIndex),\n              TransitionType.DEFAULT,\n              true\n            );\n          }\n          e.stopPropagation();\n          break;\n        case 27: // escape\n          togglePresetOverlay();\n          e.stopPropagation();\n          break;\n      }\n    },\n    [\n      loadLocalDir,\n      maxListIndex,\n      requestPresetAtIndex,\n      selectedListIndex,\n      togglePresetOverlay,\n    ]\n  );\n\n  const handleNode = useCallback((node: HTMLDivElement | null) => {\n    if (node != null && document.activeElement !== node) {\n      node.focus();\n    }\n  }, []);\n\n  if (presetKeys == null) {\n    return (\n      <div style={LOADING_STYLE}>\n        <span>Loading presets</span>\n      </div>\n    );\n  }\n  return (\n    <div\n      ref={handleNode}\n      tabIndex={-1}\n      style={OUTER_WRAPPER_STYLE}\n      onKeyDown={handleFocusedKeyboardInput}\n    >\n      <div\n        style={{\n          ...INNER_WRAPPER_STYLE,\n          width: width - 20 - WIDTH_PADDING,\n          maxHeight: height - HEIGHT_PADDING,\n        }}\n      >\n        <ul style={{ listStyleType: \"none\", padding: 0, margin: 0 }}>\n          {renderList()}\n        </ul>\n      </div>\n    </div>\n  );\n}\n\n// Find a tuple `[startIndex, endIndex]` representing start/end indexes into an\n// array of length `length`, that descripe a range of size up to `rangeSize`\n// where a best effort is made to center `indexToCenter`.\nexport function getRangeCenteredOnIndex(\n  length: number,\n  maxRangeSize: number,\n  indexToCenter: number\n): [number, number] {\n  const rangeSize = Math.min(length, maxRangeSize);\n  const halfRangeSize = Math.floor(rangeSize / 2);\n  const idealStartIndex = indexToCenter - halfRangeSize;\n  const startIndex = clamp(idealStartIndex, 0, length - rangeSize);\n  const endIndex = startIndex + rangeSize - 1;\n  return [startIndex, endIndex];\n}\nexport default PresetOverlay;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MilkdropWindow/Visualizer.tsx",
    "content": "// webamp/packages/webamp/js/components/MilkdropWindow/Visualizer.tsx\nimport { useEffect, useState, useRef } from \"react\";\nimport * as Selectors from \"../../selectors\";\nimport { TransitionType } from \"../../types\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\nimport * as Actions from \"../../actionCreators\";\nimport { VISUALIZERS } from \"../../constants\";\nimport _ from 'lodash';\n\n// @ts-ignore\nimport butterchurn from 'butterchurn';\n// @ts-ignore\nimport butterchurnPresets from 'butterchurn-presets';\n\ntype ButterchurnVisualizer = {\n  setRendererSize(width: number, height: number): void;\n  loadPreset(preset: Object, transitionTime: number): void;\n  launchSongTitleAnim(title: string): void;\n  render(): void;\n};\n\ninterface Props {\n  analyser: AnalyserNode;\n  height: number;\n  width: number;\n}\n\nconst TRANSITION_TYPE_DURATIONS = {\n  [TransitionType.DEFAULT]: 2.7,\n  [TransitionType.IMMEDIATE]: 0,\n  [TransitionType.USER_PRESET]: 5.7,\n};\n\nfunction Visualizer({ analyser, width, height }: Props) {\n  const visualizerStyle = useTypedSelector(Selectors.getVisualizerStyle);\n  const playing = useTypedSelector(Selectors.getMediaIsPlaying);\n  const trackTitle = useTypedSelector(Selectors.getCurrentTrackDisplayName);\n  const currentPreset = useTypedSelector(Selectors.getCurrentPreset);\n  const lock = useTypedSelector(Selectors.getMilkdropLockEnabled);\n  const transitionType = useTypedSelector(Selectors.getPresetTransitionType);\n  const message = useTypedSelector(Selectors.getMilkdropMessage);\n  const selectPreset = useActionCreator(Actions.selectPreset);\n\n  const isEnabledVisualizer = visualizerStyle === VISUALIZERS.MILKDROP;\n\n  const canvasRef = useRef(null);\n  const [visualizer, setVisualizer] = useState<ButterchurnVisualizer | null>(\n    null\n  );\n\n  const lastShownMessage = useRef<number | null>(null);\n  const presets = butterchurnPresets.getPresets();\n  const presetKeys = _.keys(presets);\n\n  useEffect(() => {\n    if (canvasRef.current == null || butterchurn == null) {\n      console.error(\"Canvas or Butterchurn is not initialized!\");\n      return;\n    }\n    if (visualizer != null) {\n      // Note: The visualizer does not offer anyway to clean itself up. So, we\n      // don't offer any way to recreate it. So, if you swap out the analyser\n      // node, or the canvas, that change won't be respected.\n      return;\n    }\n    const _visualizer = butterchurn.createVisualizer(\n      analyser.context,\n      canvasRef.current,\n      {\n        width,\n        height,\n        meshWidth: 32,\n        meshHeight: 24,\n        pixelRatio: window.devicePixelRatio || 1,\n      }\n    );\n    _visualizer.connectAudio(analyser);\n    if (!lock) {\n      const randomPresetKey = presetKeys[Math.floor(Math.random() * presetKeys.length)];\n      const preset = presets[randomPresetKey];\n      _visualizer.loadPreset(preset, 0.3);\n      setVisualizer(_visualizer);\n      selectPreset(randomPresetKey);\n    } else {\n      _visualizer.loadPreset(currentPreset, 0.3);\n      setVisualizer(_visualizer);\n    }\n\n  }, [butterchurn, analyser, height, width, visualizer]);\n\n  // Ensure render size stays up to date\n  useEffect(() => {\n    if (visualizer == null) {\n      return;\n    }\n    visualizer.setRendererSize(width, height);\n  }, [visualizer, width, height]);\n\n  // Load presets when they change\n  const hasLoadedPreset = useRef<boolean>(false);\n  useEffect(() => {\n\n    if (visualizer == null || currentPreset == null) {\n      return;\n    }\n    if (hasLoadedPreset.current) {\n      visualizer.loadPreset(\n        currentPreset,\n        TRANSITION_TYPE_DURATIONS[transitionType]\n      );\n    } else {\n      visualizer.loadPreset(\n        currentPreset,\n        TRANSITION_TYPE_DURATIONS[TransitionType.IMMEDIATE]\n      );\n      hasLoadedPreset.current = true;\n    }\n    // We don't want to trigger the transition if the transition type changes.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [visualizer, currentPreset]);\n\n  // Handle title animations and change preset\n  useEffect(() => {\n    if (visualizer == null || !trackTitle) {\n      return;\n    }\n\n    if (!lock) {\n      const randomPresetKey = presetKeys[Math.floor(Math.random() * presetKeys.length)];\n      const preset = presets[randomPresetKey];\n      selectPreset(randomPresetKey);\n      visualizer.loadPreset(preset, 0.3);\n    } else {\n      visualizer.loadPreset(currentPreset, 0.3);\n      setVisualizer(visualizer);\n    }\n\n    visualizer.launchSongTitleAnim(trackTitle);\n  }, [visualizer, trackTitle]);\n\n  useEffect(() => {\n    if (visualizer == null || message == null) {\n      return;\n    }\n    if (\n      lastShownMessage.current == null ||\n      message.time > lastShownMessage.current\n    ) {\n      lastShownMessage.current = Date.now();\n      const randomPresetKey = presetKeys[Math.floor(Math.random() * presetKeys.length)];\n      const preset = presets[randomPresetKey];\n      visualizer.loadPreset(preset, 0.3);\n      visualizer.launchSongTitleAnim(message.text);\n    }\n  }, [visualizer, message]);\n\n  const shouldAnimate = playing && isEnabledVisualizer;\n\n  // Kick off the animation loop\n  useEffect(() => {\n    if (!shouldAnimate || visualizer == null) {\n      return;\n    }\n    let animationFrameRequest: number | null = null;\n    const loop = () => {\n      visualizer.render();\n      animationFrameRequest = window.requestAnimationFrame(loop);\n    };\n    loop();\n    return () => {\n      if (animationFrameRequest != null) {\n        window.cancelAnimationFrame(animationFrameRequest);\n      }\n    };\n  }, [visualizer, shouldAnimate]);\n\n  return (\n    <canvas\n      height={height}\n      width={width}\n      style={{\n        height: \"100%\",\n        width: \"100%\",\n        display: isEnabledVisualizer ? \"block\" : \"none\",\n      }}\n      ref={canvasRef}\n    />\n  );\n}\n\nexport default Visualizer;"
  },
  {
    "path": "webamp/packages/webamp/js/components/MilkdropWindow/__tests__/PresetOverlay.test.js",
    "content": "import { getRangeCenteredOnIndex } from \"../PresetOverlay\";\n\ndescribe(\"getRangeCenteredOnIndex\", () => {\n  test(\"gets the whole range when the list is the same size as the range\", () => {\n    expect(getRangeCenteredOnIndex(100, 100, 0)).toEqual([0, 99]);\n    expect(getRangeCenteredOnIndex(100, 100, 99)).toEqual([0, 99]);\n    expect(getRangeCenteredOnIndex(100, 100, 50)).toEqual([0, 99]);\n  });\n  test(\"gets the first elements when index < half of range\", () => {\n    expect(getRangeCenteredOnIndex(100, 50, 0)).toEqual([0, 49]);\n    expect(getRangeCenteredOnIndex(100, 50, 24)).toEqual([0, 49]);\n  });\n  test(\"truncates the returned range when the passed range is smaller than items\", () => {\n    expect(getRangeCenteredOnIndex(100, 50, 0)).toEqual([0, 49]);\n    expect(getRangeCenteredOnIndex(100, 50, 24)).toEqual([0, 49]);\n  });\n\n  test(\"follows an example sliding window\", () => {\n    expect(getRangeCenteredOnIndex(10, 5, 1)).toEqual([0, 4]);\n    expect(getRangeCenteredOnIndex(10, 5, 2)).toEqual([0, 4]);\n    expect(getRangeCenteredOnIndex(10, 5, 3)).toEqual([1, 5]);\n    expect(getRangeCenteredOnIndex(10, 5, 4)).toEqual([2, 6]);\n    expect(getRangeCenteredOnIndex(10, 5, 5)).toEqual([3, 7]);\n    expect(getRangeCenteredOnIndex(10, 5, 6)).toEqual([4, 8]);\n    expect(getRangeCenteredOnIndex(10, 5, 7)).toEqual([5, 9]);\n    expect(getRangeCenteredOnIndex(10, 5, 8)).toEqual([5, 9]);\n    expect(getRangeCenteredOnIndex(10, 5, 9)).toEqual([5, 9]);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MilkdropWindow/index.tsx",
    "content": "import { useEffect, useCallback } from \"react\";\nimport Fullscreen from \"../Fullscreen\";\nimport {\n  useWindowSize,\n  useScreenSize,\n  useTypedSelector,\n  useActionCreator,\n} from \"../../hooks\";\nimport GenWindow from \"../GenWindow\";\nimport { WINDOWS } from \"../../constants\";\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport { TransitionType } from \"../../types\";\nimport Visualizer from \"./Visualizer\";\n\nimport Background from \"./Background\";\nimport PresetOverlay from \"./PresetOverlay\";\nimport DropTarget from \"../DropTarget\";\nimport MilkdropContextMenu from \"./MilkdropContextMenu\";\nimport Desktop from \"./Desktop\";\n\nconst MILLISECONDS_BETWEEN_PRESET_TRANSITIONS = 15000;\n\ninterface Props {\n  analyser: AnalyserNode;\n}\n\nfunction useKeyHandler() {\n  const trackTitle = useTypedSelector(Selectors.getCurrentTrackDisplayName);\n\n  const selectNextPreset = useActionCreator(Actions.selectNextPreset);\n  const selectPreviousPreset = useActionCreator(Actions.selectPreviousPreset);\n  const toggleRandomize = useActionCreator(Actions.toggleRandomizePresets);\n  const togglePresetOverlay = useActionCreator(Actions.togglePresetOverlay);\n  const scheduleMilkdropMessage = useActionCreator(\n    Actions.scheduleMilkdropMessage\n  );\n  const toggleCycling = useActionCreator(Actions.togglePresetCycling);\n\n  // Handle keyboard events\n  return useCallback(\n    (e: KeyboardEvent) => {\n      switch (e.keyCode) {\n        case 32: // spacebar\n          selectNextPreset();\n          break;\n        case 8: // backspace\n          selectPreviousPreset(TransitionType.IMMEDIATE);\n          break;\n        case 72: // H\n          selectNextPreset(TransitionType.IMMEDIATE);\n          break;\n        case 82: // R\n          toggleRandomize();\n          break;\n        case 76: // L\n          togglePresetOverlay();\n          e.stopPropagation();\n          break;\n        case 84: // T\n          if (trackTitle != null) {\n            scheduleMilkdropMessage(trackTitle);\n          }\n          e.stopPropagation();\n          break;\n        case 145: // scroll lock\n        case 125: // F14 (scroll lock for OS X)\n          toggleCycling();\n          break;\n      }\n    },\n    [\n      scheduleMilkdropMessage,\n      selectNextPreset,\n      selectPreviousPreset,\n      toggleCycling,\n      togglePresetOverlay,\n      toggleRandomize,\n      trackTitle,\n    ]\n  );\n}\n\nfunction Milkdrop({ analyser }: Props) {\n  const desktop = useTypedSelector(Selectors.getMilkdropDesktopEnabled);\n  const fullscreen = useTypedSelector(Selectors.getMilkdropFullscreenEnabled);\n  const overlay = useTypedSelector(Selectors.getPresetOverlayOpen);\n  const presetsAreCycling = useTypedSelector(Selectors.getPresetsAreCycling);\n  const currentPresetIndex = useTypedSelector(Selectors.getCurrentPresetIndex);\n  const mediaIsPlaying = useTypedSelector(Selectors.getMediaIsPlaying);\n\n  const toggleFullscreen = useActionCreator(Actions.toggleMilkdropFullscreen);\n  const selectNextPreset = useActionCreator(Actions.selectNextPreset);\n  const handlePresetDrop = useActionCreator(Actions.handlePresetDrop);\n  const setFullscreen = useActionCreator(Actions.setMilkdropFullscreen);\n\n  const handleKeyDown = useKeyHandler();\n\n  // Cycle presets\n  useEffect(() => {\n    if (!presetsAreCycling || !mediaIsPlaying) {\n      return;\n    }\n    const intervalId = setInterval(\n      selectNextPreset,\n      MILLISECONDS_BETWEEN_PRESET_TRANSITIONS\n    );\n    return () => clearInterval(intervalId);\n  }, [presetsAreCycling, currentPresetIndex, mediaIsPlaying, selectNextPreset]);\n\n  const screenSize = useScreenSize();\n  const windowSize = useWindowSize();\n\n  if (desktop) {\n    return (\n      <Desktop>\n        <MilkdropContextMenu>\n          <Visualizer {...windowSize} analyser={analyser} />\n        </MilkdropContextMenu>\n      </Desktop>\n    );\n  }\n\n  return (\n    <GenWindow\n      title={\"Milkdrop\"}\n      windowId={WINDOWS.MILKDROP}\n      onKeyDown={handleKeyDown}\n    >\n      {(genWindowSize: { width: number; height: number }) => {\n        const size = fullscreen ? screenSize : genWindowSize;\n        return (\n          <MilkdropContextMenu>\n            <Background>\n              <DropTarget\n                windowId={WINDOWS.MILKDROP}\n                handleDrop={handlePresetDrop}\n              >\n                {overlay && <PresetOverlay {...size} />}\n                <Fullscreen enabled={fullscreen} onChange={setFullscreen}>\n                  <div onDoubleClick={toggleFullscreen}>\n                    <Visualizer {...size} analyser={analyser} />\n                  </div>\n                </Fullscreen>\n              </DropTarget>\n            </Background>\n          </MilkdropContextMenu>\n        );\n      }}\n    </GenWindow>\n  );\n}\nexport default Milkdrop;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/MiniTime.tsx",
    "content": "import { Fragment } from \"react\";\nimport classnames from \"classnames\";\nimport { getTimeObj } from \"../utils\";\nimport { TIME_MODE, MEDIA_STATUS } from \"../constants\";\nimport * as Actions from \"../actionCreators\";\nimport Character from \"./Character\";\nimport * as Selectors from \"../selectors\";\n\nimport \"../../css/mini-time.css\";\nimport { useTypedSelector, useActionCreator } from \"../hooks\";\n\n// Sigh. When the display is blinking (say when it's paused) we need to\n// alternate between the actual character and the space character. Not\n// Possible to do that in pure CSS with the background being dynamically generated.\n// All \"space\" characters is also how Winamp renders no content.\nconst Background = () => (\n  <Fragment>\n    {[1, 7, 12, 20, 25].map((left, i) => (\n      <Character\n        style={{ left }}\n        key={i}\n        className=\"background-character\"\n        children=\" \"\n      />\n    ))}\n  </Fragment>\n);\n\nconst MiniTime = () => {\n  const status = useTypedSelector(Selectors.getMediaStatus);\n  const duration = useTypedSelector(Selectors.getDuration);\n  const timeElapsed = useTypedSelector(Selectors.getTimeElapsed);\n  const timeMode = useTypedSelector(Selectors.getTimeMode);\n\n  const toggle = useActionCreator(Actions.toggleTimeMode);\n  let seconds = null;\n  // TODO: Clean this up: If stopped, just render the background, rather than\n  // rendering spaces twice.\n  if (status !== MEDIA_STATUS.STOPPED && duration != null) {\n    seconds =\n      timeMode === TIME_MODE.ELAPSED ? timeElapsed : duration - timeElapsed;\n  }\n\n  const timeObj = getTimeObj(seconds);\n  const showMinus =\n    timeMode === TIME_MODE.REMAINING && status !== MEDIA_STATUS.STOPPED;\n  return (\n    <div\n      onClick={toggle}\n      className={classnames(\"mini-time\", \"countdown\", {\n        blinking: status === MEDIA_STATUS.PAUSED,\n      })}\n    >\n      <Background />\n      <Character style={{ left: 1 }}>{showMinus ? \"-\" : \" \"}</Character>\n      <Character style={{ left: 7 }}>{timeObj.minutesFirstDigit}</Character>\n      <Character style={{ left: 12 }}>{timeObj.minutesSecondDigit}</Character>\n      <Character style={{ left: 20 }}>{timeObj.secondsFirstDigit}</Character>\n      <Character style={{ left: 25 }}>{timeObj.secondsSecondDigit}</Character>\n    </div>\n  );\n};\n\nexport default MiniTime;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/OptionsContextMenu.tsx",
    "content": "import { Hr, Node } from \"./ContextMenu\";\nimport SkinsContextMenu from \"./SkinsContextMenu\";\nimport * as Actions from \"../actionCreators\";\nimport * as Selectors from \"../selectors\";\nimport { TIME_MODE } from \"../constants\";\nimport { useActionCreator, useTypedSelector } from \"../hooks\";\nconst { ipcRenderer } = window.require('electron');\n\nconst OptionsContextMenu = () => {\n  const toggleTimeMode = useActionCreator(Actions.toggleTimeMode);\n  const toggleDoubleSizeMode = useActionCreator(Actions.toggleDoubleSizeMode);\n  const toggleRepeat = useActionCreator(Actions.toggleRepeat);\n  const toggleShuffle = useActionCreator(Actions.toggleShuffle);\n\n  const doubled = useTypedSelector(Selectors.getDoubled);\n  const timeMode = useTypedSelector(Selectors.getTimeMode);\n  const repeat = useTypedSelector(Selectors.getRepeat);\n  const shuffle = useTypedSelector(Selectors.getShuffle);\n  return (\n    <>\n      <Node\n        label=\"Сбросить настройки\"\n        onClick={\n          async () => {\n            ipcRenderer.invoke(\"resetSettings\").then(() => {})\n          }\n         }\n      />\n      <Hr />\n      <Node\n        label=\"Time elapsed\"\n        hotkey=\"(Ctrl+T toggles)\"\n        onClick={toggleTimeMode}\n        checked={timeMode === TIME_MODE.ELAPSED}\n      />\n      <Node\n        label=\"Time remaining\"\n        hotkey=\"(Ctrl+T toggles)\"\n        onClick={toggleTimeMode}\n        checked={timeMode === TIME_MODE.REMAINING}\n      />\n      {/* <Node label=\"Always On Top\" hotkey=\"Ctrl+A\" /> */}\n      <Node\n        label=\"Double Size\"\n        hotkey=\"Ctrl+D\"\n        onClick={toggleDoubleSizeMode}\n        checked={doubled}\n      />\n      {/* <Node label=\"EasyMove\" hotkey=\"Ctrl+E\" /> */}\n      <Hr />\n      <Node label=\"Repeat\" hotkey=\"R\" onClick={toggleRepeat} checked={repeat} />\n      <Node\n        label=\"Shuffle\"\n        hotkey=\"S\"\n        onClick={toggleShuffle}\n        checked={shuffle}\n      />\n    </>\n  );\n};\nexport default OptionsContextMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaybackContextMenu.tsx",
    "content": "import { Fragment } from \"react\";\nimport * as Actions from \"../actionCreators\";\nimport { Hr, Node } from \"./ContextMenu\";\nimport { useActionCreator } from \"../hooks\";\n\nconst PlaybackContextMenu = () => {\n  const previous = useActionCreator(Actions.previous);\n  const play = useActionCreator(Actions.play);\n  const pause = useActionCreator(Actions.pause);\n  const stop = useActionCreator(Actions.stop);\n  const next = useActionCreator(Actions.next);\n  const seekForward = useActionCreator(Actions.seekForward);\n  const seekBackward = useActionCreator(Actions.seekBackward);\n  const nextN = useActionCreator(Actions.nextN);\n  return (\n    <Fragment>\n      <Node label=\"Previous\" hotkey=\"Z\" onClick={previous} />\n      <Node label=\"Play\" hotkey=\"X\" onClick={play} />\n      <Node label=\"Pause\" hotkey=\"C\" onClick={pause} />\n      <Node label=\"Stop\" hotkey=\"V\" onClick={stop} />\n      <Node label=\"Next\" hotkey=\"B\" onClick={next} />\n      <Hr />\n      {/*\n    <Node label=\"Stop w/ fadeout\" hotkey=\"Shift+V\" />\n    <Node label=\"Stop after current\" hotkey=\"Ctrl+V\" />\n    */}\n      <Node\n        label=\"Back 5 seconds\"\n        hotkey=\"Left\"\n        onClick={() => seekBackward(5)}\n      />\n      <Node\n        label=\"Fwd 5 seconds\"\n        hotkey=\"Right\"\n        onClick={() => seekForward(5)}\n      />\n      {/*\n    <Node label=\"Start of list\" hotkey=\"Ctrl+Z\" />\n    */}\n      <Node label=\"10 tracks back\" hotkey=\"Num. 1\" onClick={() => nextN(-10)} />\n      <Node label=\"10 tracks fwd\" hotkey=\"Num. 3\" onClick={() => nextN(10)} />\n      {/*\n    <Hr />\n    <Node label=\"Jump to time\" hotkey=\"Ctrl+J\" />\n    <Node label=\"Jump to file\" hotkey=\"J\" />\n    */}\n    </Fragment>\n  );\n};\n\nexport default PlaybackContextMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/AddMenu.tsx",
    "content": "import * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport PlaylistMenu from \"./PlaylistMenu\";\n\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nconst AddMenu = () => {\n  const nextIndex = useTypedSelector(Selectors.getTrackCount);\n  const addDirAtIndex = useActionCreator(Actions.addDirAtIndex);\n  const addFilesAtIndex = useActionCreator(Actions.addFilesAtIndex);\n  const addFilesFromUrl = useActionCreator(Actions.addFilesFromUrl);\n  return (\n    <PlaylistMenu id=\"playlist-add-menu\">\n      <div className=\"add-url\" onClick={() => addFilesFromUrl(nextIndex)} />\n      <div className=\"add-dir\" onClick={() => addDirAtIndex(nextIndex)} />\n      <div className=\"add-file\" onClick={() => addFilesAtIndex(nextIndex)} />\n    </PlaylistMenu>\n  );\n};\n\nexport default AddMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/ListMenu.tsx",
    "content": "import * as Actions from \"../../actionCreators\";\nimport PlaylistMenu from \"./PlaylistMenu\";\nimport { useActionCreator } from \"../../hooks\";\n\n/* eslint-disable no-alert */\nexport default function ListMenu() {\n  const removeAllTracks = useActionCreator(Actions.removeAllTracks);\n  const addFilesFromList = useActionCreator(Actions.addFilesFromList);\n  const saveFilesToList = useActionCreator(Actions.saveFilesToList);\n  return (\n    <PlaylistMenu id=\"playlist-list-menu\">\n      <div className=\"new-list\" onClick={removeAllTracks} />\n      <div className=\"save-list\" onClick={saveFilesToList} />\n      <div className=\"load-list\" onClick={addFilesFromList} />\n    </PlaylistMenu>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/MiscMenu.tsx",
    "content": "import PlaylistMenu from \"./PlaylistMenu\";\nimport SortContextMenu from \"./SortContextMenu\";\nimport MiscOptionsContextMenu from \"./MiscOptionsContextMenu\";\n\nconst MiscMenu = () => (\n  <PlaylistMenu id=\"playlist-misc-menu\">\n    <div className=\"sort-list\" onClick={(e) => e.stopPropagation()}>\n      <SortContextMenu />\n    </div>\n    <div\n      className=\"file-info\"\n      onClick={() => alert(\"Not supported in Yaamp\")}\n    />\n\n    <div className=\"misc-options\" onClick={(e) => e.stopPropagation()}>\n      <MiscOptionsContextMenu />\n    </div>\n  </PlaylistMenu>\n);\n\nexport default MiscMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/MiscOptionsContextMenu.tsx",
    "content": "import { Node } from \"../ContextMenu\";\nimport ContextMenuTarget from \"../ContextMenuTarget\";\nimport * as Actions from \"../../actionCreators\";\nimport { useActionCreator } from \"../../hooks\";\n\nconst MiscOptionsContextMenu = () => {\n  const downloadHtmlPlaylist = useActionCreator(Actions.downloadHtmlPlaylist);\n  return (\n    <ContextMenuTarget\n      top\n      renderMenu={() => (\n        <Node onClick={downloadHtmlPlaylist} label=\"Generate HTML playlist\" />\n      )}\n    >\n      <div />\n    </ContextMenuTarget>\n  );\n};\n\nexport default MiscOptionsContextMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/PlaylistActionArea.tsx",
    "content": "import { Fragment } from \"react\";\n\nimport * as Actions from \"../../actionCreators\";\n\nimport MiniTime from \"../MiniTime\";\nimport RunningTimeDisplay from \"./RunningTimeDisplay\";\nimport { useActionCreator } from \"../../hooks\";\n\nconst PlaylistWindow = () => {\n  const play = useActionCreator(Actions.play);\n  const pause = useActionCreator(Actions.pause);\n  const stop = useActionCreator(Actions.stop);\n  const openMediaFileDialog = useActionCreator(Actions.openMediaFileDialog);\n  const next = useActionCreator(Actions.next);\n  const previous = useActionCreator(Actions.previous);\n  return (\n    <Fragment>\n      <RunningTimeDisplay />\n      <div className=\"playlist-action-buttons\">\n        <div className=\"playlist-previous-button\" onClick={previous} />\n        <div className=\"playlist-play-button\" onClick={play} />\n        <div className=\"playlist-pause-button\" onClick={pause} />\n        <div className=\"playlist-stop-button\" onClick={stop} />\n        <div className=\"playlist-next-button\" onClick={next} />\n        <div className=\"playlist-eject-button\" onClick={openMediaFileDialog} />\n      </div>\n      <MiniTime />\n    </Fragment>\n  );\n};\nexport default PlaylistWindow;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/PlaylistMenu.tsx",
    "content": "import { Children, memo, useState, ReactNode, useCallback } from \"react\";\nimport classnames from \"classnames\";\nimport { useOnClickAway } from \"../../hooks\";\n\nimport PlaylistMenuEnry from \"./PlaylistMenuEntry\";\n\ninterface Props {\n  id: string;\n  children: ReactNode | Array<ReactNode>;\n}\n\ninterface State {\n  selected: boolean;\n}\n\nfunction PlaylistMenu(props: Props) {\n  const [selected, setSelected] = useState(false);\n\n  const [ref, setRef] = useState<Element | null>(null);\n\n  const callback = useCallback(() => {\n    // If we've clicked on a Context Menu spawed inside this menu, it will\n    // register as an external click. However, hiding the menu will remove\n    // the Context Menu from the DOM. Therefore, we wait until the next\n    // event loop to actually hide ourselves.\n    setTimeout(() => {\n      // Close the menu\n      setSelected(false);\n    }, 0);\n  }, []);\n\n  useOnClickAway(ref, selected ? callback : null);\n\n  return (\n    <div\n      id={props.id}\n      className={classnames(\"playlist-menu\", {\n        selected,\n      })}\n      ref={setRef}\n      onClick={() => setSelected((selected_) => !selected_)}\n    >\n      <div className=\"bar\" />\n      {selected && (\n        <ul>\n          {Children.map(props.children, (child, i) => (\n            <PlaylistMenuEnry key={i}>{child}</PlaylistMenuEnry>\n          ))}\n        </ul>\n      )}\n    </div>\n  );\n}\nexport default memo(PlaylistMenu);\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/PlaylistMenuEntry.tsx",
    "content": "import { memo, ReactNode } from \"react\";\nimport classnames from \"classnames\";\nimport { useIsHovered } from \"../../hooks\";\n\ninterface Props {\n  children: ReactNode;\n}\n\n// We implement hover ourselves, because we hate ourselves and https://stackoverflow.com/a/13259049/1263117\nfunction PlaylistMenuEntry({ children }: Props) {\n  const { ref, hover } = useIsHovered();\n  return (\n    <li ref={ref} className={classnames({ hover })}>\n      {children}\n    </li>\n  );\n}\n\nexport default memo(PlaylistMenuEntry);\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/PlaylistResizeTarget.tsx",
    "content": "import ResizeTarget from \"../ResizeTarget\";\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\ntype Props = {\n  widthOnly?: boolean;\n};\n\nfunction PlaylistResizeTarget({ widthOnly }: Props) {\n  const windowSize = useTypedSelector(Selectors.getWindowSize);\n  const setWindowSize = useActionCreator(Actions.setWindowSize);\n  const currentSize = windowSize(\"playlist\");\n\n  return (\n    <ResizeTarget\n      currentSize={currentSize}\n      id=\"playlist-resize-target\"\n      setWindowSize={(size) => {\n        setWindowSize(\"playlist\", size);\n      }}\n      widthOnly={widthOnly}\n    />\n  );\n}\nexport default PlaylistResizeTarget;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/PlaylistScrollBar.tsx",
    "content": "import VerticalSlider from \"../VerticalSlider\";\n\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\nimport { WINDOWS } from \"../../constants\";\n\nconst HANDLE_HEIGHT = 18;\n\nconst Handle = () => (\n  <div\n    className=\"playlist-scrollbar-handle\"\n    style={{ height: HANDLE_HEIGHT }}\n  />\n);\n\nexport default function PlaylistScrollBar() {\n  const getWindowPixelSize = useTypedSelector(Selectors.getWindowPixelSize);\n  const playlistHeight = getWindowPixelSize(WINDOWS.PLAYLIST).height;\n  const playlistScrollPosition = useTypedSelector(\n    Selectors.getPlaylistScrollPosition\n  );\n  const allTracksAreVisible = useTypedSelector(\n    Selectors.getAllTracksAreVisible\n  );\n  const setPlaylistScrollPosition = useActionCreator(\n    Actions.setPlaylistScrollPosition\n  );\n  return (\n    <div className=\"playlist-scrollbar\" style={{ marginLeft: 5 }}>\n      <VerticalSlider\n        height={playlistHeight - 58}\n        handleHeight={HANDLE_HEIGHT}\n        width={8}\n        value={playlistScrollPosition / 100}\n        onChange={(val) => setPlaylistScrollPosition(val * 100)}\n        handle={<Handle />}\n        disabled={allTracksAreVisible}\n      />\n    </div>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/PlaylistShade.test.js",
    "content": "import { Provider } from \"react-redux\";\nimport renderer from \"react-test-renderer\";\nimport Emitter from \"../../emitter\";\nimport getStore from \"../../store\";\nimport { loadMediaFiles } from \"../../actionCreators\";\n\nimport PlaylistShade from \"./PlaylistShade\";\n\nconst media = {\n  addEventListener: jest.fn(),\n  loadFromUrl: jest.fn(),\n  setVolume: jest.fn(),\n  setPreamp: jest.fn(),\n  setBalance: jest.fn(),\n  getAnalyser: () => null,\n  on: jest.fn(),\n};\n\ndescribe(\"PlaylistShade\", () => {\n  let store;\n  beforeEach(() => {\n    store = getStore(media, new Emitter());\n  });\n\n  it(\"renders to snapshot\", () => {\n    store.dispatch(\n      loadMediaFiles([{ url: \"http://example.com\", defaultName: \"Some Name\" }])\n    );\n    const tree = renderer\n      .create(\n        <Provider store={store}>\n          <PlaylistShade />\n        </Provider>\n      )\n      .toJSON();\n    expect(tree).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/PlaylistShade.tsx",
    "content": "import { useMemo } from \"react\";\nimport classnames from \"classnames\";\nimport { getTimeStr } from \"../../utils\";\nimport * as Selectors from \"../../selectors\";\n\nimport {\n  WINDOWS,\n  WINDOW_RESIZE_SEGMENT_WIDTH,\n  WINDOW_WIDTH,\n  CHARACTER_WIDTH,\n  UTF8_ELLIPSIS,\n} from \"../../constants\";\nimport * as Actions from \"../../actionCreators\";\nimport CharacterString from \"../CharacterString\";\nimport PlaylistResizeTarget from \"./PlaylistResizeTarget\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nfunction PlaylistShade() {\n  const focused = useTypedSelector(Selectors.getFocusedWindow);\n  const getWindowSize = useTypedSelector(Selectors.getWindowSize);\n  const playlistSize = getWindowSize(\"playlist\");\n  const duration = useTypedSelector(Selectors.getDuration);\n  const name = useTypedSelector(Selectors.getMinimalMediaText);\n\n  const closeWindow = useActionCreator(Actions.closeWindow);\n  const toggleShade = useActionCreator(Actions.togglePlaylistShadeMode);\n  const focusWindow = useActionCreator(Actions.setFocusedWindow);\n\n  const addedWidth = playlistSize[0] * WINDOW_RESIZE_SEGMENT_WIDTH;\n\n  const trimmedName = useMemo(() => {\n    if (name == null) {\n      return \"[No file]\";\n    }\n\n    const MIN_NAME_WIDTH = 205;\n\n    const nameLength = (MIN_NAME_WIDTH + addedWidth) / CHARACTER_WIDTH;\n    return name.length > nameLength\n      ? name.slice(0, nameLength - 1) + UTF8_ELLIPSIS\n      : name;\n  }, [addedWidth, name]);\n\n  const time = useMemo(() => {\n    return name == null ? \"\" : getTimeStr(duration);\n  }, [duration, name]);\n\n  return (\n    <div\n      id=\"playlist-window-shade\"\n      className={classnames(\"window\", \"draggable\", {\n        selected: focused === WINDOWS.PLAYLIST,\n      })}\n      style={{ width: `${WINDOW_WIDTH + addedWidth}px` }}\n      onMouseDown={() => focusWindow(\"playlist\")}\n      onDoubleClick={toggleShade}\n    >\n      <div className=\"left\">\n        <div className=\"right draggable\">\n          <div id=\"playlist-shade-track-title\">\n            <CharacterString>{trimmedName}</CharacterString>\n          </div>\n          <div id=\"playlist-shade-time\">\n            <CharacterString>{time}</CharacterString>\n          </div>\n          <PlaylistResizeTarget widthOnly />\n          <div id=\"playlist-shade-button\" onClick={toggleShade} />\n          <div\n            id=\"playlist-close-button\"\n            onClick={() => closeWindow(\"playlist\")}\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default PlaylistShade;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/RemoveMenu.tsx",
    "content": "import * as Actions from \"../../actionCreators\";\nimport PlaylistMenu from \"./PlaylistMenu\";\nimport { useActionCreator } from \"../../hooks\";\n\n/* eslint-disable no-alert */\n\nconst RemoveMenu = () => {\n  const removeSelected = useActionCreator(Actions.removeSelectedTracks);\n  const removeAll = useActionCreator(Actions.removeAllTracks);\n  const crop = useActionCreator(Actions.cropPlaylist);\n  return (\n    <PlaylistMenu id=\"playlist-remove-menu\">\n      <div\n        className=\"remove-misc\"\n        onClick={() => alert(\"Not supported in Yaamp\")}\n      />\n      <div className=\"remove-all\" onClick={removeAll} />\n      <div className=\"crop\" onClick={crop} />\n      <div className=\"remove-selected\" onClick={removeSelected} />\n    </PlaylistMenu>\n  );\n};\n\nexport default RemoveMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/RunningTimeDisplay.tsx",
    "content": "import { useMemo } from \"react\";\n\nimport CharacterString from \"../CharacterString\";\nimport * as Actions from \"../../selectors\";\nimport { useTypedSelector } from \"../../hooks\";\n\n// While all the browsers I care about support String.prototype.padEnd,\n// Not all node versions do, and I want tests to pass in Jest...\n// Sigh.\nfunction rightPad(str: string, len: number, fillChar: string): string {\n  while (str.length < len) {\n    str += fillChar;\n  }\n  return str;\n}\n\nconst RunningTimeDisplay = () => {\n  const runningTimeMessage = useTypedSelector(Actions.getRunningTimeMessage);\n  const text = useMemo(() => rightPad(runningTimeMessage, 18, \" \"), [\n    runningTimeMessage,\n  ]);\n  return (\n    <div className=\"playlist-running-time-display draggable\">\n      {/* This div is probably not strictly needed */}\n      <div>\n        <CharacterString>{text}</CharacterString>\n      </div>\n    </div>\n  );\n};\n\nexport default RunningTimeDisplay;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/SelectionMenu.tsx",
    "content": "import PlaylistMenu from \"./PlaylistMenu\";\nimport * as Actions from \"../../actionCreators\";\nimport { useActionCreator } from \"../../hooks\";\n\nexport default function SelectionMenu() {\n  const invert = useActionCreator(Actions.invertSelection);\n  const zero = useActionCreator(Actions.selectZero);\n  const all = useActionCreator(Actions.selectAll);\n  return (\n    <PlaylistMenu id=\"playlist-selection-menu\">\n      <div className=\"invert-selection\" onClick={invert} />\n      <div className=\"select-zero\" onClick={zero} />\n      <div className=\"select-all\" onClick={all} />\n    </PlaylistMenu>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/SortContextMenu.tsx",
    "content": "import * as Actions from \"../../actionCreators\";\n\nimport { Hr, Node } from \"../ContextMenu\";\nimport ContextMenuTarget from \"../ContextMenuTarget\";\nimport { useActionCreator } from \"../../hooks\";\n\ninterface DispatchProps {\n  sortListByTitle: () => void;\n  reverseList: () => void;\n  randomizeList: () => void;\n}\n\n/* eslint-disable no-alert */\n/* TODO: This should really be kitty-corner to the upper right hand corner of the MiscMenu */\nexport default function SortContextMenu() {\n  const reverseList = useActionCreator(Actions.reverseList);\n  const randomizeList = useActionCreator(Actions.randomizeList);\n  const sortListByTitle = useActionCreator(Actions.sortListByTitle);\n  return (\n    <ContextMenuTarget\n      style={{ width: \"100%\", height: \"100%\" }}\n      top\n      renderMenu={() => (\n        <>\n          <Node label=\"Sort list by title\" onClick={sortListByTitle} />\n          <Hr />\n          <Node label=\"Reverse list\" onClick={reverseList} />\n          <Node label=\"Randomize list\" onClick={randomizeList} />\n        </>\n      )}\n    >\n      <div />\n    </ContextMenuTarget>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/TrackCell.tsx",
    "content": "import { useCallback, ReactNode } from \"react\";\nimport classnames from \"classnames\";\nimport {\n  CLICKED_TRACK,\n  CTRL_CLICKED_TRACK,\n  SHIFT_CLICKED_TRACK,\n} from \"../../actionTypes\";\nimport * as Selectors from \"../../selectors\";\nimport * as Actions from \"../../actionCreators\";\nimport {\n  useTypedSelector,\n  useActionCreator,\n  useTypedDispatch,\n} from \"../../hooks\";\n\ninterface Props {\n  id: number;\n  index: number;\n  handleMoveClick: (e: React.MouseEvent<HTMLDivElement>) => void;\n  children: ReactNode;\n}\n\nfunction TrackCell({ children, handleMoveClick, index, id }: Props) {\n  const skinPlaylistStyle = useTypedSelector(Selectors.getSkinPlaylistStyle);\n  const selectedTrackIds = useTypedSelector(Selectors.getSelectedTrackIds);\n  const currentTrackId = useTypedSelector(Selectors.getCurrentTrackId);\n  const selected = selectedTrackIds.has(id);\n  const current = currentTrackId === id;\n\n  const dispatch = useTypedDispatch();\n  const playTrackNow = useActionCreator(Actions.playTrackNow);\n\n  const onMouseDown = useCallback(\n    (e: React.MouseEvent<HTMLDivElement>) => {\n      if (e.shiftKey) {\n        e.preventDefault();\n        dispatch({ type: SHIFT_CLICKED_TRACK, index });\n        return;\n      } else if (e.metaKey || e.ctrlKey) {\n        e.preventDefault();\n        dispatch({ type: CTRL_CLICKED_TRACK, index });\n        return;\n      }\n\n      if (!selected) {\n        dispatch({ type: CLICKED_TRACK, index });\n      }\n\n      handleMoveClick(e);\n    },\n    [dispatch, handleMoveClick, index, selected]\n  );\n\n  const style: React.CSSProperties = {\n    backgroundColor: selected ? skinPlaylistStyle.selectedbg : undefined,\n    color: current ? skinPlaylistStyle.current : undefined,\n  };\n  return (\n    <div\n      className={classnames(\"track-cell\", { selected, current })}\n      style={style}\n      onClick={(e) => e.stopPropagation()}\n      onMouseDown={onMouseDown}\n      onContextMenu={(e) => e.preventDefault()}\n      onDoubleClick={() => playTrackNow(id)}\n    >\n      {children}\n    </div>\n  );\n}\n\nexport default TrackCell;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/TrackList.tsx",
    "content": "import { useState, useEffect } from \"react\";\n\nimport { getTimeStr } from \"../../utils\";\nimport * as Selectors from \"../../selectors\";\nimport { TRACK_HEIGHT } from \"../../constants\";\nimport * as Actions from \"../../actionCreators\";\nimport TrackCell from \"./TrackCell\";\nimport TrackTitle from \"./TrackTitle\";\nimport { useTypedSelector, useActionCreator } from \"../../hooks\";\n\nfunction getNumberLength(number: number): number {\n  return number.toString().length;\n}\n\nfunction TrackList() {\n  const offset = useTypedSelector(Selectors.getScrollOffset);\n  const trackIds = useTypedSelector(Selectors.getVisibleTrackIds);\n  const tracks = useTypedSelector(Selectors.getTracks);\n  const numberOfTracks = useTypedSelector(Selectors.getNumberOfTracks);\n\n  const selectZero = useActionCreator(Actions.selectZero);\n  const dragSelected = useActionCreator(Actions.dragSelected);\n  const scrollPlaylistByDelta = useActionCreator(Actions.scrollPlaylistByDelta);\n\n  const [node, setNode] = useState<Element | null>(null);\n  const [moving, setMoving] = useState(false);\n  const [mouseStartY, setMouseStartY] = useState<number | null>(null);\n\n  const _handleMoveClick = (e: React.MouseEvent<HTMLDivElement>) => {\n    setMoving(true);\n    setMouseStartY(e.clientY);\n  };\n\n  useEffect(() => {\n    if (node == null || mouseStartY == null || moving === false) {\n      return;\n    }\n    const { top, bottom, left, right } = node.getBoundingClientRect();\n    let lastDiff = 0;\n    const handleMouseMove = (ee: MouseEvent) => {\n      const { clientY: y, clientX: x } = ee;\n      if (y < top || y > bottom || x < left || x > right) {\n        // Mouse is outside the track list\n        return;\n      }\n      const proposedDiff = Math.floor((y - mouseStartY) / TRACK_HEIGHT);\n      if (proposedDiff !== lastDiff) {\n        const diffDiff = proposedDiff - lastDiff;\n        dragSelected(diffDiff);\n        lastDiff = proposedDiff;\n      }\n    };\n\n    const handleMouseUp = () => setMoving(false);\n    window.addEventListener(\"mouseup\", handleMouseUp);\n    window.addEventListener(\"mousemove\", handleMouseMove);\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMouseMove);\n      window.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n    // I'm not 100% sure how well this would work if it rebound mid drag, so\n    // we'll just pretend it's okay that we have stale values in there.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [moving]);\n\n  function _renderTracks(\n    format: (id: number, i: number) => JSX.Element | string\n  ) {\n    return trackIds.map((id, i) => (\n      <TrackCell\n        key={id}\n        id={id}\n        index={offset + i}\n        handleMoveClick={_handleMoveClick}\n      >\n        {format(id, i)}\n      </TrackCell>\n    ));\n  }\n\n  const maxTrackNumberLength = getNumberLength(numberOfTracks);\n  const paddedTrackNumForIndex = (i: number) =>\n    (i + 1 + offset).toString().padStart(maxTrackNumberLength, \"\\u00A0\");\n  return (\n    <div\n      ref={setNode}\n      className=\"playlist-tracks\"\n      style={{ height: \"100%\" }}\n      onClick={selectZero}\n      onWheel={scrollPlaylistByDelta}\n    >\n      <div className=\"playlist-track-titles\">\n        {_renderTracks((id, i) => (\n          <TrackTitle id={id} paddedTrackNumber={paddedTrackNumForIndex(i)} />\n        ))}\n      </div>\n      <div className=\"playlist-track-durations\">\n        {_renderTracks((id) => getTimeStr(tracks[id].duration))}\n      </div>\n    </div>\n  );\n}\n\nexport default TrackList;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/TrackTitle.tsx",
    "content": "import * as Selectors from \"../../selectors\";\nimport { useTypedSelector } from \"../../hooks\";\n\ninterface Props {\n  id: number;\n  paddedTrackNumber: string;\n}\n\nconst TrackTitle = ({ id, paddedTrackNumber }: Props) => {\n  const title = useTypedSelector(Selectors.getTrackDisplayName)(id);\n  return (\n    <span>\n      {paddedTrackNumber}. {title}\n    </span>\n  );\n};\n\nexport default TrackTitle;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/__snapshots__/PlaylistShade.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`PlaylistShade renders to snapshot 1`] = `\n<div\n  className=\"window draggable\"\n  id=\"playlist-window-shade\"\n  onDoubleClick={[Function]}\n  onMouseDown={[Function]}\n  style={\n    Object {\n      \"width\": \"275px\",\n    }\n  }\n>\n  <div\n    className=\"left\"\n  >\n    <div\n      className=\"right draggable\"\n    >\n      <div\n        id=\"playlist-shade-track-title\"\n      >\n        <span\n          className=\" character character-91\"\n        >\n          [\n        </span>\n        <span\n          className=\" character character-110\"\n        >\n          N\n        </span>\n        <span\n          className=\" character character-111\"\n        >\n          o\n        </span>\n        <span\n          className=\" character character-32\"\n        >\n           \n        </span>\n        <span\n          className=\" character character-102\"\n        >\n          f\n        </span>\n        <span\n          className=\" character character-105\"\n        >\n          i\n        </span>\n        <span\n          className=\" character character-108\"\n        >\n          l\n        </span>\n        <span\n          className=\" character character-101\"\n        >\n          e\n        </span>\n        <span\n          className=\" character character-93\"\n        >\n          ]\n        </span>\n      </div>\n      <div\n        id=\"playlist-shade-time\"\n      />\n      <div\n        id=\"playlist-resize-target\"\n        onMouseDown={[Function]}\n      />\n      <div\n        id=\"playlist-shade-button\"\n        onClick={[Function]}\n      />\n      <div\n        id=\"playlist-close-button\"\n        onClick={[Function]}\n      />\n    </div>\n  </div>\n</div>\n`;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/PlaylistWindow/index.tsx",
    "content": "import { useCallback } from \"react\";\nimport classnames from \"classnames\";\n\nimport { WINDOWS, TRACK_HEIGHT, LOAD_STYLE } from \"../../constants\";\nimport * as Actions from \"../../actionCreators\";\nimport * as Selectors from \"../../selectors\";\n\nimport { clamp } from \"../../utils\";\nimport DropTarget from \"../DropTarget\";\nimport Visualizer from \"../Visualizer\";\nimport PlaylistShade from \"./PlaylistShade\";\nimport AddMenu from \"./AddMenu\";\nimport RemoveMenu from \"./RemoveMenu\";\nimport SelectionMenu from \"./SelectionMenu\";\nimport MiscMenu from \"./MiscMenu\";\nimport ListMenu from \"./ListMenu\";\nimport PlaylistResizeTarget from \"./PlaylistResizeTarget\";\nimport PlaylistActionArea from \"./PlaylistActionArea\";\nimport TrackList from \"./TrackList\";\nimport PlaylistScrollBar from \"./PlaylistScrollBar\";\n\nimport \"../../../css/playlist-window.css\";\nimport { AppState } from \"../../types\";\nimport FocusTarget from \"../FocusTarget\";\nimport { useActionCreator, useTypedSelector } from \"../../hooks\";\n\ninterface Props {\n  analyser: AnalyserNode;\n}\n\nfunction _maxTrackIndex(state: AppState) {\n  return state.playlist.trackOrder.length - 1;\n}\n\nfunction PlaylistWindow({ analyser }: Props) {\n  const offset = useTypedSelector(Selectors.getScrollOffset);\n  const getWindowSize = useTypedSelector(Selectors.getWindowSize);\n  const selectedWindow = useTypedSelector(Selectors.getFocusedWindow);\n  const getWindowShade = useTypedSelector(Selectors.getWindowShade);\n  const getWindowOpen = useTypedSelector(Selectors.getWindowOpen);\n  const maxTrackIndex = useTypedSelector(_maxTrackIndex);\n  const skinPlaylistStyle = useTypedSelector(Selectors.getSkinPlaylistStyle);\n  const getWindowPixelSize = useTypedSelector(Selectors.getWindowPixelSize);\n\n  const selected = selectedWindow === WINDOWS.PLAYLIST;\n  const playlistShade = Boolean(getWindowShade(WINDOWS.PLAYLIST));\n  const playlistSize = getWindowSize(WINDOWS.PLAYLIST);\n  const playlistWindowPixelSize = getWindowPixelSize(WINDOWS.PLAYLIST);\n  const doubled = useTypedSelector(Selectors.getDoubled);\n\n  const close = useActionCreator(Actions.closeWindow);\n  const toggleShade = useActionCreator(Actions.togglePlaylistShadeMode);\n  const scrollUpFourTracks = useActionCreator(Actions.scrollUpFourTracks);\n  const scrollDownFourTracks = useActionCreator(Actions.scrollDownFourTracks);\n  const scrollVolume = useActionCreator(Actions.scrollVolume);\n  const loadMedia = useActionCreator(Actions.loadMedia);\n\n  const showVisualizer = playlistSize[0] > 2;\n  const activateVisualizer = !getWindowOpen(WINDOWS.MAIN);\n\n  const handleDrop = useCallback(\n    (\n      e: React.DragEvent<HTMLDivElement>,\n      targetCoords: { x: number; y: number }\n    ) => {\n      const top = e.clientY - targetCoords.y;\n      const atIndex = clamp(\n        offset + Math.round((top - 23) / TRACK_HEIGHT),\n        0,\n        maxTrackIndex + 1\n      );\n      loadMedia(e, LOAD_STYLE.NONE, atIndex);\n    },\n    [loadMedia, maxTrackIndex, offset]\n  );\n\n  if (playlistShade) {\n    return <PlaylistShade />;\n  }\n\n  const style = {\n    color: skinPlaylistStyle.normal,\n    backgroundColor: skinPlaylistStyle.normalbg,\n    fontFamily: `${skinPlaylistStyle.font}, Arial, sans-serif`,\n    height: `${playlistWindowPixelSize.height}px`,\n    width: `${playlistWindowPixelSize.width}px`,\n  };\n\n  const classes = classnames(\"window\", \"draggable\", { selected, doubled });\n\n  const showSpacers = playlistSize[0] % 2 === 0;\n\n  return (\n    <FocusTarget windowId={WINDOWS.PLAYLIST}>\n      <DropTarget\n        id=\"playlist-window\"\n        windowId={WINDOWS.PLAYLIST}\n        className={classes}\n        style={style}\n        handleDrop={handleDrop}\n      >\n        <div className=\"playlist-top draggable\" onDoubleClick={toggleShade}>\n          <div className=\"playlist-top-left draggable\" />\n          {showSpacers && (\n            <div className=\"playlist-top-left-spacer draggable\" />\n          )}\n          <div className=\"playlist-top-left-fill draggable\" />\n          <div className=\"playlist-top-title draggable\" />\n          {showSpacers && (\n            <div className=\"playlist-top-right-spacer draggable\" />\n          )}\n          <div className=\"playlist-top-right-fill draggable\" />\n          <div className=\"playlist-top-right draggable\">\n            <div id=\"playlist-shade-button\" onClick={toggleShade} />\n            <div\n              id=\"playlist-close-button\"\n              onClick={() => close(WINDOWS.PLAYLIST)}\n            />\n          </div>\n        </div>\n        <div className=\"playlist-middle draggable\">\n          <div className=\"playlist-middle-left draggable\" />\n          <div className=\"playlist-middle-center\">\n            <TrackList />\n          </div>\n          <div className=\"playlist-middle-right draggable\">\n            <PlaylistScrollBar />\n          </div>\n        </div>\n        <div className=\"playlist-bottom draggable\">\n          <div className=\"playlist-bottom-left draggable\">\n            <AddMenu />\n            <RemoveMenu />\n            <SelectionMenu />\n            <MiscMenu />\n          </div>\n          <div className=\"playlist-bottom-center draggable\" />\n          <div className=\"playlist-bottom-right draggable\">\n            {showVisualizer && (\n              <div className=\"playlist-visualizer\">\n                {activateVisualizer && (\n                  <div className=\"visualizer-wrapper\">\n                    <Visualizer\n                      // @ts-ignore Visualizer is not yet typed\n                      analyser={analyser}\n                    />\n                  </div>\n                )}\n              </div>\n            )}\n            <PlaylistActionArea />\n            <ListMenu />\n            <div id=\"playlist-scroll-up-button\" onClick={scrollUpFourTracks} />\n            <div\n              id=\"playlist-scroll-down-button\"\n              onClick={scrollDownFourTracks}\n            />\n            <PlaylistResizeTarget />\n          </div>\n        </div>\n      </DropTarget>\n    </FocusTarget>\n  );\n}\n\nexport default PlaylistWindow;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/ResizeTarget.tsx",
    "content": "import { useState, useEffect, memo } from \"react\";\nimport {\n  WINDOW_RESIZE_SEGMENT_WIDTH,\n  WINDOW_RESIZE_SEGMENT_HEIGHT,\n} from \"../constants\";\nconst { ipcRenderer } = window.require('electron');\n\ntype Size = [number, number];\n\ninterface Props {\n  currentSize: Size;\n  setWindowSize(size: Size): void;\n  widthOnly?: boolean;\n  id?: string;\n}\n\nfunction ResizeTarget(props: Props) {\n  const { currentSize, setWindowSize, widthOnly, ...passThroughProps } = props;\n  const [mouseDown, setMouseDown] = useState(false);\n  const [mouseStart, setMouseStart] = useState<null | { x: number; y: number }>(\n    null\n  );\n  let currentNewSize = [0, 0];\n\n  useEffect(() => {\n    if (mouseDown === false || mouseStart == null) {\n      return;\n    }\n    const [width, height] = currentSize;\n    const handleMove = (ee: MouseEvent) => {\n      const x = ee.clientX - mouseStart.x;\n      const y = ee.clientY - mouseStart.y;\n\n      const newWidth = Math.max(\n        0,\n        width + Math.round(x / WINDOW_RESIZE_SEGMENT_WIDTH)\n      );\n\n      const newHeight = widthOnly\n        ? width\n        : Math.max(0, height + Math.round(y / WINDOW_RESIZE_SEGMENT_HEIGHT));\n\n      const newSize: Size = [newWidth, newHeight];\n      currentNewSize = newSize;\n\n      ipcRenderer.invoke(\"movingWindowStarted\").then(() => {});\n\n      props.setWindowSize(newSize);\n    };\n\n    window.addEventListener(\"mousemove\", handleMove);\n\n    const handleMouseUp = () => { \n      setMouseDown(false);\n      ipcRenderer.invoke('setSize', { size: currentNewSize, id: props.id }).then((rs: any) => {\n        ipcRenderer.invoke(\"movingWindowEnded\");\n      });\n    }\n    window.addEventListener(\"mouseup\", handleMouseUp);\n\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMove);\n      window.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n    // We pruposefully close over the props from when the mouse went down\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [mouseStart, mouseDown]);\n\n  const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n    // Prevent dragging from highlighting text.\n    e.preventDefault();\n    setMouseStart({\n      x: e.clientX,\n      y: e.clientY,\n    });\n    setMouseDown(true);\n  };\n\n  return <div onMouseDown={handleMouseDown} {...passThroughProps} />;\n}\nexport default memo(ResizeTarget);\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Skin.tsx",
    "content": "// Dynamically set the css background images for all the sprites\nimport { LETTERS } from \"../constants\";\nimport { imageSelectors, cursorSelectors } from \"../skinSelectors\";\nimport { useTypedSelector } from \"../hooks\";\nimport * as Selectors from \"../selectors\";\nimport { SkinImages } from \"../types\";\nimport { createSelector } from \"reselect\";\nimport Css from \"./Css\";\nimport ClipPaths from \"./ClipPaths\";\nimport { convertAniBinaryToCSS } from \"ani-cursor\";\n\nconst CSS_PREFIX = \"#webamp\";\n\nconst mapRegionNamesToIds: { [key: string]: string } = {\n  normal: \"mainWindowClipPath\",\n  windowshade: \"shadeMainWindowClipPath\",\n  equalizer: \"equalizerWindowClipPath\",\n  equalizerws: \"shadeEqualizerWindowClipPath\",\n};\n\nconst mapRegionNamesToMatcher: { [key: string]: string } = {\n  normal: \"#main-window:not(.shade)\",\n  windowshade: \"#main-window.shade\",\n  equalizer: \"#equalizer-window:not(.shade)\",\n  equalizerws: \"#equalizer-window.shade\",\n};\n\nconst numExIsUsed = (skinImages: SkinImages) => Boolean(skinImages.DIGIT_0_EX);\n\nconst FALLBACKS: { [key: string]: string } = {\n  MAIN_BALANCE_BACKGROUND: \"MAIN_VOLUME_BACKGROUND\",\n  MAIN_BALANCE_THUMB: \"MAIN_VOLUME_THUMB\",\n  MAIN_BALANCE_THUMB_ACTIVE: \"MAIN_VOLUME_THUMB_SELECTED\",\n  EQ_MAXIMIZE_BUTTON_ACTIVE: \"EQ_MAXIMIZE_BUTTON_ACTIVE_FALLBACK\",\n};\n\n// Cursors might appear in context menus which are not nested inside the window layout div.\nfunction normalizeCursorSelector(selector: string): string {\n  return `${\n    // TODO: Fix this hack\n    // Maybe our CSS name spacing should be based on some other class/id\n    // than the one we use for defining the main div.\n    // That way it could be shared by both the player and the context menu.\n    selector.startsWith(\"#webamp-context-menu\") ? \"\" : CSS_PREFIX\n  } ${selector}`;\n}\n\nconst getCssRules = createSelector(\n  Selectors.getSkinImages,\n  Selectors.getSkinCursors,\n  Selectors.getSkinLetterWidths,\n  Selectors.getSkinRegion,\n  (skinImages, skinCursors, skinGenLetterWidths, skinRegion): string | null => {\n    if (!skinImages || !skinCursors) {\n      return null;\n    }\n    const cssRules = [];\n    Object.keys(imageSelectors).forEach((imageName) => {\n      const imageUrl =\n        skinImages[imageName] || skinImages[FALLBACKS[imageName]];\n      if (imageUrl) {\n        imageSelectors[imageName].forEach((selector) => {\n          cssRules.push(\n            `${CSS_PREFIX} ${selector} {background-image: url(${imageUrl})}`\n          );\n        });\n      }\n    });\n\n    if (skinGenLetterWidths != null) {\n      LETTERS.forEach((letter) => {\n        const width = skinGenLetterWidths[`GEN_TEXT_${letter}`];\n        const selectedWidth =\n          skinGenLetterWidths[`GEN_TEXT_SELECTED_${letter}`];\n        cssRules.push(\n          `${CSS_PREFIX} .gen-text-${letter.toLowerCase()} {width: ${width}px;}`\n        );\n        cssRules.push(\n          `${CSS_PREFIX} .selected .gen-text-${letter.toLowerCase()} {width: ${selectedWidth}px;}`\n        );\n      });\n    }\n\n    Object.entries(cursorSelectors).forEach(([cursorName, cursorSelector]) => {\n      const cursor = skinCursors[cursorName];\n      if (cursor == null) {\n        return;\n      }\n      const cursorRules = cursorSelector\n        .map(normalizeCursorSelector)\n        .map((selector) => {\n          switch (cursor.type) {\n            case \"cur\":\n              return `${selector} {cursor: url(${cursor.url}), auto}`;\n            case \"ani\": {\n              return convertAniBinaryToCSS(selector, cursor.aniData);\n            }\n          }\n        });\n      cssRules.push(...cursorRules);\n    });\n\n    if (numExIsUsed(skinImages)) {\n      // This alternate number file requires that the minus sign be\n      // formatted differently.\n      cssRules.push(\n        `${CSS_PREFIX} .status #time #minus-sign { top: 0px; left: -1px; width: 9px; height: 13px; }`\n      );\n    }\n\n    for (const [regionName, polygons] of Object.entries(skinRegion)) {\n      if (polygons) {\n        const matcher = mapRegionNamesToMatcher[regionName];\n        const id = mapRegionNamesToIds[regionName];\n        cssRules.push(`${CSS_PREFIX} ${matcher} { clip-path: url(#${id}); }`);\n      }\n    }\n\n    return cssRules.join(\"\\n\");\n  }\n);\n\nconst getClipPaths = createSelector(Selectors.getSkinRegion, (skinRegion) => {\n  const clipPaths: { [id: string]: string[] } = {};\n  for (const [regionName, polygons] of Object.entries(skinRegion)) {\n    if (polygons) {\n      const id = mapRegionNamesToIds[regionName];\n      clipPaths[id] = polygons;\n    }\n  }\n  return clipPaths;\n});\n\nexport default function Skin() {\n  const cssRules = useTypedSelector(getCssRules);\n  const clipPaths = useTypedSelector(getClipPaths);\n  if (cssRules == null) {\n    return null;\n  }\n  return (\n    <>\n      <Css id=\"webamp-skin\">{cssRules}</Css>\n      <ClipPaths>{clipPaths}</ClipPaths>\n    </>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/SkinsContextMenu.tsx",
    "content": "import * as Actions from \"../actionCreators\";\nimport * as Selectors from \"../selectors\";\nimport { Hr, Node, Parent } from \"./ContextMenu\";\nimport { useActionCreator, useTypedSelector } from \"../hooks\";\n\n\nconst SkinContextMenu = () => {\n  const loadDefaultSkin = useActionCreator(Actions.loadDefaultSkin);\n  const openSkinFileDialog = useActionCreator(Actions.openSkinFileDialog);\n  const setSkin = useActionCreator(Actions.setSkinFromUrl);\n\n  const availableSkins = useTypedSelector(Selectors.getAvaliableSkins);\n  return (\n    <Parent label=\"Skins\">\n      <Node onClick={openSkinFileDialog} label=\"Load Skin...\" />\n      <Hr />\n      <Node onClick={loadDefaultSkin} label={\"<Base Skin>\"} />\n      {availableSkins.map((skin) => (\n        <Node\n          key={skin.url}\n          onClick={() => setSkin(skin.url)}\n          label={skin.name}\n        />\n      ))}\n    </Parent>\n  );\n};\nexport default SkinContextMenu;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/VerticalSlider.tsx",
    "content": "import * as Utils from \"../utils\";\nimport { ReactNode, useRef } from \"react\";\n\ntype Props = {\n  height: number;\n  width: number;\n  handleHeight: number;\n  value: number;\n  handle: ReactNode;\n  onBeforeChange?: () => void;\n  onChange: (value: number) => void;\n  onAfterChange?: () => void;\n  disabled?: boolean;\n};\n\n// `<input type=\"range\" />` can be rotated to become a vertical slider using\n// CSS, but that makes it impossible to style the handle in a pixel perfect\n// manner. Instead we reimplement it in React.\nexport default function VerticalSlider({\n  value,\n  height,\n  width,\n  handle,\n  handleHeight,\n  onBeforeChange,\n  onChange,\n  onAfterChange,\n  disabled,\n}: Props) {\n  const ref = useRef<HTMLDivElement | null>(null);\n  const handleRef = useRef<HTMLDivElement | null>(null);\n\n  function handleMouseDown(e: React.MouseEvent<HTMLDivElement, MouseEvent>) {\n    const sliderNode = ref.current;\n    const handleNode = handleRef.current;\n    if (sliderNode == null || handleNode == null) {\n      // I don't think this could ever happen in practice\n      return null;\n    }\n\n    const sliderRect = sliderNode.getBoundingClientRect();\n    const handleRect = handleNode.getBoundingClientRect();\n\n    const { top: sliderTop, height: sliderHeight } = sliderRect;\n    const { top: handleTop, height: realHandleHeight } = handleRect;\n\n    // If the user clicks on the handle we want them to continue to hold onto\n    // that point of te handle. If they click outside of the handle (in the\n    // slider itself) we want to center the handle at that point and have them\n    // move the handle from the center.\n    const handleOffset = handleNode.contains(e.target as HTMLElement)\n      ? e.clientY - handleTop\n      : realHandleHeight / 2;\n\n    const baseOffset = sliderTop + handleOffset;\n    // Measure the actual rect height rather than use the `height` prop, becuase\n    // we might be in double-size mode.\n    const spanSize = sliderHeight - realHandleHeight;\n\n    function moveToCursor(event: MouseEvent) {\n      // Ensure dragging does not cause elements/text to be selected.\n      // https://stackoverflow.com/a/19164149/1263117\n      event.preventDefault();\n      const startOffset = event.clientY - baseOffset;\n      onChange(Utils.clamp(startOffset / spanSize, 0, 1));\n    }\n\n    function handleMouseUp() {\n      if (onAfterChange != null) {\n        onAfterChange();\n      }\n      document.removeEventListener(\"mousemove\", moveToCursor);\n      document.removeEventListener(\"mouseup\", handleMouseUp);\n    }\n    document.addEventListener(\"mousemove\", moveToCursor);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n\n    if (onBeforeChange != null) {\n      onBeforeChange();\n    }\n\n    // Move the slider to where they've started.\n    moveToCursor(e.nativeEvent);\n  }\n  const offset = Math.floor((height - handleHeight) * value);\n  return (\n    <div\n      style={{ height, width }}\n      onMouseDown={disabled ? undefined : handleMouseDown}\n      ref={ref}\n    >\n      <div style={{ transform: `translateY(${offset}px)` }} ref={handleRef}>\n        {handle}\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Visualizer.tsx",
    "content": "import { useMemo, useCallback, useState, useLayoutEffect } from \"react\";\n\nimport * as Actions from \"../actionCreators\";\nimport * as Selectors from \"../selectors\";\nimport { useTypedSelector, useActionCreator } from \"../hooks\";\nimport { usePaintOscilloscopeFrame } from \"./useOscilloscopeVisualizer\";\nimport { usePaintBarFrame, usePaintBar } from \"./useBarVisualizer\";\nimport { VISUALIZERS, MEDIA_STATUS } from \"../constants\";\n\nconst PIXEL_DENSITY = 2;\n\ntype Props = {\n  analyser: AnalyserNode;\n};\n\n// Pre-render the background grid\nfunction preRenderBg(\n  width: number,\n  height: number,\n  bgColor: string,\n  fgColor: string,\n  windowShade: boolean\n): HTMLCanvasElement {\n  // Off-screen canvas for pre-rendering the background\n  const bgCanvas = document.createElement(\"canvas\");\n  bgCanvas.width = width;\n  bgCanvas.height = height;\n  const distance = 2 * PIXEL_DENSITY;\n\n  const bgCanvasCtx = bgCanvas.getContext(\"2d\");\n  if (bgCanvasCtx == null) {\n    throw new Error(\"Could not construct canvas context\");\n  }\n  bgCanvasCtx.fillStyle = bgColor;\n  bgCanvasCtx.fillRect(0, 0, width, height);\n  if (!windowShade) {\n    bgCanvasCtx.fillStyle = fgColor;\n    for (let x = 0; x < width; x += distance) {\n      for (let y = PIXEL_DENSITY; y < height; y += distance) {\n        bgCanvasCtx.fillRect(x, y, PIXEL_DENSITY, PIXEL_DENSITY);\n      }\n    }\n  }\n  return bgCanvas;\n}\n\nfunction Visualizer({ analyser }: Props) {\n  useLayoutEffect(() => {\n    analyser.fftSize = 2048;\n  }, [analyser.fftSize]);\n  const colors = useTypedSelector(Selectors.getSkinColors);\n  const style = useTypedSelector(Selectors.getVisualizerStyle);\n  const status = useTypedSelector(Selectors.getMediaStatus);\n  const getWindowShade = useTypedSelector(Selectors.getWindowShade);\n  const dummyVizData = useTypedSelector(Selectors.getDummyVizData);\n\n  const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);\n  const windowShade = getWindowShade(\"main\");\n  const renderWidth = windowShade ? 38 : 76;\n  const renderHeight = windowShade ? 5 : 16;\n\n  const width = renderWidth * PIXEL_DENSITY;\n  const height = renderHeight * PIXEL_DENSITY;\n\n  const bgCanvas = useMemo(() => {\n    return preRenderBg(\n      width,\n      height,\n      colors[0],\n      colors[1],\n      Boolean(windowShade)\n    );\n  }, [colors, height, width, windowShade]);\n\n  const paintOscilloscopeFrame = usePaintOscilloscopeFrame({\n    analyser,\n    height,\n    width,\n    renderWidth,\n  });\n  const paintBarFrame = usePaintBarFrame({\n    analyser,\n    height,\n    renderHeight,\n  });\n  const paintBar = usePaintBar({ height, renderHeight });\n\n  const paintFrame = useCallback(\n    (canvasCtx: CanvasRenderingContext2D) => {\n      if (status !== MEDIA_STATUS.PLAYING) {\n        return;\n      }\n      if (dummyVizData) {\n        canvasCtx.drawImage(bgCanvas, 0, 0);\n        Object.entries(dummyVizData).forEach(([i, value]) => {\n          paintBar(canvasCtx, Number(i), value, -1);\n        });\n        return;\n      }\n      switch (style) {\n        case VISUALIZERS.OSCILLOSCOPE:\n          canvasCtx.drawImage(bgCanvas, 0, 0);\n          paintOscilloscopeFrame(canvasCtx);\n          break;\n        case VISUALIZERS.BAR:\n          canvasCtx.drawImage(bgCanvas, 0, 0);\n          paintBarFrame(canvasCtx);\n          break;\n        default:\n          canvasCtx.clearRect(0, 0, width, height);\n      }\n    },\n    [\n      bgCanvas,\n      dummyVizData,\n      height,\n      paintBar,\n      paintBarFrame,\n      paintOscilloscopeFrame,\n      status,\n      style,\n      width,\n    ]\n  );\n\n  const [canvas, setCanvas] = useState<HTMLCanvasElement | null>(null);\n\n  useLayoutEffect(() => {\n    if (canvas == null) {\n      return;\n    }\n    const canvasCtx = canvas.getContext(\"2d\");\n    if (canvasCtx == null) {\n      return;\n    }\n    canvasCtx.imageSmoothingEnabled = false;\n\n    let animationRequest: number | null = null;\n    // Kick off the animation loop\n    const loop = () => {\n      paintFrame(canvasCtx);\n      animationRequest = window.requestAnimationFrame(loop);\n    };\n    loop();\n\n    return () => {\n      if (animationRequest != null) {\n        window.cancelAnimationFrame(animationRequest);\n      }\n    };\n  }, [canvas, paintFrame]);\n\n  return (\n    <canvas\n      id=\"visualizer\"\n      ref={setCanvas}\n      style={{ width: renderWidth, height: renderHeight }}\n      width={width}\n      height={height}\n      onClick={toggleVisualizerStyle}\n    />\n  );\n}\n\nexport default Visualizer;\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/Volume.tsx",
    "content": "import * as React from \"react\";\nimport * as Actions from \"../actionCreators\";\nimport * as Selectors from \"../selectors\";\nimport { useTypedSelector, useActionCreator } from \"../hooks\";\n\ninterface Props {\n  id?: string;\n  style?: React.CSSProperties;\n  className?: string;\n}\n\nexport default function Volume({ id, style, className }: Props) {\n  const volume = useTypedSelector(Selectors.getVolume);\n  const setFocus = useActionCreator(Actions.setFocus);\n  const unsetFocus = useActionCreator(Actions.unsetFocus);\n  const setVolume = useActionCreator(Actions.setVolume);\n\n  return (\n    <input\n      id={id}\n      type=\"range\"\n      min=\"0\"\n      max=\"100\"\n      step=\"1\"\n      value={volume}\n      style={style}\n      className={className}\n      onChange={(e) => setVolume(Number(e.target.value))}\n      onMouseDown={() => setFocus(\"volume\")}\n      onMouseUp={unsetFocus}\n      title=\"Volume Bar\"\n    />\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/WindowManager.tsx",
    "content": "import { ReactNode, useCallback, useEffect, useState } from \"react\";\n\nimport * as SnapUtils from \"../snapUtils\";\nimport * as Selectors from \"../selectors\";\nimport * as Actions from \"../actionCreators\";\nimport { WindowInfo, WindowId, Box, Point } from \"../types\";\nimport { useTypedSelector, useActionCreator } from \"../hooks\";\nconst { ipcRenderer } = window.require('electron');\n\nconst abuts = (a: Box, b: Box) => {\n  // TODO: This is kinda a hack. They should really be touching, not just within snapping distance.\n  // Also, overlapping should not count.\n  const wouldMoveTo = SnapUtils.snap(a, b);\n  return wouldMoveTo.x !== undefined || wouldMoveTo.y !== undefined;\n};\n\nlet posOnStart = false;\n\ninterface Props {\n  windows: { [windowId: string]: ReactNode };\n}\n\ntype DraggingState = {\n  moving: WindowInfo[];\n  stationary: WindowInfo[];\n  boundingBox: Box;\n  mouseStart: Point;\n};\n\nfunction useHandleMouseDown(propsWindows: {\n  [windowId: string]: ReactNode;\n}): (key: WindowId, e: React.MouseEvent<HTMLDivElement>) => void {\n  const windowsInfo = useTypedSelector(Selectors.getWindowsInfo);\n  const getOpen = useTypedSelector(Selectors.getWindowOpen);\n  const getWindowHidden = useTypedSelector(Selectors.getWindowHidden);\n  const browserWindowSize = useTypedSelector(Selectors.getBrowserWindowSize);\n  const updateWindowPositions = useActionCreator(Actions.updateWindowPositions);\n\n  const [draggingState, setDraggingState] = useState<DraggingState | null>(\n    null\n  );\n\n  // When the mouse is down, attach a listener to track mouse move events.\n  useEffect(() => {\n    if (draggingState == null) {\n      return;\n    }\n    const { boundingBox, moving, stationary, mouseStart } = draggingState;\n    const handleMouseMove = (ee: MouseEvent) => {\n      const proposedDiff = {\n        x: ee.clientX - mouseStart.x,\n        y: ee.clientY - mouseStart.y,\n      };\n\n      const proposedWindows = moving.map((node) => ({\n        ...node,\n        ...SnapUtils.applyDiff(node, proposedDiff),\n      }));\n\n      const proposedBox = {\n        ...boundingBox,\n        ...SnapUtils.applyDiff(boundingBox, proposedDiff),\n      };\n\n      const snapDiff = SnapUtils.snapDiffManyToMany(\n        proposedWindows,\n        stationary\n      );\n\n      const withinDiff = SnapUtils.snapWithinDiff(\n        proposedBox,\n        browserWindowSize\n      );\n\n      const finalDiff = SnapUtils.applyMultipleDiffs(\n        proposedDiff,\n        snapDiff,\n        withinDiff\n      );\n\n      const windowPositionDiff: { [windowId: string]: Point } = {};\n      moving.forEach((w) => {\n        windowPositionDiff[w.key] = SnapUtils.applyDiff(w, finalDiff);\n      });\n\n      // Log the updated positions of the windows being moved\n      ipcRenderer.invoke(\"movingWindowStarted\", { windows: windowsInfo }).then(() => {});\n      updateWindowPositions(windowPositionDiff, false);\n    };\n\n    function handleMouseUp() {\n      setDraggingState(null);\n      // Log that window movement has ended\n      ipcRenderer.invoke(\"movingWindowEnded\", { windows: windowsInfo }).then(() => {});\n    }\n\n    window.addEventListener(\"mouseup\", handleMouseUp);\n    window.addEventListener(\"mousemove\", handleMouseMove);\n\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMouseMove);\n      window.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n  }, [browserWindowSize, draggingState, updateWindowPositions]);\n\n  // Mouse down handler\n  return useCallback(\n    (key: WindowId, e: React.MouseEvent<HTMLDivElement>) => {\n      if (!(e.target as HTMLElement).classList.contains(\"draggable\")) {\n        return;\n      }\n\n      if (getWindowHidden(key)) {\n        // The user may be clicking on full screen Milkdrop.\n        return;\n      }\n\n      const windows = windowsInfo.filter(\n        (w) => propsWindows[w.key] != null && !getWindowHidden(w.key)\n      );\n      const targetNode = windows.find((node) => node.key === key);\n      if (targetNode == null) {\n        throw new Error(`Tried to move a node that does not exist: ${key}`);\n      }\n\n      let movingSet = new Set([targetNode]);\n      // Only the main window brings other windows along.\n      if (key === \"main\") {\n        const findAllConnected = SnapUtils.traceConnection<WindowInfo>(abuts);\n        movingSet = findAllConnected(windows, targetNode);\n      }\n\n      const stationary = windows.filter((w) => !movingSet.has(w));\n      const moving = Array.from(movingSet);\n\n      const mouseStart = { x: e.clientX, y: e.clientY };\n\n      const boundingBox = SnapUtils.boundingBox(moving);\n      setDraggingState({ boundingBox, moving, stationary, mouseStart });\n    },\n    [getWindowHidden, propsWindows, windowsInfo]\n  );\n}\n\nexport default function WindowManager({ windows: propsWindows }: Props) {\n  const windowsInfo = useTypedSelector(Selectors.getWindowsInfo);\n  const setFocusedWindow = useActionCreator(Actions.setFocusedWindow);\n  const handleMouseDown = useHandleMouseDown(propsWindows);\n  const updateWindowPositions = useActionCreator(Actions.updateWindowPositions);\n  const centerWindowsInView = useActionCreator(Actions.centerWindowsInView);\n  const setWindowSize = useActionCreator(Actions.setWindowSize);\n  const toggleWindow = useActionCreator(Actions.toggleWindow);\n\n  const windows = windowsInfo.filter((w) => propsWindows[w.key]);\n\n  if (!posOnStart) {\n    if (document.getElementById('playlist-window')) {\n      ipcRenderer.invoke('getSettings').then((rs: any) => {\n        const settingsData = JSON.parse(rs);\n        console.log(settingsData);\n        if (settingsData.windows) {\n            ipcRenderer.invoke('movingWindowStarted').then(() => {\n                let obj = windows.find((o, i) => {\n                  if (o.key === 'main') {\n                      windows[i].x = settingsData.windows.mainWindow.x;\n                      windows[i].y = settingsData.windows.mainWindow.y;\n                  }\n                  if (o.key === 'playlist') {\n                    windows[i].x = settingsData.windows.playlistWindow.x;\n                    windows[i].y = settingsData.windows.playlistWindow.y;\n                    setWindowSize(o.key, settingsData.windows.playlistWindow.size);\n                  }\n                  if (o.key === 'equalizer') {\n                    windows[i].x = settingsData.windows.equalizerWindow.x;\n                    windows[i].y = settingsData.windows.equalizerWindow.y;\n                  }\n                  if (o.key === 'milkdrop') {\n                    windows[i].x = settingsData.windows.milkdropWindow.x;\n                    windows[i].y = settingsData.windows.milkdropWindow.y;\n                    setWindowSize(o.key, settingsData.windows.milkdropWindow.size);\n                  }\n                });\n                const newPositions = windowsInfo.reduce(\n                  (pos, w) => ({\n                    ...pos,\n                    [w.key]: { x: w.x, y: w.y },\n                  }),\n                  {}\n                );\n\n                updateWindowPositions(newPositions, false);\n                centerWindowsInView();\n                if (!settingsData.windows.playlistWindow.visible) {\n                  toggleWindow('playlist');\n                }\n                if (!settingsData.windows.equalizerWindow.visible) {\n                  toggleWindow('equalizer');\n                }\n                ipcRenderer.invoke('movingWindowEndedWithoutSave').then(() => {});\n                posOnStart = true;\n              });\n        }\n      })\n    }\n  }\n\n\n  const onBlur = useCallback(\n    // I give up on trying to type things with `relatedTarget`.\n    (e: any) => {\n      const { currentTarget, relatedTarget } = e;\n      if (\n        currentTarget === relatedTarget ||\n        currentTarget.contains(relatedTarget)\n      ) {\n        return;\n      }\n      setFocusedWindow(null);\n    },\n    [setFocusedWindow]\n  );\n\n  return (\n    <>\n      {windows.map((w) => (\n        <div\n          key={w.key}\n          id={w.key}\n          onBlur={onBlur}\n          onMouseDown={(e: React.MouseEvent<HTMLDivElement>) => {\n            handleMouseDown(w.key, e);\n          }}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            transform: `translate(${w.x}px, ${w.y}px)`,\n          }}\n        >\n          {propsWindows[w.key]}\n        </div>\n      ))}\n    </>\n  );\n}"
  },
  {
    "path": "webamp/packages/webamp/js/components/useBarVisualizer.ts",
    "content": "import { useMemo, useCallback, useState } from \"react\";\n\nimport * as Selectors from \"../selectors\";\nimport { useTypedSelector } from \"../hooks\";\n\nconst PIXEL_DENSITY = 2;\nconst BAR_WIDTH = 3 * PIXEL_DENSITY;\nconst GRADIENT_COLOR_COUNT = 16;\nconst PEAK_COLOR_INDEX = 23;\nconst BAR_PEAK_DROP_RATE = 0.01;\nconst NUM_BARS = 20;\n\nfunction octaveBucketsForBufferLength(bufferLength: number): number[] {\n  const octaveBuckets = new Array(NUM_BARS).fill(0);\n  const minHz = 200;\n  const maxHz = 22050;\n  const octaveStep = Math.pow(maxHz / minHz, 1 / NUM_BARS);\n\n  octaveBuckets[0] = 0;\n  octaveBuckets[1] = minHz;\n  for (let i = 2; i < NUM_BARS - 1; i++) {\n    octaveBuckets[i] = octaveBuckets[i - 1] * octaveStep;\n  }\n  octaveBuckets[NUM_BARS - 1] = maxHz;\n\n  for (let i = 0; i < NUM_BARS; i++) {\n    const octaveIdx = Math.floor((octaveBuckets[i] / maxHz) * bufferLength);\n    octaveBuckets[i] = octaveIdx;\n  }\n\n  return octaveBuckets;\n}\n\nfunction preRenderBar(\n  height: number,\n  colors: string[],\n  renderHeight: number\n): HTMLCanvasElement {\n  /**\n   * The order of the colours is commented in the file: the fist two colours\n   * define the background and dots (check it to see what are the dots), the\n   * next 16 colours are the analyzer's colours from top to bottom, the next\n   * 5 colours are the oscilloscope's ones, from center to top/bottom, the\n   * last colour is for the analyzer's peak markers.\n   */\n\n  // Off-screen canvas for pre-rendering a single bar gradient\n  const barCanvas = document.createElement(\"canvas\");\n  barCanvas.width = BAR_WIDTH;\n  barCanvas.height = height;\n\n  const offset = 2; // The first two colors are for the background;\n  const gradientColors = colors.slice(offset, offset + GRADIENT_COLOR_COUNT);\n\n  const barCanvasCtx = barCanvas.getContext(\"2d\");\n  if (barCanvasCtx == null) {\n    throw new Error(\"Could not construct canvas context\");\n  }\n  const multiplier = GRADIENT_COLOR_COUNT / renderHeight;\n  // In shade mode, the five colors are, from top to bottom:\n  // 214, 102, 0 -- 3\n  // 222, 165, 24 -- 6\n  // 148, 222, 33 -- 9\n  // 57, 181, 16 -- 12\n  // 24, 132, 8 -- 15\n  // TODO: This could probably be improved by iterating backwards\n  for (let i = 0; i < renderHeight; i++) {\n    const colorIndex = GRADIENT_COLOR_COUNT - 1 - Math.floor(i * multiplier);\n    barCanvasCtx.fillStyle = gradientColors[colorIndex];\n    const y = height - i * PIXEL_DENSITY;\n    barCanvasCtx.fillRect(0, y, BAR_WIDTH, PIXEL_DENSITY);\n  }\n  return barCanvas;\n}\n\nexport function usePaintBar({\n  renderHeight,\n  height,\n}: {\n  renderHeight: number;\n  height: number;\n}) {\n  const colors = useTypedSelector(Selectors.getSkinColors);\n  const getWindowShade = useTypedSelector(Selectors.getWindowShade);\n  const windowShade = getWindowShade(\"main\");\n\n  const barCanvas = useMemo(() => {\n    return preRenderBar(height, colors, renderHeight);\n  }, [colors, height, renderHeight]);\n\n  return useCallback(\n    (\n      ctx: CanvasRenderingContext2D,\n      x: number,\n      barHeight: number,\n      peakHeight: number\n    ) => {\n      barHeight = Math.ceil(barHeight) * PIXEL_DENSITY;\n      peakHeight = Math.ceil(peakHeight) * PIXEL_DENSITY;\n      if (barHeight > 0 || peakHeight > 0) {\n        const y = height - barHeight;\n        // Draw the gradient\n        const b = BAR_WIDTH;\n        if (height > 0) {\n          ctx.drawImage(barCanvas, 0, y, b, height, x, y, b, height);\n        }\n\n        // Draw the gray peak line\n        if (!windowShade) {\n          const peakY = height - peakHeight;\n          ctx.fillStyle = colors[PEAK_COLOR_INDEX];\n          ctx.fillRect(x, peakY, b, PIXEL_DENSITY);\n        }\n      }\n    },\n    [barCanvas, colors, height, windowShade]\n  );\n}\n\nexport function usePaintBarFrame({\n  renderHeight,\n  height,\n  analyser,\n}: {\n  renderHeight: number;\n  height: number;\n  analyser: AnalyserNode;\n}) {\n  const [barPeaks] = useState(() => new Array(NUM_BARS).fill(0));\n  const [barPeakFrames] = useState(() => new Array(NUM_BARS).fill(0));\n  const bufferLength = analyser.frequencyBinCount;\n\n  const octaveBuckets = useMemo(() => {\n    return octaveBucketsForBufferLength(bufferLength);\n  }, [bufferLength]);\n\n  const dataArray = useMemo(() => {\n    return new Uint8Array(bufferLength);\n  }, [bufferLength]);\n\n  const paintBar = usePaintBar({ height, renderHeight });\n\n  return useCallback(\n    (canvasCtx: CanvasRenderingContext2D) => {\n      analyser.getByteFrequencyData(dataArray);\n      const heightMultiplier = renderHeight / 256;\n      const xOffset = BAR_WIDTH + PIXEL_DENSITY; // Bar width, plus a pixel of spacing to the right.\n      for (let j = 0; j < NUM_BARS - 1; j++) {\n        const start = octaveBuckets[j];\n        const end = octaveBuckets[j + 1];\n        let amplitude = 0;\n        for (let k = start; k < end; k++) {\n          amplitude += dataArray[k];\n        }\n        amplitude /= end - start;\n\n        // The drop rate should probably be normalized to the rendering FPS, for now assume 60 FPS\n        let barPeak =\n          barPeaks[j] - BAR_PEAK_DROP_RATE * Math.pow(barPeakFrames[j], 2);\n        if (barPeak < amplitude) {\n          barPeak = amplitude;\n          barPeakFrames[j] = 0;\n        } else {\n          barPeakFrames[j] += 1;\n        }\n        barPeaks[j] = barPeak;\n\n        paintBar(\n          canvasCtx,\n          j * xOffset,\n          amplitude * heightMultiplier,\n          barPeak * heightMultiplier\n        );\n      }\n    },\n    [\n      analyser,\n      barPeakFrames,\n      barPeaks,\n      dataArray,\n      octaveBuckets,\n      paintBar,\n      renderHeight,\n    ]\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/components/useOscilloscopeVisualizer.ts",
    "content": "import { useMemo, useCallback } from \"react\";\n\nimport * as Selectors from \"../selectors\";\nimport { useTypedSelector } from \"../hooks\";\n\nconst PIXEL_DENSITY = 2;\n\n// Return the average value in a slice of dataArray\nfunction sliceAverage(\n  dataArray: Uint8Array,\n  sliceWidth: number,\n  sliceNumber: number\n): number {\n  const start = sliceWidth * sliceNumber;\n  const end = start + sliceWidth;\n  let sum = 0;\n  for (let i = start; i < end; i++) {\n    sum += dataArray[i];\n  }\n  return sum / sliceWidth;\n}\n\nexport function usePaintOscilloscopeFrame({\n  analyser,\n  height,\n  width,\n  renderWidth,\n}: {\n  analyser: AnalyserNode;\n  height: number;\n  width: number;\n  renderWidth: number;\n}) {\n  const colors = useTypedSelector(Selectors.getSkinColors);\n\n  const bufferLength = analyser.fftSize;\n\n  const dataArray = useMemo(() => {\n    return new Uint8Array(bufferLength);\n  }, [bufferLength]);\n\n  return useCallback(\n    (canvasCtx: CanvasRenderingContext2D) => {\n      analyser.getByteTimeDomainData(dataArray);\n\n      canvasCtx.lineWidth = PIXEL_DENSITY;\n\n      // Just use one of the viscolors for now\n      canvasCtx.strokeStyle = colors[18];\n\n      // Since dataArray has more values than we have pixels to display, we\n      // have to average several dataArray values per pixel. We call these\n      // groups slices.\n      //\n      // We use the  2x scale here since we only want to plot values for\n      // \"real\" pixels.\n      const sliceWidth = Math.floor(bufferLength / width) * PIXEL_DENSITY;\n\n      const h = height;\n\n      canvasCtx.beginPath();\n\n      // Iterate over the width of the canvas in \"real\" pixels.\n      for (let j = 0; j <= renderWidth; j++) {\n        const amplitude = sliceAverage(dataArray, sliceWidth, j);\n        const percentAmplitude = amplitude / 255; // dataArray gives us bytes\n        const y = (1 - percentAmplitude) * h; // flip y\n        const x = j * PIXEL_DENSITY;\n\n        // Canvas coordinates are in the middle of the pixel by default.\n        // When we want to draw pixel perfect lines, we will need to\n        // account for that here\n        if (x === 0) {\n          canvasCtx.moveTo(x, y);\n        } else {\n          canvasCtx.lineTo(x, y);\n        }\n      }\n      canvasCtx.stroke();\n    },\n    [analyser, bufferLength, colors, dataArray, height, renderWidth, width]\n  );\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/constants.ts",
    "content": "import {\n  Band,\n  MediaTagRequestStatus,\n  MediaStatus,\n  LoadStyle,\n  TimeMode,\n} from \"./types\";\nimport baseSkin from \"./baseSkin.json\";\nexport const BANDS: Band[] = [\n  60,\n  170,\n  310,\n  600,\n  1000,\n  3000,\n  6000,\n  12000,\n  14000,\n  16000,\n];\n\nexport const WINDOWS = {\n  MAIN: \"main\",\n  PLAYLIST: \"playlist\",\n  EQUALIZER: \"equalizer\",\n  MILKDROP: \"milkdrop\",\n};\n\nexport const LOAD_STYLE: Record<LoadStyle, LoadStyle> = {\n  BUFFER: \"BUFFER\",\n  PLAY: \"PLAY\",\n  NONE: \"NONE\",\n};\n\n// TODO: Make this an enum?\nexport const MEDIA_TAG_REQUEST_STATUS: Record<\n  MediaTagRequestStatus,\n  MediaTagRequestStatus\n> = {\n  INITIALIZED: \"INITIALIZED\",\n  FAILED: \"FAILED\",\n  COMPLETE: \"COMPLETE\",\n  NOT_REQUESTED: \"NOT_REQUESTED\",\n};\n\nexport const UTF8_ELLIPSIS = \"\\u2026\";\nexport const CHARACTER_WIDTH = 5;\nexport const WINDOW_RESIZE_SEGMENT_WIDTH = 25;\nexport const WINDOW_RESIZE_SEGMENT_HEIGHT = 29;\nexport const WINDOW_HEIGHT = 116;\nexport const WINDOW_WIDTH = 275;\nexport const TRACK_HEIGHT = 13;\nexport const LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\n\nexport const DEFAULT_SKIN = baseSkin;\n\nexport const VISUALIZERS = {\n  OSCILLOSCOPE: \"OSCILLOSCOPE\",\n  BAR: \"BAR\",\n  NONE: \"NONE\",\n  MILKDROP: \"MILKDROP\",\n};\n\nexport const VISUALIZER_ORDER = [\n  VISUALIZERS.BAR,\n  VISUALIZERS.OSCILLOSCOPE, // TODO: Verify the order\n  VISUALIZERS.NONE,\n];\n\nexport const TIME_MODE: Record<TimeMode, TimeMode> = {\n  ELAPSED: \"ELAPSED\",\n  REMAINING: \"REMAINING\",\n};\n\n// TODO: Convert to enum once we are fully Typescript\nexport const MEDIA_STATUS: Record<MediaStatus, MediaStatus> = {\n  PLAYING: \"PLAYING\",\n  STOPPED: \"STOPPED\",\n  PAUSED: \"PAUSED\",\n};\n"
  },
  {
    "path": "webamp/packages/webamp/js/emitter.test.js",
    "content": "import Emitter from \"./emitter\";\n\ndescribe(\"Emitter\", () => {\n  it(\"calls a callback\", () => {\n    const mock = jest.fn();\n    const emitter = new Emitter();\n    emitter.on(\"some-event\", mock);\n    emitter.trigger(\"some-event\");\n    expect(mock).toHaveBeenCalled();\n  });\n  it(\"calls multiple callbacks\", () => {\n    const mock1 = jest.fn();\n    const mock2 = jest.fn();\n    const emitter = new Emitter();\n    emitter.on(\"some-event\", mock1);\n    emitter.on(\"some-event\", mock2);\n    emitter.trigger(\"some-event\");\n    expect(mock1).toHaveBeenCalled();\n    expect(mock2).toHaveBeenCalled();\n  });\n  it(\"returns an unsubscribe function\", () => {\n    const mock = jest.fn();\n    const emitter = new Emitter();\n    const unsubscribe = emitter.on(\"some-event\", mock);\n    emitter.trigger(\"some-event\");\n    unsubscribe();\n    emitter.trigger(\"some-event\");\n    emitter.trigger(\"some-event\");\n    emitter.trigger(\"some-event\");\n    emitter.trigger(\"some-event\");\n    emitter.trigger(\"some-event\");\n    expect(mock).toHaveBeenCalledTimes(1);\n  });\n  it(\"subscriptions do not take effent until the next event\", () => {\n    const mock = jest.fn();\n    const emitter = new Emitter();\n    emitter.on(\"some-event\", () => {\n      emitter.on(\"some-event\", mock);\n    });\n    emitter.trigger(\"some-event\");\n    expect(mock).not.toHaveBeenCalled();\n  });\n  it(\"unsubscribe does not take effect until the next event\", () => {\n    const mock = jest.fn();\n    const emitter = new Emitter();\n    emitter.on(\"some-event\", () => {\n      unsubscribe(); // eslint-disable-line no-use-before-define\n    });\n    const unsubscribe = emitter.on(\"some-event\", mock);\n    emitter.trigger(\"some-event\");\n    expect(mock).toHaveBeenCalled();\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/emitter.ts",
    "content": "export default class Emitter {\n  _listeners: { [event: string]: Array<(...args: any[]) => void> };\n\n  constructor() {\n    this._listeners = {};\n  }\n\n  on(event: string, callback: (...args: any[]) => void) {\n    const eventListeners = this._listeners[event] || [];\n    eventListeners.push(callback);\n    this._listeners[event] = eventListeners;\n    const unsubscribe = () => {\n      this._listeners[event] = eventListeners.filter((cb) => cb !== callback);\n    };\n    return unsubscribe;\n  }\n\n  trigger(event: string, ...args: any[]) {\n    const callbacks = this._listeners[event];\n    if (callbacks) {\n      callbacks.forEach((cb) => cb(...args));\n    }\n  }\n\n  dispose() {\n    this._listeners = {};\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/fileUtils.ts",
    "content": "import invariant from \"invariant\";\nimport { IMusicMetadataBrowserApi } from \"./types\";\nimport { IAudioMetadata } from \"music-metadata\"; // Import music-metadata type definitions\nimport * as Utils from \"./utils\";\n\ntype MediaDataType = string | ArrayBuffer | Blob;\n\nexport function genMediaTags(\n  file: MediaDataType,\n  musicMetadata: IMusicMetadataBrowserApi\n): Promise<IAudioMetadata> {\n  invariant(\n    file != null,\n    \"Attempted to get the tags of media file without passing a file\"\n  );\n\n  const options = {\n    duration: true,\n    skipPostHeaders: true, // avoid unnecessary data to be read\n  };\n\n  if (typeof file === \"string\") {\n    return musicMetadata.fetchFromUrl(file, options);\n  }\n  // Assume Blob\n  return musicMetadata.parseBlob(file as Blob, options);\n}\n\nexport function genMediaDuration(url: string): Promise<number> {\n  invariant(\n    typeof url === \"string\",\n    \"Attempted to get the duration of media file without passing a url\"\n  );\n  return new Promise((resolve, reject) => {\n    // TODO: Does this actually stop downloading the file once it's\n    // got the duration?\n    const audio = document.createElement(\"audio\");\n    audio.crossOrigin = \"anonymous\";\n    const durationChange = () => {\n      resolve(audio.duration);\n      audio.removeEventListener(\"durationchange\", durationChange);\n      audio.src = \"\";\n      // TODO: Not sure if this really gets cleaned up.\n    };\n    audio.addEventListener(\"durationchange\", durationChange);\n    audio.addEventListener(\"error\", (e) => {\n      reject(e);\n    });\n    audio.src = url;\n  });\n}\n\nexport async function genArrayBufferFromFileReference(\n  fileReference: File\n): Promise<any> {\n  invariant(\n    fileReference != null,\n    \"Attempt to get an ArrayBuffer without assigning a fileReference\"\n  );\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      resolve(reader.result as ArrayBuffer);\n    };\n    reader.onerror = reject;\n    reader.readAsArrayBuffer(fileReference);\n  });\n}\n\nexport async function genStringFromFileReference(\n  fileReference: File\n): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      resolve(reader.result as string);\n    };\n    reader.onerror = reject;\n    reader.readAsText(fileReference);\n  });\n}\n\ninterface PromptForFileReferenceOptions {\n  accept?: string | null;\n  directory?: boolean;\n}\n\nexport async function promptForFileReferences(\n  { accept, directory = false }: PromptForFileReferenceOptions = {\n    accept: null,\n    directory: false,\n  }\n): Promise<FileList> {\n  return new Promise<FileList>((resolve) => {\n    // Does this represent a memory leak somehow?\n    // Can this fail? Do we ever reject?\n    const fileInput = document.createElement(\"input\");\n    if (accept) fileInput.setAttribute(\"accept\", accept);\n    fileInput.type = \"file\";\n    fileInput.multiple = true;\n    // @ts-ignore Non-standard\n    fileInput.webkitdirectory = directory;\n    // @ts-ignore Non-standard\n    fileInput.directory = directory;\n    // @ts-ignore Non-standard\n    fileInput.mozdirectory = directory;\n    // Not entirely sure why this is needed, since the input\n    // was just created, but somehow this helps prevent change\n    // events from getting swallowed.\n    // https://stackoverflow.com/a/12102992/1263117\n\n    // @ts-ignore Technically you can't set this to null, it has to be a string.\n    // But I don't feel like retesting it, so I'll leave it as null\n    fileInput.value = null;\n    fileInput.addEventListener(\"change\", (e: Event) => {\n      const files = (<HTMLInputElement>e.target).files;\n      resolve(files as FileList);\n    });\n    fileInput.click();\n  });\n}\n\nfunction urlIsBlobUrl(url: string): boolean {\n  return /^blob:/.test(url);\n}\n\nexport function curUrlFromByteArray(arr: Uint8Array) {\n  const base64 = Utils.base64FromDataArray(arr);\n  return `data:image/x-win-bitmap;base64,${base64}`;\n}\n\n// This is not perfect, but... meh: https://stackoverflow.com/a/36756650/1263117\nexport function filenameFromUrl(url: string): string | null {\n  if (urlIsBlobUrl(url)) {\n    return null;\n  }\n\n  const lastSegment = url.split(\"/\").pop();\n  if (lastSegment == null) {\n    return null;\n  }\n  return lastSegment.split(\"#\")[0].split(\"?\")[0];\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/hooks.ts",
    "content": "import {\n  useState,\n  useEffect,\n  useCallback,\n  useLayoutEffect,\n  useRef,\n} from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport * as Utils from \"./utils\";\nimport { Action, Thunk, AppState } from \"./types\";\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\nexport function useUnmountedRef(): { current: boolean } {\n  const unmountedRef = useRef(false);\n  useEffect(() => {\n    return () => {\n      unmountedRef.current = true;\n    };\n  }, []);\n  return unmountedRef;\n}\n\nexport function usePromiseValueOrNull<T>(propValue: Promise<T>): T | null {\n  const [value, setValue] = useState<T | null>(null);\n  useEffect(() => {\n    let disposed = false;\n    propValue.then((resolvedValue) => {\n      if (disposed) {\n        return;\n      }\n      setValue(resolvedValue);\n    });\n\n    return () => {\n      disposed = true;\n    };\n  }, [propValue]);\n\n  return value;\n}\n\nexport function useScreenSize() {\n  const [size] = useState<Size>(Utils.getScreenSize());\n  // TODO: We could subscribe to screen size changes.\n  return size;\n}\n\nexport function useWindowSize() {\n  const [size, setSize] = useState<Size>(Utils.getWindowSize());\n  const handler = useCallback(\n    Utils.throttle(() => {\n      setSize(Utils.getWindowSize());\n    }, 100) as () => void,\n    []\n  );\n  useEffect(() => {\n    window.addEventListener(\"resize\", handler);\n    return () => {\n      window.removeEventListener(\"resize\", handler);\n    };\n  }, [handler]);\n  return size;\n}\n\nconst cursorPositionRef = { current: { pageX: 0, pageY: 0 } };\nwindow.document.addEventListener(\"mousemove\", ({ pageX, pageY }) => {\n  cursorPositionRef.current = { pageX, pageY };\n});\n\n// We use a single global event listener because there is no way to get the\n// mouse position aside from an event. Ideally we could create/clean up the\n// event listener in the hook, but in the case where we want to check the cursor\n// position on mount, that we wouldn't have had time to capture an event.\nfunction useCursorPositionRef() {\n  return cursorPositionRef;\n}\n\n// CSS hover state is not respected if the cursor is already over the node when\n// it is added to the DOM. This hook allows your component to know its hover\n// state on mount without waiting for the mouse to move.\n// https://stackoverflow.com/a/13259049/1263117\nexport function useIsHovered() {\n  const cursorRef = useCursorPositionRef();\n  const [hover, setHover] = useState(false);\n  const [node, setNode] = useState<HTMLElement | null>(null);\n\n  useLayoutEffect(() => {\n    if (node == null) {\n      setHover(false);\n      return;\n    }\n    const domRect = node.getBoundingClientRect();\n    const { pageX, pageY } = cursorRef.current;\n    setHover(\n      pageX >= domRect.left &&\n        pageX <= domRect.right &&\n        pageY >= domRect.top &&\n        pageY <= domRect.bottom\n    );\n\n    const enter = () => setHover(true);\n    const leave = () => setHover(false);\n    node.addEventListener(\"mouseenter\", enter);\n    node.addEventListener(\"mouseleave\", leave);\n\n    return () => {\n      node.removeEventListener(\"mouseenter\", enter);\n      node.removeEventListener(\"mouseleave\", leave);\n    };\n  }, [node, cursorRef]);\n\n  return { ref: setNode, hover };\n}\n\nexport function useOnClickAway(\n  ref: Element | null,\n  callback: null | (() => void)\n) {\n  useEffect(() => {\n    if (ref == null || callback == null) {\n      return;\n    }\n\n    const handleClickOut = (ee: MouseEvent) => {\n      const clickOutTarget = ee.target;\n      if (!(clickOutTarget instanceof Element)) {\n        // TypeScript doesn't realize this will always be true\n        return;\n      }\n      if (ref.contains(clickOutTarget)) {\n        return;\n      }\n      // If the click is _not_ inside the menu.\n      callback();\n      window.document.removeEventListener(\"click\", handleClickOut, {\n        capture: true,\n      });\n    };\n\n    window.document.addEventListener(\"click\", handleClickOut, {\n      capture: true,\n    });\n\n    return () => {\n      window.document.removeEventListener(\"click\", handleClickOut, {\n        capture: true,\n      });\n    };\n  }, [ref, callback]);\n}\n\n// TODO: Return useSelector directly and apply the type without wrapping\nexport function useTypedSelector<T>(selector: (state: AppState) => T): T {\n  return useSelector(selector);\n}\n\nexport function useActionCreator<T extends (...args: any[]) => Action | Thunk>(\n  actionCreator: T\n): (...funcArgs: Parameters<T>) => void {\n  const dispatch = useDispatch();\n  return useCallback((...args) => dispatch(actionCreator(...args)), [\n    dispatch,\n    actionCreator,\n  ]);\n}\n\nexport function useTypedDispatch(): (action: Action | Thunk) => void {\n  return useDispatch();\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/hotkeys.ts",
    "content": "import {\n  play,\n  pause,\n  stop,\n  adjustVolume,\n  toggleRepeat,\n  toggleShuffle,\n  openMediaFileDialog,\n  seekForward,\n  seekBackward,\n  reverseList,\n  nextN,\n  next,\n  previous,\n  toggleDoubleSizeMode,\n  toggleWindow,\n} from \"./actionCreators\";\n\nimport { TOGGLE_TIME_MODE, TOGGLE_LLAMA_MODE } from \"./actionTypes\";\n\nimport { Dispatch } from \"./types\";\n\nconst IGNORE_EVENTS_FROM_TAGS = new Set([\"input\", \"textarea\", \"select\"]);\n\nexport function bindHotkeys(dispatch: Dispatch): () => void {\n  let currentPos: number = 0;\n  const trigger = [\n    78, // N\n    85, // U\n    76, // L\n    76, // L\n    83, // S\n    79, // O\n    70, // F\n    84, // T\n  ];\n\n  const listener = (e: KeyboardEvent) => {\n    if (\n      e.target instanceof Element &&\n      IGNORE_EVENTS_FROM_TAGS.has(e.target.tagName.toLowerCase())\n    ) {\n      return;\n    }\n    if (e.ctrlKey) {\n      switch (e.keyCode) {\n        case 68: // CTRL+D\n          dispatch(toggleDoubleSizeMode());\n          e.preventDefault(); // Supress the \"Bookmark\" action on windows.\n          break;\n        case 76: // CTRL+L FIXME\n          break;\n        case 82: // CTRL+R\n          dispatch(reverseList());\n          break;\n        case 84: // CTRL+T\n          dispatch({ type: TOGGLE_TIME_MODE });\n          break;\n      }\n    } else if (e.altKey) {\n      switch (e.keyCode) {\n        case 87: // ALT+W\n          dispatch(toggleWindow(\"main\"));\n          break;\n        case 69: // ALT+E\n          dispatch(toggleWindow(\"playlist\"));\n          break;\n        case 71: // ALT+G\n          dispatch(toggleWindow(\"equalizer\"));\n          break;\n      }\n    } else {\n      switch (e.keyCode) {\n        case 37: // left arrow\n          dispatch(seekBackward(5));\n          break;\n        case 38: // up arrow\n          dispatch(adjustVolume(1));\n          break;\n        case 39: // right arrow\n          dispatch(seekForward(5));\n          break;\n        case 40: // down arrow\n          dispatch(adjustVolume(-1));\n          break;\n        case 66: // B\n          dispatch(next());\n          break;\n        case 67: // C\n          dispatch(pause());\n          break;\n        case 76: // L\n          dispatch(openMediaFileDialog());\n          break;\n        case 82: // R\n          dispatch(toggleRepeat());\n          break;\n        case 83: // S\n          dispatch(toggleShuffle());\n          break;\n        case 86: // V\n          dispatch(stop());\n          break;\n        case 88: // X\n          dispatch(play());\n          break;\n        case 90: // Z\n          dispatch(previous());\n          break;\n        case 96: // numpad 0\n          dispatch(openMediaFileDialog());\n          break;\n        case 97: // numpad 1\n          dispatch(nextN(-10));\n          break;\n        case 98: // numpad 2\n          dispatch(adjustVolume(-1));\n          break;\n        case 99: // numpad 3\n          dispatch(nextN(10));\n          break;\n        case 100: // numpad 4\n          dispatch(previous());\n          break;\n        case 101: // numpad 5\n          dispatch(play());\n          break;\n        case 102: // numpad 6\n          dispatch(next());\n          break;\n        case 103: // numpad 7\n          dispatch(seekBackward(5));\n          break;\n        case 104: // numpad 8\n          dispatch(adjustVolume(1));\n          break;\n        case 105: // numpad 9\n          dispatch(seekForward(5));\n          break;\n      }\n    }\n\n    // Easter Egg\n\n    // Ignore escape. Usually this gets swallowed by the browser, but not always.\n    if (e.keyCode !== 27) {\n      currentPos = e.keyCode === trigger[currentPos] ? currentPos + 1 : 0;\n      if (currentPos === trigger.length) {\n        dispatch({ type: TOGGLE_LLAMA_MODE });\n      }\n    }\n  };\n  document.addEventListener(\"keydown\", listener);\n\n  return () => {\n    document.removeEventListener(\"keydown\", listener);\n  };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/loadQueue.js",
    "content": "import invariant from \"invariant\";\nimport TinyQueue from \"tinyqueue\";\n\n// Push promises onto a queue with a priority.\n// Run a given number of jobs in parallel\n// Useful for prioritizing network requests\nexport default class LoadQueue {\n  constructor({ threads }) {\n    // TODO: Consider not running items with zero priority\n    // Priority is a function so that items can change their priority between\n    // when their priority is evaluated.\n    // For example, we might add a track to the playlist and then scroll to/away\n    // from it before it gets processed.\n    this._queue = new TinyQueue([], (a, b) => a.priority() - b.priority());\n    this._availableThreads = threads;\n  }\n\n  push(task, priority) {\n    const t = { task, priority };\n    this._queue.push(t);\n    // Wait until the next event loop to pick a task to run. This way, we can\n    // enqueue multiple items in an event loop, and be sure they will be run in\n    // priority order.\n    setTimeout(() => {\n      this._run();\n    }, 0);\n    return () => {\n      // TODO: Could return a boolean representing if the task has already been\n      // kicked off.\n      this._queue = this._queue.filter((t1) => t1 !== t);\n    };\n  }\n\n  _run() {\n    while (this._availableThreads > 0) {\n      if (this._queue.length === 0) {\n        return;\n      }\n      this._availableThreads--;\n      const t = this._queue.pop();\n      const promise = t.task();\n      invariant(\n        typeof promise.then === \"function\",\n        `LoadQueue only supports loading Promises. Got ${promise}`\n      );\n      promise.then(() => {\n        this._availableThreads++;\n        this._run();\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/marqueeUtils.test.ts",
    "content": "import * as MarqueeUtils from \"./marqueeUtils\";\n\ndescribe(\"getBalanceText\", () => {\n  it(\"treats negative numbers as left\", () => {\n    const actual = MarqueeUtils.getBalanceText(-25);\n    const expected = \"Balance: 25% Left\";\n    expect(actual).toEqual(expected);\n  });\n  it(\"treats positive numbers as right\", () => {\n    const actual = MarqueeUtils.getBalanceText(25);\n    const expected = \"Balance: 25% Right\";\n    expect(actual).toEqual(expected);\n  });\n  it(\"has a special case for center\", () => {\n    const actual = MarqueeUtils.getBalanceText(0);\n    const expected = \"Balance: Center\";\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"getVolumeText\", () => {\n  it(\"expresses volume as percent\", () => {\n    const actual = MarqueeUtils.getVolumeText(50);\n    const expected = \"Volume: 50%\";\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"getPositionText\", () => {\n  it(\"formats a position\", () => {\n    const duration = 86;\n    const seekToPercent = 85;\n    const actual = MarqueeUtils.getPositionText(duration, seekToPercent);\n    const expected = \"Seek to: 01:13/01:26 (85%)\";\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"getDoubleSizeModeText\", () => {\n  it(\"prompts to enable when disabled\", () => {\n    const actual = MarqueeUtils.getDoubleSizeModeText(true);\n    const expected = \"Disable doublesize mode\";\n    expect(actual).toEqual(expected);\n  });\n  it(\"prompts to disable when enabled\", () => {\n    const actual = MarqueeUtils.getDoubleSizeModeText(false);\n    const expected = \"Enable doublesize mode\";\n    expect(actual).toEqual(expected);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/marqueeUtils.tsx",
    "content": "import { Slider } from \"./types\";\n\nimport * as Utils from \"./utils\";\n\nexport const getBalanceText = (balance: number): string => {\n  if (balance === 0) {\n    return \"Balance: Center\";\n  }\n  const direction = balance > 0 ? \"Right\" : \"Left\";\n  return `Balance: ${Math.abs(balance)}% ${direction}`;\n};\n\nexport const getVolumeText = (volume: number): string => `Volume: ${volume}%`;\n\nexport const getPositionText = (\n  duration: number,\n  seekToPercent: number\n): string => {\n  const newElapsedStr = Utils.getTimeStr(\n    (duration * seekToPercent) / 100,\n    false\n  );\n  const durationStr = Utils.getTimeStr(duration, false);\n  return `Seek to: ${newElapsedStr}/${durationStr} (${seekToPercent}%)`;\n};\n\nexport const getDoubleSizeModeText = (enabled: boolean): string =>\n  `${enabled ? \"Disable\" : \"Enable\"} doublesize mode`;\n\nconst formatHz = (hz: number): string =>\n  hz < 1000 ? `${hz}HZ` : `${hz / 1000}KHZ`;\n\n// Format a number as a string, ensuring it has a + or - sign\nconst ensureSign = (num: number | string): string =>\n  num > 0 ? `+${num}` : num.toString();\n\n// Round to 1 and exactly 1 decimal point\nconst roundToTenths = (num: number): string =>\n  (Math.round(num * 10) / 10).toFixed(1);\n\nexport const getEqText = (band: Slider, level: number): string => {\n  const db = roundToTenths(((level - 50) / 50) * 12);\n  const label = band === \"preamp\" ? \"Preamp\" : formatHz(band);\n  return `EQ: ${label} ${ensureSign(db)} DB`;\n};\n"
  },
  {
    "path": "webamp/packages/webamp/js/media/StereoBalanceNode.js",
    "content": "// The Web Audio API does not offer an easy way to make a stereo balance\n// control. This is an attempt to fill that void, using an API similar to\n// [StereoPannerNode](https://developer.mozilla.org/en-US/docs/Web/API/StereoPannerNode)\nexport default function StereoBalanceNode(context, options = { balance: 0 }) {\n  let balance = 0;\n\n  // ChannelSplitterNode cannot be told to use a `channelInterperatation` of\n  // \"speakers\". This means that if we get a mono file, we will end up only\n  // playing in the left speaker. So instead we use this dummy gain node to\n  // convert whatever source we get (stereo, mono, or n channels) into a stereo\n  // signal.\n  // Idea credit: https://github.com/WebAudio/web-audio-api/issues/975#issue-177242377\n  const upMixer = context.createGain();\n  upMixer.channelCount = 2;\n  upMixer.channelCountMode = \"explicit\";\n  upMixer.channelInterpretation = \"speakers\";\n\n  const splitter = context.createChannelSplitter(2);\n\n  // Create the gains for left and right\n  const leftGain = context.createGain();\n  const rightGain = context.createGain();\n\n  const merger = context.createChannelMerger(2);\n\n  upMixer.connect(splitter);\n\n  splitter.connect(leftGain, 0);\n  splitter.connect(rightGain, 1);\n\n  leftGain.connect(merger, 0, 0);\n  rightGain.connect(merger, 0, 1);\n\n  // -1 (left) to 1 (right)\n  function set(rawValue) {\n    const value = Number(rawValue);\n    leftGain.gain.value = value > 0 ? 1 - value : 1;\n    rightGain.gain.value = value > 0 ? 1 : 1 + value;\n    balance = value;\n  }\n\n  function get() {\n    return balance;\n  }\n\n  // Create our own version of an [AudioParam](https://developer.mozilla.org/en-US/docs/Web/API/AudioParam).\n  // We don't currently support any of the \"over time\" methods, but maybe some day\n  // we'll want to.\n  const audioParam = {};\n  Object.defineProperties(audioParam, {\n    value: { get, set, enumerable: true, configurable: true },\n  });\n\n  // The way the `.connect` API works, we can't actually construct our own\n  // AudioNode. Instead we have to take an existing node and monkey patch it.\n  Object.defineProperties(upMixer, {\n    balance: {\n      value: audioParam,\n      enumerable: true,\n      writable: false,\n      configurable: true,\n    },\n    connect: {\n      value: AudioNode.prototype.connect.bind(merger),\n      enumerable: false,\n      writable: false,\n      configurable: true,\n    },\n    disconnect: {\n      value: AudioNode.prototype.disconnect.bind(merger),\n      enumerable: false,\n      writable: false,\n      configurable: true,\n    },\n  });\n\n  if (balance !== options.balance) {\n    set(options.balance);\n  }\n\n  return upMixer;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/media/elementSource.ts",
    "content": "import Emitter from \"../emitter\";\nimport { clamp } from \"../utils\";\nimport { MEDIA_STATUS } from \"../constants\";\nimport { MediaStatus } from \"../types\";\nconst { ipcRenderer } = window.require('electron');\n\nexport default class ElementSource {\n  _emitter: Emitter;\n  _context: AudioContext;\n  _source: AudioNode;\n  _destination: AudioNode;\n  _audio: HTMLAudioElement;\n  _stalled: boolean;\n  _status: MediaStatus;\n\n  on(eventType: string, cb: (...args: any[]) => void) {\n    return this._emitter.on(eventType, cb);\n  }\n\n  constructor(context: AudioContext, destination: AudioNode) {\n    this._emitter = new Emitter();\n    this._context = context;\n    this._destination = destination;\n    this._audio = document.createElement(\"audio\");\n    this._audio.crossOrigin = \"anonymous\";\n    this._stalled = false;\n    this._status = MEDIA_STATUS.STOPPED;\n\n    // TODO: #leak\n    this._audio.addEventListener(\"suspend\", () => {\n      this._setStalled(true);\n    });\n\n    // TODO: #leak\n    this._audio.addEventListener(\"durationchange\", () => {\n      this._emitter.trigger(\"loaded\");\n      this._setStalled(false);\n    });\n\n    // TODO: #leak\n    this._audio.addEventListener(\"ended\", () => {\n      this._emitter.trigger(\"ended\");\n      this._setStatus(MEDIA_STATUS.STOPPED);\n    });\n\n    // TODO: Throttle to 50 (if needed)\n    // TODO: #leak\n    this._audio.addEventListener(\"timeupdate\", () => {\n      this._emitter.trigger(\"positionChange\");\n    });\n\n    // TODO: #leak\n    this._audio.addEventListener(\"error\", (e) => {\n      switch (this._audio.error!.code) {\n        case 1:\n          // The fetching of the associated resource was aborted by the user's request.\n          console.error(\"MEDIA_ERR_ABORTED\", e);\n          break;\n        case 2:\n          console.error(\"MEDIA_ERR_NETWORK\", e);\n          // Some kind of network error occurred which prevented the media from being successfully fetched, despite having previously been available.\n          break;\n        case 3:\n          // Despite having previously been determined to be usable, an error occurred while trying to decode the media resource, resulting in an error.\n\n          // There is a bug in Chrome where improperly terminated mp3s can cuase this error.\n          // https://bugs.chromium.org/p/chromium/issues/detail?id=794782\n          // Related: Commit f44e826c83c74fef04c2c448af30cfb353b28312\n          console.error(\"PIPELINE_ERROR_DECODE\", e);\n          break;\n        case 4:\n          console.error(\"MEDIA_ERR_SRC_NOT_SUPPORTED\", e);\n          // The associated resource or media provider object (such as a MediaStream) has been found to be unsuitable.\n          break;\n      }\n      // Rather than just geting stuck in this error state, we can just pretend this is\n      // the end of the track.\n\n      this._emitter.trigger(\"ended\");\n      this._setStatus(MEDIA_STATUS.STOPPED);\n    });\n\n    this._source = this._context.createMediaElementSource(this._audio);\n    this._source.connect(destination);\n  }\n\n  _setStalled(stalled: boolean) {\n    this._stalled = stalled;\n    this._emitter.trigger(\"stallChanged\");\n  }\n\n  disconnect() {\n    this._source.disconnect();\n  }\n\n  // Async for now, for compatibility with BufferAudioSource\n  // TODO: This does not need to be async\n  async loadUrl(url: string) {\n    if (/^\\d+$/.test(url) || /^.*-.*-.*-.*-.*$/.test(url)) {\n      await ipcRenderer.invoke('getTrackByID', url).then((link: any) => {\n        this._audio.src = link;\n      });\n    } else {\n        this._audio.src = url;\n    }\n  }\n\n  async play() {\n    if (this._status !== MEDIA_STATUS.PAUSED) {\n      this.seekToTime(0);\n    }\n    try {\n      await this._audio.play();\n      // TODO #race\n    } catch (err) {\n      //\n    }\n    this._setStatus(MEDIA_STATUS.PLAYING);\n  }\n\n  pause() {\n    this._audio.pause();\n    this._setStatus(MEDIA_STATUS.PAUSED);\n  }\n\n  stop() {\n    this._audio.pause();\n    this._audio.currentTime = 0;\n    this._setStatus(MEDIA_STATUS.STOPPED);\n  }\n\n  seekToTime(time: number) {\n    /* TODO: We could check if this is actually seekable:\n    const { seekable } = this._audio;\n    for (let i = 0; i < seekable.length; i++) {\n      console.log(\"start\", seekable.start(i), \"end\", seekable.end(i));\n    }\n    */\n    this._audio.currentTime = clamp(time, 0, this.getDuration());\n    this._emitter.trigger(\"positionChange\");\n  }\n\n  getStalled() {\n    return this._stalled;\n  }\n\n  getStatus() {\n    return this._status;\n  }\n\n  getDuration() {\n    const { duration } = this._audio;\n    // Safari on iOS currently has a strange behavior where it reports\n    // the duration as infinity if an Accept-Ranges header is not returned.\n    // For now, 0 is better even though it's still wrong.\n    return isNaN(duration) || duration === Infinity ? 0 : duration;\n  }\n\n  getTimeElapsed() {\n    return this._audio.currentTime;\n  }\n\n  _setStatus(status: MediaStatus) {\n    this._status = status;\n    this._emitter.trigger(\"statusChange\");\n  }\n\n  dispose() {\n    // TODO: Dispose subscriptions to this.audio\n    this.stop();\n    this._emitter.dispose();\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/media/index.ts",
    "content": "/* Emulate the native <audio> element with Web Audio API */\nimport { BANDS, MEDIA_STATUS } from \"../constants\";\nimport { Band } from \"../types\";\nimport Emitter from \"../emitter\";\nimport StereoBalanceNode from \"./StereoBalanceNode\";\nimport ElementSource from \"./elementSource\";\n\ninterface StereoBalanceNodeType extends AudioNode {\n  constructor(context: AudioContext): StereoBalanceNodeType;\n  balance: {\n    value: number;\n  };\n}\n\n// NOTE: While this is not technically a public API, https://winampify.io/ is\n// replacing this class with a custom version. Breaking changes to this API\n// surface should be communicated to Remi.\nexport default class Media {\n  _emitter: Emitter;\n  _context: AudioContext;\n  _balance: StereoBalanceNodeType;\n  _staticSource: GainNode;\n  _preamp: GainNode;\n  _analyser: AnalyserNode;\n  _gainNode: GainNode;\n  _source: ElementSource;\n  _bands: { [band: number]: BiquadFilterNode };\n\n  constructor() {\n    this._emitter = new Emitter();\n    // @ts-ignore Typescript does not know about webkitAudioContext\n    this._context = new (window.AudioContext || window.webkitAudioContext)();\n    // Fix for iOS and Chrome (Canary) which require that the context be created\n    // or resumed by a user interaction.\n    // https://developers.google.com/web/updates/2017/09/autoplay-policy-changes\n    // https://gist.github.com/laziel/7aefabe99ee57b16081c\n    // Via: https://stackoverflow.com/a/43395068/1263117\n    // TODO #leak\n    if (this._context.state === \"suspended\") {\n      const resume = async () => {\n        await this._context.resume();\n\n        if (this._context.state === \"running\") {\n          // TODO: Add this to the disposable\n          document.body.removeEventListener(\"touchend\", resume, false);\n          document.body.removeEventListener(\"click\", resume, false);\n          document.body.removeEventListener(\"keydown\", resume, false);\n        }\n      };\n\n      document.body.addEventListener(\"touchend\", resume, false);\n      document.body.addEventListener(\"click\", resume, false);\n      document.body.addEventListener(\"keydown\", resume, false);\n    }\n\n    // TODO: Maybe we can get rid of this now that we are using AudioAbstraction?\n    this._staticSource = this._context.createGain(); // Just a noop node\n\n    // @ts-ignore The way this class has to be monkey patched, makes it very hard to type.\n    this._balance = new StereoBalanceNode(this._context);\n\n    // Create the preamp node\n    this._preamp = this._context.createGain();\n\n    // Create the analyser node for the visualizer\n    this._analyser = this._context.createAnalyser();\n    this._analyser.fftSize = 2048;\n    // don't smooth audio analysis\n    this._analyser.smoothingTimeConstant = 0.0;\n\n    // Create the gain node for the volume control\n    this._gainNode = this._context.createGain();\n\n    // Connect all the nodes in the correct way\n    // (Note, source is created and connected later)\n    //\n    //                <source>\n    //                    |\n    //                    |_____________\n    //                    |             \\\n    //                <preamp>          |\n    //                    |             | <-- Optional bypass\n    //           [...biquadFilters]     |\n    //                    |_____________/\n    //                    |\n    //              <staticSource>\n    //                    |\n    //                <balance>\n    //                    |\n    //                    |\\\n    //                    | <analyser>\n    //                  <gain>\n    //                    |\n    //              <destination>\n\n    this._source = new ElementSource(this._context, this._staticSource);\n\n    this._source.on(\"positionChange\", () => {\n      this._emitter.trigger(\"timeupdate\");\n    });\n    this._source.on(\"ended\", () => {\n      this._emitter.trigger(\"ended\");\n    });\n    this._source.on(\"statusChange\", () => {\n      switch (this._source.getStatus()) {\n        case MEDIA_STATUS.PLAYING:\n          this._emitter.trigger(\"playing\");\n          break;\n      }\n      this._emitter.trigger(\"timeupdate\");\n    });\n    this._source.on(\"loaded\", () => {\n      this._emitter.trigger(\"fileLoaded\");\n    });\n\n    this._staticSource.connect(this._preamp);\n\n    let output = this._preamp;\n    this._bands = {};\n\n    BANDS.forEach((band, i) => {\n      const filter = this._context.createBiquadFilter();\n\n      this._bands[band] = filter;\n\n      if (i === 0) {\n        // The first filter, includes all lower frequencies\n        filter.type = \"lowshelf\";\n      } else if (i === BANDS.length - 1) {\n        // The last filter, includes all higher frequencies\n        filter.type = \"highshelf\";\n      } else {\n        filter.type = \"peaking\";\n      }\n      filter.frequency.value = band;\n      filter.gain.value = 0;\n\n      output.connect(filter);\n      output = filter;\n    });\n\n    output.connect(this._balance);\n\n    this._balance.connect(this._gainNode);\n    this._balance.connect(this._analyser);\n\n    this._gainNode.connect(this._context.destination);\n  }\n\n  getAnalyser() {\n    return this._analyser;\n  }\n\n  /* Properties */\n  duration() {\n    return this._source.getDuration();\n  }\n\n  timeElapsed() {\n    return this._source.getTimeElapsed();\n  }\n\n  timeRemaining() {\n    return this.duration() - this.timeElapsed();\n  }\n\n  percentComplete() {\n    return (this.timeElapsed() / this.duration()) * 100;\n  }\n\n  /* Actions */\n  async play() {\n    await this._source.play();\n  }\n\n  pause() {\n    this._source.pause();\n  }\n\n  stop() {\n    this._source.stop();\n  }\n\n  /* Actions with arguments */\n  seekToPercentComplete(percent: number) {\n    const seekTime = this.duration() * (percent / 100);\n    this.seekToTime(seekTime);\n  }\n\n  // From 0-1\n  setVolume(volume: number) {\n    this._gainNode.gain.value = volume / 100;\n  }\n\n  // from 0 to 2400\n  // The input value here is 0-2400 which represents -12db to 12db with 0.1 dB steps.\n  // Value 1200 is 0db (no change).\n  // Equation used is: 10^((dB)/20) = x, where x (preamp.gain.value) is passed on to gainnode for boosting or attenuation.\n  setPreamp(value: number) {\n    const db = (value / 2400) * 24 - 12;\n    this._preamp.gain.value = Math.pow(10, db / 20);\n  }\n\n  // From -100 to 100\n  setBalance(balance: number) {\n    // Yo Dawg.\n    this._balance.balance.value = balance / 100;\n  }\n\n  setEqBand(band: Band, value: number) {\n    const db = (value / 2400) * 24 - 12;\n    this._bands[band].gain.value = db;\n  }\n\n  disableEq() {\n    this._staticSource.disconnect();\n    this._staticSource.connect(this._balance);\n  }\n\n  enableEq() {\n    this._staticSource.disconnect();\n    this._staticSource.connect(this._preamp);\n  }\n\n  /* Listeners */\n  on(event: string, callback: (...args: any[]) => void) {\n    this._emitter.on(event, callback);\n  }\n\n  seekToTime(time: number) {\n    this._source.seekToTime(time);\n  }\n\n  // Used only for the initial load, since it must have a CORS header\n  async loadFromUrl(url: string, autoPlay: boolean) {\n    this._emitter.trigger(\"waiting\");\n    await this._source.loadUrl(url);\n    // TODO #race\n    this._emitter.trigger(\"stopWaiting\");\n    if (autoPlay) {\n      this.play();\n    }\n  }\n\n  dispose() {\n    this._source.dispose();\n    this._emitter.dispose();\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/mediaMiddleware.ts",
    "content": "import Media from \"./media\";\nimport {\n  IS_PLAYING,\n  PAUSE,\n  PLAY,\n  SEEK_TO_PERCENT_COMPLETE,\n  SET_BAND_VALUE,\n  SET_BALANCE,\n  SET_MEDIA,\n  SET_VOLUME,\n  START_WORKING,\n  STOP,\n  STOP_WORKING,\n  UPDATE_TIME_ELAPSED,\n  SET_EQ_OFF,\n  SET_EQ_ON,\n  PLAY_TRACK,\n  BUFFER_TRACK,\n  LOAD_SERIALIZED_STATE,\n} from \"./actionTypes\";\nimport { next as nextTrack } from \"./actionCreators\";\nimport * as Selectors from \"./selectors\";\nimport { MiddlewareStore, Action, Dispatch } from \"./types\";\nimport { objectForEach } from \"./utils\";\n\nexport default (media: Media) => (store: MiddlewareStore) => {\n  const {\n    media: { volume, balance },\n    equalizer: { sliders },\n  } = store.getState();\n\n  // Ensure the default state is the canonical value.\n  media.setVolume(volume);\n  media.setBalance(balance);\n  media.setPreamp(sliders.preamp);\n  // TODO: Ensure other values like bands are in sync\n\n  media.on(\"timeupdate\", () => {\n    store.dispatch({\n      type: UPDATE_TIME_ELAPSED,\n      elapsed: media.timeElapsed(),\n    });\n  });\n\n  media.on(\"ended\", () => {\n    store.dispatch(nextTrack());\n  });\n\n  media.on(\"playing\", () => {\n    store.dispatch({ type: IS_PLAYING });\n  });\n\n  media.on(\"waiting\", () => {\n    store.dispatch({ type: START_WORKING });\n  });\n\n  media.on(\"stopWaiting\", () => {\n    store.dispatch({ type: STOP_WORKING });\n  });\n\n  media.on(\"fileLoaded\", () => {\n    const id = Selectors.getCurrentTrackId(store.getState());\n    if (id == null) {\n      // Attempted to set the metadata for a track that was already removed.\n      // Really, the media should have been stopped when the track was removed.\n      return;\n    }\n    store.dispatch({\n      id,\n      type: SET_MEDIA,\n      kbps: \"320\",\n      khz: \"44\",\n      channels: 2,\n      length: media.duration(),\n    });\n  });\n\n  return (next: Dispatch) => (action: Action) => {\n    const returnValue = next(action);\n    const state = store.getState();\n    switch (action.type) {\n      case PLAY:\n        media.play();\n        break;\n      case PAUSE:\n        media.pause();\n        break;\n      case STOP:\n        media.stop();\n        break;\n      case SET_VOLUME:\n        media.setVolume(Selectors.getVolume(state));\n        break;\n      case SET_BALANCE:\n        media.setBalance(Selectors.getBalance(state));\n        break;\n      case SEEK_TO_PERCENT_COMPLETE:\n        media.seekToPercentComplete(action.percent);\n        break;\n      case PLAY_TRACK: {\n        const url = Selectors.getTrackUrl(store.getState())(action.id);\n        if (url != null) {\n          media.loadFromUrl(url, true);\n        }\n        break;\n      }\n      case BUFFER_TRACK: {\n        const url = Selectors.getTrackUrl(store.getState())(action.id);\n        if (url != null) {\n          media.loadFromUrl(url, false);\n        }\n        break;\n      }\n      case SET_BAND_VALUE:\n        if (action.band === \"preamp\") {\n          media.setPreamp(action.value);\n        } else {\n          media.setEqBand(action.band, action.value);\n        }\n        break;\n      case SET_EQ_OFF:\n        media.disableEq();\n        break;\n      case SET_EQ_ON:\n        media.enableEq();\n        break;\n      case LOAD_SERIALIZED_STATE: {\n        // Set ALL THE THINGS!\n        if (Selectors.getEqualizerEnabled(state)) {\n          media.enableEq();\n        } else {\n          media.disableEq();\n        }\n        media.setVolume(Selectors.getVolume(state));\n        media.setBalance(Selectors.getBalance(state));\n        objectForEach(state.equalizer.sliders, (value, slider) => {\n          if (slider === \"preamp\") {\n            media.setPreamp(value);\n          } else {\n            // @ts-ignore I don't know how to teach TypeScript about objects\n            // that use Slider as keys\n            media.setEqBand(slider, value);\n          }\n        });\n        break;\n      }\n    }\n    return returnValue;\n  };\n};\n"
  },
  {
    "path": "webamp/packages/webamp/js/playlistHtml.tsx",
    "content": "import { render } from \"react-dom\";\n\ninterface Props {\n  averageTrackLength: string;\n  numberOfTracks: number;\n  playlistLengthSeconds: number;\n  playlistLengthMinutes: number;\n  tracks: string[];\n}\n\nexport const getAsDataURI = (text: string): string =>\n  `data:text/html;base64,${window.btoa(text)}`;\n\n// Replaces deprecated \"noshade\" attribute\nconst noshadeStyle = {\n  height: \"2px\",\n  borderWidth: 0,\n  color: \"gray\",\n  backgroundColor: \"gray\",\n};\n\n// We use all kinds of non-standard attributes and tags. So we create these fake\n// components to trick Typescript.\nconst Body = (props: any) => {\n  // @ts-ignore\n  return <body {...props} />;\n};\n\nconst Font = (props: any) => {\n  // @ts-ignore\n  return <font {...props} />;\n};\n\nconst Hr = (props: any) => {\n  // @ts-ignore\n  return <hr {...props} />;\n};\n\nconst Div = (props: any) => {\n  // @ts-ignore\n  return <div {...props} />;\n};\n\nconst Table = (props: any) => {\n  // @ts-ignore\n  return <table {...props} />;\n};\n\n// TODO: Move <html> tag out to the string creation step in order\n// to avoid the warning.\nconst Playlist = (props: Props) => (\n  <html>\n    <head>\n      <link rel=\"stylesheet\" href=\"null\" />\n      <style type=\"text/css\">\n        {`\n        body { background: #000040; }\n        .para1 { margin-top: -42px; margin-left: 145px; margin-right: 10px; font-family: \"font2, Arial\"; font-size: 30px; line-height: 35px; text-align: left; color: #E1E1E1; }\n        .para2 { margin-top: 15px; margin-left: 15px; margin-right: 50px; font-family: \"font1, Arial Black\"; font-size: 50px; line-height: 40px; text-align: left; color: #004080; }\n        `}\n      </style>\n      <title>Winamp Generated PlayList</title>\n    </head>\n    <Body bgcolor=\"#000080\" topmargin=\"0\" leftmargin=\"0\" text=\"#FFFFFF\">\n      <Div align=\"center\">\n        <Div className=\"para2\" align=\"center\">\n          <p>WINAMP</p>\n        </Div>\n        <Div className=\"para1\" align=\"center\">\n          <p>playlist</p>\n        </Div>\n      </Div>\n      <Hr\n        align=\"left\"\n        width=\"90%\"\n        size=\"1\"\n        color=\"#FFBF00\"\n        style={noshadeStyle}\n      />\n      <Div align=\"right\">\n        <Table border=\"0\" cellSpacing=\"0\" cellPadding=\"0\" width=\"98%\">\n          {/* Added <tbody> tag */}\n          <tbody>\n            <tr>\n              <td>\n                <small>\n                  <small>\n                    <Font face=\"Arial\" color=\"#FFBF00\">\n                      {props.numberOfTracks}\n                    </Font>\n                    <Font color=\"#409FFF\" face=\"Arial\">\n                      {\" track in playlist, average track length: \"}\n                    </Font>\n                    <Font face=\"Arial\" color=\"#FFBF00\">\n                      {props.averageTrackLength}\n                    </Font>\n                  </small>\n                </small>\n                <br />\n                <small>\n                  <small>\n                    <Font color=\"#409FFF\" face=\"Arial\">\n                      {\"Playlist length: \"}\n                    </Font>\n                    <Font face=\"Arial\" color=\"#FFBF00\">\n                      {props.playlistLengthMinutes}\n                    </Font>\n                    <Font color=\"#409FFF\" face=\"Arial\">\n                      {\" minutes \"}\n                    </Font>\n                    <Font face=\"Arial\" color=\"#FFBF00\">\n                      {props.playlistLengthSeconds}\n                    </Font>\n                    <Font color=\"#409FFF\" face=\"Arial\">\n                      {\" second \"}\n                    </Font>\n                    <br />\n                    <Font color=\"#409FFF\" face=\"Arial\">\n                      Right-click <a href=\"./\">here</a> to save this HTML file.\n                    </Font>\n                  </small>\n                </small>\n              </td>\n            </tr>\n          </tbody>\n        </Table>\n      </Div>\n      <blockquote>\n        <p>\n          <Font color=\"#FFBF00\" face=\"Arial\">\n            <big>Playlist files:</big>\n          </Font>\n          {/* Added closing tag here */}\n        </p>\n        <ul>\n          <Font face=\"Arial\" color=\"#FFFFFF\">\n            <small>\n              {props.tracks.map((track) => (\n                <span key={track}>\n                  {track}\n                  <br />\n                </span>\n              ))}\n              {/* Added closing tag here */}\n            </small>\n          </Font>\n        </ul>\n      </blockquote>\n      <Hr\n        align=\"left\"\n        width=\"90%\"\n        size=\"1\"\n        color=\"#FFBF00\"\n        style={noshadeStyle}\n      />\n    </Body>\n  </html>\n);\n\nconst createPlaylistHTML = (props: Props): string => {\n  const node = document.createElement(\"div\");\n  render(<Playlist {...props} />, node);\n  return node.innerHTML;\n};\n\nexport const createPlaylistURL = (props: Props): string =>\n  getAsDataURI(createPlaylistHTML(props));\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/display.ts",
    "content": "import {\n  Action,\n  SkinImages,\n  Cursors,\n  SkinRegion,\n  GenLetterWidths,\n  PlaylistStyle,\n  SkinGenExColors,\n  DummyVizData,\n} from \"../types\";\nimport * as Utils from \"../utils\";\nimport { createSelector } from \"reselect\";\n\nimport {\n  CLOSE_WINAMP,\n  OPEN_WINAMP,\n  SET_SKIN_DATA,\n  START_WORKING,\n  STEP_MARQUEE,\n  STOP_WORKING,\n  TOGGLE_DOUBLESIZE_MODE,\n  TOGGLE_LLAMA_MODE,\n  TOGGLE_VISUALIZER_STYLE,\n  SET_PLAYLIST_SCROLL_POSITION,\n  LOADED,\n  SET_Z_INDEX,\n  DISABLE_MARQUEE,\n  SET_DUMMY_VIZ_DATA,\n  LOADING,\n  LOAD_SERIALIZED_STATE,\n  LOAD_DEFAULT_SKIN,\n} from \"../actionTypes\";\nimport { DEFAULT_SKIN, VISUALIZER_ORDER } from \"../constants\";\nimport { DisplaySerializedStateV1 } from \"../serializedStates/v1Types\";\n\nexport interface DisplayState {\n  visualizerStyle: number;\n  doubled: boolean;\n  llama: boolean;\n  disableMarquee: boolean;\n  marqueeStep: number;\n  skinImages: SkinImages;\n  skinCursors: Cursors | null;\n  skinRegion: SkinRegion;\n  skinGenLetterWidths: GenLetterWidths | null;\n  skinColors: string[]; // Theoretically this could be a tuple of a specific length\n  skinPlaylistStyle: PlaylistStyle | null;\n  skinGenExColors: SkinGenExColors;\n  working: boolean;\n  closed: boolean;\n  loading: boolean;\n  playlistScrollPosition: number;\n  zIndex: number;\n  dummyVizData: DummyVizData | null;\n}\n\nconst defaultSkinGenExColors = {\n  itemBackground: \"rgb(0,0,0)\",\n  itemForeground: \"rgb(0,255,0)\",\n  windowBackground: \"rgb(56,55,87)\",\n  buttonText: \"rgb(57,57,66)\",\n  windowText: \"rgb(255,255,255)\",\n  divider: \"rgb(117,116,139)\",\n  playlistSelection: \"rgb(0,0,198)\",\n  listHeaderBackground: \"rgb(72,72,120)\",\n  listHeaderText: \"rgb(255,255,255)\",\n  listHeaderFrameTopAndLeft: \"rgb(108,108,180)\",\n  listHeaderFrameBottomAndRight: \"rgb(36,36,60)\",\n  listHeaderFramePressed: \"rgb(18,18,30)\",\n  listHeaderDeadArea: \"rgb(36,36,60)\",\n  scrollbarOne: \"rgb(36,36,60)\",\n  scrollbarTwo: \"rgb(36,36,60)\",\n  pressedScrollbarOne: \"rgb(121,130,150)\",\n  pressedScrollbarTwo: \"rgb(78,88,110)\",\n  scrollbarDeadArea: \"rgb(36,36,60)\",\n  listTextHighlighted: \"rgb(0,198,255)\",\n  listTextHighlightedBackground: \"rgb(0,198,255)\",\n  listTextSelected: \"rgb(0,198,255)\",\n  listTextSelectedBackground: \"rgb(0,198,255)\",\n};\n\nconst defaultDisplayState = {\n  doubled: false,\n  marqueeStep: 0,\n  disableMarquee: false,\n  loading: true,\n  llama: false,\n  closed: false,\n  working: false,\n  skinImages: DEFAULT_SKIN.images,\n  skinColors: DEFAULT_SKIN.colors,\n  skinCursors: null,\n  skinPlaylistStyle: null,\n  skinRegion: {},\n  visualizerStyle: 0, // Index into VISUALIZER_ORDER\n  dummyVizData: null,\n  playlistScrollPosition: 0,\n  skinGenLetterWidths: null, // TODO: Get the default value for this?\n  skinGenExColors: defaultSkinGenExColors,\n  additionalVisualizers: [],\n  zIndex: 0,\n};\n\nconst display = (\n  state: DisplayState = defaultDisplayState,\n  action: Action\n): DisplayState => {\n  switch (action.type) {\n    case LOAD_DEFAULT_SKIN: {\n      const {\n        skinImages,\n        skinColors,\n        skinCursors,\n        skinPlaylistStyle,\n        skinRegion,\n        skinGenLetterWidths,\n        skinGenExColors,\n      } = defaultDisplayState;\n      return {\n        ...state,\n        skinImages,\n        skinColors,\n        skinCursors,\n        skinPlaylistStyle,\n        skinRegion,\n        skinGenLetterWidths,\n        skinGenExColors,\n      };\n    }\n    case TOGGLE_DOUBLESIZE_MODE:\n      return { ...state, doubled: !state.doubled };\n    case TOGGLE_LLAMA_MODE:\n      return { ...state, llama: !state.llama };\n    case STEP_MARQUEE:\n      return state.disableMarquee\n        ? state\n        : { ...state, marqueeStep: state.marqueeStep + 1 };\n    case DISABLE_MARQUEE:\n      return { ...state, disableMarquee: true };\n    case STOP_WORKING:\n      return { ...state, working: false };\n    case START_WORKING:\n      return { ...state, working: true };\n    case CLOSE_WINAMP:\n      return { ...state, closed: true };\n    case OPEN_WINAMP:\n      return { ...state, closed: false };\n    case LOADING:\n      return { ...state, loading: true };\n    case LOADED:\n      return { ...state, loading: false };\n    case SET_SKIN_DATA:\n      const { data } = action;\n      return {\n        ...state,\n        loading: false,\n        skinImages: data.skinImages,\n        skinColors: data.skinColors,\n        skinPlaylistStyle: data.skinPlaylistStyle,\n        skinCursors: data.skinCursors,\n        skinRegion: data.skinRegion,\n        skinGenLetterWidths: data.skinGenLetterWidths,\n        skinGenExColors: data.skinGenExColors || defaultSkinGenExColors,\n      };\n    case TOGGLE_VISUALIZER_STYLE:\n      return {\n        ...state,\n        visualizerStyle: (state.visualizerStyle + 1) % VISUALIZER_ORDER.length,\n      };\n    case SET_PLAYLIST_SCROLL_POSITION:\n      return { ...state, playlistScrollPosition: action.position };\n    case SET_Z_INDEX:\n      return { ...state, zIndex: action.zIndex };\n    case SET_DUMMY_VIZ_DATA:\n      return { ...state, dummyVizData: action.data };\n    case LOAD_SERIALIZED_STATE: {\n      const { skinCursors, ...rest } = action.serializedState.display;\n      const upgrade = (url: string) => ({ type: \"cur\", url } as const);\n      const newSkinCursors =\n        skinCursors == null ? null : Utils.objectMap(skinCursors, upgrade);\n      return { ...state, skinCursors: newSkinCursors, ...rest };\n    }\n    default:\n      return state;\n  }\n};\nexport default display;\n\nexport const getSerializedState = (\n  state: DisplayState\n): DisplaySerializedStateV1 => {\n  // My kingdom for a type-safe `_.pick`.\n  const {\n    visualizerStyle,\n    doubled,\n    llama,\n    marqueeStep,\n    skinImages,\n    skinCursors,\n    skinRegion,\n    skinGenLetterWidths,\n    skinColors,\n    skinPlaylistStyle,\n  } = state;\n\n  let newCursors: { [cursor: string]: string } | null = null;\n  if (skinCursors != null) {\n    // @ts-ignore Typescript does not like that we can have `undefined` as\n    // values here. Since this is going to get serialized to JSON (which will\n    // drop undefined) it's fine.\n    // This code is geting removed soon anyway.\n    newCursors = Utils.objectMap(skinCursors, (cursor) => {\n      return cursor.type === \"cur\" ? cursor.url : undefined;\n    });\n  }\n  return {\n    visualizerStyle,\n    doubled,\n    llama,\n    marqueeStep,\n    skinImages,\n    skinCursors: newCursors,\n    skinRegion,\n    skinGenLetterWidths,\n    skinColors,\n    skinPlaylistStyle,\n  };\n};\n\nexport const getVisualizerStyle = createSelector(\n  (state: DisplayState) => state.visualizerStyle,\n  (visualizationStyle): string => {\n    return VISUALIZER_ORDER[visualizationStyle];\n  }\n);\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/equalizer.ts",
    "content": "import { Slider, Action } from \"./../types\";\n\nimport {\n  SET_BAND_VALUE,\n  SET_EQ_AUTO,\n  SET_EQ_ON,\n  SET_EQ_OFF,\n  LOAD_SERIALIZED_STATE,\n} from \"../actionTypes\";\nimport { EqualizerSerializedStateV1 } from \"../serializedStates/v1Types\";\n\nexport interface EqualizerState {\n  on: boolean;\n  auto: boolean;\n  sliders: Record<Slider, number>;\n}\n\nconst defaultState = {\n  on: true,\n  auto: false,\n  sliders: {\n    preamp: 1200,\n    60: 1200,\n    170: 1200,\n    310: 1200,\n    600: 1200,\n    1000: 1200,\n    3000: 1200,\n    6000: 1200,\n    12000: 1200,\n    14000: 1200,\n    16000: 1200,\n  },\n};\n\nfunction migrateSliderValues(sliders: Record<Slider, number>): Record<Slider, number> {\n  const migrated: Record<Slider, number> = { ...sliders };\n  \n  const needsMigration = Object.values(sliders).some(val => val > 0 && val <= 100 && val !== 0);\n  \n  if (needsMigration) {\n    Object.keys(migrated).forEach(key => {\n      const value = migrated[key as Slider];\n      if (value >= 0 && value <= 100) {\n        migrated[key as Slider] = Math.round((value / 100) * 2400);\n      }\n    });\n  }\n  \n  return migrated;\n}\n\nconst equalizer = (\n  state: EqualizerState = defaultState,\n  action: Action\n): EqualizerState => {\n  switch (action.type) {\n    case SET_BAND_VALUE:\n      const newSliders = { ...state.sliders, [action.band]: action.value };\n      return { ...state, sliders: newSliders };\n    case SET_EQ_ON:\n      return { ...state, on: true };\n    case SET_EQ_OFF:\n      return { ...state, on: false };\n    case SET_EQ_AUTO:\n      return { ...state, auto: action.value };\n    case LOAD_SERIALIZED_STATE:\n      if (action.serializedState.equalizer) {\n        const loadedState = action.serializedState.equalizer;\n        return {\n          ...loadedState,\n          sliders: migrateSliderValues(loadedState.sliders),\n        };\n      }\n      return state;\n    default:\n      return state;\n  }\n};\n\nexport function getSerializedState(\n  state: EqualizerState\n): EqualizerSerializedStateV1 {\n  return state;\n}\n\nexport default equalizer;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/index.ts",
    "content": "import { AppState, Action } from \"../types\";\nimport { combineReducers } from \"redux\";\n\nimport playlist from \"./playlist\";\nimport windows from \"./windows\";\nimport media from \"./media\";\nimport display from \"./display\";\nimport userInput from \"./userInput\";\nimport equalizer from \"./equalizer\";\nimport network from \"./network\";\nimport settings from \"./settings\";\nimport tracks from \"./tracks\";\nimport milkdrop from \"./milkdrop\";\n\nconst reducer = combineReducers<AppState, Action>({\n  userInput,\n  windows,\n  display,\n  settings,\n  equalizer,\n  playlist,\n  media,\n  network,\n  tracks,\n  milkdrop,\n});\n\nexport default reducer;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/media.ts",
    "content": "import { Action, MediaStatus, TimeMode } from \"../types\";\nimport {\n  PLAY,\n  STOP,\n  PAUSE,\n  IS_STOPPED,\n  IS_PLAYING,\n  SET_VOLUME,\n  SET_BALANCE,\n  SET_MEDIA,\n  TOGGLE_REPEAT,\n  TOGGLE_SHUFFLE,\n  TOGGLE_TIME_MODE,\n  UPDATE_TIME_ELAPSED,\n  LOAD_SERIALIZED_STATE,\n} from \"../actionTypes\";\nimport { TIME_MODE, MEDIA_STATUS } from \"../constants\";\nimport { MediaSerializedStateV1 } from \"../serializedStates/v1Types\";\n\nexport interface MediaState {\n  timeMode: TimeMode; // TODO: Convert this to an enum\n  timeElapsed: number;\n  volume: number;\n  balance: number;\n  shuffle: boolean;\n  repeat: boolean;\n  status: MediaStatus;\n}\n\nconst defaultState = {\n  timeMode: TIME_MODE.ELAPSED,\n  timeElapsed: 0,\n\n  // The winamp ini file declares the default volume as \"200\".\n  // The UI seems to show a default volume near 78, which would\n  // math with the default value being 200 out of 255.\n  volume: Math.round((200 / 255) * 100),\n  balance: 0,\n  shuffle: false,\n  repeat: false,\n  // TODO: Enforce possible values\n  status: MEDIA_STATUS.STOPPED,\n};\n\nconst media = (\n  state: MediaState = defaultState,\n  action: Action\n): MediaState => {\n  switch (action.type) {\n    // TODO: Make these constants\n    case PLAY:\n    case IS_PLAYING:\n      return { ...state, status: MEDIA_STATUS.PLAYING };\n    case PAUSE:\n      return { ...state, status: MEDIA_STATUS.PAUSED };\n    case STOP:\n    case IS_STOPPED:\n      return { ...state, status: MEDIA_STATUS.STOPPED };\n    case TOGGLE_TIME_MODE:\n      const newMode =\n        state.timeMode === TIME_MODE.REMAINING\n          ? TIME_MODE.ELAPSED\n          : TIME_MODE.REMAINING;\n      return { ...state, timeMode: newMode };\n    case UPDATE_TIME_ELAPSED:\n      return { ...state, timeElapsed: action.elapsed };\n    case SET_MEDIA:\n      return {\n        ...state,\n      };\n    case SET_VOLUME:\n      return { ...state, volume: action.volume };\n    case SET_BALANCE:\n      return { ...state, balance: action.balance };\n    case TOGGLE_REPEAT:\n      return { ...state, repeat: !state.repeat };\n    case TOGGLE_SHUFFLE:\n      return { ...state, shuffle: !state.shuffle };\n    case LOAD_SERIALIZED_STATE:\n      return { ...state, ...action.serializedState.media };\n    default:\n      return state;\n  }\n};\n\nexport function getSerializedState(state: MediaState): MediaSerializedStateV1 {\n  const { volume, balance, shuffle, repeat } = state;\n  return { volume, balance, shuffle, repeat };\n}\n\nexport default media;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/milkdrop.test.js",
    "content": "import Emitter from \"../emitter\";\nimport createStore from \"../store\";\nimport * as Actions from \"../actionCreators\";\nimport * as Selectors from \"../selectors\";\n\n// Actually tests action creators too\nconst media = {\n  addEventListener: jest.fn(),\n  setVolume: jest.fn(),\n  setBalance: jest.fn(),\n  setPreamp: jest.fn(),\n  getAnalyser: () => null,\n  on: jest.fn(),\n};\n\ntest(\"The first tack is picked at random\", () => {\n  const store = createStore(media, new Emitter());\n  const mockPreset = [\n    { type: \"RESOLVED\", name: \"First\", preset: {} },\n    { type: \"RESOLVED\", name: \"Second\", preset: {} },\n    { type: \"RESOLVED\", name: \"Third\", preset: {} },\n    { type: \"RESOLVED\", name: \"Fourth\", preset: {} },\n  ];\n  Math.random = () => 0.5;\n  // Just confirm that the default setting is correct\n  expect(Selectors.getRandomizePresets(store.getState())).toBe(true);\n  store.dispatch(Actions.loadPresets(mockPreset));\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(2);\n});\n\ntest(\"handles history (prev/next) correctly\", () => {\n  const store = createStore(media, new Emitter());\n  const mockPreset = [\n    { type: \"RESOLVED\", name: \"First\", preset: {} },\n    { type: \"RESOLVED\", name: \"Second\", preset: {} },\n  ];\n  expect(Selectors.getRandomizePresets(store.getState())).toBe(true);\n  store.dispatch(Actions.toggleRandomizePresets());\n  expect(Selectors.getRandomizePresets(store.getState())).toBe(false);\n\n  // Check initial state\n  expect(store.getState().milkdrop.presetHistory).toEqual([]);\n  expect(Selectors.getCurrentPreset(store.getState())).toBe(null);\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(null);\n\n  // Load some presets\n  store.dispatch(Actions.loadPresets(mockPreset));\n  expect(store.getState().milkdrop.presetHistory).toEqual([0]);\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);\n\n  // Select next\n  store.dispatch(Actions.selectNextPreset());\n  expect(store.getState().milkdrop.presetHistory).toEqual([0, 1]);\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(1);\n\n  // Select previous\n  store.dispatch(Actions.selectPreviousPreset());\n  expect(store.getState().milkdrop.presetHistory).toEqual([0]);\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);\n\n  // Next again\n  store.dispatch(Actions.selectNextPreset());\n  expect(store.getState().milkdrop.presetHistory).toEqual([0, 1]);\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(1);\n\n  // Previous again\n  store.dispatch(Actions.selectPreviousPreset());\n  expect(store.getState().milkdrop.presetHistory).toEqual([0]);\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);\n});\n\ntest(\"selectes the first preset in a new set when added\", async () => {\n  const store = createStore(media, new Emitter());\n  const mockPreset = [\n    { type: \"RESOLVED\", name: \"First\", preset: {} },\n    { type: \"RESOLVED\", name: \"Second\", preset: {} },\n  ];\n  store.dispatch(Actions.toggleRandomizePresets());\n\n  // Load some presets\n  store.dispatch(Actions.loadPresets(mockPreset));\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);\n\n  const presetPromise = Promise.resolve({});\n  // Load some more presets\n  const newMockPresets = [\n    { type: \"UNRESOLVED\", name: \"First\", getPreset: () => presetPromise },\n  ];\n  store.dispatch(Actions.loadPresets(newMockPresets));\n  // The new presets are not selected right away\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0);\n  await presetPromise;\n  // Once the first preset is loaded, it gets selected\n  expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(2);\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/milkdrop.ts",
    "content": "import { Action, StatePreset, TransitionType, MilkdropMessage } from \"../types\";\nimport {\n  SET_MILKDROP_DESKTOP,\n  SET_MILKDROP_FULLSCREEN,\n  SET_MILKDROP_LOCK,\n  GOT_BUTTERCHURN_PRESETS,\n  GOT_BUTTERCHURN,\n  RESOLVE_PRESET_AT_INDEX,\n  SELECT_PRESET_AT_INDEX,\n  TOGGLE_PRESET_OVERLAY,\n  PRESET_REQUESTED,\n  TOGGLE_RANDOMIZE_PRESETS,\n  TOGGLE_PRESET_CYCLING,\n  SCHEDULE_MILKDROP_MESSAGE,\n} from \"../actionTypes\";\nimport * as Utils from \"../utils\";\n\nexport interface MilkdropState {\n  display: \"WINDOW\" | \"DESKTOP\" | \"FULLSCREEN\";\n  overlay: boolean;\n  lock: boolean;\n  presetHistory: number[];\n  presets: StatePreset[];\n  currentPresetIndex: number | null;\n  butterchurn: any;\n  transitionType: TransitionType;\n  randomize: boolean;\n  cycling: boolean;\n  // TODO: This could probably be simplified to just a date and we could assume\n  // the song title is the message.\n  message: MilkdropMessage | null;\n}\n\nconst defaultMilkdropState: MilkdropState = {\n  display: \"WINDOW\",\n  overlay: false,\n  lock: false,\n  presetHistory: [],\n  presets: [],\n  currentPresetIndex: null,\n  butterchurn: null,\n  transitionType: TransitionType.DEFAULT,\n  randomize: true,\n  cycling: true,\n  message: null,\n};\n\nexport const milkdrop = (\n  state: MilkdropState = defaultMilkdropState,\n  action: Action\n): MilkdropState => {\n  switch (action.type) {\n    case SET_MILKDROP_DESKTOP:\n      return { ...state, display: action.enabled ? \"DESKTOP\" : \"WINDOW\" };\n    case SET_MILKDROP_FULLSCREEN:\n      return { ...state, display: action.enabled ? \"FULLSCREEN\" : \"WINDOW\" };\n    case SET_MILKDROP_LOCK:\n        return { ...state, lock: action.enabled };\n    case GOT_BUTTERCHURN:\n      return { ...state, butterchurn: action.butterchurn };\n    case GOT_BUTTERCHURN_PRESETS:\n      return {\n        ...state,\n        presets: state.presets.concat(action.presets),\n      };\n    case PRESET_REQUESTED:\n      if (action.addToHistory) {\n        return {\n          ...state,\n          presetHistory: [...state.presetHistory, action.index],\n        };\n      }\n      return {\n        ...state,\n        presetHistory: state.presetHistory.slice(0, -1),\n      };\n    case RESOLVE_PRESET_AT_INDEX:\n      const preset = state.presets[action.index];\n      return {\n        ...state,\n        presets: Utils.replaceAtIndex(state.presets, action.index, {\n          type: \"RESOLVED\",\n          name: preset.name,\n          preset: action.json,\n        }),\n      };\n    case SELECT_PRESET_AT_INDEX:\n      return {\n        ...state,\n        currentPresetIndex: action.index,\n        transitionType: action.transitionType,\n      };\n    case TOGGLE_PRESET_OVERLAY:\n      return { ...state, overlay: !state.overlay };\n    case TOGGLE_RANDOMIZE_PRESETS:\n      return { ...state, randomize: !state.randomize };\n    case TOGGLE_PRESET_CYCLING:\n      return { ...state, cycling: !state.cycling };\n    case SCHEDULE_MILKDROP_MESSAGE:\n      return {\n        ...state,\n        message: {\n          text: action.message,\n          time: Date.now(),\n        },\n      };\n    default:\n      return state;\n  }\n};\n\nexport default milkdrop;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/network.ts",
    "content": "import { Action } from \"../types\";\nimport { NETWORK_CONNECTED, NETWORK_DISCONNECTED } from \"../actionTypes\";\n\nexport interface NetworkState {\n  connected: boolean;\n}\n\nconst network = (\n  state: NetworkState = { connected: true },\n  action: Action\n): NetworkState => {\n  switch (action.type) {\n    case NETWORK_CONNECTED:\n      return { ...state, connected: true };\n    case NETWORK_DISCONNECTED:\n      return { ...state, connected: false };\n    default:\n      return state;\n  }\n};\n\nexport default network;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/playlist.test.js",
    "content": "import {\n  SHIFT_CLICKED_TRACK,\n  CLICKED_TRACK,\n  CTRL_CLICKED_TRACK,\n  ADD_TRACK_FROM_URL,\n} from \"../actionTypes\";\nimport reducer from \"./playlist\";\n\ndescribe(\"playlist reducer\", () => {\n  it(\"can handle adding a track\", () => {\n    const initialState = {\n      trackOrder: [],\n      selectedTracks: new Set(),\n      lastSelectedIndex: null,\n    };\n    const nextState = reducer(initialState, {\n      type: ADD_TRACK_FROM_URL,\n      id: 100,\n      defaultName: \"My Track Name\",\n      url: \"url://some-url\",\n    });\n    expect(nextState).toEqual({\n      trackOrder: [100],\n      selectedTracks: new Set(),\n      lastSelectedIndex: null,\n    });\n  });\n  it(\"defaults to adding new tracks to the end of the list\", () => {\n    const initialState = {\n      trackOrder: [3, 2],\n      selectedTracks: new Set(),\n      lastSelectedIndex: 0,\n    };\n    const nextState = reducer(initialState, {\n      type: ADD_TRACK_FROM_URL,\n      id: 100,\n      defaultName: \"My Track Name\",\n      url: \"url://some-url\",\n    });\n    expect(nextState).toEqual({\n      selectedTracks: new Set(),\n      trackOrder: [3, 2, 100],\n      lastSelectedIndex: null,\n    });\n  });\n  it(\"can handle adding a track at a given index\", () => {\n    const initialState = {\n      selectedTracks: new Set(),\n      trackOrder: [3, 2],\n      lastSelectedIndex: 0,\n    };\n    const nextState = reducer(initialState, {\n      type: ADD_TRACK_FROM_URL,\n      id: 100,\n      defaultName: \"My Track Name\",\n      url: \"url://some-url\",\n      atIndex: 1,\n    });\n    expect(nextState).toEqual({\n      selectedTracks: new Set(),\n      trackOrder: [3, 100, 2],\n      lastSelectedIndex: null,\n    });\n  });\n  it(\"can handle clicking a track\", () => {\n    const initialState = {\n      trackOrder: [3, 2],\n      selectedTracks: new Set(),\n      lastSelectedIndex: 0,\n    };\n\n    const nextState = reducer(initialState, {\n      type: CLICKED_TRACK,\n      index: 1,\n    });\n    expect(nextState).toEqual({\n      selectedTracks: new Set([2]),\n      trackOrder: [3, 2],\n      lastSelectedIndex: 1,\n    });\n  });\n  it(\"can handle ctrl-clicking a track\", () => {\n    const initialState = {\n      selectedTracks: new Set([2]),\n      trackOrder: [3, 2],\n      lastSelectedIndex: 1,\n    };\n\n    const nextState = reducer(initialState, {\n      type: CTRL_CLICKED_TRACK,\n      index: 0,\n    });\n    expect(nextState).toEqual({\n      selectedTracks: new Set([2, 3]),\n      trackOrder: [3, 2],\n      lastSelectedIndex: 0,\n    });\n  });\n  it(\"can handle shift-click\", () => {\n    const initialState = {\n      selectedTracks: new Set(),\n      trackOrder: [3, 2, 1, 0],\n      lastSelectedIndex: 1,\n    };\n\n    const nextState = reducer(initialState, {\n      type: SHIFT_CLICKED_TRACK,\n      index: 3,\n    });\n    expect(nextState).toEqual({\n      lastSelectedIndex: 1,\n      selectedTracks: new Set([0, 1, 2]),\n      trackOrder: [3, 2, 1, 0],\n    });\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/playlist.ts",
    "content": "import { Action } from \"../types\";\nimport {\n  CLICKED_TRACK,\n  CTRL_CLICKED_TRACK,\n  SHIFT_CLICKED_TRACK,\n  SELECT_ALL,\n  SELECT_ZERO,\n  INVERT_SELECTION,\n  REMOVE_ALL_TRACKS,\n  REMOVE_TRACKS,\n  ADD_TRACK_FROM_URL,\n  REVERSE_LIST,\n  RANDOMIZE_LIST,\n  SET_TRACK_ORDER,\n  PLAY_TRACK,\n  BUFFER_TRACK,\n  DRAG_SELECTED,\n} from \"../actionTypes\";\nimport { shuffle, moveSelected } from \"../utils\";\n\nexport interface PlaylistState {\n  trackOrder: number[];\n  lastSelectedIndex: number | null;\n  currentTrack: number | null;\n  selectedTracks: Set<number>;\n}\n\nconst defaultPlaylistState: PlaylistState = {\n  trackOrder: [],\n  currentTrack: null,\n  lastSelectedIndex: null,\n  selectedTracks: new Set(),\n};\n\nfunction toggleSetMembership<T>(set: Set<T>, value: T): void {\n  if (set.has(value)) {\n    set.delete(value);\n  } else {\n    set.add(value);\n  }\n}\n\nconst playlist = (\n  state: PlaylistState = defaultPlaylistState,\n  action: Action\n): PlaylistState => {\n  switch (action.type) {\n    case CLICKED_TRACK:\n      return {\n        ...state,\n        selectedTracks: new Set([state.trackOrder[action.index]]),\n        lastSelectedIndex: action.index,\n      };\n    case CTRL_CLICKED_TRACK: {\n      const id = state.trackOrder[action.index];\n      const newSelectedTracks = new Set(state.selectedTracks);\n      toggleSetMembership(newSelectedTracks, id);\n      return {\n        ...state,\n        selectedTracks: newSelectedTracks,\n        // Using this as the lastClickedIndex is kinda funny, since you\n        // may have just _un_selected the track. However, this is what\n        // Winamp 2 does, so we'll copy it.\n        lastSelectedIndex: action.index,\n      };\n    }\n    case SHIFT_CLICKED_TRACK:\n      if (state.lastSelectedIndex == null) {\n        return state;\n      }\n      const clickedIndex = action.index;\n      const start = Math.min(clickedIndex, state.lastSelectedIndex);\n      const end = Math.max(clickedIndex, state.lastSelectedIndex);\n      const selectedTracks = new Set(state.trackOrder.slice(start, end + 1));\n      return {\n        ...state,\n        selectedTracks,\n      };\n    case SELECT_ALL:\n      return {\n        ...state,\n        selectedTracks: new Set(state.trackOrder),\n      };\n    case SELECT_ZERO:\n      return {\n        ...state,\n        selectedTracks: new Set(),\n      };\n    case INVERT_SELECTION:\n      return {\n        ...state,\n        selectedTracks: new Set(\n          state.trackOrder.filter((id) => !state.selectedTracks.has(id))\n        ),\n      };\n    case REMOVE_ALL_TRACKS:\n      // TODO: Consider disposing of ObjectUrls\n      return {\n        ...state,\n        trackOrder: [],\n        currentTrack: null,\n        selectedTracks: new Set(),\n        lastSelectedIndex: null,\n      };\n    case REMOVE_TRACKS:\n      // TODO: Consider disposing of ObjectUrls\n      const actionIds = new Set(action.ids.map(Number));\n      const { currentTrack } = state;\n      return {\n        ...state,\n        trackOrder: state.trackOrder.filter(\n          (trackId) => !actionIds.has(trackId)\n        ),\n        currentTrack: actionIds.has(Number(currentTrack)) ? null : currentTrack,\n        selectedTracks: new Set(\n          Array.from(state.selectedTracks).filter((id) => actionIds.has(id))\n        ),\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null,\n      };\n    case REVERSE_LIST:\n      return {\n        ...state,\n        trackOrder: [...state.trackOrder].reverse(),\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null,\n      };\n    case RANDOMIZE_LIST:\n      return {\n        ...state,\n        trackOrder: shuffle(state.trackOrder),\n      };\n    case SET_TRACK_ORDER:\n      const { trackOrder } = action;\n      return { ...state, trackOrder };\n    case ADD_TRACK_FROM_URL:\n      const atIndex =\n        action.atIndex == null ? state.trackOrder.length : action.atIndex;\n      return {\n        ...state,\n        trackOrder: [\n          ...state.trackOrder.slice(0, atIndex),\n          Number(action.id),\n          ...state.trackOrder.slice(atIndex),\n        ],\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null,\n      };\n    case PLAY_TRACK:\n    case BUFFER_TRACK:\n      return {\n        ...state,\n        currentTrack: action.id,\n      };\n    case DRAG_SELECTED:\n      return {\n        ...state,\n        trackOrder: moveSelected(\n          state.trackOrder,\n          (i) => state.selectedTracks.has(state.trackOrder[i]),\n          action.offset\n        ),\n        // TODO: This could probably be made to work, but we clear it just to be safe.\n        lastSelectedIndex: null,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default playlist;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/settings.ts",
    "content": "import { Action, Skin } from \"../types\";\nimport { SET_AVAILABLE_SKINS } from \"../actionTypes\";\n\nexport interface SettingsState {\n  availableSkins: Array<Skin>;\n}\n\nconst defaultSettingsState = {\n  availableSkins: [],\n};\n\nconst settings = (\n  state: SettingsState = defaultSettingsState,\n  action: Action\n): SettingsState => {\n  switch (action.type) {\n    case SET_AVAILABLE_SKINS:\n      return { ...state, availableSkins: action.skins };\n    default:\n      return state;\n  }\n};\n\nexport default settings;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/tracks.test.ts",
    "content": "import * as fromTracks from \"./tracks\";\nimport { PlaylistTrack } from \"../types\";\n\ndescribe(\"getTrackDisplayName\", () => {\n  const expectDisplayName = (\n    track: Partial<PlaylistTrack>,\n    expected: string\n  ) => {\n    // @ts-ignore We test incomplete tracks\n    expect(fromTracks.getTrackDisplayName({ \"1\": track }, 1)).toBe(expected);\n  };\n  it(\"uses the artists and title if provided\", () => {\n    expectDisplayName(\n      {\n        artist: \"Artist\",\n        title: \"Title\",\n        defaultName: \"Default Name\",\n        url: \"https://example.com/dir/filename.mp3\",\n      },\n      \"Artist - Title\"\n    );\n  });\n  it(\"uses the title if provided\", () => {\n    expectDisplayName(\n      {\n        title: \"Title\",\n        defaultName: \"Default Name\",\n        url: \"https://example.com/dir/filename.mp3\",\n      },\n      \"Title\"\n    );\n  });\n  it(\"uses a defaultName if provided\", () => {\n    expectDisplayName(\n      {\n        defaultName: \"Default Name\",\n        url: \"https://example.com/dir/filename.mp3\",\n      },\n      \"Default Name\"\n    );\n  });\n  it(\"uses the filename if a URL is provided\", () => {\n    expectDisplayName(\n      { url: \"https://example.com/dir/filename.mp3\" },\n      \"filename.mp3\"\n    );\n  });\n  it(\"does not use the filename if a blob URL is provided\", () => {\n    expectDisplayName({ url: \"blob:foo\" }, \"???\");\n  });\n  it(\"falls back to '???'\", () => {\n    expectDisplayName({}, \"???\");\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/tracks.ts",
    "content": "import { PlaylistTrack, Action } from \"../types\";\nimport {\n  SET_MEDIA,\n  SET_MEDIA_TAGS,\n  SET_MEDIA_DURATION,\n  MEDIA_TAG_REQUEST_INITIALIZED,\n  MEDIA_TAG_REQUEST_FAILED,\n  ADD_TRACK_FROM_URL,\n} from \"../actionTypes\";\nimport { MEDIA_TAG_REQUEST_STATUS } from \"../constants\";\nimport * as TrackUtils from \"../trackUtils\";\n\nexport interface TracksState {\n  [id: string]: PlaylistTrack;\n}\n\nconst defaultPlaylistState: TracksState = {};\n\nconst tracks = (\n  state: TracksState = defaultPlaylistState,\n  action: Action\n): TracksState => {\n  switch (action.type) {\n    case ADD_TRACK_FROM_URL:\n      return {\n        ...state,\n        [action.id]: {\n          id: action.id,\n          defaultName: action.defaultName || null,\n          duration: action.duration ?? null,\n          url: action.url,\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.INITIALIZED,\n        },\n      };\n    case SET_MEDIA: {\n      const newTrack = {\n        ...state[action.id],\n        duration: action.length,\n      };\n      return {\n        ...state,\n        [action.id]: newTrack,\n      };\n    }\n    case MEDIA_TAG_REQUEST_INITIALIZED:\n      return {\n        ...state,\n        [action.id]: {\n          ...state[action.id],\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.INITIALIZED,\n        },\n      };\n    case MEDIA_TAG_REQUEST_FAILED:\n      return {\n        ...state,\n        [action.id]: {\n          ...state[action.id],\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.FAILED,\n        },\n      };\n    case SET_MEDIA_DURATION: {\n      return {\n        ...state,\n        [action.id]: {\n          ...state[action.id],\n          duration: action.duration,\n        },\n      };\n    }\n    case SET_MEDIA_TAGS:\n      const track = state[action.id];\n      const {\n        sampleRate,\n        bitrate,\n        numberOfChannels,\n        title,\n        artist,\n        album,\n        albumArtUrl,\n      } = action;\n      const { kbps, khz, channels } = track;\n      return {\n        ...state,\n        [action.id]: {\n          ...track,\n          mediaTagsRequestStatus: MEDIA_TAG_REQUEST_STATUS.COMPLETE,\n          title,\n          artist,\n          album,\n          albumArtUrl,\n          kbps: bitrate != null ? String(Math.round(bitrate / 1000)) : kbps,\n          khz: sampleRate != null ? String(Math.round(sampleRate / 1000)) : khz,\n          channels: numberOfChannels != null ? numberOfChannels : channels,\n        },\n      };\n    default:\n      return state;\n  }\n};\n\nexport default tracks;\n\nexport const getTrackDisplayName = (\n  state: TracksState,\n  id: number | null = null\n): string | null => {\n  if (id == null) {\n    return null;\n  }\n  const track = state[id];\n  if (track == null) {\n    return null;\n  }\n\n  return TrackUtils.trackName(track);\n};\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/userInput.test.js",
    "content": "import { SET_FOCUS, SET_SCRUB_POSITION, UNSET_FOCUS } from \"../actionTypes\";\nimport userInput from \"./userInput\";\n\ndescribe(\"userInput reducer\", () => {\n  const state = userInput(undefined, { type: \"@@INIT\" });\n  it(\"has sensible defaults\", () => {\n    expect(state).toEqual({\n      focus: null,\n      scrubPosition: 0,\n      bandFocused: null,\n      userMessage: null,\n    });\n  });\n  it(\"can set focus\", () => {\n    const newState = userInput(state, {\n      type: SET_FOCUS,\n      input: \"foo\",\n      bandFocused: null,\n      userMessage: null,\n    });\n    expect(newState).toEqual({\n      focus: \"foo\",\n      scrubPosition: 0,\n      bandFocused: null,\n      userMessage: null,\n    });\n  });\n  it(\"can unset focus\", () => {\n    const newState = userInput(\n      { ...state, focus: \"foo\", bandFocused: null },\n      { type: UNSET_FOCUS }\n    );\n    expect(newState).toEqual({\n      focus: null,\n      scrubPosition: 0,\n      bandFocused: null,\n      userMessage: null,\n    });\n  });\n  it(\"can set scrub position\", () => {\n    const newState = userInput(state, {\n      type: SET_SCRUB_POSITION,\n      position: 5,\n      bandFocused: null,\n      userMessage: null,\n    });\n    expect(newState).toEqual({\n      focus: null,\n      scrubPosition: 5,\n      bandFocused: null,\n      userMessage: null,\n    });\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/userInput.ts",
    "content": "import { Action, Slider } from \"../types\";\nimport {\n  SET_FOCUS,\n  SET_BAND_FOCUS,\n  SET_SCRUB_POSITION,\n  UNSET_FOCUS,\n  SET_USER_MESSAGE,\n  UNSET_USER_MESSAGE,\n} from \"../actionTypes\";\n\nexport interface UserInputState {\n  focus: string | null; // TODO: Convert this to an enum?\n  bandFocused: Slider | null;\n  scrubPosition: number;\n  userMessage: string | null;\n}\n\nconst defaultUserInput = {\n  focus: null,\n  bandFocused: null,\n  scrubPosition: 0,\n  userMessage: null,\n};\n\nexport const userInput = (\n  state: UserInputState = defaultUserInput,\n  action: Action\n): UserInputState => {\n  switch (action.type) {\n    case SET_FOCUS:\n      return { ...state, focus: action.input, bandFocused: null };\n    case SET_BAND_FOCUS:\n      return { ...state, focus: action.input, bandFocused: action.bandFocused };\n    case UNSET_FOCUS:\n      return { ...state, focus: null, bandFocused: null };\n    case SET_SCRUB_POSITION:\n      return { ...state, scrubPosition: action.position };\n    case SET_USER_MESSAGE:\n      return { ...state, userMessage: action.message };\n    case UNSET_USER_MESSAGE:\n      return { ...state, userMessage: null };\n    default:\n      return state;\n  }\n};\n\nexport default userInput;\n"
  },
  {
    "path": "webamp/packages/webamp/js/reducers/windows.ts",
    "content": "import { Action, WindowId, Box, Point } from \"../types\";\nimport { WINDOWS } from \"../constants\";\nimport {\n  SET_FOCUSED_WINDOW,\n  TOGGLE_WINDOW,\n  CLOSE_WINDOW,\n  UPDATE_WINDOW_POSITIONS,\n  WINDOW_SIZE_CHANGED,\n  TOGGLE_WINDOW_SHADE_MODE,\n  LOAD_SERIALIZED_STATE,\n  BROWSER_WINDOW_SIZE_CHANGED,\n  RESET_WINDOW_SIZES,\n  ENABLE_MILKDROP,\n} from \"../actionTypes\";\nimport * as Utils from \"../utils\";\nimport { WindowsSerializedStateV1 } from \"../serializedStates/v1Types\";\n\nexport type WindowPositions = {\n  [windowId: string]: Point;\n};\n\nexport interface WebampWindow {\n  title: string;\n  size: [number, number];\n  open: boolean;\n  shade?: boolean;\n  canResize: boolean;\n  canShade: boolean;\n  canDouble: boolean;\n  hotkey?: string;\n  position: Point;\n}\n\nexport interface WindowInfo extends Box {\n  key: WindowId;\n}\nexport interface WindowsState {\n  focused: WindowId | null;\n  genWindows: { [name: string]: WebampWindow };\n  browserWindowSize: { height: number; width: number };\n  positionsAreRelative: boolean;\n  windowOrder: WindowId[];\n}\n\nconst defaultWindowsState: WindowsState = {\n  focused: WINDOWS.MAIN,\n  positionsAreRelative: true,\n  genWindows: {\n    // TODO: Remove static capabilities and derive them from ids/generic\n    [WINDOWS.MAIN]: {\n      title: \"Main Window\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: false,\n      canShade: true,\n      canDouble: true,\n      hotkey: \"Alt+W\",\n      position: { x: 0, y: 0 },\n    },\n    [WINDOWS.EQUALIZER]: {\n      title: \"Equalizer\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: false,\n      canShade: true,\n      canDouble: true,\n      hotkey: \"Alt+G\",\n      position: { x: 0, y: 0 },\n    },\n    [WINDOWS.PLAYLIST]: {\n      title: \"Playlist Editor\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: true,\n      canShade: true,\n      canDouble: false,\n      hotkey: \"Alt+E\",\n      position: { x: 0, y: 0 },\n    },\n    [WINDOWS.MILKDROP]: {\n      title: \"Milkdrop\",\n      size: [0, 0],\n      open: true,\n      shade: false,\n      canResize: true,\n      canShade: false,\n      canDouble: false,\n      position: { x: 0, y: 0 },\n    },\n  },\n  browserWindowSize: { width: 0, height: 0 },\n  windowOrder: [\n    WINDOWS.PLAYLIST,\n    WINDOWS.EQUALIZER,\n    WINDOWS.MILKDROP,\n    WINDOWS.MAIN,\n  ],\n};\n\nconst windows = (\n  state: WindowsState = defaultWindowsState,\n  action: Action\n): WindowsState => {\n  switch (action.type) {\n    case ENABLE_MILKDROP:\n      return {\n        ...state,\n        genWindows: {\n          ...state.genWindows,\n          [WINDOWS.MILKDROP]: {\n            ...state.genWindows[WINDOWS.MILKDROP],\n            open: action.open,\n          },\n        },\n      };\n    case SET_FOCUSED_WINDOW:\n      let windowOrder = state.windowOrder;\n      if (action.window != null) {\n        windowOrder = [\n          ...state.windowOrder.filter((windowId) => windowId !== action.window),\n          action.window,\n        ];\n      }\n      return { ...state, focused: action.window, windowOrder };\n    case TOGGLE_WINDOW_SHADE_MODE:\n      const { canShade } = state.genWindows[action.windowId];\n      if (!canShade) {\n        throw new Error(\n          `Tried to shade/unshade a window that cannot be shaded: ${action.windowId}`\n        );\n      }\n      return {\n        ...state,\n        genWindows: {\n          ...state.genWindows,\n          [action.windowId]: {\n            ...state.genWindows[action.windowId],\n            shade: !state.genWindows[action.windowId].shade,\n          },\n        },\n      };\n    case TOGGLE_WINDOW:\n      const windowState = state.genWindows[action.windowId];\n      return {\n        ...state,\n        genWindows: {\n          ...state.genWindows,\n          [action.windowId]: {\n            ...windowState,\n            open: !windowState.open,\n          },\n        },\n      };\n    case CLOSE_WINDOW:\n      return {\n        ...state,\n        genWindows: {\n          ...state.genWindows,\n          [action.windowId]: {\n            ...state.genWindows[action.windowId],\n            open: false,\n          },\n        },\n      };\n    case WINDOW_SIZE_CHANGED:\n      const { canResize } = state.genWindows[action.windowId];\n      if (!canResize) {\n        throw new Error(\n          `Tried to resize a window that cannot be resized: ${action.windowId}`\n        );\n      }\n      return {\n        ...state,\n        genWindows: {\n          ...state.genWindows,\n          [action.windowId]: {\n            ...state.genWindows[action.windowId],\n            size: action.size,\n          },\n        },\n      };\n    case UPDATE_WINDOW_POSITIONS:\n      return {\n        ...state,\n        positionsAreRelative:\n          action.absolute === true ? false : state.positionsAreRelative,\n        genWindows: Utils.objectMap(state.genWindows, (w, windowId) => {\n          const newPosition = action.positions[windowId];\n          if (newPosition == null) {\n            return w;\n          }\n          return { ...w, position: newPosition };\n        }),\n      };\n    case RESET_WINDOW_SIZES:\n      return {\n        ...state,\n        genWindows: Utils.objectMap(state.genWindows, (w) => ({\n          ...w,\n          // Not sure why TypeScript can't figure this out for itself.\n          size: [0, 0] as [number, number],\n        })),\n      };\n    case LOAD_SERIALIZED_STATE: {\n      const { genWindows, focused, positionsAreRelative } =\n        action.serializedState.windows;\n      return {\n        ...state,\n        positionsAreRelative,\n        genWindows: Utils.objectMap(state.genWindows, (w, windowId) => {\n          const serializedW = genWindows[windowId];\n          if (serializedW == null) {\n            return w;\n          }\n          // Pull out `hidden` since it's been removed from our state.\n          const { hidden, ...rest } = serializedW;\n          return { ...w, ...rest };\n        }),\n        focused,\n      };\n    }\n    case BROWSER_WINDOW_SIZE_CHANGED:\n      return {\n        ...state,\n        browserWindowSize: { height: action.height, width: action.width },\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport function getSerializedState(\n  state: WindowsState\n): WindowsSerializedStateV1 {\n  return {\n    positionsAreRelative: state.positionsAreRelative,\n    genWindows: Utils.objectMap(state.genWindows, (w) => {\n      return {\n        size: w.size,\n        open: w.open,\n        hidden: false, // Not used any more\n        shade: w.shade || false,\n        position: w.position,\n      };\n    }),\n    focused: state.focused,\n  };\n}\n\nexport default windows;"
  },
  {
    "path": "webamp/packages/webamp/js/regionParser.test.js",
    "content": "import fs from \"fs\";\nimport regionParser, { pointPairs } from \"./regionParser\";\n\ndescribe(\"pointPairs\", () => {\n  it(\"8\", () => {\n    expect(\n      pointPairs([\"1\", \"0\", \"275\", \"0\", \"275\", \"115\", \"1\", \"115\"])\n    ).toEqual([\"1,0\", \"275,0\", \"275,115\", \"1,115\"]);\n  });\n});\n\ndescribe(\"regionParser\", () => {\n  it(\"parses the default file as empty\", () => {\n    const regionTxt = fs.readFileSync(\n      \"./js/__tests__/fixtures/region.txt\",\n      \"utf8\"\n    );\n    expect(regionParser(regionTxt)).toEqual({});\n  });\n  it(\"parses a complex file\", () => {\n    const regionTxt = fs.readFileSync(\n      \"./js/__tests__/fixtures/region1.txt\",\n      \"utf8\"\n    );\n    expect(regionParser(regionTxt)).toMatchSnapshot();\n  });\n  it(\"parses a file with section headers but no info\", () => {\n    const regionTxt = fs.readFileSync(\n      \"./js/__tests__/fixtures/region_empty_sections.txt\",\n      \"utf8\"\n    );\n    expect(regionParser(regionTxt)).toMatchSnapshot();\n  });\n  it(\"parses the EVAunit region.txt\", () => {\n    const regionTxt = fs.readFileSync(\n      \"./js/__tests__/fixtures/region_eva.txt\",\n      \"utf8\"\n    );\n    expect(regionParser(regionTxt)).toMatchSnapshot();\n  });\n  it(\"parses the iTuned region.txt\", () => {\n    const regionTxt = fs.readFileSync(\n      \"./js/__tests__/fixtures/region_ituned.txt\",\n      \"utf8\"\n    );\n    expect(regionParser(regionTxt)).toMatchSnapshot();\n  });\n  it(\"parses a region.txt where the points have leading commas\", () => {\n    const regionTxt = fs.readFileSync(\n      \"./js/__tests__/fixtures/region_leading_comma.txt\",\n      \"utf8\"\n    );\n    expect(regionParser(regionTxt)).toMatchSnapshot();\n  });\n  it(\"parses Satellite M's region.txt\", () => {\n    const regionTxt = fs.readFileSync(\n      \"./js/__tests__/fixtures/region_satellite.txt\",\n      \"utf8\"\n    );\n    expect(regionParser(regionTxt)).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/regionParser.ts",
    "content": "import { parseIni } from \"./utils\";\n\nexport function pointPairs(arr: string[]) {\n  const pairedValues = [];\n  for (let i = 0; i < arr.length; i += 2) {\n    pairedValues.push(`${arr[i]},${arr[i + 1]}`);\n  }\n  return pairedValues;\n}\n\ntype RegionData = { [section: string]: string[] };\n\nexport default function regionParser(regionStr: string): RegionData {\n  const iniData = parseIni(regionStr);\n  const data: RegionData = {};\n  Object.keys(iniData).forEach((section) => {\n    const { numpoints, pointlist } = iniData[section];\n    if (!numpoints || !pointlist) {\n      return;\n    }\n    const pointCounts = numpoints.split(/\\s*,\\s*/).filter((val) => val !== \"\");\n    const points = pointPairs(\n      // points can be separated by spaces, or by commas\n      pointlist.split(/\\s*[, ]\\s*/).filter((val) => val !== \"\")\n    );\n    let pointIndex = 0;\n    const polygons = pointCounts.map((numStr) => {\n      const num = Number(numStr);\n      if (num < 3) {\n        // What use is a polygon with less than three sides?\n        pointIndex += num;\n        return null;\n      }\n      const polygon = points.slice(pointIndex, pointIndex + num).join(\" \");\n      if (!polygon.length) {\n        // It's possible that the skin author specified more polygons than provided points.\n        return null;\n      }\n      pointIndex += num;\n      return polygon;\n    });\n    const validPolygons = polygons.filter(\n      (polygon) => polygon != null\n    ) as string[];\n    if (validPolygons.length) {\n      data[section] = validPolygons;\n    }\n  });\n\n  return data;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/resizeUtils.test.ts",
    "content": "import { getPositionDiff, generateGraph } from \"./resizeUtils\";\n\ndescribe(\"resizeUtils\", () => {\n  it(\"can enter shade mode\", () => {\n    const graph = {\n      a: {},\n      b: { below: \"a\" },\n      c: { below: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: -75, width: 0 },\n      b: { height: 0, width: 0 },\n      c: { height: 0, width: 0 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 0, y: -75 },\n      c: { x: 0, y: -75 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can make the middle window enter shade mode\", () => {\n    const graph = {\n      a: {},\n      b: { below: \"a\" },\n      c: { below: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: 0, width: 0 },\n      b: { height: -75, width: 0 },\n      c: { height: 0, width: 0 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 0, y: 0 },\n      c: { x: 0, y: -75 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can exit shade mode\", () => {\n    const graph = {\n      a: {},\n      b: { below: \"a\" },\n      c: { below: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: 75, width: 0 },\n      b: { height: 0, width: 0 },\n      c: { height: 0, width: 0 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 0, y: 75 },\n      c: { x: 0, y: 75 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can enter double mode\", () => {\n    const graph = {\n      a: {},\n      b: { below: \"a\" },\n      c: { below: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: 100, width: 100 },\n      b: { height: 100, width: 100 },\n      c: { height: 100, width: 100 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 0, y: 100 },\n      c: { x: 0, y: 200 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can enter double mode when shaped like a grid\", () => {\n    const graph = {\n      a: {},\n      b: { right: \"a\" },\n      c: { below: \"a\" },\n      d: { below: \"b\", right: \"c\" },\n    };\n    const sizeDiff = {\n      a: { height: 100, width: 100 },\n      b: { height: 100, width: 100 },\n      c: { height: 100, width: 100 },\n      d: { height: 100, width: 100 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 100, y: 0 },\n      c: { x: 0, y: 100 },\n      d: { x: 100, y: 100 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can enter double mode when shaped like a 3x3 grid\", () => {\n    const graph = {\n      a: {},\n      b: { right: \"a\" },\n      c: { right: \"b\" },\n\n      d: { below: \"a\" },\n      e: { below: \"b\", right: \"d\" },\n      f: { below: \"c\", right: \"e\" },\n\n      g: { below: \"d\" },\n      h: { below: \"e\", right: \"g\" },\n      i: { below: \"f\", right: \"h\" },\n    };\n    const sizeDiff = {\n      a: { height: 100, width: 100 },\n      b: { height: 100, width: 100 },\n      c: { height: 100, width: 100 },\n\n      d: { height: 100, width: 100 },\n      e: { height: 100, width: 100 },\n      f: { height: 100, width: 100 },\n\n      g: { height: 100, width: 100 },\n      h: { height: 100, width: 100 },\n      i: { height: 100, width: 100 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 100, y: 0 },\n      c: { x: 200, y: 0 },\n\n      d: { x: 0, y: 100 },\n      e: { x: 100, y: 100 },\n      f: { x: 200, y: 100 },\n\n      g: { x: 0, y: 200 },\n      h: { x: 100, y: 200 },\n      i: { x: 200, y: 200 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can exit double mode\", () => {\n    const graph = {\n      a: {},\n      b: { below: \"a\" },\n      c: { below: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: -100, width: -100 },\n      b: { height: -100, width: -100 },\n      c: { height: -100, width: -100 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 0, y: -100 },\n      c: { x: 0, y: -200 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can enter shade mode when horizontal\", () => {\n    const graph = {\n      a: {},\n      b: { right: \"a\" },\n      c: { right: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: -75, width: 0 },\n      b: { height: 0, width: 0 },\n      c: { height: 0, width: 0 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 0, y: 0 },\n      c: { x: 0, y: 0 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can enter double mode when horizontal\", () => {\n    const graph = {\n      a: {},\n      b: { right: \"a\" },\n      c: { right: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: 100, width: 100 },\n      b: { height: 100, width: 100 },\n      c: { height: 100, width: 100 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 100, y: 0 },\n      c: { x: 200, y: 0 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can leave double mode when horizontal\", () => {\n    const graph = {\n      a: {},\n      b: { right: \"a\" },\n      c: { right: \"b\" },\n    };\n    const sizeDiff = {\n      a: { height: -100, width: -100 },\n      b: { height: -100, width: -100 },\n      c: { height: -100, width: -100 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: -100, y: 0 },\n      c: { x: -200, y: 0 },\n    };\n    expect(actual).toEqual(expected);\n  });\n  it(\"can shade two windows above two other windows\", () => {\n    const graph = {\n      a: {},\n      b: { below: \"a\" },\n      c: {},\n      d: { below: \"c\" },\n    };\n    const sizeDiff = {\n      a: { height: -75, width: 0 },\n      b: { height: 0, width: 0 },\n      c: { height: -75, width: 0 },\n      d: { height: 0, width: 0 },\n    };\n    const actual = getPositionDiff(graph, sizeDiff);\n    const expected = {\n      a: { x: 0, y: 0 },\n      b: { x: 0, y: -75 },\n      c: { x: 0, y: 0 },\n      d: { x: 0, y: -75 },\n    };\n    expect(actual).toEqual(expected);\n  });\n});\ndescribe(\"generateGraph\", () => {\n  it(\"of stacked windows\", () => {\n    const actual = generateGraph([\n      { key: \"a\", x: 0, y: 0, width: 100, height: 100 },\n      { key: \"b\", x: 0, y: 100, width: 100, height: 100 },\n      { key: \"c\", x: 0, y: 200, width: 100, height: 100 },\n    ]);\n    expect(actual).toEqual({\n      a: {},\n      b: { below: \"a\" },\n      c: { below: \"b\" },\n    });\n  });\n  it(\"of disconnected windows\", () => {\n    const actual = generateGraph([\n      { key: \"a\", x: 0, y: 0, width: 100, height: 100 },\n      { key: \"b\", x: 0, y: 110, width: 100, height: 100 },\n    ]);\n    expect(actual).toEqual({\n      a: {},\n      b: {},\n    });\n  });\n  it(\"of windows that touch in y, but the lower one is to the right\", () => {\n    const actual = generateGraph([\n      { key: \"a\", x: 0, y: 0, width: 100, height: 100 },\n      { key: \"b\", x: 110, y: 100, width: 100, height: 100 },\n    ]);\n    expect(actual).toEqual({\n      a: {},\n      b: {},\n    });\n  });\n  it(\"of windows that touch in y, but the lower one is to the left\", () => {\n    const actual = generateGraph([\n      { key: \"a\", x: 110, y: 0, width: 100, height: 100 },\n      { key: \"b\", x: 0, y: 100, width: 100, height: 100 },\n    ]);\n    expect(actual).toEqual({\n      a: {},\n      b: {},\n    });\n  });\n  it(\"of windows that touch in x, but the right one is below\", () => {\n    const actual = generateGraph([\n      { key: \"a\", x: 0, y: 0, width: 100, height: 100 },\n      { key: \"b\", x: 100, y: 110, width: 100, height: 100 },\n    ]);\n    expect(actual).toEqual({\n      a: {},\n      b: {},\n    });\n  });\n  it(\"of windows that touch in x, but the right one is above\", () => {\n    const actual = generateGraph([\n      { key: \"a\", x: 0, y: 110, width: 100, height: 100 },\n      { key: \"b\", x: 100, y: 0, width: 100, height: 100 },\n    ]);\n    expect(actual).toEqual({\n      a: {},\n      b: {},\n    });\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/resizeUtils.ts",
    "content": "import { WindowInfo, WindowId } from \"./types\";\n\ninterface NewGraph {\n  [key: string]: {\n    above: string[];\n    left: string[];\n  };\n}\n\ninterface PositionDiff {\n  [key: string]: {\n    x: number;\n    y: number;\n  };\n}\n\nexport interface SizeDiff {\n  [key: string]: {\n    width: number;\n    height: number;\n  };\n}\n\nexport function getPositionDiff(\n  graph: Graph,\n  sizeDiff: SizeDiff\n): PositionDiff {\n  const newGraph: NewGraph = {};\n  const positionDiff: PositionDiff = {};\n  for (const key of Object.keys(graph)) {\n    newGraph[key] = { above: [], left: [] };\n    positionDiff[key] = { x: 0, y: 0 };\n  }\n\n  // Construct an inverted graph\n  for (const [key, neighbors] of Object.entries(graph)) {\n    const { below, right } = neighbors;\n    if (right != null) {\n      newGraph[right].left.push(key);\n    }\n    if (below != null) {\n      newGraph[below].above.push(key);\n    }\n  }\n\n  function walkRight(key: WindowId) {\n    const node = newGraph[key];\n    const nodeSizeDiff = sizeDiff[key];\n    node.left.forEach((left) => {\n      positionDiff[left].x += nodeSizeDiff.width + positionDiff[key].x;\n      walkRight(left);\n    });\n  }\n\n  function walkDown(key: WindowId) {\n    const node = newGraph[key];\n    const nodeSizeDiff = sizeDiff[key];\n    node.above.forEach((above) => {\n      positionDiff[above].y += nodeSizeDiff.height + positionDiff[key].y;\n      walkDown(above);\n    });\n  }\n\n  // Find disconnected nodes, and walk\n  for (const [key, neighbors] of Object.entries(graph)) {\n    if (neighbors.below == null) {\n      walkDown(key);\n    }\n    if (neighbors.right == null) {\n      walkRight(key);\n    }\n  }\n\n  return positionDiff;\n}\n\ninterface Edges {\n  below?: WindowId;\n  right?: WindowId;\n}\n\ninterface Graph {\n  // TODO: Ensure this is a WindowId\n  [id: string]: Edges;\n}\n\nexport function generateGraph(windows: WindowInfo[]): Graph {\n  const bottoms: { [offset: number]: WindowInfo[] } = {};\n  const rights: { [offset: number]: WindowInfo[] } = {};\n  for (const w of windows) {\n    const bottom = w.y + w.height;\n    if (bottoms[bottom]) {\n      bottoms[bottom].push(w);\n    } else {\n      bottoms[bottom] = [w];\n    }\n\n    const right = w.x + w.width;\n    if (rights[right]) {\n      rights[right].push(w);\n    } else {\n      rights[right] = [w];\n    }\n  }\n\n  const graph: Graph = {};\n  for (const w of windows) {\n    const edges: Edges = {};\n    const top = w.y;\n    const left = w.x;\n\n    const tops = bottoms[top];\n    const lefts = rights[left];\n    if (tops) {\n      for (const below of tops) {\n        const isToTheLeft = below.x + below.width < w.x;\n        const isToTheRight = below.x > w.x + w.width;\n\n        const overlapsInX = !(isToTheLeft || isToTheRight);\n        if (overlapsInX) {\n          edges.below = below.key;\n          break;\n        }\n      }\n    }\n    if (lefts) {\n      for (const right of lefts) {\n        const isAbove = right.y + right.height < w.y;\n        const isBelow = right.y > w.y + w.height;\n        const overlapsInY = !(isAbove || isBelow);\n        if (overlapsInY) {\n          edges.right = right.key;\n          break;\n        }\n      }\n    }\n\n    graph[w.key] = edges;\n  }\n  return graph;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/selectors.test.ts",
    "content": "import reducer from \"./reducers\";\nimport { getEqfData, getNextTrackId } from \"./selectors\";\nimport { AppState } from \"./types\";\ndescribe(\"getEqfData\", () => {\n  it(\"can extract EQF data from the current state\", () => {\n    const state = reducer(undefined, { type: \"@@init\" });\n    const actual = getEqfData(state);\n    const expected = {\n      presets: [\n        {\n          hz60: 33,\n          hz170: 33,\n          hz310: 33,\n          hz600: 33,\n          hz1000: 33,\n          hz3000: 33,\n          hz12000: 33,\n          hz14000: 33,\n          hz16000: 33,\n          hz6000: 33,\n          name: \"Entry1\",\n          preamp: 33,\n        },\n      ],\n      type: \"Winamp EQ library file v1.1\",\n    };\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"nextTrack\", () => {\n  it(\"returns null if you don't have any tracks\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: null, trackOrder: [] },\n      media: { repeat: false },\n    } as any;\n    expect(state.playlist.trackOrder).toEqual([]);\n    expect(getNextTrackId(state)).toBe(null);\n  });\n\n  it(\"returns null if you are going forward from the last track and repeat is not turned on\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 3, trackOrder: [1, 2, 3] },\n      media: { repeat: false },\n    } as any;\n    expect(getNextTrackId(state)).toBe(null);\n  });\n\n  it(\"wraps around if you are going forward from the last track and repeat _is_ turned on\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 3, trackOrder: [1, 2, 3] },\n      media: { repeat: true },\n    } as any;\n    expect(getNextTrackId(state)).toBe(1);\n  });\n\n  it(\"returns null if you are going backward from the first track and repeat is not turned on\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 1, trackOrder: [1, 2, 3] },\n      media: { repeat: false },\n    } as any;\n    expect(getNextTrackId(state, -1)).toBe(null);\n  });\n\n  it(\"wraps around if you are going backwards from the first track and repeat _is_ turned on\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 1, trackOrder: [1, 2, 3] },\n      media: { repeat: true },\n    } as any;\n    expect(getNextTrackId(state, -1)).toBe(3);\n  });\n\n  it(\"does a normal next\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 2, trackOrder: [1, 2, 3] },\n      media: { repeat: false },\n    } as any;\n    expect(getNextTrackId(state)).toBe(3);\n  });\n\n  it(\"does a normal previous\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 2, trackOrder: [1, 2, 3] },\n      media: { repeat: false },\n    } as any;\n    expect(getNextTrackId(state, -1)).toBe(1);\n  });\n\n  it(\"takes you to the last track if you overshoot\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 2, trackOrder: [1, 2, 3] },\n      media: { repeat: false },\n    } as any;\n    expect(getNextTrackId(state, 10)).toBe(3);\n  });\n\n  it(\"takes you to the first track if you overshoot\", () => {\n    const state: AppState = {\n      playlist: { currentTrack: 2, trackOrder: [1, 2, 3] },\n      media: { repeat: false },\n    } as any;\n    expect(getNextTrackId(state, -10)).toBe(1);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/selectors.ts",
    "content": "import {\n  AppState,\n  PlaylistTrack,\n  WebampWindow,\n  WindowId,\n  WindowInfo,\n  LoadedURLTrack,\n  WindowPositions,\n  PlaylistStyle,\n  TransitionType,\n  MediaStatus,\n  TimeMode,\n  SkinImages,\n  Cursors,\n  SkinRegion,\n  GenLetterWidths,\n  MilkdropMessage,\n  DummyVizData,\n} from \"./types\";\nimport { createSelector, defaultMemoize } from \"reselect\";\nimport * as Utils from \"./utils\";\nimport {\n  BANDS,\n  TRACK_HEIGHT,\n  WINDOW_RESIZE_SEGMENT_WIDTH,\n  WINDOW_RESIZE_SEGMENT_HEIGHT,\n  WINDOW_WIDTH,\n  MEDIA_STATUS,\n  MEDIA_TAG_REQUEST_STATUS,\n  WINDOWS,\n  VISUALIZERS,\n} from \"./constants\";\nimport { createPlaylistURL } from \"./playlistHtml\";\nimport * as fromTracks from \"./reducers/tracks\";\nimport * as fromDisplay from \"./reducers/display\";\nimport * as fromEqualizer from \"./reducers/equalizer\";\nimport * as fromMedia from \"./reducers/media\";\nimport * as fromWindows from \"./reducers/windows\";\nimport * as MarqueeUtils from \"./marqueeUtils\";\nimport { generateGraph } from \"./resizeUtils\";\nimport { SerializedStateV1 } from \"./serializedStates/v1Types\";\n\n// @ts-ignore\nimport butterchurnPresets from 'butterchurn-presets';\n\nexport const getSliders = (state: AppState) => state.equalizer.sliders;\n\nexport const getEqfData = createSelector(getSliders, (sliders) => {\n  const preset: { [key: string]: number | string } = {\n    name: \"Entry1\",\n    preamp: Utils.denormalizeEqBand(sliders.preamp),\n  };\n  BANDS.forEach((band) => {\n    preset[`hz${band}`] = Utils.denormalizeEqBand(sliders[band]);\n  });\n  const eqfData = {\n    presets: [preset],\n    type: \"Winamp EQ library file v1.1\",\n  };\n  return eqfData;\n});\n\nexport const getTracks = (state: AppState) => state.tracks;\nexport const getTrackUrl = (state: AppState) => {\n  return (id: number): string | null => {\n    return state.tracks[id]?.url;\n  };\n};\nexport const getTrackOrder = (state: AppState) => state.playlist.trackOrder;\n\nexport const getTrackCount = createSelector(\n  getTrackOrder,\n  (trackOrder) => trackOrder.length\n);\n\nexport const getOrderedTracks = createSelector(\n  getTracks,\n  getTrackOrder,\n  (tracks, trackOrder) => trackOrder.filter((id) => tracks[id])\n);\n\nexport const getUserTracks = createSelector(\n  getTracks,\n  getTrackOrder,\n  (tracks, trackOrder) =>\n    trackOrder.map((id) => {\n      const track = tracks[id];\n\n      return {\n        url: track.url,\n        metaData: {\n          artist: track.artist || \"\",\n          title: track.title || \"\",\n          album: track.album,\n          albumArtUrl: track.albumArtUrl || \"\",\n        },\n      };\n    })\n);\n\nconst getOrderedTrackObjects = createSelector(\n  getTracks,\n  getOrderedTracks,\n  (tracks, trackOrder): PlaylistTrack[] => trackOrder.map((id) => tracks[id])\n);\n\nexport const getSelectedTrackIds = (state: AppState): Set<number> => {\n  return state.playlist.selectedTracks;\n};\n\nexport const getSelectedTrackObjects = createSelector(\n  getOrderedTrackObjects,\n  getSelectedTrackIds,\n  (tracks, selectedIds) => tracks.filter((track) => selectedIds.has(track.id))\n);\n\n// If a duration is `null`, it counts as zero, which seems fine enough.\nconst runningTimeFromTracks = (tracks: PlaylistTrack[]) =>\n  tracks.reduce((time, track) => time + Number(track.duration), 0);\n\nconst getTotalRunningTime = createSelector(\n  getOrderedTrackObjects,\n  runningTimeFromTracks\n);\n\nconst getSelectedRunningTime = createSelector(\n  getSelectedTrackObjects,\n  runningTimeFromTracks\n);\n\n// Note: We should append \"+\" to these values if some of the tracks are of unknown time.\nexport const getRunningTimeMessage = createSelector(\n  getTotalRunningTime,\n  getSelectedRunningTime,\n  (totalRunningTime, selectedRunningTime) =>\n    `${Utils.getTimeStr(selectedRunningTime)}/${Utils.getTimeStr(\n      totalRunningTime\n    )}`\n);\n\n// TODO: use slectors to get memoization\nexport const getCurrentTrackIndex = (state: AppState): number => {\n  const { playlist } = state;\n  if (playlist.currentTrack == null) {\n    return -1;\n  }\n  return playlist.trackOrder.indexOf(playlist.currentTrack);\n};\n\nexport const getCurrentTrackNumber = createSelector(\n  getCurrentTrackIndex,\n  (currentTrackIndex) => currentTrackIndex + 1\n);\n\nexport const getCurrentTrackId = (state: AppState) =>\n  state.playlist.currentTrack;\n\n// TODO: Sigh... Technically, we should detect if we are looping only repeat if we are.\n// I think this would require pre-computing the \"random\" order of a playlist.\nexport const getRandomTrackId = (state: AppState): number | null => {\n  const {\n    playlist: { trackOrder, currentTrack },\n  } = state;\n  if (trackOrder.length === 0) {\n    return null;\n  }\n  let nextId;\n  do {\n    nextId = trackOrder[Math.floor(trackOrder.length * Math.random())];\n  } while (nextId === currentTrack && trackOrder.length > 1);\n  return nextId;\n};\n\nexport const getNextTrackId = (state: AppState, n = 1) => {\n  const {\n    playlist: { trackOrder },\n    media: { repeat, shuffle },\n  } = state;\n  if (shuffle) {\n    return getRandomTrackId(state);\n  }\n  const trackCount = getTrackCount(state);\n  if (trackCount === 0) {\n    return null;\n  }\n\n  const currentIndex = getCurrentTrackIndex(state);\n\n  let nextIndex = currentIndex + n;\n  if (repeat) {\n    nextIndex = nextIndex % trackCount;\n    if (nextIndex < 0) {\n      // Handle wrapping around backwards\n      nextIndex += trackCount;\n    }\n    return trackOrder[nextIndex];\n  }\n\n  if (currentIndex === trackCount - 1 && n > 0) {\n    return null;\n  } else if (currentIndex === 0 && n < 0) {\n    return null;\n  }\n\n  nextIndex = Utils.clamp(nextIndex, 0, trackCount - 1);\n  return trackOrder[nextIndex];\n};\n\nexport const getGenWindows = (state: AppState) => {\n  return state.windows.genWindows;\n};\n\nexport const getWindowOpen = createSelector(getGenWindows, (genWindows) => {\n  return (windowId: WindowId) => genWindows[windowId].open;\n});\n\nexport const getWindowHidden = createSelector(getGenWindows, (genWindows) => {\n  return (windowId: WindowId) => genWindows[windowId].hidden;\n});\n\nexport const getWindowShade = createSelector(getGenWindows, (genWindows) => {\n  return (windowId: WindowId) => genWindows[windowId].shade;\n});\n\nexport const getWindowSize = createSelector(getGenWindows, (genWindows) => {\n  return (windowId: WindowId) => genWindows[windowId].size;\n});\n\nexport const getWindowPositions = createSelector(\n  getGenWindows,\n  (windows): WindowPositions => Utils.objectMap(windows, (w) => w.position)\n);\n\nconst BASE_WINDOW_HEIGHT = 58;\nexport const getNumberOfVisibleTracks = createSelector(\n  getWindowSize,\n  (getWindowSize_) => {\n    const playlistSize = getWindowSize_(\"playlist\");\n    return Math.floor(\n      (BASE_WINDOW_HEIGHT + WINDOW_RESIZE_SEGMENT_HEIGHT * playlistSize[1]) /\n        TRACK_HEIGHT\n    );\n  }\n);\n\nexport const getOverflowTrackCount = createSelector(\n  getTrackCount,\n  getNumberOfVisibleTracks,\n  (trackCount, numberOfVisibleTracks) =>\n    Math.max(0, trackCount - numberOfVisibleTracks)\n);\n\nconst _getPlaylistScrollPosition = (state: AppState) =>\n  state.display.playlistScrollPosition;\n\nexport const getPlaylistScrollPosition = createSelector(\n  getOverflowTrackCount,\n  _getPlaylistScrollPosition,\n  (overflowTrackCount, playlistScrollPosition) => {\n    if (overflowTrackCount === 0) {\n      return 0;\n    }\n    return Math.round(\n      (Math.round((overflowTrackCount * playlistScrollPosition) / 100) /\n        overflowTrackCount) *\n        100\n    );\n  }\n);\n\nexport const getScrollOffset = createSelector(\n  _getPlaylistScrollPosition,\n  getTrackCount,\n  getNumberOfVisibleTracks,\n  (playlistScrollPosition, trackCount, numberOfVisibleTracks) => {\n    const overflow = Math.max(0, trackCount - numberOfVisibleTracks);\n    return Utils.percentToIndex(playlistScrollPosition / 100, overflow + 1);\n  }\n);\n\nexport const getVisibleTrackIds = createSelector(\n  getScrollOffset,\n  getTrackOrder,\n  getNumberOfVisibleTracks,\n  (offset, trackOrder, numberOfVisibleTracks) =>\n    trackOrder.slice(offset, offset + numberOfVisibleTracks)\n);\n\nexport function getAllTracksAreVisible(state: AppState): boolean {\n  return getVisibleTrackIds(state).length === state.playlist.trackOrder.length;\n}\n\nexport const getTrackIsVisibleFunction = createSelector(\n  getVisibleTrackIds,\n  (visibleTrackIds) => {\n    return (id: number) => visibleTrackIds.includes(id);\n  }\n);\n\nexport const getVisibleTracks = createSelector(\n  getVisibleTrackIds,\n  getTracks,\n  (visibleTrackIds, tracks) => visibleTrackIds.map((id) => tracks[id])\n);\n\nexport const getPlaylist = (state: AppState) => state.playlist;\n\nexport const getDuration = (state: AppState): number | null => {\n  const { playlist, tracks } = state;\n  if (playlist.currentTrack == null) {\n    return null;\n  }\n  const currentTrack = tracks[playlist.currentTrack];\n  return currentTrack && currentTrack.duration;\n};\n\nexport const getTrackDisplayName = createSelector(getTracks, (tracks) => {\n  return defaultMemoize((trackId: number | null) =>\n    fromTracks.getTrackDisplayName(tracks, trackId)\n  );\n});\n\nexport const getCurrentTrackDisplayName = createSelector(\n  getCurrentTrackId,\n  getTrackDisplayName,\n  (id, getName) => {\n    return getName(id);\n  }\n);\n\nexport const getMediaStatus = (state: AppState): MediaStatus | null => {\n  return state.media.status;\n};\n\nexport const getMediaIsPlaying = (state: AppState) =>\n  state.media.status === MEDIA_STATUS.PLAYING;\n\nexport const getCurrentTrack = createSelector(\n  getCurrentTrackId,\n  getTracks,\n  (trackId, tracks): PlaylistTrack | null => {\n    return trackId == null ? null : tracks[trackId];\n  }\n);\nexport const getCurrentlyPlayingTrackIdIfLoaded = createSelector(\n  getMediaIsPlaying,\n  getCurrentTrack,\n  (mediaIsPlaying, currentTrack) => {\n    if (\n      !mediaIsPlaying ||\n      !currentTrack ||\n      currentTrack.mediaTagsRequestStatus ===\n        MEDIA_TAG_REQUEST_STATUS.INITIALIZED\n    ) {\n      return null;\n    }\n    return currentTrack.id;\n  }\n);\n\nexport const getCurrentTrackInfo = createSelector(\n  getCurrentTrack,\n  (track: PlaylistTrack | null): LoadedURLTrack | null => {\n    if (track == null) {\n      return null;\n    }\n    return {\n      url: track.url,\n      metaData: {\n        title: track.title || null,\n        artist: track.artist || null,\n        album: track.album || null,\n        albumArtUrl: track.albumArtUrl || null,\n      },\n    };\n  }\n);\n\nexport const getMinimalMediaText = createSelector(\n  getCurrentTrackNumber,\n  getCurrentTrackDisplayName,\n  (trackNumber, name) => (name == null ? null : `${trackNumber}. ${name}`)\n);\n\nexport const getMediaText = createSelector(\n  getMinimalMediaText,\n  getDuration,\n  (minimalMediaText, duration) =>\n    minimalMediaText == null\n      ? null\n      : `${minimalMediaText} (${Utils.getTimeStr(duration)})`\n);\n\nexport const getNumberOfTracks = (state: AppState) =>\n  getTrackOrder(state).length;\nconst getPlaylistDuration = createSelector(getTracks, (tracks) =>\n  Object.values(tracks).reduce(\n    (total, track) => total + (track.duration || 0),\n    0\n  )\n);\n\nexport const getPlaylistURL = createSelector(\n  getNumberOfTracks,\n  getPlaylistDuration,\n  getTrackOrder,\n  getTracks,\n  getTrackDisplayName,\n  (numberOfTracks, playlistDuration, trackOrder, tracks, getDisplayName) =>\n    createPlaylistURL({\n      numberOfTracks,\n      averageTrackLength: Utils.getTimeStr(playlistDuration / numberOfTracks),\n      // TODO: Handle hours\n      playlistLengthMinutes: Math.floor(playlistDuration / 60),\n      playlistLengthSeconds: Math.floor(playlistDuration % 60),\n      tracks: trackOrder.map(\n        (id, i) =>\n          `${i + 1}. ${getDisplayName(id)} (${Utils.getTimeStr(\n            tracks[id].duration\n          )})`\n      ),\n    })\n);\n\nconst WINDOW_HEIGHT = 116;\nconst SHADE_WINDOW_HEIGHT = 14;\n\nfunction getWPixelSize(w: WebampWindow, doubled: boolean) {\n  const [width, height] = w.size;\n  let doubledMultiplier = doubled && w.canDouble ? 2 : 1;\n  if (w.title == \"Playlist Editor\" ) { doubledMultiplier = 1 }\n  const pix = {\n    height: WINDOW_HEIGHT + height * WINDOW_RESIZE_SEGMENT_HEIGHT,\n    width: WINDOW_WIDTH + width * WINDOW_RESIZE_SEGMENT_WIDTH,\n  };\n  return {\n    height: (w.shade ? SHADE_WINDOW_HEIGHT : pix.height) * doubledMultiplier,\n    width: pix.width * doubledMultiplier,\n  };\n}\n\nexport function getFocusedWindow(state: AppState): WindowId | null {\n  return state.windows.focused;\n}\n\nexport function getWindowPosition(state: AppState) {\n  return (windowId: WindowId) => state.windows.genWindows[windowId].position;\n}\n\nexport function getPositionsAreRelative(state: AppState) {\n  return state.windows.positionsAreRelative;\n}\n\nexport function getDoubled(state: AppState) {\n  return state.display.doubled;\n}\n\nexport function getLlamaMode(state: AppState) {\n  return state.display.llama;\n}\n\nexport function getZIndex(state: AppState): number {\n  return state.display.zIndex;\n}\n\n// TODO: This is poorly memoized. It invalidates when a window moves.\nexport const getWindowSizes = createSelector(\n  getGenWindows,\n  getDoubled,\n  (windows, doubled) => {\n    return Utils.objectMap(windows, (w) => getWPixelSize(w, doubled));\n  }\n);\n\nexport const getWindowPixelSize = createSelector(getWindowSizes, (sizes) => {\n  return (windowId: WindowId) => sizes[windowId];\n});\n\nconst getWindowOrder = (state: AppState): WindowId[] =>\n  state.windows.windowOrder;\n\nexport const getNormalizedWindowOrder = createSelector(\n  getWindowOrder,\n  getGenWindows,\n  (windowOrder, genWindows): WindowId[] => {\n    return [\n      WINDOWS.MAIN,\n      ...windowOrder.filter(\n        (windowId) => windowId !== WINDOWS.MAIN && genWindows[windowId] != null\n      ),\n    ];\n  }\n);\n\n// TODO: Now that both size and position are stored on genWindows this seems a bit silly.\nexport const getWindowsInfo = createSelector(\n  getWindowSizes,\n  getWindowPositions,\n  getNormalizedWindowOrder,\n  (sizes, positions, windowOrder): WindowInfo[] => {\n    return windowOrder.map((key) => ({\n      key,\n      ...sizes[key],\n      ...positions[key],\n    }));\n  }\n);\n\nexport const getWindowGraph = createSelector(getWindowsInfo, generateGraph);\n\nconst defaultPlaylistStyle = {\n  normal: \"#00FF00\",\n  current: \"#FFFFFF\",\n  normalbg: \"#000000\",\n  selectedbg: \"#0000C6\",\n  font: \"Arial\",\n};\n\nexport function getSkinColors(state: AppState): string[] {\n  return state.display.skinColors;\n}\n\nexport const getSkinPlaylistStyle = (state: AppState): PlaylistStyle => {\n  return state.display.skinPlaylistStyle || defaultPlaylistStyle;\n};\n\nexport const getVisualizerStyle = (state: AppState): string => {\n  const milkdrop = state.windows.genWindows[WINDOWS.MILKDROP];\n  if (milkdrop != null && milkdrop.open) {\n    return VISUALIZERS.MILKDROP;\n  }\n  return fromDisplay.getVisualizerStyle(state.display);\n};\n\nexport const getVolume = (state: AppState) => state.media.volume;\nexport const getBalance = (state: AppState) => state.media.balance;\nexport const getShuffle = (state: AppState) => state.media.shuffle;\nexport const getRepeat = (state: AppState) => state.media.repeat;\n\nexport const getChannels = createSelector(\n  getCurrentTrack,\n  (track: PlaylistTrack | null): number | null => {\n    return track != null ? track.channels || null : null;\n  }\n);\n\nexport const getTimeElapsed = (state: AppState): number => {\n  return state.media.timeElapsed;\n};\n\nexport function getSerlializedState(state: AppState): SerializedStateV1 {\n  return {\n    version: 1,\n    media: fromMedia.getSerializedState(state.media),\n    equalizer: fromEqualizer.getSerializedState(state.equalizer),\n    display: fromDisplay.getSerializedState(state.display),\n    windows: fromWindows.getSerializedState(state.windows),\n  };\n}\n\nexport function getEqualizerEnabled(state: AppState): boolean {\n  return state.equalizer.on;\n}\n\nexport function getEqualizerAuto(state: AppState): boolean {\n  return state.equalizer.auto;\n}\n\nexport function getBrowserWindowSize(\n  state: AppState\n): { height: number; width: number } {\n  return state.windows.browserWindowSize;\n}\n\nexport const getOpenWindows = createSelector(getGenWindows, (genWindows) =>\n  Utils.objectFilter(genWindows, (w) => w.open)\n);\n\nexport const getStackedLayoutPositions = createSelector(\n  getOpenWindows,\n  getDoubled,\n  (openWindows, doubled): WindowPositions => {\n    let offset = 0;\n    return Utils.objectMap(openWindows, (w) => {\n      const position = { x: 0, y: offset };\n      offset += getWPixelSize(w, doubled).height;\n      return position;\n    });\n  }\n);\n\nexport const getUserInputFocus = (state: AppState): string | null => {\n  return state.userInput.focus;\n};\n\nexport const getUserInputScrubPosition = (state: AppState): number => {\n  return state.userInput.scrubPosition;\n};\n// TODO: Make this a reselect selector\nexport const getMarqueeText = (state: AppState): string => {\n  const defaultText = \"Winamp 2.91\";\n  if (state.userInput.userMessage != null) {\n    return state.userInput.userMessage;\n  }\n  switch (getUserInputFocus(state)) {\n    case \"balance\":\n      return MarqueeUtils.getBalanceText(state.media.balance);\n    case \"volume\":\n      return MarqueeUtils.getVolumeText(state.media.volume);\n    case \"position\":\n      const duration = getDuration(state);\n      if (duration == null) {\n        // This probably can't ever happen.\n        return defaultText;\n      }\n      return MarqueeUtils.getPositionText(\n        duration,\n        getUserInputScrubPosition(state)\n      );\n    case \"double\":\n      return MarqueeUtils.getDoubleSizeModeText(state.display.doubled);\n    case \"eq\":\n      const band = state.userInput.bandFocused;\n      if (band == null) {\n        // This probably can't ever happen.\n        return defaultText;\n      }\n      return MarqueeUtils.getEqText(band, state.equalizer.sliders[band]);\n    default:\n      break;\n  }\n  if (state.playlist.currentTrack != null) {\n    const mediaText = getMediaText(state);\n    if (mediaText == null) {\n      // This probably can't ever happen.\n      return defaultText;\n    }\n    return mediaText;\n  }\n  return defaultText;\n};\n\nexport const getKbps = createSelector(\n  getCurrentTrack,\n  (track: PlaylistTrack | null): string | null => {\n    return track != null ? track.kbps || null : null;\n  }\n);\n\nexport const getKhz = createSelector(\n  getCurrentTrack,\n  (track: PlaylistTrack | null): string | null => {\n    return track != null ? track.khz || null : null;\n  }\n);\n\nexport function getDebugData(state: AppState) {\n  return {\n    ...state,\n    display: {\n      ...state.display,\n      skinGenLetterWidths: \"[[REDACTED]]\",\n      skinImages: \"[[REDACTED]]\",\n      skinCursors: \"[[REDACTED]]\",\n      skinRegion: \"[[REDACTED]]\",\n    },\n  };\n}\n\nexport function getMilkdropMessage(state: AppState): MilkdropMessage | null {\n  return state.milkdrop.message;\n}\n\nexport function getMilkdropWindowEnabled(state: AppState): boolean {\n  return state.milkdrop.display === \"WINDOW\";\n}\n\nexport function getMilkdropDesktopEnabled(state: AppState): boolean {\n  return state.milkdrop.display === \"DESKTOP\";\n}\n\nexport function getMilkdropFullscreenEnabled(state: AppState): boolean {\n  return state.milkdrop.display === \"FULLSCREEN\";\n}\n\nexport function getMilkdropLockEnabled(state: AppState): boolean {\n  return state.milkdrop.lock;\n}\n\nexport function getPresets(state: AppState): any {\n  return butterchurnPresets.getPresets();\n}\n\nexport function getButterchurn(state: AppState): any {\n  return state.milkdrop.butterchurn;\n}\n\nexport function getPresetTransitionType(state: AppState): TransitionType {\n  return state.milkdrop.transitionType;\n}\n\nexport function getCurrentPresetIndex(state: AppState): number | null {\n  return state.milkdrop.currentPresetIndex;\n}\nexport function getCurrentPreset(state: AppState): any | null {\n  const index = getCurrentPresetIndex(state);\n  if (index == null) {\n    return null;\n  }\n  const preset = butterchurnPresets.getPresets()[index];\n\n  if (preset == null) {\n    return null;\n  }\n  return preset;\n}\n\nexport function getPresetNames(state: AppState): string[] {\n  return state.milkdrop.presets.map((preset) => preset.name);\n}\n\nexport function getPresetOverlayOpen(state: AppState): boolean {\n  return state.milkdrop.overlay;\n}\n\nexport function getPresetsAreCycling(state: AppState): boolean {\n  return state.milkdrop.cycling;\n}\n\nexport function getRandomizePresets(state: AppState): boolean {\n  return state.milkdrop.randomize;\n}\n\nexport function getClosed(state: AppState): boolean {\n  return state.display.closed;\n}\n\nexport function getSkinImages(state: AppState): SkinImages {\n  return state.display.skinImages;\n}\n\nexport function getSkinCursors(state: AppState): Cursors | null {\n  return state.display.skinCursors;\n}\n\nexport function getSkinRegion(state: AppState): SkinRegion {\n  return state.display.skinRegion;\n}\n\nexport function getSkinLetterWidths(state: AppState): GenLetterWidths | null {\n  return state.display.skinGenLetterWidths;\n}\n\nexport function getPreampLineUrl(state: AppState): string | null {\n  return state.display.skinImages.EQ_PREAMP_LINE;\n}\n\nexport function getLineColorsUrl(state: AppState): string | null {\n  return state.display.skinImages.EQ_GRAPH_LINE_COLORS;\n}\n\nexport const getPreampLineImage = createSelector(\n  getPreampLineUrl,\n  async (url): Promise<HTMLImageElement | null> => {\n    if (url == null) {\n      return null;\n    }\n    return Utils.imgFromUrl(url);\n  }\n);\n\nexport const getLineColorsImage = createSelector(\n  getLineColorsUrl,\n  async (url): Promise<HTMLImageElement | null> => {\n    if (url == null) {\n      return null;\n    }\n    return Utils.imgFromUrl(url);\n  }\n);\n\nexport function getDummyVizData(state: AppState): DummyVizData | null {\n  return state.display.dummyVizData;\n}\n\nexport function getMarqueeStep(state: AppState): number {\n  return state.display.marqueeStep;\n}\n\nexport function getNetworkConnected(state: AppState): boolean {\n  return state.network.connected;\n}\n\nexport function getTimeMode(state: AppState): TimeMode {\n  return state.media.timeMode;\n}\n\nexport function getLoading(state: AppState): boolean {\n  return state.display.loading;\n}\n\nexport function getWorking(state: AppState): boolean {\n  return state.display.working;\n}\n\nexport function getAvaliableSkins(state: AppState) {\n  return state.settings.availableSkins;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/serialization.test.ts",
    "content": "import fs from \"fs\";\nimport path from \"path\";\nimport reducer from \"./reducers\";\nimport * as Selectors from \"./selectors\";\nimport * as Actions from \"./actionCreators\";\nimport { kebabCase } from \"lodash\";\n\nimport { createStore, applyMiddleware } from \"redux\";\nimport thunk from \"redux-thunk\";\nimport { LOAD_SERIALIZED_STATE } from \"./actionTypes\";\nimport { SerializedStateV1 } from \"./serializedStates/v1Types\";\nimport { AppState, Action } from \"./types\";\n\nfunction fixturePath(name: string) {\n  return path.join(\n    __dirname,\n    \"__tests__/fixtures/serializedState/v1/\",\n    `${kebabCase(name)}.json`\n  );\n}\n\nfunction writeFixture(name: string, state: SerializedStateV1) {\n  fs.writeFileSync(fixturePath(name), JSON.stringify(state, null, 4));\n}\n\nfunction readFixture(name: string): SerializedStateV1 {\n  return JSON.parse(fs.readFileSync(fixturePath(name), \"utf8\"));\n}\n\ninterface SerializationTestParams<T> {\n  name: string;\n  action: Action;\n  selector(state: AppState): T;\n  expected: T;\n}\n\nfunction testSerialization<T>({\n  name,\n  action,\n  selector,\n  expected,\n}: SerializationTestParams<T>) {\n  test(name, () => {\n    const firstStore = getStore();\n    // Does not match the expected selection in the initial state\n    expect(selector(firstStore.getState())).not.toEqual(expected);\n\n    firstStore.dispatch(action);\n    // Ensure we actually changed something\n    expect(firstStore.getState()).not.toEqual(getStore().getState());\n\n    // Ensure the expectation is true before we serialize\n    expect(selector(firstStore.getState())).toEqual(expected);\n\n    const serializedState = Selectors.getSerlializedState(\n      firstStore.getState()\n    );\n\n    if (!fs.existsSync(fixturePath(name))) {\n      writeFixture(name, serializedState);\n      console.warn(\"Wrote new fixture: \", fixturePath(name));\n    }\n\n    const readSerializedState = readFixture(name);\n\n    // Ensure our serialization strategy hasn't changed since we last serialized\n    expect(readSerializedState).toEqual(serializedState);\n\n    // Try to apply this serialized state to the default state\n    const secondStore = getStore();\n    secondStore.dispatch({\n      type: LOAD_SERIALIZED_STATE,\n      serializedState: readSerializedState,\n    });\n\n    // Ensure our restored state conforms to expectation\n    expect(selector(secondStore.getState())).toEqual(expected);\n\n    // TODO: Try to apply the serialized state to a complex non-initial state\n  });\n}\n\nfunction getStore() {\n  const extras = {};\n  const enhancer = applyMiddleware(thunk.withExtraArgument(extras));\n  return createStore(reducer, enhancer);\n}\n\ndescribe(\"can serialize\", () => {\n  test(\"the initial state\", () => {\n    const store = getStore();\n    const serializedState = Selectors.getSerlializedState(store.getState());\n    expect(serializedState).toMatchSnapshot();\n\n    const newStore = getStore();\n    newStore.dispatch({\n      type: LOAD_SERIALIZED_STATE,\n      serializedState,\n    });\n    expect(store.getState()).toEqual(newStore.getState());\n  });\n\n  /* Media */\n  testSerialization({\n    name: \"volume\",\n    action: Actions.setVolume(50),\n    selector: Selectors.getVolume,\n    expected: 50,\n  });\n\n  testSerialization({\n    name: \"balance\",\n    action: Actions.setBalance(40),\n    selector: Selectors.getBalance,\n    expected: 40,\n  });\n\n  testSerialization({\n    name: \"shuffle\",\n    action: Actions.toggleShuffle(),\n    selector: Selectors.getShuffle,\n    expected: true,\n  });\n\n  testSerialization({\n    name: \"repeat\",\n    action: Actions.toggleRepeat(),\n    selector: Selectors.getRepeat,\n    expected: true,\n  });\n\n  /* Equalizer */\n  testSerialization({\n    name: \"equalizer on\",\n    // @ts-ignore\n    action: Actions.toggleEq(),\n    selector: Selectors.getEqualizerEnabled,\n    expected: false,\n  });\n\n  testSerialization({\n    name: \"equalizer band\",\n    action: Actions.setEqBand(60, 100),\n    selector: (state) => Selectors.getSliders(state)[60],\n    expected: 100,\n  });\n\n  testSerialization({\n    name: \"equalizer preamp\",\n    action: Actions.setPreamp(10),\n    selector: (state) => Selectors.getSliders(state).preamp,\n    expected: 10,\n  });\n\n  /* Display */\n  testSerialization({\n    name: \"double mode\",\n    // @ts-ignore\n    action: Actions.toggleDoubleSizeMode(),\n    selector: Selectors.getDoubled,\n    expected: true,\n  });\n\n  testSerialization({\n    name: \"llama mode\",\n    action: Actions.toggleLlamaMode(),\n    selector: Selectors.getLlamaMode,\n    expected: true,\n  });\n\n  // TODO\n  // * marqueeStep\n  // * skinImages\n  // * skinCursors\n  // * skinRegion\n  // * skinGenLetterWidths\n  // * skinColors\n  // * skinPlaylistStyle\n  // * focused\n\n  /* Gen Windows */\n  testSerialization({\n    name: \"window size\",\n    action: Actions.setWindowSize(\"playlist\", [4, 5]),\n    selector: (state) => Selectors.getWindowSize(state)(\"playlist\"),\n    expected: [4, 5],\n  });\n\n  testSerialization({\n    name: \"window open\",\n    action: Actions.closeWindow(\"playlist\"),\n    selector: (state) => Selectors.getWindowOpen(state)(\"playlist\"),\n    expected: false,\n  });\n\n  testSerialization({\n    name: \"window hidden\",\n    action: Actions.hideWindow(\"playlist\"),\n    selector: (state) => Selectors.getWindowHidden(state)(\"playlist\"),\n    expected: true,\n  });\n\n  testSerialization({\n    name: \"window shade\",\n    // @ts-ignore\n    action: Actions.toggleEqualizerShadeMode(),\n    selector: (state) => Boolean(Selectors.getWindowShade(state)(\"equalizer\")),\n    expected: true,\n  });\n\n  testSerialization({\n    name: \"main window position\",\n    action: Actions.updateWindowPositions({ main: { x: 100, y: 100 } }),\n    selector: (state) => Selectors.getWindowPosition(state)(\"main\"),\n    expected: { x: 100, y: 100 },\n  });\n\n  testSerialization({\n    name: \"window positions are relative\",\n    action: Actions.updateWindowPositions({ main: { x: 100, y: 100 } }, true),\n    selector: Selectors.getPositionsAreRelative,\n    expected: false,\n  });\n\n  testSerialization({\n    name: \"focused window\",\n    action: Actions.setFocusedWindow(\"equalizer\"),\n    selector: (state) => Selectors.getFocusedWindow(state),\n    expected: \"equalizer\",\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/serializedStates/v1Types.ts",
    "content": "/**\n * NOTE: This file must not import any other types\n */\n\nexport interface WindowsSerializedStateV1 {\n  positionsAreRelative: boolean;\n  genWindows: {\n    [windowId: string]: {\n      size: [number, number];\n      open: boolean;\n      hidden: boolean;\n      shade: boolean;\n      position: { x: number; y: number };\n    };\n  };\n  focused: string | null;\n}\n\nexport interface DisplaySerializedStateV1 {\n  visualizerStyle: number;\n  doubled: boolean;\n  llama: boolean;\n  marqueeStep: number;\n  skinImages: { [sprite: string]: string };\n  skinCursors: { [cursor: string]: string } | null;\n  skinRegion: { [windowName: string]: string[] };\n  skinGenLetterWidths: { [letter: string]: number } | null;\n  skinColors: string[]; // Theoretically this could be a tuple of a specific length\n  skinPlaylistStyle: {\n    normal: string;\n    current: string;\n    normalbg: string;\n    selectedbg: string;\n    font: string;\n  } | null;\n}\n\nexport interface EqualizerSerializedStateV1 {\n  on: boolean;\n  auto: boolean;\n  sliders: Record<\n    | 60\n    | 170\n    | 310\n    | 600\n    | 1000\n    | 3000\n    | 6000\n    | 12000\n    | 14000\n    | 16000\n    | \"preamp\",\n    number\n  >;\n}\n\nexport interface MediaSerializedStateV1 {\n  volume: number;\n  balance: number;\n  shuffle: boolean;\n  repeat: boolean;\n}\n\nexport interface SerializedStateV1 {\n  version: 1;\n  windows: WindowsSerializedStateV1;\n  media: MediaSerializedStateV1;\n  display: DisplaySerializedStateV1;\n  equalizer: EqualizerSerializedStateV1;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/skinParser.js",
    "content": "import SKIN_SPRITES from \"./skinSprites\";\nimport regionParser from \"./regionParser\";\nimport { LETTERS, DEFAULT_SKIN } from \"./constants\";\nimport { parseViscolors } from \"./utils\";\nimport * as SkinParserUtils from \"./skinParserUtils\";\n\nconst shallowMerge = (objs) =>\n  objs.reduce((prev, img) => Object.assign(prev, img), {});\n\nconst CURSORS = [\n  \"CLOSE\",\n  \"EQCLOSE\",\n  \"EQNORMAL\",\n  \"EQSLID\",\n  \"EQTITLE\",\n  \"MAINMENU\",\n  \"MMENU\",\n  \"MIN\",\n  \"NORMAL\",\n  \"PCLOSE\",\n  \"PNORMAL\",\n  \"POSBAR\",\n  \"PSIZE\",\n  \"PTBAR\",\n  \"PVSCROLL\",\n  \"PWINBUT\",\n  \"PWSNORM\",\n  \"PWSSIZE\",\n  \"SONGNAME\",\n  \"TITLEBAR\",\n  \"VOLBAL\",\n  \"WINBUT\",\n  \"WSNORMAL\",\n  \"WSPOSBAR\",\n  /*\n   * > There are usually 4 more cursors in the skins: volbar.cur, wsclose.cur,\n   * > wswinbut.cur, wsmin.cur, but they are never used, at least in the last\n   * > versions of winamp, so there's no need of including them. The cursors\n   * > shown when the mouse is over the app-buttons are the same in normal and\n   * > winshade mode, except for the main menu button. You can make animated\n   * > cursors, but you have to name them with the extension .cur (animated\n   * > cursors are usually .ani files).\n   *\n   * -- Skinners Atlas\n   *\n   * \"VOLBAR\",\n   * \"WSCLOSE\",\n   * \"WSWINBUT\",\n   * \"WSMIN\",\n   *\n   */\n];\n\nasync function genVizColors(zip) {\n  const viscolor = await SkinParserUtils.getFileFromZip(\n    zip,\n    \"VISCOLOR\",\n    \"txt\",\n    \"text\"\n  );\n  return viscolor ? parseViscolors(viscolor.contents) : DEFAULT_SKIN.colors;\n}\n\nasync function genImages(zip) {\n  const imageObjs = await Promise.all(\n    Object.keys(SKIN_SPRITES).map((fileName) =>\n      SkinParserUtils.getSpriteUrisFromFilename(zip, fileName)\n    )\n  );\n  // Merge all the objects into a single object. Tests assert that sprite keys are unique.\n  return shallowMerge(imageObjs);\n}\nasync function genCursors(zip) {\n  const cursorObjs = await Promise.all(\n    CURSORS.map(async (cursorName) => ({\n      [cursorName]: await SkinParserUtils.getCursorFromFilename(\n        zip,\n        cursorName\n      ),\n    }))\n  );\n  return shallowMerge(cursorObjs);\n}\n\nasync function genRegion(zip) {\n  const region = await SkinParserUtils.getFileFromZip(\n    zip,\n    \"REGION\",\n    \"txt\",\n    \"text\"\n  );\n  return region ? regionParser(region.contents) : {};\n}\n\nasync function genGenTextSprites(zip) {\n  const img = await SkinParserUtils.getImgFromFilename(zip, \"GEN\");\n  if (img == null) {\n    return null;\n  }\n\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n  canvas.width = img.width;\n  canvas.height = img.height;\n  context.drawImage(img, 0, 0);\n\n  const getLetters = (y, prefix) => {\n    const getColorAt = (x) => context.getImageData(x, y, 1, 1).data.join(\",\");\n\n    let x = 1;\n    const backgroundColor = getColorAt(0);\n\n    const height = 7;\n    return LETTERS.map((letter) => {\n      let nextBackground = x;\n      while (\n        getColorAt(nextBackground) !== backgroundColor &&\n        nextBackground < canvas.width\n      ) {\n        nextBackground++;\n      }\n      const width = nextBackground - x;\n      const name = `${prefix}_${letter}`;\n      const sprite = { x, y, height, width, name };\n      x = nextBackground + 1;\n      return sprite;\n    });\n  };\n\n  const letterWidths = {};\n  const sprites = [\n    ...getLetters(88, \"GEN_TEXT_SELECTED\"),\n    ...getLetters(96, \"GEN_TEXT\"),\n  ];\n  sprites.forEach((sprite) => {\n    letterWidths[sprite.name] = sprite.width;\n  });\n  return [letterWidths, SkinParserUtils.getSpriteUrisFromImg(img, sprites)];\n}\n\n// A promise that, given an array buffer returns a skin style object\nasync function skinParser(zipFileBuffer, JSZip) {\n  const zip = await JSZip.loadAsync(zipFileBuffer);\n\n  const [\n    colors,\n    playlistStyle,\n    images,\n    cursors,\n    region,\n    genTextSprites,\n    genExColors,\n  ] = await Promise.all([\n    genVizColors(zip),\n    SkinParserUtils.getPlaylistStyle(zip),\n    genImages(zip),\n    genCursors(zip),\n    genRegion(zip),\n    genGenTextSprites(zip),\n    SkinParserUtils.getGenExColors(zip),\n  ]);\n\n  const [genLetterWidths, genTextImages] = genTextSprites || [null, {}];\n\n  return {\n    colors,\n    playlistStyle,\n    images: { ...images, ...genTextImages },\n    genLetterWidths,\n    cursors,\n    region,\n    genExColors,\n  };\n}\n\nexport default skinParser;\n"
  },
  {
    "path": "webamp/packages/webamp/js/skinParserUtils.ts",
    "content": "import JSZip from \"jszip\";\nimport { PlaylistStyle, SkinGenExColors, CursorImage } from \"./types\";\nimport SKIN_SPRITES, { Sprite } from \"./skinSprites\";\nimport { DEFAULT_SKIN } from \"./constants\";\nimport * as Utils from \"./utils\";\nimport * as FileUtils from \"./fileUtils\";\n\nexport const getFileExtension = (fileName: string): string | null => {\n  const matches = /\\.([a-z]{3,4})$/i.exec(fileName);\n  return matches ? matches[1].toLowerCase() : null;\n};\n\nfunction getFilenameRegex(base: string, ext: string): RegExp {\n  return new RegExp(`^(.*/)?${base}.(${ext})$`, \"i\");\n}\n\nexport async function getFileFromZip(\n  zip: JSZip,\n  fileName: string,\n  ext: string,\n  mode: \"blob\" | \"text\" | \"base64\" | \"uint8array\"\n) {\n  const files = zip.file(getFilenameRegex(fileName, ext));\n  if (!files.length) {\n    return null;\n  }\n\n  // Windows file system is case insensitve, but zip files are not.\n  // This means that it's possible for a zip to contain both `main.bmp` _and_\n  // `main.BMP` but in Winamp only one will be materialized onto disk when\n  // decompressing. I suspect that in this case later files in the archive\n  // overwrite earlier ones. To mimic that behavior we use the last matching\n  // file.\n  //\n  // This works because `JSZip.file` filters the files by iterating the\n  // underlying `files` object under the hood:\n  // https://github.com/Stuk/jszip/blob/25d401e104926fef8528d670ecfe53f14e77a297/lib/object.js#L182\n  // Since JavaScript objects are iterable in the order that the keys were\n  // added this _should_ mean that by taking the last file here we will get\n  // the last file that JSZip extracted.\n  const lastFile = files[files.length - 1];\n\n  try {\n    const contents = await lastFile.async(mode);\n    return { contents, name: lastFile.name };\n  } catch (e) {\n    console.warn(\n      `Failed to extract \"${fileName}.${ext}\" from the skin archive.`\n    );\n    return null;\n  }\n}\n\nfunction fallbackGetImgFromBlob(blob: Blob): Promise<HTMLImageElement> {\n  return Utils.imgFromUrl(URL.createObjectURL(blob));\n}\n\nexport async function getImgFromBlob(\n  blob: Blob\n): Promise<ImageBitmap | HTMLImageElement | null> {\n  try {\n    // Use this faster native browser API if available.\n    // NOTE: In some browsers `window.createImageBitmap` may not exist so this will throw.\n    return await window.createImageBitmap(blob);\n  } catch (e) {\n    try {\n      return await fallbackGetImgFromBlob(blob);\n    } catch (ee) {\n      // Like Winamp we will silently fail on images that don't parse.\n      return null;\n    }\n  }\n}\n\nexport function getSpriteUrisFromImg(\n  img: HTMLImageElement | ImageBitmap,\n  sprites: Sprite[]\n): { [spriteName: string]: string } {\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n  if (context == null) {\n    throw new Error(\"Failed to get canvas context\");\n  }\n  const images: { [spriteName: string]: string } = {};\n  sprites.forEach((sprite) => {\n    canvas.height = sprite.height;\n    canvas.width = sprite.width;\n\n    context.drawImage(img, -sprite.x, -sprite.y);\n    const image = canvas.toDataURL();\n    images[sprite.name] = image;\n  });\n  return images;\n}\n\nexport async function getImgFromFilename(\n  zip: JSZip,\n  fileName: string\n): Promise<HTMLImageElement | ImageBitmap | null> {\n  // Winamp only supports .bmp images, but WACUP set a precidence of supporting\n  // .png as well to reduce size. Since we care about size as well, we follow\n  // suit. Our default skin uses .png to save 14kb.\n  const file = await getFileFromZip(zip, fileName, \"(png|bmp)\", \"blob\");\n  if (!file) {\n    return null;\n  }\n\n  const mimeType = `image/${getFileExtension(file.name) || \"*\"}`;\n  // The spec for createImageBitmap() says the browser should try to sniff the\n  // mime type, but it looks like Firefox does not. So we specify it here\n  // explicitly.\n  const typedBlob = new Blob([file.contents], { type: mimeType });\n  return getImgFromBlob(typedBlob);\n}\n\nexport async function getSpriteUrisFromFilename(\n  zip: JSZip,\n  fileName: string\n): Promise<{ [spriteName: string]: string }> {\n  const img = await getImgFromFilename(zip, fileName);\n  if (img == null) {\n    return {};\n  }\n  return getSpriteUrisFromImg(img, SKIN_SPRITES[fileName]);\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/xaudio2/resource-interchange-file-format--riff-\nconst RIFF_MAGIC = \"RIFF\".split(\"\").map((c) => c.charCodeAt(0));\n\nfunction arrayStartsWith(arr: Uint8Array, matcher: number[]): boolean {\n  return matcher.every((item, i) => arr[i] === item);\n}\n\nexport async function getCursorFromFilename(\n  zip: JSZip,\n  fileName: string\n): Promise<CursorImage | null> {\n  const file = await getFileFromZip(zip, fileName, \"CUR\", \"uint8array\");\n  if (file == null) {\n    return null;\n  }\n  const contents = file.contents as Uint8Array;\n  if (arrayStartsWith(contents, RIFF_MAGIC)) {\n    try {\n      return { type: \"ani\", aniData: contents };\n    } catch (e) {\n      console.error(e);\n      return null;\n    }\n  }\n\n  return { type: \"cur\", url: FileUtils.curUrlFromByteArray(contents) };\n}\n\nexport async function getPlaylistStyle(zip: JSZip): Promise<PlaylistStyle> {\n  const files = zip.file(getFilenameRegex(\"PLEDIT\", \"txt\"));\n  const file = files[0];\n  if (file == null) {\n    return DEFAULT_SKIN.playlistStyle;\n  }\n  const ini = await file.async(\"text\");\n  if (ini == null) {\n    return DEFAULT_SKIN.playlistStyle;\n  }\n  const data = ini && Utils.parseIni(ini).text;\n  if (!data) {\n    // Corrupt or missing PLEDIT.txt file.\n    return DEFAULT_SKIN.playlistStyle;\n  }\n\n  // Winamp seems to permit colors that contain too many characters.\n  // For compatibility with existing skins, we normalize them here.\n  [\"normal\", \"current\", \"normalbg\", \"selectedbg\", \"mbFG\", \"mbBG\"].forEach(\n    (colorKey) => {\n      let color = data[colorKey];\n      if (!color) {\n        return;\n      }\n      if (color[0] !== \"#\") {\n        color = `#${color}`;\n      }\n      data[colorKey] = color.slice(0, 7);\n    }\n  );\n\n  return { ...DEFAULT_SKIN.playlistStyle, ...data };\n}\n\nexport async function getGenExColors(\n  zip: JSZip\n): Promise<null | SkinGenExColors> {\n  const img = await getImgFromFilename(zip, \"GENEX\");\n  if (img == null) {\n    return null;\n  }\n\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n  if (context == null) {\n    return null;\n  }\n  canvas.width = img.width;\n  canvas.height = img.height;\n  context.drawImage(img, 0, 0);\n\n  const getColorAt = (x: number): string =>\n    `rgb(${context\n      .getImageData(x, 0, 1, 1)\n      // Discard the alpha channel\n      .data.slice(0, 3)\n      .join(\",\")})`;\n\n  // Ideally we would just have a map from key to the x value and map over\n  // that with getColorAt, but I don't know a great way to make that type\n  // safe. So, we'll just do this for now, where we explicitly call getColorAt\n  // for each key.\n  return {\n    // (1) x=48: item background (background to edits, listviews, etc.)\n    itemBackground: getColorAt(48),\n    // (2) x=50: item foreground (text colour of edits, listviews, etc.)\n    itemForeground: getColorAt(50),\n    // (3) x=52: window background (used to set the bg color for the dialog)\n    windowBackground: getColorAt(52),\n    // (4) x=54: button text colour\n    buttonText: getColorAt(54),\n    // (5) x=56: window text colour\n    windowText: getColorAt(56),\n    // (6) x=58: colour of dividers and sunken borders\n    divider: getColorAt(58),\n    // (7) x=60: selection colour for entries inside playlists (nothing else yet)\n    playlistSelection: getColorAt(60),\n    // (8) x=62: listview header background colour\n    listHeaderBackground: getColorAt(62),\n    // (9) x=64: listview header text colour\n    listHeaderText: getColorAt(64),\n    // (10) x=66: listview header frame top and left colour\n    listHeaderFrameTopAndLeft: getColorAt(66),\n    // (11) x=68: listview header frame bottom and right colour\n    listHeaderFrameBottomAndRight: getColorAt(68),\n    // (12) x=70: listview header frame colour, when pressed\n    listHeaderFramePressed: getColorAt(70),\n    // (13) x=72: listview header dead area colour\n    listHeaderDeadArea: getColorAt(72),\n    // (14) x=74: scrollbar colour #1\n    scrollbarOne: getColorAt(74),\n    // (15) x=76: scrollbar colour #2\n    scrollbarTwo: getColorAt(76),\n    // (16) x=78: pressed scrollbar colour #1\n    pressedScrollbarOne: getColorAt(78),\n    // (17) x=80: pressed scrollbar colour #2\n    pressedScrollbarTwo: getColorAt(80),\n    // (18) x=82: scrollbar dead area colour\n    scrollbarDeadArea: getColorAt(82),\n    // (19) x=84 List view text colour highlighted\n    listTextHighlighted: getColorAt(84),\n    // (20) x=86 List view background colour highlighted\n    listTextHighlightedBackground: getColorAt(86),\n    // (21) x=88 List view text colour selected\n    listTextSelected: getColorAt(88),\n    // (22) x=90 List view background colour selected\n    listTextSelectedBackground: getColorAt(90),\n  };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/skinSelectors.ts",
    "content": "import { LETTERS } from \"./constants\";\nimport { FONT_LOOKUP, imageConstFromChar } from \"./skinSprites\";\n\ninterface Selectors {\n  [name: string]: string[];\n}\n\nexport const imageSelectors: Selectors = {\n  MAIN_BALANCE_BACKGROUND: [\"#balance\"],\n  MAIN_BALANCE_THUMB: [\n    \"#balance::-webkit-slider-thumb\",\n    \"#balance::-moz-range-thumb\",\n  ],\n  MAIN_BALANCE_THUMB_ACTIVE: [\n    \"#balance:active::-webkit-slider-thumb\",\n    \"#balance:active::-moz-range-thumb\",\n  ],\n  MAIN_PREVIOUS_BUTTON: [\".actions #previous\"],\n  MAIN_PREVIOUS_BUTTON_ACTIVE: [\".actions #previous:active\"],\n  MAIN_PLAY_BUTTON: [\".actions #play\"],\n  MAIN_PLAY_BUTTON_ACTIVE: [\".actions #play:active\"],\n  MAIN_PAUSE_BUTTON: [\".actions #pause\"],\n  MAIN_PAUSE_BUTTON_ACTIVE: [\".actions #pause:active\"],\n  MAIN_STOP_BUTTON: [\".actions #stop\"],\n  MAIN_STOP_BUTTON_ACTIVE: [\".actions #stop:active\"],\n  MAIN_NEXT_BUTTON: [\".actions #next\"],\n  MAIN_NEXT_BUTTON_ACTIVE: [\".actions #next:active\"],\n  MAIN_EJECT_BUTTON: [\"#eject\"],\n  MAIN_EJECT_BUTTON_ACTIVE: [\"#eject:active\"],\n  MAIN_WINDOW_BACKGROUND: [\"#main-window\"],\n  MAIN_STEREO: [\".media-info #stereo\", \".stop .media-info #stereo.selected\"],\n  MAIN_STEREO_SELECTED: [\".media-info #stereo.selected\"],\n  MAIN_MONO: [\".media-info #mono\", \".stop .media-info #mono.selected\"],\n  MAIN_MONO_SELECTED: [\".media-info #mono.selected\"],\n  NO_MINUS_SIGN: [\"#time #minus-sign\"],\n  MINUS_SIGN: [\"#time.countdown #minus-sign\"],\n  DIGIT_0: [\".digit-0\"],\n  DIGIT_1: [\".digit-1\"],\n  DIGIT_2: [\".digit-2\"],\n  DIGIT_3: [\".digit-3\"],\n  DIGIT_4: [\".digit-4\"],\n  DIGIT_5: [\".digit-5\"],\n  DIGIT_6: [\".digit-6\"],\n  DIGIT_7: [\".digit-7\"],\n  DIGIT_8: [\".digit-8\"],\n  DIGIT_9: [\".digit-9\"],\n  NO_MINUS_SIGN_EX: [\"#time #minus-sign\"],\n  MINUS_SIGN_EX: [\"#time.countdown #minus-sign\"],\n  DIGIT_0_EX: [\".digit-0\"],\n  DIGIT_1_EX: [\".digit-1\"],\n  DIGIT_2_EX: [\".digit-2\"],\n  DIGIT_3_EX: [\".digit-3\"],\n  DIGIT_4_EX: [\".digit-4\"],\n  DIGIT_5_EX: [\".digit-5\"],\n  DIGIT_6_EX: [\".digit-6\"],\n  DIGIT_7_EX: [\".digit-7\"],\n  DIGIT_8_EX: [\".digit-8\"],\n  DIGIT_9_EX: [\".digit-9\"],\n  MAIN_PLAYING_INDICATOR: [\".play #play-pause\"],\n  MAIN_PAUSED_INDICATOR: [\".pause #play-pause\"],\n  MAIN_STOPPED_INDICATOR: [\".stop #play-pause\"],\n  MAIN_NOT_WORKING_INDICATOR: [\"#work-indicator\"],\n  MAIN_WORKING_INDICATOR: [\"#work-indicator.selected\"],\n  PLAYLIST_TOP_TILE: [\n    \".playlist-top-left-fill\",\n    \".playlist-top-left-spacer\",\n    \".playlist-top-right-fill\",\n    \".playlist-top-right-spacer\",\n  ],\n  PLAYLIST_TOP_LEFT_CORNER: [\".playlist-top-left\"],\n  PLAYLIST_TITLE_BAR: [\".playlist-top-title\"],\n  PLAYLIST_TOP_RIGHT_CORNER: [\".playlist-top-right\"],\n  PLAYLIST_TOP_TILE_SELECTED: [\n    \".selected .playlist-top-left-fill\",\n    \".selected .playlist-top-left-spacer\",\n    \".selected .playlist-top-right-fill\",\n    \".selected .playlist-top-right-spacer\",\n  ],\n  PLAYLIST_TOP_LEFT_SELECTED: [\".selected .playlist-top-left\"],\n  PLAYLIST_TITLE_BAR_SELECTED: [\".selected .playlist-top-title\"],\n  PLAYLIST_TOP_RIGHT_CORNER_SELECTED: [\".selected .playlist-top-right\"],\n  PLAYLIST_LEFT_TILE: [\".playlist-middle-left\"],\n  PLAYLIST_RIGHT_TILE: [\".playlist-middle-right\"],\n  PLAYLIST_SCROLL_HANDLE: [\".playlist-scrollbar-handle\"],\n  PLAYLIST_SCROLL_HANDLE_SELECTED: [\n    \".playlist-middle-right:active .playlist-scrollbar-handle\",\n  ],\n  PLAYLIST_BOTTOM_TILE: [\".playlist-bottom\"],\n  PLAYLIST_BOTTOM_LEFT_CORNER: [\".playlist-bottom-left\"],\n  PLAYLIST_BOTTOM_RIGHT_CORNER: [\".playlist-bottom-right\"],\n  PLAYLIST_VISUALIZER_BACKGROUND: [\".playlist-visualizer\"],\n  PLAYLIST_SHADE_BACKGROUND: [\"#playlist-window-shade\"],\n  PLAYLIST_SHADE_BACKGROUND_LEFT: [\"#playlist-window-shade .left\"],\n  PLAYLIST_SHADE_BACKGROUND_RIGHT: [\"#playlist-window-shade .right\"],\n  PLAYLIST_SHADE_BACKGROUND_RIGHT_SELECTED: [\n    \"#playlist-window-shade.selected .right\",\n  ],\n\n  PLAYLIST_ADD_MENU_BAR: [\"#playlist-add-menu.selected .bar\"],\n  PLAYLIST_ADD_URL: [\"#playlist-add-menu .add-url\"],\n  PLAYLIST_ADD_URL_SELECTED: [\"#playlist-add-menu .hover .add-url\"],\n  PLAYLIST_ADD_DIR: [\"#playlist-add-menu .add-dir\"],\n  PLAYLIST_ADD_DIR_SELECTED: [\"#playlist-add-menu .hover .add-dir\"],\n  PLAYLIST_ADD_FILE: [\"#playlist-add-menu .add-file\"],\n  PLAYLIST_ADD_FILE_SELECTED: [\"#playlist-add-menu .hover .add-file\"],\n\n  PLAYLIST_REMOVE_MENU_BAR: [\"#playlist-remove-menu.selected .bar\"],\n  PLAYLIST_REMOVE_ALL: [\"#playlist-remove-menu .remove-all\"],\n  PLAYLIST_REMOVE_ALL_SELECTED: [\"#playlist-remove-menu .hover .remove-all\"],\n  PLAYLIST_CROP: [\"#playlist-remove-menu .crop\"],\n  PLAYLIST_CROP_SELECTED: [\"#playlist-remove-menu .hover .crop\"],\n  PLAYLIST_REMOVE_SELECTED: [\"#playlist-remove-menu .remove-selected\"],\n  PLAYLIST_REMOVE_SELECTED_SELECTED: [\n    \"#playlist-remove-menu .hover .remove-selected\",\n  ],\n  PLAYLIST_REMOVE_MISC: [\"#playlist-remove-menu .remove-misc\"],\n  PLAYLIST_REMOVE_MISC_SELECTED: [\"#playlist-remove-menu .hover .remove-misc\"],\n\n  PLAYLIST_SELECT_MENU_BAR: [\"#playlist-selection-menu.selected .bar\"],\n  PLAYLIST_INVERT_SELECTION: [\"#playlist-selection-menu .invert-selection\"],\n  PLAYLIST_INVERT_SELECTION_SELECTED: [\n    \"#playlist-selection-menu .hover .invert-selection\",\n  ],\n  PLAYLIST_SELECT_ZERO: [\"#playlist-selection-menu .select-zero\"],\n  PLAYLIST_SELECT_ZERO_SELECTED: [\n    \"#playlist-selection-menu .hover .select-zero\",\n  ],\n  PLAYLIST_SELECT_ALL: [\"#playlist-selection-menu .select-all\"],\n  PLAYLIST_SELECT_ALL_SELECTED: [\"#playlist-selection-menu .hover .select-all\"],\n  PLAYLIST_CLOSE_SELECTED: [\"#playlist-close-button:active\"],\n  PLAYLIST_COLLAPSE_SELECTED: [\n    \"#playlist-window #playlist-shade-button:active\",\n  ],\n  PLAYLIST_EXPAND_SELECTED: [\n    \"#playlist-window-shade #playlist-shade-button:active\",\n  ],\n\n  PLAYLIST_MISC_MENU_BAR: [\"#playlist-misc-menu.selected .bar\"],\n  PLAYLIST_MISC_OPTIONS: [\"#playlist-misc-menu .misc-options\"],\n  PLAYLIST_MISC_OPTIONS_SELECTED: [\"#playlist-misc-menu .hover .misc-options\"],\n  PLAYLIST_FILE_INFO: [\"#playlist-misc-menu .file-info\"],\n  PLAYLIST_FILE_INFO_SELECTED: [\"#playlist-misc-menu .hover .file-info\"],\n  PLAYLIST_SORT_LIST: [\"#playlist-misc-menu .sort-list\"],\n  PLAYLIST_SORT_LIST_SELECTED: [\"#playlist-misc-menu .hover .sort-list\"],\n\n  PLAYLIST_LIST_BAR: [\"#playlist-list-menu.selected .bar\"],\n  PLAYLIST_NEW_LIST: [\"#playlist-list-menu .new-list\"],\n  PLAYLIST_NEW_LIST_SELECTED: [\"#playlist-list-menu .hover .new-list\"],\n  PLAYLIST_LOAD_LIST: [\"#playlist-list-menu .load-list\"],\n  PLAYLIST_LOAD_LIST_SELECTED: [\"#playlist-list-menu .hover .load-list\"],\n  PLAYLIST_SAVE_LIST: [\"#playlist-list-menu .save-list\"],\n  PLAYLIST_SAVE_LIST_SELECTED: [\"#playlist-list-menu .hover .save-list\"],\n\n  EQ_WINDOW_BACKGROUND: [\"#equalizer-window:not(.shade)\"],\n  EQ_TITLE_BAR: [\".equalizer-top\"],\n  EQ_TITLE_BAR_SELECTED: [\".selected .equalizer-top\"],\n  EQ_SLIDER_BACKGROUND: [\".band\"],\n  EQ_SLIDER_THUMB: [\".band .slider-handle\"],\n  // But the \"active\" pseudo selector on the parent, since clicking\n  // anywhere on the track moves the slider.\n  EQ_SLIDER_THUMB_SELECTED: [\".band:active .slider-handle\"],\n  EQ_ON_BUTTON: [\"#on\"],\n  EQ_ON_BUTTON_DEPRESSED: [\"#on:active\"],\n  EQ_ON_BUTTON_SELECTED: [\"#on.selected\"],\n  EQ_ON_BUTTON_SELECTED_DEPRESSED: [\"#on.selected:active\"],\n  EQ_AUTO_BUTTON: [\"#auto\"],\n  EQ_AUTO_BUTTON_DEPRESSED: [\"#auto:active\"],\n  EQ_AUTO_BUTTON_SELECTED: [\"#auto.selected\"],\n  EQ_AUTO_BUTTON_SELECTED_DEPRESSED: [\"#auto.selected:active\"],\n  EQ_GRAPH_BACKGROUND: [\"#eqGraph\"],\n  EQ_PRESETS_BUTTON: [\"#presets\"],\n  EQ_PRESETS_BUTTON_SELECTED: [\"#presets:active\"],\n  EQ_PREAMP_LINE: [\"#preamp-line\"],\n  EQ_SHADE_BACKGROUND: [\"#equalizer-window.shade\"],\n  EQ_SHADE_BACKGROUND_SELECTED: [\"#equalizer-window.shade.selected\"],\n  EQ_SHADE_VOLUME_SLIDER_LEFT: [\n    \"#equalizer-volume.left::-webkit-slider-thumb\",\n    \"#equalizer-volume.left::-moz-range-thumb\",\n  ],\n  EQ_SHADE_VOLUME_SLIDER_CENTER: [\n    \"#equalizer-volume.center::-webkit-slider-thumb\",\n    \"#equalizer-volume.center::-moz-range-thumb\",\n  ],\n  EQ_SHADE_VOLUME_SLIDER_RIGHT: [\n    \"#equalizer-volume.right::-webkit-slider-thumb\",\n    \"#equalizer-volume.right::-moz-range-thumb\",\n  ],\n  EQ_SHADE_BALANCE_SLIDER_LEFT: [\n    \"#equalizer-balance.left::-webkit-slider-thumb\",\n    \"#equalizer-balance.left::-moz-range-thumb\",\n  ],\n  EQ_SHADE_BALANCE_SLIDER_CENTER: [\n    \"#equalizer-balance.center::-webkit-slider-thumb\",\n    \"#equalizer-balance.center::-moz-range-thumb\",\n  ],\n  EQ_SHADE_BALANCE_SLIDER_RIGHT: [\n    \"#equalizer-balance.right::-webkit-slider-thumb\",\n    \"#equalizer-balance.right::-moz-range-thumb\",\n  ],\n  EQ_MAXIMIZE_BUTTON_ACTIVE: [\"#equalizer-shade:active\"],\n  EQ_MINIMIZE_BUTTON_ACTIVE: [\n    \"#equalizer-window.shade #equalizer-shade:active\",\n  ],\n  EQ_CLOSE_BUTTON: [\n    \"#equalizer-window.selected #eq-buttons.clicked #equalizer-close\",\n  ],\n  EQ_CLOSE_BUTTON_ACTIVE: [\n    \"#equalizer-window.selected #eq-buttons.clicked #equalizer-close:active\",\n  ],\n  EQ_SHADE_CLOSE_BUTTON: [\n    \"#equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close\",\n  ],\n  EQ_SHADE_CLOSE_BUTTON_ACTIVE: [\n    \"#equalizer-window.shade.selected #eq-buttons.clicked #equalizer-close:active\",\n  ],\n  MAIN_POSITION_SLIDER_BACKGROUND: [\"#position\"],\n  MAIN_POSITION_SLIDER_THUMB: [\n    \"#position::-webkit-slider-thumb\",\n    \"#position::-moz-range-thumb\",\n  ],\n  MAIN_POSITION_SLIDER_THUMB_SELECTED: [\n    \"#position:active::-webkit-slider-thumb\",\n    \"#position:active::-moz-range-thumb\",\n  ],\n  MAIN_SHUFFLE_BUTTON: [\"#shuffle\"],\n  MAIN_SHUFFLE_BUTTON_DEPRESSED: [\"#shuffle:active\"],\n  MAIN_SHUFFLE_BUTTON_SELECTED: [\"#shuffle.selected\"],\n  MAIN_SHUFFLE_BUTTON_SELECTED_DEPRESSED: [\"#shuffle.selected:active\"],\n  MAIN_REPEAT_BUTTON: [\"#repeat\"],\n  MAIN_REPEAT_BUTTON_DEPRESSED: [\"#repeat:active\"],\n  MAIN_REPEAT_BUTTON_SELECTED: [\"#repeat.selected\"],\n  MAIN_REPEAT_BUTTON_SELECTED_DEPRESSED: [\"#repeat.selected:active\"],\n  MAIN_EQ_BUTTON: [\"#equalizer-button\"],\n  MAIN_EQ_BUTTON_SELECTED: [\"#equalizer-button.selected\"],\n  MAIN_EQ_BUTTON_DEPRESSED: [\"#equalizer-button:active\"],\n  MAIN_EQ_BUTTON_DEPRESSED_SELECTED: [\"#equalizer-button.selected:active\"],\n  MAIN_PLAYLIST_BUTTON: [\"#playlist-button\"],\n  MAIN_PLAYLIST_BUTTON_SELECTED: [\"#playlist-button.selected\"],\n  MAIN_PLAYLIST_BUTTON_DEPRESSED: [\"#playlist-button:active\"],\n  MAIN_PLAYLIST_BUTTON_DEPRESSED_SELECTED: [\"#playlist-button.selected:active\"],\n  MAIN_TITLE_BAR: [\"#title-bar\"],\n  MAIN_TITLE_BAR_SELECTED: [\".selected #title-bar\"],\n  MAIN_EASTER_EGG_TITLE_BAR: [\".llama #title-bar\"],\n  MAIN_EASTER_EGG_TITLE_BAR_SELECTED: [\".llama.selected #title-bar\"],\n  MAIN_OPTIONS_BUTTON: [\".selected #title-bar #option.clicked\"],\n  MAIN_OPTIONS_BUTTON_DEPRESSED: [\n    \".selected #title-bar #option:active\",\n    \".selected #title-bar #option.selected\",\n  ],\n  MAIN_MINIMIZE_BUTTON: [\".selected #title-bar #minimize.clicked\"],\n  MAIN_MINIMIZE_BUTTON_DEPRESSED: [\".selected #title-bar #minimize:active\"],\n  MAIN_SHADE_BUTTON: [\".selected #title-bar #shade.clicked\"],\n  MAIN_SHADE_BUTTON_DEPRESSED: [\".selected #title-bar #shade:active\"],\n  MAIN_CLOSE_BUTTON: [\".selected #title-bar #close.clicked\"],\n  MAIN_CLOSE_BUTTON_DEPRESSED: [\".selected #title-bar #close:active\"],\n  MAIN_CLUTTER_BAR_BACKGROUND: [\"#clutter-bar\"],\n  MAIN_CLUTTER_BAR_BACKGROUND_DISABLED: [\"#clutter-bar.disabled\"],\n  MAIN_CLUTTER_BAR_BUTTON_O_SELECTED: [\n    \"#button-o:active\",\n    \"#button-0.selected\",\n  ],\n  MAIN_CLUTTER_BAR_BUTTON_A_SELECTED: [\n    \"#button-a:active\",\n    \"#button-a.selected\",\n  ],\n  MAIN_CLUTTER_BAR_BUTTON_I_SELECTED: [\n    \"#button-i:active\",\n    \"#button-i.selected\",\n  ],\n  MAIN_CLUTTER_BAR_BUTTON_D_SELECTED: [\n    \"#button-d:active\",\n    \"#button-d.selected\",\n  ],\n  MAIN_CLUTTER_BAR_BUTTON_V_SELECTED: [\n    \"#button-v:active\",\n    \"#button-v.selected\",\n  ],\n  MAIN_SHADE_BACKGROUND: [\".shade #title-bar\"],\n  MAIN_SHADE_BACKGROUND_SELECTED: [\".shade.selected #title-bar\"],\n  MAIN_SHADE_BUTTON_SELECTED: [\".shade.selected #title-bar #shade\"],\n  MAIN_SHADE_BUTTON_SELECTED_DEPRESSED: [\".shade #title-bar #shade:active\"],\n  MAIN_SHADE_POSITION_BACKGROUND: [\".shade #position\"],\n  MAIN_SHADE_POSITION_THUMB: [\n    \".shade #position::-moz-range-thumb\",\n    \".shade #position::-webkit-slider-thumb\",\n  ],\n  MAIN_SHADE_POSITION_THUMB_LEFT: [\n    \".shade #position.left::-moz-range-thumb\",\n    \".shade #position.left::-webkit-slider-thumb\",\n  ],\n  MAIN_SHADE_POSITION_THUMB_RIGHT: [\n    \".shade #position.right::-moz-range-thumb\",\n    \".shade #position.right::-webkit-slider-thumb\",\n  ],\n  MAIN_VOLUME_BACKGROUND: [\"#volume\"],\n  MAIN_VOLUME_THUMB: [\n    \"#volume input::-webkit-slider-thumb\",\n    \"#volume input::-moz-range-thumb\",\n  ],\n  MAIN_VOLUME_THUMB_SELECTED: [\n    \"#volume input:active::-webkit-slider-thumb\",\n    \"#volume input:active::-moz-range-thumb\",\n  ],\n  GEN_TOP_CENTER_FILL: [\".gen-window .gen-top\"],\n  GEN_TOP_LEFT: [\".gen-window .gen-top-left\"],\n  GEN_TOP_LEFT_END: [\".gen-window .gen-top-left-end\"],\n  GEN_TOP_RIGHT: [\".gen-window .gen-top-right\"],\n  GEN_TOP_RIGHT_END: [\".gen-window .gen-top-right-end\"],\n  GEN_TOP_LEFT_RIGHT_FILL: [\n    \".gen-window .gen-top-left-fill\",\n    \".gen-window .gen-top-right-fill\",\n  ],\n\n  GEN_TOP_CENTER_FILL_SELECTED: [\".gen-window.selected .gen-top\"],\n  GEN_TOP_LEFT_SELECTED: [\".gen-window.selected .gen-top-left\"],\n  GEN_TOP_LEFT_END_SELECTED: [\".gen-window.selected .gen-top-left-end\"],\n  GEN_TOP_RIGHT_SELECTED: [\".gen-window.selected .gen-top-right\"],\n  GEN_TOP_RIGHT_END_SELECTED: [\".gen-window.selected .gen-top-right-end\"],\n  GEN_TOP_LEFT_RIGHT_FILL_SELECTED: [\n    \".gen-window.selected .gen-top-left-fill\",\n    \".gen-window.selected .gen-top-right-fill\",\n  ],\n  GEN_BOTTOM_LEFT: [\".gen-window .gen-bottom-left\"],\n  GEN_BOTTOM_RIGHT: [\".gen-window .gen-bottom-right\"],\n  GEN_BOTTOM_FILL: [\".gen-window .gen-bottom\"],\n  GEN_MIDDLE_LEFT: [\".gen-window .gen-middle-left\"],\n  GEN_MIDDLE_LEFT_BOTTOM: [\".gen-window .gen-middle-left-bottom\"],\n  GEN_MIDDLE_RIGHT: [\".gen-window .gen-middle-right\"],\n  GEN_MIDDLE_RIGHT_BOTTOM: [\".gen-window .gen-middle-right-bottom\"],\n  GEN_CLOSE_SELECTED: [\".gen-window .gen-close:active\"],\n};\n\nObject.keys(FONT_LOOKUP).forEach((character) => {\n  const key = imageConstFromChar(character);\n  const code = character.charCodeAt(0);\n  imageSelectors[key] = [`.character-${code}`];\n});\n\nLETTERS.forEach((character) => {\n  imageSelectors[`GEN_TEXT_${character}`] = [\n    `.gen-text-${character.toLowerCase()}`,\n  ];\n  imageSelectors[`GEN_TEXT_SELECTED_${character}`] = [\n    `.gen-window.selected .gen-text-${character.toLowerCase()}`,\n  ];\n});\n\nexport const cursorSelectors: Selectors = {\n  CLOSE: [\"#title-bar #close\"],\n  // This is not quite right. There are some areas that show this cursor\n  // but are not clickable.\n  EQSLID: [\"#equalizer-window .band\"],\n  EQNORMAL: [\"#equalizer-window\"],\n  EQCLOSE: [\"#equalizer-window #equalizer-close\"],\n  EQTITLE: [\n    \"#equalizer-window .title-bar\",\n    \"#equalizer-window.shade\",\n    \"#equalizer-window.shade input\",\n  ],\n  MAINMENU: [\"#main-window #option\", \"#webamp-context-menu .context-menu\"],\n  MIN: [\"#main-window #minimize\"],\n  NORMAL: [\n    // Use this as the default cursor.\n    \".window\",\n    \".window input\", // Otherwise\n    \"#main-window\",\n    \"#main-window.shade #title-bar\",\n  ],\n  MMENU: [\"#main-window.shade #option\"],\n  PNORMAL: [\"#playlist-window\"],\n  // TODO: This is should really only apply to the top part of the top.\n  // The chrome around the playlist window is larger than others. The\n  // cursor only applies to the same height as the other window's chrome.\n  PTBAR: [\"#playlist-window .playlist-top\"],\n  PCLOSE: [\n    \"#playlist-window #playlist-close-button\",\n    \"#playlist-window-shade #playlist-close-button\",\n  ],\n  PWINBUT: [\n    \"#playlist-window #playlist-shade-button\",\n    \"#playlist-window-shade #playlist-shade-button\",\n  ],\n  POSBAR: [\"#main-window #position\"],\n  PSIZE: [\"#playlist-window #playlist-resize-target\"],\n  PWSSIZE: [\"#playlist-window-shade #playlist-resize-target\"],\n  PWSNORM: [\"#playlist-window-shade\"],\n  // TODO: The target for this is not quite right.\n  PVSCROLL: [\"#playlist-window .playlist-scrollbar\"],\n  SONGNAME: [\"#main-window #marquee\"],\n  TITLEBAR: [\"#main-window #title-bar\"],\n  VOLBAL: [\"#volume\", \"#volume input\", \"#balance\"],\n  WINBUT: [\"#main-window #shade\"],\n  WSNORMAL: [\"#main-window.shade #title-bar\"],\n  WSPOSBAR: [\"#main-window.shade #position\"],\n};\n"
  },
  {
    "path": "webamp/packages/webamp/js/skinSprites.test.js",
    "content": "import skinSprites from \"./skinSprites\";\n\nconst each = (obj, iterator) => {\n  Object.keys(obj).forEach((key) => {\n    iterator(obj[key]);\n  });\n};\n\nconst getNames = (arr) => arr.map((item) => item.name);\n\ndescribe(\"skinSprites\", () => {\n  it(\"each spritSheet has a unique name\", () => {\n    const spriteSheetNames = Object.keys(skinSprites);\n    const seenNames = [];\n    spriteSheetNames.forEach((name) => {\n      expect(seenNames).not.toContain(name);\n      seenNames.push(name);\n    });\n  });\n  it(\"each sprite has a unique name\", () => {\n    let spriteNames = [];\n    each(skinSprites, (spriteSheet) => {\n      spriteNames = spriteNames.concat(getNames(spriteSheet));\n    });\n    const seenNames = [];\n    spriteNames.forEach((name) => {\n      expect(seenNames).not.toContain(name);\n      seenNames.push(name);\n    });\n  });\n  it(\"each sprite has the needed properties\", () => {\n    each(skinSprites, (spriteSheet) => {\n      spriteSheet.forEach((sprite) => {\n        expect(typeof sprite.name).toBe(\"string\");\n        expect(typeof sprite.x).toBe(\"number\");\n        expect(typeof sprite.y).toBe(\"number\");\n        expect(typeof sprite.height).toBe(\"number\");\n        expect(typeof sprite.width).toBe(\"number\");\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/skinSprites.ts",
    "content": "import { UTF8_ELLIPSIS } from \"./constants\";\n\nexport type SpriteName = string;\n\nexport interface Sprite {\n  name: SpriteName;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n/* TODO: There are too many \" \" and \"_\" characters */\nexport const FONT_LOOKUP: { [letter: string]: [number, number] } = {\n  a: [0, 0],\n  b: [0, 1],\n  c: [0, 2],\n  d: [0, 3],\n  e: [0, 4],\n  f: [0, 5],\n  g: [0, 6],\n  h: [0, 7],\n  i: [0, 8],\n  j: [0, 9],\n  k: [0, 10],\n  l: [0, 11],\n  m: [0, 12],\n  n: [0, 13],\n  o: [0, 14],\n  p: [0, 15],\n  q: [0, 16],\n  r: [0, 17],\n  s: [0, 18],\n  t: [0, 19],\n  u: [0, 20],\n  v: [0, 21],\n  w: [0, 22],\n  x: [0, 23],\n  y: [0, 24],\n  z: [0, 25],\n  '\"': [0, 26],\n  \"@\": [0, 27],\n  \" \": [0, 30],\n  \"0\": [1, 0],\n  \"1\": [1, 1],\n  \"2\": [1, 2],\n  \"3\": [1, 3],\n  \"4\": [1, 4],\n  \"5\": [1, 5],\n  \"6\": [1, 6],\n  \"7\": [1, 7],\n  \"8\": [1, 8],\n  \"9\": [1, 9],\n  [UTF8_ELLIPSIS]: [1, 10],\n  \".\": [1, 11],\n  \":\": [1, 12],\n  \"(\": [1, 13],\n  \")\": [1, 14],\n  \"-\": [1, 15],\n  \"'\": [1, 16],\n  \"!\": [1, 17],\n  _: [1, 18],\n  \"+\": [1, 19],\n  \"\\\\\": [1, 20],\n  \"/\": [1, 21],\n  \"[\": [1, 22],\n  \"]\": [1, 23],\n  \"^\": [1, 24],\n  \"&\": [1, 25],\n  \"%\": [1, 26],\n  \",\": [1, 27],\n  \"=\": [1, 28],\n  $: [1, 29],\n  \"#\": [1, 30],\n  Å: [2, 0],\n  Ö: [2, 1],\n  Ä: [2, 2],\n  \"?\": [2, 3],\n  \"*\": [2, 4],\n  \"<\": [1, 22],\n  \">\": [1, 23],\n  \"{\": [1, 22],\n  \"}\": [1, 23],\n};\n\nexport const imageConstFromChar = (char: string) =>\n  `CHARACTER_${char.charCodeAt(0)}`;\n\nconst CHAR_X = 5;\nconst CHAR_Y = 6;\n\nconst characterSprites = [];\nfor (const key in FONT_LOOKUP) {\n  if (FONT_LOOKUP.hasOwnProperty(key)) {\n    const position = FONT_LOOKUP[key];\n    characterSprites.push({\n      name: imageConstFromChar(key),\n      y: position[0] * CHAR_Y,\n      x: position[1] * CHAR_X,\n      width: CHAR_X,\n      height: CHAR_Y,\n    });\n  }\n}\n\ninterface SpriteMap {\n  [sheet: string]: Sprite[];\n}\n\nconst sprites: SpriteMap = {\n  BALANCE: [\n    { name: \"MAIN_BALANCE_BACKGROUND\", x: 9, y: 0, width: 38, height: 420 },\n    { name: \"MAIN_BALANCE_THUMB\", x: 15, y: 422, width: 14, height: 11 },\n    { name: \"MAIN_BALANCE_THUMB_ACTIVE\", x: 0, y: 422, width: 14, height: 11 },\n  ],\n  CBUTTONS: [\n    { name: \"MAIN_PREVIOUS_BUTTON\", x: 0, y: 0, width: 23, height: 18 },\n    {\n      name: \"MAIN_PREVIOUS_BUTTON_ACTIVE\",\n      x: 0,\n      y: 18,\n      width: 23,\n      height: 18,\n    },\n    { name: \"MAIN_PLAY_BUTTON\", x: 23, y: 0, width: 23, height: 18 },\n    { name: \"MAIN_PLAY_BUTTON_ACTIVE\", x: 23, y: 18, width: 23, height: 18 },\n    { name: \"MAIN_PAUSE_BUTTON\", x: 46, y: 0, width: 23, height: 18 },\n    { name: \"MAIN_PAUSE_BUTTON_ACTIVE\", x: 46, y: 18, width: 23, height: 18 },\n    { name: \"MAIN_STOP_BUTTON\", x: 69, y: 0, width: 23, height: 18 },\n    { name: \"MAIN_STOP_BUTTON_ACTIVE\", x: 69, y: 18, width: 23, height: 18 },\n    { name: \"MAIN_NEXT_BUTTON\", x: 92, y: 0, width: 23, height: 18 },\n    { name: \"MAIN_NEXT_BUTTON_ACTIVE\", x: 92, y: 18, width: 22, height: 18 },\n    { name: \"MAIN_EJECT_BUTTON\", x: 114, y: 0, width: 22, height: 16 },\n    { name: \"MAIN_EJECT_BUTTON_ACTIVE\", x: 114, y: 16, width: 22, height: 16 },\n  ],\n  MAIN: [\n    { name: \"MAIN_WINDOW_BACKGROUND\", x: 0, y: 0, width: 275, height: 116 },\n  ],\n  MONOSTER: [\n    { name: \"MAIN_STEREO\", x: 0, y: 12, width: 29, height: 12 },\n    { name: \"MAIN_STEREO_SELECTED\", x: 0, y: 0, width: 29, height: 12 },\n    { name: \"MAIN_MONO\", x: 29, y: 12, width: 27, height: 12 },\n    { name: \"MAIN_MONO_SELECTED\", x: 29, y: 0, width: 27, height: 12 },\n  ],\n  NUMBERS: [\n    { name: \"NO_MINUS_SIGN\", x: 9, y: 6, width: 5, height: 1 },\n    { name: \"MINUS_SIGN\", x: 20, y: 6, width: 5, height: 1 },\n    { name: \"DIGIT_0\", x: 0, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_1\", x: 9, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_2\", x: 18, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_3\", x: 27, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_4\", x: 36, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_5\", x: 45, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_6\", x: 54, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_7\", x: 63, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_8\", x: 72, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_9\", x: 81, y: 0, width: 9, height: 13 },\n  ],\n  NUMS_EX: [\n    { name: \"NO_MINUS_SIGN_EX\", x: 90, y: 0, width: 9, height: 13 },\n    { name: \"MINUS_SIGN_EX\", x: 99, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_0_EX\", x: 0, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_1_EX\", x: 9, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_2_EX\", x: 18, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_3_EX\", x: 27, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_4_EX\", x: 36, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_5_EX\", x: 45, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_6_EX\", x: 54, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_7_EX\", x: 63, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_8_EX\", x: 72, y: 0, width: 9, height: 13 },\n    { name: \"DIGIT_9_EX\", x: 81, y: 0, width: 9, height: 13 },\n  ],\n  PLAYPAUS: [\n    { name: \"MAIN_PLAYING_INDICATOR\", x: 0, y: 0, width: 9, height: 9 },\n    { name: \"MAIN_PAUSED_INDICATOR\", x: 9, y: 0, width: 9, height: 9 },\n    { name: \"MAIN_STOPPED_INDICATOR\", x: 18, y: 0, width: 9, height: 9 },\n    { name: \"MAIN_NOT_WORKING_INDICATOR\", x: 36, y: 0, width: 9, height: 9 },\n    { name: \"MAIN_WORKING_INDICATOR\", x: 39, y: 0, width: 9, height: 9 },\n  ],\n  PLEDIT: [\n    { name: \"PLAYLIST_TOP_TILE\", x: 127, y: 21, width: 25, height: 20 },\n    { name: \"PLAYLIST_TOP_LEFT_CORNER\", x: 0, y: 21, width: 25, height: 20 },\n    { name: \"PLAYLIST_TITLE_BAR\", x: 26, y: 21, width: 100, height: 20 },\n    {\n      name: \"PLAYLIST_TOP_RIGHT_CORNER\",\n      x: 153,\n      y: 21,\n      width: 25,\n      height: 20,\n    },\n    {\n      name: \"PLAYLIST_TOP_TILE_SELECTED\",\n      x: 127,\n      y: 0,\n      width: 25,\n      height: 20,\n    },\n    { name: \"PLAYLIST_TOP_LEFT_SELECTED\", x: 0, y: 0, width: 25, height: 20 },\n    {\n      name: \"PLAYLIST_TITLE_BAR_SELECTED\",\n      x: 26,\n      y: 0,\n      width: 100,\n      height: 20,\n    },\n    {\n      name: \"PLAYLIST_TOP_RIGHT_CORNER_SELECTED\",\n      x: 153,\n      y: 0,\n      width: 25,\n      height: 20,\n    },\n    { name: \"PLAYLIST_LEFT_TILE\", x: 0, y: 42, width: 12, height: 29 },\n    { name: \"PLAYLIST_RIGHT_TILE\", x: 31, y: 42, width: 20, height: 29 },\n    { name: \"PLAYLIST_BOTTOM_TILE\", x: 179, y: 0, width: 25, height: 38 },\n    {\n      name: \"PLAYLIST_BOTTOM_LEFT_CORNER\",\n      x: 0,\n      y: 72,\n      width: 125,\n      height: 38,\n    },\n    {\n      name: \"PLAYLIST_BOTTOM_RIGHT_CORNER\",\n      x: 126,\n      y: 72,\n      width: 150,\n      height: 38,\n    },\n    {\n      name: \"PLAYLIST_VISUALIZER_BACKGROUND\",\n      x: 205,\n      y: 0,\n      width: 75,\n      height: 38,\n    },\n    { name: \"PLAYLIST_SHADE_BACKGROUND\", x: 72, y: 57, width: 25, height: 14 },\n    {\n      name: \"PLAYLIST_SHADE_BACKGROUND_LEFT\",\n      x: 72,\n      y: 42,\n      width: 25,\n      height: 14,\n    },\n    {\n      name: \"PLAYLIST_SHADE_BACKGROUND_RIGHT\",\n      x: 99,\n      y: 57,\n      width: 50,\n      height: 14,\n    },\n    {\n      name: \"PLAYLIST_SHADE_BACKGROUND_RIGHT_SELECTED\",\n      x: 99,\n      y: 42,\n      width: 50,\n      height: 14,\n    },\n    {\n      name: \"PLAYLIST_SCROLL_HANDLE_SELECTED\",\n      x: 61,\n      y: 53,\n      width: 8,\n      height: 18,\n    },\n    { name: \"PLAYLIST_SCROLL_HANDLE\", x: 52, y: 53, width: 8, height: 18 },\n    { name: \"PLAYLIST_ADD_URL\", x: 0, y: 111, width: 22, height: 18 },\n    { name: \"PLAYLIST_ADD_URL_SELECTED\", x: 23, y: 111, width: 22, height: 18 },\n    { name: \"PLAYLIST_ADD_DIR\", x: 0, y: 130, width: 22, height: 18 },\n    { name: \"PLAYLIST_ADD_DIR_SELECTED\", x: 23, y: 130, width: 22, height: 18 },\n    { name: \"PLAYLIST_ADD_FILE\", x: 0, y: 149, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_ADD_FILE_SELECTED\",\n      x: 23,\n      y: 149,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_REMOVE_ALL\", x: 54, y: 111, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_REMOVE_ALL_SELECTED\",\n      x: 77,\n      y: 111,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_CROP\", x: 54, y: 130, width: 22, height: 18 },\n    { name: \"PLAYLIST_CROP_SELECTED\", x: 77, y: 130, width: 22, height: 18 },\n    { name: \"PLAYLIST_REMOVE_SELECTED\", x: 54, y: 149, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_REMOVE_SELECTED_SELECTED\",\n      x: 77,\n      y: 149,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_REMOVE_MISC\", x: 54, y: 168, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_REMOVE_MISC_SELECTED\",\n      x: 77,\n      y: 168,\n      width: 22,\n      height: 18,\n    },\n    {\n      name: \"PLAYLIST_INVERT_SELECTION\",\n      x: 104,\n      y: 111,\n      width: 22,\n      height: 18,\n    },\n    {\n      name: \"PLAYLIST_INVERT_SELECTION_SELECTED\",\n      x: 127,\n      y: 111,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_SELECT_ZERO\", x: 104, y: 130, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_SELECT_ZERO_SELECTED\",\n      x: 127,\n      y: 130,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_SELECT_ALL\", x: 104, y: 149, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_SELECT_ALL_SELECTED\",\n      x: 127,\n      y: 149,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_SORT_LIST\", x: 154, y: 111, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_SORT_LIST_SELECTED\",\n      x: 177,\n      y: 111,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_FILE_INFO\", x: 154, y: 130, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_FILE_INFO_SELECTED\",\n      x: 177,\n      y: 130,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_MISC_OPTIONS\", x: 154, y: 149, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_MISC_OPTIONS_SELECTED\",\n      x: 177,\n      y: 149,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_NEW_LIST\", x: 204, y: 111, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_NEW_LIST_SELECTED\",\n      x: 227,\n      y: 111,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_SAVE_LIST\", x: 204, y: 130, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_SAVE_LIST_SELECTED\",\n      x: 227,\n      y: 130,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_LOAD_LIST\", x: 204, y: 149, width: 22, height: 18 },\n    {\n      name: \"PLAYLIST_LOAD_LIST_SELECTED\",\n      x: 227,\n      y: 149,\n      width: 22,\n      height: 18,\n    },\n    { name: \"PLAYLIST_ADD_MENU_BAR\", x: 48, y: 111, width: 3, height: 54 },\n    { name: \"PLAYLIST_REMOVE_MENU_BAR\", x: 100, y: 111, width: 3, height: 72 },\n    { name: \"PLAYLIST_SELECT_MENU_BAR\", x: 150, y: 111, width: 3, height: 54 },\n    { name: \"PLAYLIST_MISC_MENU_BAR\", x: 200, y: 111, width: 3, height: 54 },\n    { name: \"PLAYLIST_LIST_BAR\", x: 250, y: 111, width: 3, height: 54 },\n    { name: \"PLAYLIST_CLOSE_SELECTED\", x: 52, y: 42, width: 9, height: 9 },\n    { name: \"PLAYLIST_COLLAPSE_SELECTED\", x: 62, y: 42, width: 9, height: 9 },\n    { name: \"PLAYLIST_EXPAND_SELECTED\", x: 150, y: 42, width: 9, height: 9 },\n  ],\n  EQ_EX: [\n    {\n      name: \"EQ_SHADE_BACKGROUND_SELECTED\",\n      x: 0,\n      y: 0,\n      width: 275,\n      height: 14,\n    },\n    { name: \"EQ_SHADE_BACKGROUND\", x: 0, y: 15, width: 275, height: 14 },\n    { name: \"EQ_SHADE_VOLUME_SLIDER_LEFT\", x: 1, y: 30, width: 3, height: 7 },\n    { name: \"EQ_SHADE_VOLUME_SLIDER_CENTER\", x: 4, y: 30, width: 3, height: 7 },\n    { name: \"EQ_SHADE_VOLUME_SLIDER_RIGHT\", x: 7, y: 30, width: 3, height: 7 },\n    { name: \"EQ_SHADE_BALANCE_SLIDER_LEFT\", x: 11, y: 30, width: 3, height: 7 },\n    {\n      name: \"EQ_SHADE_BALANCE_SLIDER_CENTER\",\n      x: 14,\n      y: 30,\n      width: 3,\n      height: 7,\n    },\n    {\n      name: \"EQ_SHADE_BALANCE_SLIDER_RIGHT\",\n      x: 17,\n      y: 30,\n      width: 3,\n      height: 7,\n    },\n    { name: \"EQ_MAXIMIZE_BUTTON_ACTIVE\", x: 1, y: 38, width: 9, height: 9 },\n    { name: \"EQ_MINIMIZE_BUTTON_ACTIVE\", x: 1, y: 47, width: 9, height: 9 },\n    { name: \"EQ_SHADE_CLOSE_BUTTON\", x: 11, y: 38, width: 9, height: 9 },\n    { name: \"EQ_SHADE_CLOSE_BUTTON_ACTIVE\", x: 11, y: 47, width: 9, height: 9 },\n  ],\n  EQMAIN: [\n    { name: \"EQ_WINDOW_BACKGROUND\", x: 0, y: 0, width: 275, height: 116 },\n    { name: \"EQ_TITLE_BAR\", x: 0, y: 149, width: 275, height: 14 },\n    { name: \"EQ_TITLE_BAR_SELECTED\", x: 0, y: 134, width: 275, height: 14 },\n    { name: \"EQ_SLIDER_BACKGROUND\", x: 13, y: 164, width: 209, height: 129 },\n    { name: \"EQ_SLIDER_THUMB\", x: 0, y: 164, width: 11, height: 11 },\n    { name: \"EQ_SLIDER_THUMB_SELECTED\", x: 0, y: 176, width: 11, height: 11 },\n    { name: \"EQ_CLOSE_BUTTON\", x: 0, y: 116, width: 9, height: 9 },\n    { name: \"EQ_CLOSE_BUTTON_ACTIVE\", x: 0, y: 125, width: 9, height: 9 },\n    // This is technically not a sprite, it's just part of the background.\n    // However, we extract it to use it as a fallback for\n    // `EQ_MAXIMIZE_BUTTON_ACTIVE`. Without this, skins that don't implement\n    // `eq_ex.bmp` would show the default skin's `EQ_MAXIMIZE_BUTTON_ACTIVE`\n    // instead of showing no sprite aka, just showing through to this portion of\n    // the title bar image.\n    {\n      name: \"EQ_MAXIMIZE_BUTTON_ACTIVE_FALLBACK\",\n      x: 254,\n      y: 152,\n      width: 9,\n      height: 9,\n    },\n    { name: \"EQ_ON_BUTTON\", x: 10, y: 119, width: 26, height: 12 },\n    { name: \"EQ_ON_BUTTON_DEPRESSED\", x: 128, y: 119, width: 26, height: 12 },\n    { name: \"EQ_ON_BUTTON_SELECTED\", x: 69, y: 119, width: 26, height: 12 },\n    {\n      name: \"EQ_ON_BUTTON_SELECTED_DEPRESSED\",\n      x: 187,\n      y: 119,\n      width: 26,\n      height: 12,\n    },\n    { name: \"EQ_AUTO_BUTTON\", x: 36, y: 119, width: 32, height: 12 },\n    {\n      name: \"EQ_AUTO_BUTTON_DEPRESSED\",\n      x: 154,\n      y: 119,\n      width: 32,\n      height: 12,\n    },\n    { name: \"EQ_AUTO_BUTTON_SELECTED\", x: 95, y: 119, width: 32, height: 12 },\n    {\n      name: \"EQ_AUTO_BUTTON_SELECTED_DEPRESSED\",\n      x: 213,\n      y: 119,\n      width: 32,\n      height: 12,\n    },\n    { name: \"EQ_GRAPH_BACKGROUND\", x: 0, y: 294, width: 113, height: 19 },\n    { name: \"EQ_GRAPH_LINE_COLORS\", x: 115, y: 294, width: 1, height: 19 },\n    { name: \"EQ_PRESETS_BUTTON\", x: 224, y: 164, width: 44, height: 12 },\n    {\n      name: \"EQ_PRESETS_BUTTON_SELECTED\",\n      x: 224,\n      y: 176,\n      width: 44,\n      height: 12,\n    },\n    { name: \"EQ_PREAMP_LINE\", x: 0, y: 314, width: 113, height: 1 },\n  ],\n  POSBAR: [\n    {\n      name: \"MAIN_POSITION_SLIDER_BACKGROUND\",\n      x: 0,\n      y: 0,\n      width: 248,\n      height: 10,\n    },\n    {\n      name: \"MAIN_POSITION_SLIDER_THUMB\",\n      x: 248,\n      y: 0,\n      width: 29,\n      height: 10,\n    },\n    {\n      name: \"MAIN_POSITION_SLIDER_THUMB_SELECTED\",\n      x: 278,\n      y: 0,\n      width: 29,\n      height: 10,\n    },\n  ],\n  SHUFREP: [\n    { name: \"MAIN_SHUFFLE_BUTTON\", x: 28, y: 0, width: 47, height: 15 },\n    {\n      name: \"MAIN_SHUFFLE_BUTTON_DEPRESSED\",\n      x: 28,\n      y: 15,\n      width: 47,\n      height: 15,\n    },\n    {\n      name: \"MAIN_SHUFFLE_BUTTON_SELECTED\",\n      x: 28,\n      y: 30,\n      width: 47,\n      height: 15,\n    },\n    {\n      name: \"MAIN_SHUFFLE_BUTTON_SELECTED_DEPRESSED\",\n      x: 28,\n      y: 45,\n      width: 47,\n      height: 15,\n    },\n    { name: \"MAIN_REPEAT_BUTTON\", x: 0, y: 0, width: 28, height: 15 },\n    {\n      name: \"MAIN_REPEAT_BUTTON_DEPRESSED\",\n      x: 0,\n      y: 15,\n      width: 28,\n      height: 15,\n    },\n    {\n      name: \"MAIN_REPEAT_BUTTON_SELECTED\",\n      x: 0,\n      y: 30,\n      width: 28,\n      height: 15,\n    },\n    {\n      name: \"MAIN_REPEAT_BUTTON_SELECTED_DEPRESSED\",\n      x: 0,\n      y: 45,\n      width: 28,\n      height: 15,\n    },\n    { name: \"MAIN_EQ_BUTTON\", x: 0, y: 61, width: 23, height: 12 },\n    { name: \"MAIN_EQ_BUTTON_SELECTED\", x: 0, y: 73, width: 23, height: 12 },\n    { name: \"MAIN_EQ_BUTTON_DEPRESSED\", x: 46, y: 61, width: 23, height: 12 },\n    {\n      name: \"MAIN_EQ_BUTTON_DEPRESSED_SELECTED\",\n      x: 46,\n      y: 73,\n      width: 23,\n      height: 12,\n    },\n    { name: \"MAIN_PLAYLIST_BUTTON\", x: 23, y: 61, width: 23, height: 12 },\n    {\n      name: \"MAIN_PLAYLIST_BUTTON_SELECTED\",\n      x: 23,\n      y: 73,\n      width: 23,\n      height: 12,\n    },\n    {\n      name: \"MAIN_PLAYLIST_BUTTON_DEPRESSED\",\n      x: 69,\n      y: 61,\n      width: 23,\n      height: 12,\n    },\n    {\n      name: \"MAIN_PLAYLIST_BUTTON_DEPRESSED_SELECTED\",\n      x: 69,\n      y: 73,\n      width: 23,\n      height: 12,\n    },\n  ],\n  TEXT: characterSprites,\n  TITLEBAR: [\n    { name: \"MAIN_TITLE_BAR\", x: 27, y: 15, width: 275, height: 14 },\n    { name: \"MAIN_TITLE_BAR_SELECTED\", x: 27, y: 0, width: 275, height: 14 },\n    {\n      name: \"MAIN_EASTER_EGG_TITLE_BAR\",\n      x: 27,\n      y: 72,\n      width: 275,\n      height: 14,\n    },\n    {\n      name: \"MAIN_EASTER_EGG_TITLE_BAR_SELECTED\",\n      x: 27,\n      y: 57,\n      width: 275,\n      height: 14,\n    },\n    { name: \"MAIN_OPTIONS_BUTTON\", x: 0, y: 0, width: 9, height: 9 },\n    {\n      name: \"MAIN_OPTIONS_BUTTON_DEPRESSED\",\n      x: 0,\n      y: 9,\n      width: 9,\n      height: 9,\n    },\n    { name: \"MAIN_MINIMIZE_BUTTON\", x: 9, y: 0, width: 9, height: 9 },\n    {\n      name: \"MAIN_MINIMIZE_BUTTON_DEPRESSED\",\n      x: 9,\n      y: 9,\n      width: 9,\n      height: 9,\n    },\n    { name: \"MAIN_SHADE_BUTTON\", x: 0, y: 18, width: 9, height: 9 },\n    { name: \"MAIN_SHADE_BUTTON_DEPRESSED\", x: 9, y: 18, width: 9, height: 9 },\n    { name: \"MAIN_CLOSE_BUTTON\", x: 18, y: 0, width: 9, height: 9 },\n    { name: \"MAIN_CLOSE_BUTTON_DEPRESSED\", x: 18, y: 9, width: 9, height: 9 },\n    {\n      name: \"MAIN_CLUTTER_BAR_BACKGROUND\",\n      x: 304,\n      y: 0,\n      width: 8,\n      height: 43,\n    },\n    {\n      name: \"MAIN_CLUTTER_BAR_BACKGROUND_DISABLED\",\n      x: 312,\n      y: 0,\n      width: 8,\n      height: 43,\n    },\n    {\n      name: \"MAIN_CLUTTER_BAR_BUTTON_O_SELECTED\",\n      x: 304,\n      y: 47,\n      width: 8,\n      height: 8,\n    },\n    {\n      name: \"MAIN_CLUTTER_BAR_BUTTON_A_SELECTED\",\n      x: 312,\n      y: 55,\n      width: 8,\n      height: 7,\n    },\n    {\n      name: \"MAIN_CLUTTER_BAR_BUTTON_I_SELECTED\",\n      x: 320,\n      y: 62,\n      width: 8,\n      height: 7,\n    },\n    {\n      name: \"MAIN_CLUTTER_BAR_BUTTON_D_SELECTED\",\n      x: 328,\n      y: 69,\n      width: 8,\n      height: 8,\n    },\n    {\n      name: \"MAIN_CLUTTER_BAR_BUTTON_V_SELECTED\",\n      x: 336,\n      y: 77,\n      width: 8,\n      height: 7,\n    },\n    { name: \"MAIN_SHADE_BACKGROUND\", x: 27, y: 42, width: 275, height: 14 },\n    {\n      name: \"MAIN_SHADE_BACKGROUND_SELECTED\",\n      x: 27,\n      y: 29,\n      width: 275,\n      height: 14,\n    },\n    { name: \"MAIN_SHADE_BUTTON_SELECTED\", x: 0, y: 27, width: 9, height: 9 },\n    {\n      name: \"MAIN_SHADE_BUTTON_SELECTED_DEPRESSED\",\n      x: 9,\n      y: 27,\n      width: 9,\n      height: 9,\n    },\n    {\n      name: \"MAIN_SHADE_POSITION_BACKGROUND\",\n      x: 0,\n      y: 36,\n      width: 17,\n      height: 7,\n    },\n    { name: \"MAIN_SHADE_POSITION_THUMB\", x: 20, y: 36, width: 3, height: 7 },\n    {\n      name: \"MAIN_SHADE_POSITION_THUMB_LEFT\",\n      x: 17,\n      y: 36,\n      width: 3,\n      height: 7,\n    },\n    {\n      name: \"MAIN_SHADE_POSITION_THUMB_RIGHT\",\n      x: 23,\n      y: 36,\n      width: 3,\n      height: 7,\n    },\n  ],\n  VOLUME: [\n    { name: \"MAIN_VOLUME_BACKGROUND\", x: 0, y: 0, width: 68, height: 420 },\n    { name: \"MAIN_VOLUME_THUMB\", x: 15, y: 422, width: 14, height: 11 },\n    {\n      name: \"MAIN_VOLUME_THUMB_SELECTED\",\n      x: 0,\n      y: 422,\n      width: 14,\n      height: 11,\n    },\n  ],\n  GEN: [\n    { name: \"GEN_TOP_LEFT_SELECTED\", x: 0, y: 0, width: 25, height: 20 },\n    { name: \"GEN_TOP_LEFT_END_SELECTED\", x: 26, y: 0, width: 25, height: 20 },\n    {\n      name: \"GEN_TOP_CENTER_FILL_SELECTED\",\n      x: 52,\n      y: 0,\n      width: 25,\n      height: 20,\n    },\n    { name: \"GEN_TOP_RIGHT_END_SELECTED\", x: 78, y: 0, width: 25, height: 20 },\n    {\n      name: \"GEN_TOP_LEFT_RIGHT_FILL_SELECTED\",\n      x: 104,\n      y: 0,\n      width: 25,\n      height: 20,\n    },\n    { name: \"GEN_TOP_RIGHT_SELECTED\", x: 130, y: 0, width: 25, height: 20 },\n\n    { name: \"GEN_TOP_LEFT\", x: 0, y: 21, width: 25, height: 20 },\n    { name: \"GEN_TOP_LEFT_END\", x: 26, y: 21, width: 25, height: 20 },\n    { name: \"GEN_TOP_CENTER_FILL\", x: 52, y: 21, width: 25, height: 20 },\n    { name: \"GEN_TOP_RIGHT_END\", x: 78, y: 21, width: 25, height: 20 },\n    { name: \"GEN_TOP_LEFT_RIGHT_FILL\", x: 104, y: 21, width: 25, height: 20 },\n    { name: \"GEN_TOP_RIGHT\", x: 130, y: 21, width: 25, height: 20 },\n    { name: \"GEN_BOTTOM_LEFT\", x: 0, y: 42, width: 125, height: 14 },\n    { name: \"GEN_BOTTOM_RIGHT\", x: 0, y: 57, width: 125, height: 14 },\n    { name: \"GEN_BOTTOM_FILL\", x: 127, y: 72, width: 25, height: 14 },\n    { name: \"GEN_MIDDLE_LEFT\", x: 127, y: 42, width: 11, height: 29 },\n    { name: \"GEN_MIDDLE_LEFT_BOTTOM\", x: 158, y: 42, width: 11, height: 24 },\n    { name: \"GEN_MIDDLE_RIGHT\", x: 139, y: 42, width: 8, height: 29 },\n    { name: \"GEN_MIDDLE_RIGHT_BOTTOM\", x: 170, y: 42, width: 8, height: 24 },\n    { name: \"GEN_CLOSE_SELECTED\", x: 148, y: 42, width: 9, height: 9 },\n  ],\n  /*\n\n  We don't currently support the Media Library, so there are disabled\n  GENEX: [\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_LEFT_UNPRESSED\",\n      x: 0,\n      y: 0,\n      height: 15,\n      width: 4,\n    },\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_CENTER_UNPRESSED\",\n      x: 4,\n      y: 0,\n      height: 15,\n      width: 39,\n    },\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_RIGHT_UNPRESSED\",\n      x: 43,\n      y: 0,\n      height: 15,\n      width: 4,\n    },\n    {\n      name: \"GENEX_BUTTON_BACKGROUND_PRESSED\",\n      x: 0,\n      y: 1,\n      height: 15,\n      width: 47,\n    },\n    { name: \"GENEX_SCROLL_UP_UNPRESSED\", x: 0, y: 31, height: 14, width: 14 },\n    {\n      name: \"GENEX_SCROLL_DOWN_UNPRESSED\",\n      x: 14,\n      y: 31,\n      height: 14,\n      width: 14,\n    },\n    { name: \"GENEX_SCROLL_UP_PRESSED\", x: 28, y: 31, height: 14, width: 14 },\n    { name: \"GENEX_SCROLL_DOWN_PRESSED\", x: 42, y: 31, height: 14, width: 14 },\n    { name: \"GENEX_SCROLL_LEFT_UNPRESSED\", x: 0, y: 45, height: 14, width: 14 },\n    {\n      name: \"GENEX_SCROLL_RIGHT_UNPRESSED\",\n      x: 14,\n      y: 45,\n      height: 14,\n      width: 14,\n    },\n    { name: \"GENEX_SCROLL_LEFT_PRESSED\", x: 28, y: 45, height: 14, width: 14 },\n    { name: \"GENEX_SCROLL_RIGHT_PRESSED\", x: 42, y: 45, height: 14, width: 14 },\n    {\n      name: \"GENEX_VERTICAL_SCROLL_HANDLE_UNPRESSED\",\n      x: 56,\n      y: 31,\n      height: 28,\n      width: 14,\n    },\n    {\n      name: \"GENEX_VERTICAL_SCROLL_HANDLE_PRESSED\",\n      x: 70,\n      y: 31,\n      height: 28,\n      width: 14,\n    },\n    {\n      name: \"GENEX_HORIZONTAL_SCROLL_HANDLE_UNPRESSED\",\n      x: 84,\n      y: 31,\n      height: 14,\n      width: 28,\n    },\n    {\n      name: \"GENEX_HORIZONTAL_SCROLL_HANDLE_PRESSED\",\n      x: 84,\n      y: 45,\n      height: 14,\n      width: 28,\n    },\n  ],\n  */\n};\n\nexport default sprites;\n"
  },
  {
    "path": "webamp/packages/webamp/js/snapUtils.test.ts",
    "content": "import {\n  top,\n  bottom,\n  left,\n  right,\n  near,\n  snap,\n  overlapY,\n  overlapX,\n  snapWithin,\n  applySnap,\n  snapDiff,\n  boundingBox,\n  applyMultipleDiffs,\n} from \"./snapUtils\";\n\ndescribe(\"side functions\", () => {\n  const box = { x: 10, y: 15, width: 50, height: 100 };\n  it(\"can find the top of a box\", () => {\n    const actual = top(box);\n    const expected = 15;\n    expect(actual).toEqual(expected);\n  });\n  it(\"can find the bottom of a box\", () => {\n    const actual = bottom(box);\n    const expected = 115;\n    expect(actual).toEqual(expected);\n  });\n  it(\"can find the left of a box\", () => {\n    const actual = left(box);\n    const expected = 10;\n    expect(actual).toEqual(expected);\n  });\n  it(\"can find the right of a box\", () => {\n    const actual = right(box);\n    const expected = 60;\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"near function\", () => {\n  it(\"can tell if A is near B\", () => {\n    const actual = near(10, 20);\n    const expected = true;\n    expect(actual).toEqual(expected);\n  });\n  it(\"can tell if A is near B\", () => {\n    const actual = near(10, 30);\n    const expected = false;\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"overlap functions\", () => {\n  it(\"overlapY detects when the boxes overlap in the Y axis\", () => {\n    const a = { y: 10, height: 50, width: 100, x: 0 };\n    const b = { y: 40, height: 50, width: 100, x: 0 };\n    const actual = overlapY(a, b);\n    const expected = true;\n    expect(actual).toEqual(expected);\n  });\n  it(\"overlapY detects when the boxes are within SNAP_DISTANCE on the Y axis\", () => {\n    const a = { y: 10, height: 50, width: 100, x: 0 };\n    const b = { y: 70, height: 50, width: 100, x: 0 };\n    const actual = overlapY(a, b);\n    const expected = true;\n    expect(actual).toEqual(expected);\n  });\n  it(\"overlapY detects when the boxes do not overlap in the Y axis\", () => {\n    const a = { y: 10, height: 50, width: 100, x: 0 };\n    const b = { y: 90, height: 50, width: 100, x: 0 };\n    const actual = overlapY(a, b);\n    const expected = false;\n    expect(actual).toEqual(expected);\n  });\n  it(\"overlapX detects when the boxes overlap in the X axis\", () => {\n    const a = { x: 10, width: 50, height: 100, y: 0 };\n    const b = { x: 40, width: 50, height: 100, y: 0 };\n    const actual = overlapX(a, b);\n    const expected = true;\n    expect(actual).toEqual(expected);\n  });\n  it(\"overlapX detects when the boxes are within SNAP_DISTANCE on the X axis\", () => {\n    const a = { x: 10, width: 50, height: 100, y: 0 };\n    const b = { x: 70, width: 50, height: 100, y: 0 };\n    const actual = overlapX(a, b);\n    const expected = true;\n    expect(actual).toEqual(expected);\n  });\n  it(\"overlapX detects when the boxes do not overlap in the X axis\", () => {\n    const a = { x: 10, width: 50, height: 100, y: 0 };\n    const b = { x: 90, width: 50, height: 100, y: 0 };\n    const actual = overlapX(a, b);\n    const expected = false;\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"snap function\", () => {\n  it(\"does not snap if A and B are obviously far apart\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 200, y: 200, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = {};\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the left of A to the right of B\", () => {\n    const a = { x: 120, y: 30, width: 100, height: 100 };\n    const b = { x: 10, y: 10, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 110 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the right of A to the left of B\", () => {\n    const a = { x: 10, y: 30, width: 100, height: 100 };\n    const b = { x: 120, y: 10, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 20 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top of A to the bottom of B\", () => {\n    const a = { x: 30, y: 10, width: 100, height: 100 };\n    const b = { x: 10, y: 120, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { y: 20 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the bottom of A to the top of B\", () => {\n    const a = { x: 30, y: 120, width: 100, height: 100 };\n    const b = { x: 10, y: 10, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { y: 110 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"does not snap to the X axis if A is below B\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 110, y: 150, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = {};\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps in both axis if the corners are within SNAP_DISTANCE\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 120, y: 120, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 20, y: 20 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the left of A to the left of B\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 15, y: 110, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 15, y: 10 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top of A to the bottom of B\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 110, y: 15, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 10, y: 15 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top left corner of A to the bottom right corner of B\", () => {\n    const a = { x: 110, y: 110, width: 100, height: 100 };\n    const b = { x: 0, y: 0, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 100, y: 100 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top of A down to the bottom of B, if A slighterly overlaps B\", () => {\n    const a = { x: 0, y: 90, width: 100, height: 100 };\n    const b = { x: 0, y: 0, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 0, y: 100 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top of A down to the bottom of B, if A slighterly overlaps B\", () => {\n    const a = { x: 0, y: 90, width: 100, height: 100 };\n    const b = { x: 0, y: 0, width: 100, height: 100 };\n    const actual = snap(a, b);\n    const expected = { x: 0, y: 100 };\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"snapWithin function\", () => {\n  it(\"snaps the inner box to the top of the outer box\", () => {\n    const inner = { x: 120, y: 10, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the bottom of the outer box\", () => {\n    const inner = { x: 120, y: 910, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { y: 900 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the right of the outer box\", () => {\n    const inner = { x: 910, y: 120, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { x: 900 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the left of the outer box\", () => {\n    const inner = { x: 10, y: 120, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { x: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the top-left of the outer box\", () => {\n    const inner = { x: 10, y: 10, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { x: 0, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"applySnap function\", () => {\n  it(\"does not apply undefined values\", () => {\n    const original = { x: 10, y: 10 };\n    const snapped = { x: undefined, y: undefined };\n    const actual = applySnap(original, snapped);\n    const expected = original;\n    expect(actual).toEqual(expected);\n  });\n  it(\"preserves other values on original\", () => {\n    const original = { x: 10, y: 10, foo: \"bar\" };\n    const snapped = { x: 50, y: 50 };\n    const actual = applySnap(original, snapped);\n    const expected = { x: 50, y: 50, foo: \"bar\" };\n    expect(actual).toEqual(expected);\n  });\n  it('will clobber original with falsy \"0\" values', () => {\n    const original = { x: 10, y: 10 };\n    const snapped = { x: 0, y: 0 };\n    const actual = applySnap(original, snapped);\n    expect(actual).toEqual(snapped);\n  });\n  it('will clobber original with falsy \"0\" values', () => {\n    const original = { x: 10, y: 10 };\n    const snapped = { x: 0, y: 0 };\n    const actual = applySnap(original, snapped);\n    expect(actual).toEqual(snapped);\n  });\n  it(\"can apply multiple snaps\", () => {\n    const original = { x: 10, y: 10 };\n    const snapped1 = { x: 0 };\n    const snapped2 = { y: 0 };\n    const actual = applySnap(original, snapped1, snapped2);\n    const expected = { x: 0, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"the last snap wins\", () => {\n    const original = { x: 10, y: 10 };\n    const snapped1 = { x: 50, y: 20 };\n    const snapped2 = { x: 60, y: 60 };\n    const actual = applySnap(original, snapped1, snapped2);\n    const expected = { x: 60, y: 60 };\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"snap diff\", () => {\n  it(\"does not snap if A and B are obviously far apart\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 200, y: 200, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 0, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the left of A to the right of B\", () => {\n    const a = { x: 120, y: 30, width: 100, height: 100 };\n    const b = { x: 10, y: 10, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: -10, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the right of A to the left of B\", () => {\n    const a = { x: 10, y: 30, width: 100, height: 100 };\n    const b = { x: 120, y: 10, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 10, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top of A to the bottom of B\", () => {\n    const a = { x: 30, y: 10, width: 100, height: 100 };\n    const b = { x: 10, y: 120, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 0, y: 10 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the bottom of A to the top of B\", () => {\n    const a = { x: 30, y: 120, width: 100, height: 100 };\n    const b = { x: 10, y: 10, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 0, y: -10 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"does not snap to the X axis if A is below B\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 110, y: 150, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 0, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps in both axis if the corners are within SNAP_DISTANCE\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 120, y: 120, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 10, y: 10 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the left of A to the left of B\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 15, y: 110, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 5, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top of A to the bottom of B\", () => {\n    const a = { x: 10, y: 10, width: 100, height: 100 };\n    const b = { x: 110, y: 15, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: 0, y: 5 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the top left corner of A to the bottom right corner of B\", () => {\n    const a = { x: 110, y: 110, width: 100, height: 100 };\n    const b = { x: 0, y: 0, width: 100, height: 100 };\n    const actual = snapDiff(a, b);\n    const expected = { x: -10, y: -10 };\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"snapWithin function\", () => {\n  it(\"snaps the inner box to the top of the outer box\", () => {\n    const inner = { x: 120, y: 10, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the bottom of the outer box\", () => {\n    const inner = { x: 120, y: 910, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { y: 900 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the right of the outer box\", () => {\n    const inner = { x: 910, y: 120, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { x: 900 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the left of the outer box\", () => {\n    const inner = { x: 10, y: 120, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { x: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"snaps the inner box to the top-left of the outer box\", () => {\n    const inner = { x: 10, y: 10, width: 100, height: 100 };\n    const outer = { width: 1000, height: 1000 };\n    const actual = snapWithin(inner, outer);\n    const expected = { x: 0, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"boundingBox function\", () => {\n  it(\"does not mutate the given array\", () => {\n    const box = { x: 10, y: 10, width: 100, height: 100 };\n    const boxesA = [box];\n    const boxesB = [box];\n    boundingBox(boxesA);\n    expect(boxesA).toEqual(boxesB);\n  });\n  it(\"returns iteself when called on a single box\", () => {\n    const box = { x: 10, y: 10, width: 100, height: 100 };\n    expect(boundingBox([box])).toEqual(box);\n  });\n  it(\"returns the larger box when one fits entire within another\", () => {\n    const boxes = [\n      { x: 10, y: 10, width: 100, height: 100 },\n      { x: 20, y: 20, width: 80, height: 80 },\n    ];\n    expect(boundingBox(boxes)).toEqual(boxes[0]);\n  });\n  it(\"returns countaing box of two boxes\", () => {\n    const boxes = [\n      { x: 10, y: 10, width: 100, height: 100 },\n      { x: 120, y: 220, width: 100, height: 100 },\n    ];\n    expect(boundingBox(boxes)).toEqual({\n      x: 10,\n      y: 10,\n      width: 210,\n      height: 310,\n    });\n  });\n  it(\"returns countaing box of three boxes\", () => {\n    const boxes = [\n      { x: 10, y: 10, width: 100, height: 100 },\n      { x: 120, y: 220, width: 100, height: 100 },\n      { x: 3, y: 220, width: 100, height: 100 },\n    ];\n    expect(boundingBox(boxes)).toEqual({\n      x: 3,\n      y: 10,\n      width: 217,\n      height: 310,\n    });\n  });\n});\n\ndescribe(\"applySnap function\", () => {\n  it(\"does not apply undefined values\", () => {\n    const original = { x: 10, y: 10 };\n    const snapped = { x: undefined, y: undefined };\n    const actual = applySnap(original, snapped);\n    const expected = original;\n    expect(actual).toEqual(expected);\n  });\n  it(\"preserves other values on original\", () => {\n    const original = { x: 10, y: 10, foo: \"bar\" };\n    const snapped = { x: 50, y: 50 };\n    const actual = applySnap(original, snapped);\n    const expected = { x: 50, y: 50, foo: \"bar\" };\n    expect(actual).toEqual(expected);\n  });\n  it('will clobber original with falsy \"0\" values', () => {\n    const original = { x: 10, y: 10 };\n    const snapped = { x: 0, y: 0 };\n    const actual = applySnap(original, snapped);\n    expect(actual).toEqual(snapped);\n  });\n  it('will clobber original with falsy \"0\" values', () => {\n    const original = { x: 10, y: 10 };\n    const snapped = { x: 0, y: 0 };\n    const actual = applySnap(original, snapped);\n    expect(actual).toEqual(snapped);\n  });\n  it(\"can apply multiple snaps\", () => {\n    const original = { x: 10, y: 10 };\n    const snapped1 = { x: 0 };\n    const snapped2 = { y: 0 };\n    const actual = applySnap(original, snapped1, snapped2);\n    const expected = { x: 0, y: 0 };\n    expect(actual).toEqual(expected);\n  });\n  it(\"the last snap wins\", () => {\n    const original = { x: 10, y: 10 };\n    const snapped1 = { x: 50, y: 20 };\n    const snapped2 = { x: 60, y: 60 };\n    const actual = applySnap(original, snapped1, snapped2);\n    const expected = { x: 60, y: 60 };\n    expect(actual).toEqual(expected);\n  });\n\n  describe(\"applyMultipleDiffs\", () => {\n    it(\"uses the smallest non-zero value for each axis\", () => {\n      expect(\n        applyMultipleDiffs({ x: 31, y: -8 }, { x: 0, y: 8 }, { x: 0, y: 0 })\n      ).toEqual({ x: 31, y: 0 });\n    });\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/snapUtils.ts",
    "content": "import { Box, Point, Diff, BoundingBox } from \"./types\";\n\nexport const SNAP_DISTANCE = 15;\n\nexport const top = (box: Box) => box.y;\nexport const bottom = (box: Box) => box.y + box.height;\nexport const left = (box: Box) => box.x;\nexport const right = (box: Box) => box.x + box.width;\n\nexport const near = (a: number, b: number) => Math.abs(a - b) < SNAP_DISTANCE;\n\n// http://stackoverflow.com/a/3269471/1263117\nexport const overlapX = (a: Box, b: Box) =>\n  left(a) <= right(b) + SNAP_DISTANCE && left(b) <= right(a) + SNAP_DISTANCE;\nexport const overlapY = (a: Box, b: Box) =>\n  top(a) <= bottom(b) + SNAP_DISTANCE && top(b) <= bottom(a) + SNAP_DISTANCE;\n\n// Give a new position for `boxA` that snaps it to `boxB` if neede.\nexport const snap = (boxA: Box, boxB: Box) => {\n  let x, y;\n\n  // TODO: Refactor/simplify this code\n  if (overlapY(boxA, boxB)) {\n    if (near(left(boxA), right(boxB))) {\n      x = right(boxB);\n    } else if (near(right(boxA), left(boxB))) {\n      x = left(boxB) - boxA.width;\n    } else if (near(left(boxA), left(boxB))) {\n      x = left(boxB);\n    } else if (near(right(boxA), right(boxB))) {\n      x = right(boxB) - boxA.width;\n    }\n  }\n\n  if (overlapX(boxA, boxB)) {\n    if (near(top(boxA), bottom(boxB))) {\n      y = bottom(boxB);\n    } else if (near(bottom(boxA), top(boxB))) {\n      y = top(boxB) - boxA.height;\n    } else if (near(top(boxA), top(boxB))) {\n      y = top(boxB);\n    } else if (near(bottom(boxA), bottom(boxB))) {\n      y = bottom(boxB) - boxA.height;\n    }\n  }\n  return { x, y };\n};\n\nexport const snapDiff = (a: Box, b: Box): Point => {\n  const newPos = snap(a, b);\n  return {\n    x: newPos.x === undefined ? 0 : newPos.x - a.x,\n    y: newPos.y === undefined ? 0 : newPos.y - a.y,\n  };\n};\n\n// TODO: Use the first x and y combo\nexport const snapDiffManyToMany = (as: Box[], bs: Box[]): Point => {\n  let x: number | undefined = 0;\n  let y: number | undefined = 0;\n  for (const a of as) {\n    for (const b of bs) {\n      const diff = snapDiff(a, b);\n      x = x || diff.x;\n      y = y || diff.y;\n      if (x !== undefined && x > 0 && y !== undefined && y > 0) {\n        break;\n      }\n    }\n  }\n  return { x, y };\n};\n\nexport const snapToMany = (boxA: Box, otherBoxes: Box[]): Diff => {\n  let x: number | undefined;\n  let y: number | undefined;\n\n  otherBoxes.forEach((boxB) => {\n    const newPos = snap(boxA, boxB);\n    x = newPos.x || x;\n    y = newPos.y || y;\n  });\n\n  return { x, y };\n};\n\nexport const snapWithin = (boxA: Box, boundingBox: BoundingBox): Diff => {\n  let x, y;\n\n  if (boxA.x - SNAP_DISTANCE < 0) {\n    x = 0;\n  } else if (boxA.x + boxA.width + SNAP_DISTANCE > boundingBox.width) {\n    x = boundingBox.width - boxA.width;\n  }\n\n  if (boxA.y - SNAP_DISTANCE < 0) {\n    y = 0;\n  } else if (boxA.y + boxA.height + SNAP_DISTANCE > boundingBox.height) {\n    y = boundingBox.height - boxA.height;\n  }\n\n  return { x, y };\n};\n\nexport const snapWithinDiff = (a: Box, b: BoundingBox) => {\n  const newPos = snapWithin(a, b);\n  return {\n    x: newPos.x === undefined ? 0 : newPos.x - a.x,\n    y: newPos.y === undefined ? 0 : newPos.y - a.y,\n  };\n};\n\nexport const applySnap = (original: Point, ...snaps: Diff[]) =>\n  snaps.reduce(\n    (previous, snapped) => ({\n      ...previous,\n      x: typeof snapped.x !== \"undefined\" ? snapped.x : previous.x,\n      y: typeof snapped.y !== \"undefined\" ? snapped.y : previous.y,\n    }),\n    original\n  );\n\nexport const boundingBox = (nodes: Box[]): Box => {\n  const boxes = nodes.slice();\n  const firstNode = boxes.pop();\n  if (firstNode == null) {\n    throw new Error(\"boundingBox must be called with at least one node\");\n  }\n  const bounding = {\n    top: top(firstNode),\n    right: right(firstNode),\n    bottom: bottom(firstNode),\n    left: left(firstNode),\n  };\n\n  boxes.forEach((node) => {\n    bounding.top = Math.min(bounding.top, top(node));\n    bounding.right = Math.max(bounding.right, right(node));\n    bounding.bottom = Math.max(bounding.bottom, bottom(node));\n    bounding.left = Math.min(bounding.left, left(node));\n  });\n\n  return {\n    x: bounding.left,\n    y: bounding.top,\n    width: bounding.right - bounding.left,\n    height: bounding.bottom - bounding.top,\n  };\n};\n\nexport function traceConnection<B extends Box>(\n  areConnected: (candidate: Box, n: Box) => boolean\n) {\n  return (candidates: B[], node: B): Set<B> => {\n    const connected = new Set<B>();\n    const checkNode = (n: B) => {\n      for (const candidate of candidates) {\n        if (!connected.has(candidate) && areConnected(candidate, n)) {\n          connected.add(candidate);\n          checkNode(candidate);\n        }\n      }\n    };\n    checkNode(node);\n    return connected;\n  };\n}\n\nexport const applyDiff = (a: Point, b: Point) => ({\n  x: a.x + b.x,\n  y: a.y + b.y,\n});\n\n// TODO: This should not\nexport const applyMultipleDiffs = (initial: Point, ...diffs: Point[]) => {\n  const metaDiff = diffs.reduce((m, diff) => ({\n    // Use the smallest non-zero diff for each axis.\n    // TODO: Min should be the absolute value\n    x: m.x === 0 || diff.x === 0 ? m.x + diff.x : Math.min(m.x, diff.x),\n    y: m.y === 0 || diff.y === 0 ? m.y + diff.y : Math.min(m.y, diff.y),\n  }));\n  return applyDiff(initial, metaDiff);\n};\n"
  },
  {
    "path": "webamp/packages/webamp/js/spinParserUtils.test.ts",
    "content": "import * as SkinParserUtils from \"./skinParserUtils\";\n\ndescribe(\"getFileExtension\", () => {\n  it(\"can get bmp\", () => {\n    expect(SkinParserUtils.getFileExtension(\"foo.bmp\")).toBe(\"bmp\");\n  });\n  it(\"can match four char extension\", () => {\n    expect(SkinParserUtils.getFileExtension(\"foo.html\")).toBe(\"html\");\n  });\n  it(\"converts to lower case\", () => {\n    expect(SkinParserUtils.getFileExtension(\"foo.BMP\")).toBe(\"bmp\");\n  });\n  it(\"returns null if a match is not found\", () => {\n    expect(SkinParserUtils.getFileExtension(\"foo\")).toBe(null);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/store.ts",
    "content": "import { createStore, applyMiddleware, DeepPartial } from \"redux\";\nimport thunk from \"redux-thunk\";\nimport { composeWithDevTools } from \"redux-devtools-extension\";\nimport reducer from \"./reducers\";\nimport mediaMiddleware from \"./mediaMiddleware\";\nimport { merge } from \"./utils\";\nimport { UPDATE_TIME_ELAPSED, STEP_MARQUEE } from \"./actionTypes\";\nimport Media from \"./media\";\nimport Emitter from \"./emitter\";\nimport { Extras, Dispatch, Action, AppState, Middleware } from \"./types\";\n\n// TODO: Move to demo\nconst compose = composeWithDevTools({\n  actionsBlacklist: [UPDATE_TIME_ELAPSED, STEP_MARQUEE],\n});\n\nexport default function (\n  media: Media,\n  actionEmitter: Emitter,\n  customMiddlewares: Middleware[] = [],\n  stateOverrides: DeepPartial<AppState> | undefined,\n  extras: Extras\n) {\n  let initialState;\n  if (stateOverrides) {\n    initialState = merge(\n      reducer(undefined, { type: \"@@init\" }),\n      stateOverrides\n    );\n  }\n\n  const emitterMiddleware = () => (next: Dispatch) => (action: Action) => {\n    actionEmitter.trigger(action.type, action);\n    return next(action);\n  };\n\n  const enhancer = compose(\n    applyMiddleware(\n      ...[\n        thunk.withExtraArgument(extras),\n        mediaMiddleware(media),\n        emitterMiddleware,\n        ...customMiddlewares,\n      ].filter(Boolean)\n    )\n  );\n\n  // The Redux types are a bit confused, and don't realize that passing an\n  // undefined initialState is allowed.\n  const store = initialState\n    ? createStore(reducer, initialState, enhancer)\n    : createStore(reducer, enhancer);\n  return store;\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/trackUtils.ts",
    "content": "import { PlaylistTrack } from \"./types\";\nimport * as Utils from \"./utils\";\nimport * as FileUtils from \"./fileUtils\";\n\nexport const trackName = Utils.weakMapMemoize(\n  (track: PlaylistTrack): string => {\n    const { artist, title, defaultName, url } = track;\n    if (artist && title) {\n      return `${artist} - ${title}`;\n    } else if (title) {\n      return title;\n    } else if (defaultName) {\n      return defaultName;\n    } else if (url) {\n      const filename = FileUtils.filenameFromUrl(url);\n      if (filename) {\n        return filename;\n      }\n    }\n    return \"???\";\n  }\n);\n\nexport const trackFilename = Utils.weakMapMemoize(\n  (track: PlaylistTrack): string => {\n    if (track.url) {\n      const urlFilename = FileUtils.filenameFromUrl(track.url);\n      if (urlFilename != null) {\n        return urlFilename;\n      }\n    }\n    if (track.defaultName) {\n      return track.defaultName;\n    }\n    return \"???\";\n  }\n);\n"
  },
  {
    "path": "webamp/packages/webamp/js/types.ts",
    "content": "import { PlaylistState } from \"./reducers/playlist\";\nimport { SettingsState } from \"./reducers/settings\";\nimport { UserInputState } from \"./reducers/userInput\";\nimport { MediaState } from \"./reducers/media\";\nimport { ThunkDispatch, ThunkAction } from \"redux-thunk\";\nimport { DisplayState } from \"./reducers/display\";\nimport {\n  WindowsState,\n  WindowPositions as _WindowPositions,\n  WebampWindow as _WebampWindow,\n  WindowInfo as _WindowInfo,\n  WindowPosition as _WindowPosition,\n} from \"./reducers/windows\";\nimport { EqualizerState } from \"./reducers/equalizer\";\nimport { NetworkState } from \"./reducers/network\";\nimport { MilkdropState } from \"./reducers/milkdrop\";\nimport { SerializedStateV1 } from \"./serializedStates/v1Types\";\nimport { TracksState } from \"./reducers/tracks\";\nimport { IAudioMetadata, IOptions } from \"music-metadata\";\nimport { Store as ReduxStore } from \"redux\";\n\n// Avoid warnings from Webpack: https://github.com/webpack/webpack/issues/7378\nexport type WebampWindow = _WebampWindow;\nexport type WindowInfo = _WindowInfo;\nexport type WindowPosition = _WindowPosition;\nexport type WindowPositions = _WindowPositions;\n\nexport interface Point {\n  x: number;\n  y: number;\n}\n\nexport interface Diff {\n  x?: number;\n  y?: number;\n}\n\nexport interface BoundingBox {\n  width: number;\n  height: number;\n}\n\nexport interface Box extends Point {\n  width: number;\n  height: number;\n}\n\nexport interface FilePicker {\n  contextMenuName: string;\n  filePicker: () => Promise<Track[]>;\n  requiresNetwork: boolean;\n}\n\nexport type Skin = {\n  url: string;\n  name: string;\n};\n\nexport interface MilkdropMessage {\n  text: string;\n  time: number;\n}\n\nexport type Band =\n  | 60\n  | 170\n  | 310\n  | 600\n  | 1000\n  | 3000\n  | 6000\n  | 12000\n  | 14000\n  | 16000;\n\nexport type Slider = Band | \"preamp\";\n\nexport type CursorImage =\n  | {\n      type: \"cur\";\n      url: string;\n    }\n  | {\n      type: \"ani\";\n      aniData: Uint8Array;\n    };\n\n// TODO: Use a type to ensure these keys mirror the CURSORS constant in\n// skinParser.js\nexport type Cursors = { [cursor: string]: CursorImage };\n\nexport type GenLetterWidths = { [letter: string]: number };\n\nexport interface PlaylistStyle {\n  normal: string;\n  current: string;\n  normalbg: string;\n  selectedbg: string;\n  font: string;\n}\n\n// TODO: Type these keys.\nexport type SkinImages = { [sprite: string]: string };\n\n// TODO: type these keys\nexport type SkinRegion = { [windowName: string]: string[] };\n\nexport type DummyVizData = {\n  0: 11.75;\n  8: 11.0625;\n  16: 8.5;\n  24: 7.3125;\n  32: 6.75;\n  40: 6.4375;\n  48: 6.25;\n  56: 5.875;\n  64: 5.625;\n  72: 5.25;\n  80: 5.125;\n  88: 4.875;\n  96: 4.8125;\n  104: 4.375;\n  112: 3.625;\n  120: 1.5625;\n};\n\nexport interface SkinGenExColors {\n  itemBackground: string;\n  itemForeground: string;\n  windowBackground: string;\n  buttonText: string;\n  windowText: string;\n  divider: string;\n  playlistSelection: string;\n  listHeaderBackground: string;\n  listHeaderText: string;\n  listHeaderFrameTopAndLeft: string;\n  listHeaderFrameBottomAndRight: string;\n  listHeaderFramePressed: string;\n  listHeaderDeadArea: string;\n  scrollbarOne: string;\n  scrollbarTwo: string;\n  pressedScrollbarOne: string;\n  pressedScrollbarTwo: string;\n  scrollbarDeadArea: string;\n  listTextHighlighted: string;\n  listTextHighlightedBackground: string;\n  listTextSelected: string;\n  listTextSelectedBackground: string;\n}\n\nexport type WindowId = string;\n\n// TODO: Fill these out once we actually use them.\nexport type SkinData = {\n  skinImages: SkinImages;\n  skinColors: string[];\n  skinPlaylistStyle: PlaylistStyle;\n  skinCursors: Cursors;\n  skinRegion: SkinRegion;\n  skinGenLetterWidths: GenLetterWidths;\n  skinGenExColors: SkinGenExColors | null;\n};\n\n// This is what we actually pass to butterchurn\ntype ButterchurnPresetJson = {\n  name: string;\n  butterchurnPresetObject: Object;\n};\n\n// A URL that points to a Butterchurn preset\ninterface ButterchurnPresetUrl {\n  name: string;\n  butterchurnPresetUrl: string;\n}\n\nexport type LazyButterchurnPresetJson = {\n  name: string;\n  getButterchrunPresetObject: () => Promise<Object>;\n};\n\nexport type Preset =\n  | ButterchurnPresetJson\n  | ButterchurnPresetUrl\n  | LazyButterchurnPresetJson;\n\nexport type StatePreset =\n  | { type: \"RESOLVED\"; name: string; preset: Object }\n  | { type: \"UNRESOLVED\"; name: string; getPreset: () => Promise<Object> };\n\nexport interface ButterchurnOptions {\n  getPresets(): Promise<Preset[]>;\n  importButterchurn(): Promise<any>;\n  importConvertPreset?: () => Promise<{\n    convertPreset(file: string, endpoint: string): Promise<Object>;\n  }>;\n  presetConverterEndpoint?: string;\n  butterchurnOpen: boolean;\n}\n\nexport interface EqfPreset {\n  name: string;\n  hz60: number;\n  hz170: number;\n  hz310: number;\n  hz600: number;\n  hz1000: number;\n  hz3000: number;\n  hz12000: number;\n  hz14000: number;\n  hz16000: number;\n  hz6000: number;\n  preamp: number;\n}\n\nexport enum TransitionType {\n  IMMEDIATE,\n  DEFAULT,\n  USER_PRESET,\n}\n\nexport interface Size {\n  width: number;\n  height: number;\n}\n\nexport type Action =\n  | {\n      type: \"@@init\";\n    }\n  | {\n      type: \"NETWORK_CONNECTED\";\n    }\n  | {\n      type: \"NETWORK_DISCONNECTED\";\n    }\n  | {\n      type: \"SET_AVAILABLE_SKINS\";\n      skins: Array<Skin>;\n    }\n  | {\n      type: \"PLAY\";\n    }\n  | {\n      type: \"IS_PLAYING\";\n    }\n  | {\n      type: \"PAUSE\";\n    }\n  | {\n      type: \"STOP\";\n    }\n  | {\n      type: \"IS_STOPPED\";\n    }\n  | {\n      type: \"TOGGLE_TIME_MODE\";\n    }\n  | {\n      type: \"UPDATE_TIME_ELAPSED\";\n      elapsed: number;\n    }\n  | {\n      type: \"ADD_TRACK_FROM_URL\";\n      atIndex: number | null;\n      id: number;\n      defaultName?: string;\n      duration?: number;\n      url: string;\n    }\n  | {\n      type: \"SET_MEDIA\";\n      id: number;\n      length: number;\n      kbps: string;\n      khz: string;\n      channels: number;\n    }\n  | {\n      type: \"SET_VOLUME\";\n      volume: number;\n    }\n  | {\n      type: \"SET_BALANCE\";\n      balance: number;\n    }\n  | {\n      type: \"TOGGLE_REPEAT\";\n    }\n  | {\n      type: \"TOGGLE_SHUFFLE\";\n    }\n  | {\n      type: \"SET_FOCUS\";\n      input: string;\n    }\n  | {\n      type: \"SET_BAND_FOCUS\";\n      input: string;\n      bandFocused: Slider;\n    }\n  | {\n      type: \"UNSET_FOCUS\";\n    }\n  | {\n      type: \"SET_SCRUB_POSITION\";\n      position: number;\n    }\n  | {\n      type: \"SET_USER_MESSAGE\";\n      message: string;\n    }\n  | {\n      type: \"UNSET_USER_MESSAGE\";\n    }\n  | {\n      type: \"TOGGLE_DOUBLESIZE_MODE\";\n    }\n  | {\n      type: \"TOGGLE_LLAMA_MODE\";\n    }\n  | {\n      type: \"STEP_MARQUEE\";\n    }\n  | {\n      type: \"DISABLE_MARQUEE\";\n    }\n  | {\n      type: \"STOP_WORKING\";\n    }\n  | {\n      type: \"START_WORKING\";\n    }\n  | {\n      type: \"CLOSE_WINAMP\";\n    }\n  | {\n      type: \"OPEN_WINAMP\";\n    }\n  | {\n      type: \"LOADING\";\n    }\n  | {\n      type: \"LOADED\";\n    }\n  | {\n      type: \"SET_SKIN_DATA\";\n      data: SkinData;\n    }\n  | {\n      type: \"TOGGLE_VISUALIZER_STYLE\";\n    }\n  | {\n      type: \"SET_PLAYLIST_SCROLL_POSITION\";\n      position: number;\n    }\n  | {\n      type: \"SET_Z_INDEX\";\n      zIndex: number;\n    }\n  | {\n      type: \"SET_DUMMY_VIZ_DATA\";\n      data: null;\n    }\n  | {\n      type: \"SET_BAND_VALUE\";\n      band: Slider;\n      value: number;\n    }\n  | {\n      type: \"SET_EQ_ON\";\n    }\n  | {\n      type: \"SET_EQ_OFF\";\n    }\n  | {\n      type: \"SET_EQ_AUTO\";\n      value: boolean;\n    }\n  | {\n      type: \"SET_FOCUSED_WINDOW\";\n      window: WindowId | null;\n    }\n  | {\n      type: \"TOGGLE_WINDOW_SHADE_MODE\";\n      windowId: WindowId;\n    }\n  | {\n      type: \"TOGGLE_WINDOW\";\n      windowId: WindowId;\n    }\n  | {\n      type: \"CLOSE_WINDOW\";\n      windowId: WindowId;\n    }\n  | {\n      type: \"SET_WINDOW_VISIBILITY\";\n      windowId: WindowId;\n      hidden: boolean;\n    }\n  | {\n      type: \"ADD_GEN_WINDOW\";\n      windowId: WindowId;\n      title: string;\n      open: boolean;\n    }\n  | {\n      type: \"WINDOW_SIZE_CHANGED\";\n      windowId: WindowId;\n      size: [number, number];\n    }\n  | {\n      type: \"UPDATE_WINDOW_POSITIONS\";\n      positions: WindowPositions;\n      absolute?: boolean;\n    }\n  | {\n      type: \"CLICKED_TRACK\";\n      index: number;\n    }\n  | {\n      type: \"CTRL_CLICKED_TRACK\";\n      index: number;\n    }\n  | {\n      type: \"SHIFT_CLICKED_TRACK\";\n      index: number;\n    }\n  | {\n      type: \"SELECT_ALL\";\n    }\n  | {\n      type: \"SELECT_ZERO\";\n    }\n  | {\n      type: \"INVERT_SELECTION\";\n    }\n  | {\n      type: \"REMOVE_ALL_TRACKS\";\n    }\n  | {\n      type: \"REMOVE_TRACKS\";\n      ids: number[];\n    }\n  | {\n      type: \"REVERSE_LIST\";\n    }\n  | {\n      type: \"RANDOMIZE_LIST\";\n    }\n  | {\n      type: \"SET_TRACK_ORDER\";\n      trackOrder: number[];\n    }\n  | {\n      type: \"SET_MEDIA_TAGS\";\n      id: number;\n      title: string;\n      artist: string;\n      album?: string;\n      albumArtUrl?: string | null;\n      numberOfChannels?: number;\n      bitrate?: number;\n      sampleRate?: number;\n    }\n  | {\n      type: \"MEDIA_TAG_REQUEST_INITIALIZED\";\n      id: number;\n    }\n  | {\n      type: \"MEDIA_TAG_REQUEST_FAILED\";\n      id: number;\n    }\n  | {\n      type: \"SET_MEDIA_DURATION\";\n      id: number;\n      duration: number;\n    }\n  | {\n      type: \"PLAY_TRACK\";\n      id: number;\n    }\n  | {\n      type: \"BUFFER_TRACK\";\n      id: number;\n    }\n  | {\n      type: \"DRAG_SELECTED\";\n      offset: number;\n    }\n  | {\n      type: \"PLAY\";\n    }\n  | {\n      type: \"PAUSE\";\n    }\n  | {\n      type: \"SEEK_TO_PERCENT_COMPLETE\";\n      percent: number;\n    }\n  | {\n      type: \"MINIMIZE_WINAMP\";\n    }\n  | {\n      type: \"CLOSE_REQUESTED\";\n      cancel: () => void;\n    }\n  | {\n      type: \"LOAD_SERIALIZED_STATE\";\n      serializedState: SerializedStateV1;\n    }\n  | { type: \"RESET_WINDOW_SIZES\" }\n  | { type: \"BROWSER_WINDOW_SIZE_CHANGED\"; height: number; width: number }\n  | { type: \"LOAD_DEFAULT_SKIN\" }\n  | { type: \"ENABLE_MILKDROP\"; open: boolean }\n  | { type: \"SCHEDULE_MILKDROP_MESSAGE\"; message: string }\n  | {\n      type: \"SET_MILKDROP_DESKTOP\";\n      enabled: boolean;\n    }\n  | {\n      type: \"SET_MILKDROP_FULLSCREEN\";\n      enabled: boolean;\n    }\n  | {\n      type: \"SET_MILKDROP_LOCK\";\n      enabled: boolean;\n    }\n  | { type: \"PRESET_REQUESTED\"; index: number; addToHistory: boolean }\n  | {\n      type: \"GOT_BUTTERCHURN_PRESETS\";\n      presets: StatePreset[];\n    }\n  | {\n      type: \"GOT_BUTTERCHURN\";\n      butterchurn: any;\n    }\n  | {\n      type: \"TOGGLE_RANDOMIZE_PRESETS\";\n    }\n  | { type: \"TOGGLE_PRESET_CYCLING\" }\n  | {\n      type: \"RESOLVE_PRESET_AT_INDEX\";\n      index: number | string | any;\n      json: Object;\n    }\n  | {\n      type: \"SELECT_PRESET_AT_INDEX\";\n      index: number | string | any;\n      transitionType: TransitionType;\n    }\n  | { type: \"TOGGLE_PRESET_OVERLAY\" }\n  | { type: \"MAIN_CONTEXT_MENU_OPENED\" }\n  | {\n      type: \"DROPPED_FILES\";\n      count: number;\n      firstFileName: string | null;\n      windowId: WindowId;\n    }\n  | {\n      type: \"OPENED_FILES\";\n      expectedType: \"SKIN\" | \"MEDIA\" | \"EQ\";\n      count: number;\n      firstFileName: string | null;\n    };\n\nexport type MediaTagRequestStatus =\n  | \"INITIALIZED\"\n  | \"FAILED\"\n  | \"COMPLETE\"\n  | \"NOT_REQUESTED\";\n\nexport type MediaStatus = \"PLAYING\" | \"STOPPED\" | \"PAUSED\";\n\nexport type LoadStyle = \"BUFFER\" | \"PLAY\" | \"NONE\";\n\nexport type TimeMode = \"ELAPSED\" | \"REMAINING\";\n\ninterface TrackInfo {\n  /**\n   * Name to be used until ID3 tags can be resolved.\n   *\n   * If the track has a `url`, and this property is not given,\n   * the filename will be used instead.\n   *\n   * Example: `'My Song'`\n   */\n  defaultName?: string;\n\n  /**\n   * Data to be used _instead_ of trying to fetch ID3 tags.\n   *\n   * Example: `{ artist: 'Jordan Eldredge', title: \"Jordan's Song\" }`\n   */\n  metaData?: {\n    artist: string;\n    title: string;\n    album?: string;\n    albumArtUrl?: string;\n  };\n\n  /**\n   * Duration (in seconds) to be used instead of fetching enough of the file to measure its length.\n   *\n   * Example: 95\n   */\n  duration?: number;\n}\n\nexport interface URLTrack extends TrackInfo {\n  /**\n   * Source URL of the track\n   *\n   * Note: This URL must be served the with correct CORs headers.\n   *\n   * Example: `'https://example.com/song.mp3'`\n   */\n  url: string;\n}\n\nexport interface BlobTrack extends TrackInfo {\n  /**\n   * Blob source of the track\n   */\n  blob: Blob;\n}\n\nexport interface LoadedURLTrack {\n  url: string;\n  metaData: {\n    artist: string | null;\n    title: string | null;\n    album: string | null;\n    albumArtUrl: string | null;\n  };\n}\n\n/**\n * Many methods on the webamp instance deal with track.\n *\n * Either `url` or `blob` must be specified\n */\nexport type Track = URLTrack | BlobTrack;\n\nexport interface PlaylistTrack {\n  id: number;\n  artist?: string;\n  title?: string;\n  album?: string;\n  url: string;\n  defaultName: string | null;\n  albumArtUrl?: string | null;\n  mediaTagsRequestStatus: MediaTagRequestStatus;\n  duration: number | null;\n  kbps?: string;\n  khz: string;\n  channels?: number;\n}\n\nexport interface AppState {\n  userInput: UserInputState;\n  windows: WindowsState;\n  display: DisplayState;\n  settings: SettingsState;\n  equalizer: EqualizerState;\n  playlist: PlaylistState;\n  media: MediaState;\n  network: NetworkState;\n  tracks: TracksState;\n  milkdrop: MilkdropState;\n}\n\n/**\n * Type definition of the music-metadata module.\n * Ref: https://github.com/Borewit/music-metadata/blob/master/src/index.ts\n */\nexport interface IMusicMetadataBrowserApi {\n  /**\n   * Parse Web API File\n   * @param {Blob} blob\n   * @param {IOptions} options Parsing options\n   * @returns {Promise<IAudioMetadata>}\n   */\n  parseBlob(blob: Blob, options?: IOptions): Promise<IAudioMetadata>;\n\n  /**\n   * Parse fetched file, using the Web Fetch API\n   * @param {string} audioTrackUrl URL to download the audio track from\n   * @param {IOptions} options Parsing options\n   * @returns {Promise<IAudioMetadata>}\n   */\n  fetchFromUrl(\n    audioTrackUrl: string,\n    options?: IOptions\n  ): Promise<IAudioMetadata>;\n\n  /**\n   * Parse audio from Node Buffer\n   * @param {Stream.Readable} stream Audio input stream\n   * @param {string} mimeType <string> Content specification MIME-type, e.g.: 'audio/mpeg'\n   * @param {IOptions} options Parsing options\n   * @returns {Promise<IAudioMetadata>}\n   */\n  parseBuffer(\n    buf: Buffer,\n    mimeType?: string,\n    options?: IOptions\n  ): Promise<IAudioMetadata>;\n}\n\nexport interface Extras {\n  requireJSZip(): Promise<never>;\n  requireMusicMetadata(): Promise<IMusicMetadataBrowserApi>;\n  convertPreset: ((file: File) => Promise<Object>) | null;\n  handleTrackDropEvent?: (\n    e: React.DragEvent<HTMLDivElement>\n  ) => Track[] | null | Promise<Track[] | null>;\n  handleAddUrlEvent?: () => Track[] | null | Promise<Track[] | null>;\n  handleLoadListEvent?: () => Track[] | null | Promise<Track[] | null>;\n  handleSaveListEvent?: (tracks: Track[]) => null | Promise<null>;\n}\n\nexport type GetState = () => AppState;\n\nexport type Thunk = ThunkAction<void, AppState, Extras, Action>;\n\nexport type Dispatch = ThunkDispatch<AppState, Extras, Action>;\n\nexport type Reducer = (state: AppState, action: Action) => AppState;\n\nexport type Middleware = (\n  store: MiddlewareStore\n) => (next: Dispatch) => (action: Action) => any;\n\nexport interface Store extends ReduxStore {\n  subscribe(cb: () => void): () => void;\n  dispatch: Dispatch;\n  getState: GetState;\n  replaceReducer(reducer: Reducer): void;\n}\n\nexport interface MiddlewareStore {\n  dispatch: Dispatch;\n  getState: GetState;\n}\n\nexport const SELECT_PRESET = \"SELECT_PRESET\";\nexport const NEXT_PRESET = \"NEXT_PRESET\";\n\nexport interface SelectPresetAction {\n  type: typeof SELECT_PRESET;\n  payload: string;\n}\n\nexport interface NextPresetAction {\n  type: typeof NEXT_PRESET;\n}"
  },
  {
    "path": "webamp/packages/webamp/js/utils.test.ts",
    "content": "import fs from \"fs\";\n\nimport {\n  getTimeObj,\n  getTimeStr,\n  clamp,\n  parseViscolors,\n  parseIni,\n  normalizeEqBand,\n  denormalizeEqBand,\n  segment,\n  moveSelected,\n  spliceIn,\n  replaceAtIndex,\n} from \"./utils\";\n\nconst fixture = (filename: string) =>\n  fs.readFileSync(`./js/__tests__/fixtures/${filename}`, \"utf8\");\n\ndescribe(\"getTimeObj\", () => {\n  it(\"expresses seconds as an object\", () => {\n    const actual = getTimeObj(1234);\n    const expected = {\n      minutesFirstDigit: \"2\",\n      minutesSecondDigit: \"0\",\n      secondsFirstDigit: \"3\",\n      secondsSecondDigit: \"4\",\n    };\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"getTimeStr\", () => {\n  it(\"expresses seconds as string\", () => {\n    const actual = getTimeStr(1234);\n    const expected = \"20:34\";\n    expect(actual).toEqual(expected);\n  });\n  it(\"pads with only one zero\", () => {\n    const actual = getTimeStr(5);\n    const expected = \"0:05\";\n    expect(actual).toEqual(expected);\n  });\n  it(\"truncates extra minutes\", () => {\n    const actual = getTimeStr(540000);\n    const expected = \"9000:00\";\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"clamp\", () => {\n  it(\"respects the max value\", () => {\n    const actual = clamp(101, 0, 100);\n    const expected = 100;\n    expect(actual).toEqual(expected);\n  });\n  it(\"respects the min value\", () => {\n    const actual = clamp(0, 1, 100);\n    const expected = 1;\n    expect(actual).toEqual(expected);\n  });\n  it(\"respects the given value if in range\", () => {\n    const actual = clamp(50, 0, 100);\n    const expected = 50;\n    expect(actual).toEqual(expected);\n  });\n});\n\ndescribe(\"parseViscolors\", () => {\n  it(\"can parse the default viscolors file\", () => {\n    const viscolors = fixture(\"VISCOLOR.TXT\");\n    const actual = parseViscolors(viscolors);\n    expect(actual).toMatchInlineSnapshot(`\nArray [\n  \"rgb(0,0,0)\",\n  \"rgb(24,33,41)\",\n  \"rgb(239,49,16)\",\n  \"rgb(206,41,16)\",\n  \"rgb(214,90,0)\",\n  \"rgb(214,102,0)\",\n  \"rgb(214,115,0)\",\n  \"rgb(198,123,8)\",\n  \"rgb(222,165,24)\",\n  \"rgb(214,181,33)\",\n  \"rgb(189,222,41)\",\n  \"rgb(148,222,33)\",\n  \"rgb(41,206,16)\",\n  \"rgb(50,190,16)\",\n  \"rgb(57,181,16)\",\n  \"rgb(49,156,8)\",\n  \"rgb(41,148,0)\",\n  \"rgb(24,132,8)\",\n  \"rgb(255,255,255)\",\n  \"rgb(214,214,222)\",\n  \"rgb(181,189,189)\",\n  \"rgb(160,170,175)\",\n  \"rgb(148,156,165)\",\n  \"rgb(150,150,150)\",\n]\n`);\n  });\n\n  it(\"can parse a malformed viscolors file\", () => {\n    // From https://skins.webamp.org/skin/018ddb394f2bfe49efa70bce27b71cb2/Centra_CSS-102_104-3.wsz/\n    const viscolors = fixture(\"CENTRA_VISCOLOR.TXT\");\n    const actual = parseViscolors(viscolors);\n    expect(actual).toMatchInlineSnapshot(`\nArray [\n  \"rgb(110,150,176)\",\n  \"rgb(165,165,165)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(55,55,67)\",\n  \"rgb(181,189,189)\",\n  \"rgb(148,156,165)\",\n  \"rgb(148,156,165)\",\n]\n`);\n  });\n\n  it(\"does not require commas to separate values\", () => {\n    // From https://skins.webamp.org/skin/99c6227d8880e00813a9aa6c4e808c37/valgaav_by_dreamcass-d85bqwp.wsz/\n    const viscolors = fixture(\"viscolor_valgaav.txt\");\n    const actual = parseViscolors(viscolors);\n    expect(actual).toMatchInlineSnapshot(`\nArray [\n  \"rgb(98,111,123)\",\n  \"rgb(98,111,123)\",\n  \"rgb(21,21,21)\",\n  \"rgb(223,176,176)\",\n  \"rgb(218,168,168)\",\n  \"rgb(211,158,158)\",\n  \"rgb(204,147,147)\",\n  \"rgb(198,137,137)\",\n  \"rgb(191,127,127)\",\n  \"rgb(185,117,117)\",\n  \"rgb(178,107,107)\",\n  \"rgb(172,97,97)\",\n  \"rgb(165,86,86)\",\n  \"rgb(158,76,76)\",\n  \"rgb(152,66,66)\",\n  \"rgb(145,56,56)\",\n  \"rgb(138,46,46)\",\n  \"rgb(138,46,46)\",\n  \"rgb(138,46,46)\",\n  \"rgb(158,76,76)\",\n  \"rgb(178,107,107)\",\n  \"rgb(198,137,137)\",\n  \"rgb(218,168,168)\",\n  \"rgb(223,176,176)\",\n]\n`);\n  });\n  it(\"allows for trailing lines\", () => {\n    const viscolors = fixture(\"viscolor_green_dimension.txt\");\n    const actual = parseViscolors(viscolors);\n    expect(actual).toMatchInlineSnapshot(`\nArray [\n  \"rgb(0,0,0)\",\n  \"rgb(0,0,0)\",\n  \"rgb(0,50,0)\",\n  \"rgb(0,56,0)\",\n  \"rgb(0,63,0)\",\n  \"rgb(0,70,0)\",\n  \"rgb(0,76,0)\",\n  \"rgb(0,83,0)\",\n  \"rgb(0,89,0)\",\n  \"rgb(0,96,0)\",\n  \"rgb(0,103,0)\",\n  \"rgb(0,109,0)\",\n  \"rgb(0,116,0)\",\n  \"rgb(0,123,0)\",\n  \"rgb(0,129,0)\",\n  \"rgb(0,136,0)\",\n  \"rgb(0,143,0)\",\n  \"rgb(0,150,0)\",\n  \"rgb(0,63,0)\",\n  \"rgb(0,76,0)\",\n  \"rgb(0,96,0)\",\n  \"rgb(0,116,0)\",\n  \"rgb(0,150,0)\",\n  \"rgb(0,255,0)\",\n]\n`);\n  });\n});\n\ndescribe(\"parseIni\", () => {\n  it(\"can parse the default pledit.txt file\", () => {\n    const pledit = fixture(\"PLEDIT.TXT\");\n    const actual = parseIni(pledit);\n    const expected = {\n      text: {\n        normal: \"#00FF00\",\n        current: \"#FFFFFF\",\n        normalbg: \"#000000\",\n        selectedbg: \"#0000FF\",\n        font: \"Arial\",\n      },\n    };\n    expect(actual).toEqual(expected);\n  });\n\n  it(\"can parse TopazAmp's pledit.txt file\", () => {\n    const pledit = fixture(\"PLEDIT_TOPAZ.TXT\");\n    const actual = parseIni(pledit);\n    const expected = {\n      text: {\n        normal: \"#319593\",\n        current: \"#89D8D1\",\n        normalbg: \"#000000\",\n        selectedbg: \"#2B4242\",\n        font: \"Arial\",\n        mbbg: \"#000000\",\n        mbfg: \"#89D8D1\",\n      },\n    };\n    expect(actual).toEqual(expected);\n  });\n\n  it(\"allows space around =\", () => {\n    const actual = parseIni(`\n[foo]\nbar = baz\n`);\n    const expected = {\n      foo: {\n        bar: \"baz\",\n      },\n    };\n    expect(actual).toEqual(expected);\n  });\n\n  it(\"can parse a pledit.txt file with quotes\", () => {\n    const pledit = fixture(\"PLEDIT_WITH_QUOTES.TXT\");\n    const actual = parseIni(pledit);\n    const expected = {\n      text: {\n        normal: \"#00FF00\",\n        current: \"#FFFFFF\",\n        normalbg: \"#000000\",\n        selectedbg: \"#0000FF\",\n        font: \"Ricky's cool font!\",\n      },\n    };\n    expect(actual).toEqual(expected);\n  });\n\n  it(\"can parse a pledit.txt file that uses = to mark comments\", () => {\n    const pledit = fixture(\"PLEDIT_WITH_EQUALS.TXT\");\n    const actual = parseIni(pledit);\n\n    const expected = {\n      text: {\n        normal: \"#000000\",\n        mbfg: \"#000000\",\n        current: \"#606060\",\n        normalbg: \"#7897B7\",\n        selectedbg: \"#6685A5\",\n        mbbg: \"#7897B7\",\n        font: \"Ariel\",\n      },\n    };\n    expect(actual).toEqual(expected);\n  });\n\n  it(\"allows quotes around values\", () => {\n    const actual = parseIni(`\n[foo]\nbar = \"baz\"\n  `);\n    const expected = {\n      foo: {\n        bar: \"baz\",\n      },\n    };\n    expect(actual).toEqual(expected);\n  });\n});\n\ntest(\"normalize\", () => {\n  expect(normalizeEqBand(1)).toBe(0);\n  expect(normalizeEqBand(64)).toBe(100);\n});\ntest(\"denormalize\", () => {\n  expect(denormalizeEqBand(0)).toBe(1);\n  expect(denormalizeEqBand(100)).toBe(64);\n});\n\ndescribe(\"segment\", () => {\n  it(\"can handle min\", () => {\n    expect(segment(0, 100, 0, [0, 1, 2])).toBe(0);\n    expect(segment(1, 100, 1, [0, 1, 2])).toBe(0);\n    expect(segment(-1, 100, -1, [0, 1, 2])).toBe(0);\n  });\n  it(\"can handle max\", () => {\n    //expect(segment(0, 100, 100, [0, 1, 2])).toBe(2);\n    //expect(segment(1, 100, 100, [0, 1, 2])).toBe(2);\n    expect(segment(-1, 100, 100, [0, 1, 2])).toBe(2);\n  });\n  it(\"can handle mid\", () => {\n    expect(segment(0, 2, 1, [0, 1, 2])).toBe(1);\n    expect(segment(0, 2, 1.5, [0, 1, 2])).toBe(2);\n    expect(segment(1, 3, 2.5, [0, 1, 2])).toBe(2);\n    expect(segment(-1, 2, 0.5, [0, 1, 2])).toBe(1);\n  });\n  it(\"can handle various real wold cases\", () => {\n    expect(segment(-100, 100, -100, [\"left\", \"center\", \"right\"])).toBe(\"left\");\n    expect(segment(0, 100, 88, [\"left\", \"center\", \"right\"])).toBe(\"right\");\n    expect(segment(0, 100, 50, [\"left\", \"center\", \"right\"])).toBe(\"center\");\n  });\n});\n\ndescribe(\"moveSelected\", () => {\n  it(\"can drag a single item 1\", () => {\n    expect(\n      moveSelected(\n        [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],\n        (i) => new Set([1]).has(i),\n        1\n      )\n    ).toEqual([\"a\", \"c\", \"b\", \"d\", \"e\", \"f\", \"g\", \"h\"]);\n  });\n  it(\"can drag a single item\", () => {\n    expect(\n      moveSelected(\n        [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],\n        (i) => new Set([1]).has(i),\n        3\n      )\n    ).toEqual([\"a\", \"c\", \"d\", \"e\", \"b\", \"f\", \"g\", \"h\"]);\n  });\n  it(\"can drag consecutive items\", () => {\n    expect(\n      moveSelected(\n        [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],\n        (i) => new Set([1, 2]).has(i),\n        3\n      )\n    ).toEqual([\"a\", \"d\", \"e\", \"f\", \"b\", \"c\", \"g\", \"h\"]);\n  });\n  it(\"works for a simple example\", () => {\n    const arr = [true, false, false];\n    expect(moveSelected(arr, (i) => arr[i], 1)).toEqual([false, true, false]);\n  });\n  it(\"works for a simple negative example\", () => {\n    const arr = [false, false, true];\n    expect(moveSelected(arr, (i) => arr[i], -1)).toEqual([false, true, false]);\n  });\n});\n\ndescribe(\"spliceIn\", () => {\n  it(\"is immutable\", () => {\n    const original = [1, 2, 3];\n    const spliced = spliceIn(original, 1, [200]);\n    expect(spliced).not.toBe(original);\n    expect(original).toEqual([1, 2, 3]);\n  });\n  it(\"adds values at the given index\", () => {\n    const spliced = spliceIn([1, 2, 3], 1, [200]);\n    expect(spliced).toEqual([1, 200, 2, 3]);\n  });\n});\n\ndescribe(\"replaceAtIndex\", () => {\n  test(\"can replace\", () => {\n    expect(replaceAtIndex([1, 2, 3, 4], 2, 0)).toEqual([1, 2, 0, 4]);\n  });\n});\n"
  },
  {
    "path": "webamp/packages/webamp/js/utils.ts",
    "content": "import { DEFAULT_SKIN } from \"./constants\";\nimport { WindowInfo } from \"./types\";\n\ninterface Time {\n  minutesFirstDigit: string;\n  minutesSecondDigit: string;\n  secondsFirstDigit: string;\n  secondsSecondDigit: string;\n}\n\ninterface IniData {\n  [section: string]: {\n    [key: string]: string;\n  };\n}\n\nexport function imgFromUrl(url: string): Promise<HTMLImageElement> {\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.onload = () => {\n      resolve(img);\n    };\n    img.onerror = reject;\n    img.src = url;\n  });\n}\n\nexport const getTimeObj = (time: number | null): Time => {\n  if (time == null) {\n    // If we clean up `<MiniTime />` we don't need to do this any more.\n    return {\n      minutesFirstDigit: \" \",\n      minutesSecondDigit: \" \",\n      secondsFirstDigit: \" \",\n      secondsSecondDigit: \" \",\n    };\n  }\n  const minutes = Math.floor(time / 60);\n  const seconds = time % 60;\n\n  const digits =\n    time == null\n      ? [\" \", \" \", \" \", \" \"]\n      : [\n          String(Math.floor(minutes / 10)),\n          String(Math.floor(minutes % 10)),\n          String(Math.floor(seconds / 10)),\n          String(Math.floor(seconds % 10)),\n        ];\n\n  const [\n    minutesFirstDigit,\n    minutesSecondDigit,\n    secondsFirstDigit,\n    secondsSecondDigit,\n  ] = digits;\n\n  return {\n    minutesFirstDigit,\n    minutesSecondDigit,\n    secondsFirstDigit,\n    secondsSecondDigit,\n  };\n};\n\nexport const getTimeStr = (\n  time: number | null,\n  truncate: boolean = true\n): string => {\n  if (time == null) {\n    return \"\";\n  }\n  const {\n    minutesFirstDigit,\n    minutesSecondDigit,\n    secondsFirstDigit,\n    secondsSecondDigit,\n  } = getTimeObj(time);\n\n  return [\n    truncate && minutesFirstDigit === \"0\" ? \"\" : minutesFirstDigit,\n    minutesSecondDigit,\n    \":\",\n    secondsFirstDigit,\n    secondsSecondDigit,\n  ].join(\"\");\n};\n\nexport const parseViscolors = (text: string): string[] => {\n  const entries = text.split(\"\\n\");\n  const regex = /^\\s*(\\d+)\\s*,?\\s*(\\d+)\\s*,?\\s*(\\d+)/;\n  const colors = [...DEFAULT_SKIN.colors];\n  entries\n    .map((line) => regex.exec(line))\n    .filter(Boolean)\n    .map((matches) => (matches as RegExpExecArray).slice(1, 4).join(\",\"))\n    .map((rgb, i) => {\n      colors[i] = `rgb(${rgb})`;\n    });\n  return colors;\n};\n\nconst SECTION_REGEX = /^\\s*\\[(.+?)\\]\\s*$/;\nconst PROPERTY_REGEX = /^\\s*([^;][^=]*)\\s*=\\s*(.*)\\s*$/;\n\nexport const parseIni = (text: string): IniData => {\n  let section: string, match;\n  return text.split(/[\\r\\n]+/g).reduce((data: IniData, line) => {\n    if ((match = line.match(PROPERTY_REGEX)) && section != null) {\n      const key = match[1].trim().toLowerCase();\n      const value = match[2]\n        // Ignore anything after a second `=`\n        // TODO: What if this is inside quotes or escaped?\n        .replace(/\\=.*$/g, \"\")\n        .trim()\n        // Strip quotes\n        // TODO: What about escaped quotes?\n        // TODO: What about unbalanced quotes?\n        .replace(/(^\")|(\"$)|(^')|('$)/g, \"\");\n      data[section][key] = value;\n    } else if ((match = line.match(SECTION_REGEX))) {\n      section = match[1].trim().toLowerCase();\n      data[section] = {};\n    }\n    return data;\n  }, {});\n};\n\nexport const clamp = (value: number, min: number, max: number): number =>\n  Math.min(Math.max(value, min), max);\n\nexport const sum = (values: number[]): number =>\n  values.reduce((total, value) => total + value, 0);\n\nexport const base64FromDataArray = (dataArray: Uint8Array): string => {\n  return window.btoa(String.fromCharCode(...dataArray));\n};\n\nexport const base64FromArrayBuffer = (arrayBuffer: ArrayBuffer): string => {\n  return base64FromDataArray(new Uint8Array(arrayBuffer));\n};\n\n// https://stackoverflow.com/a/15832662/1263117\nexport function downloadURI(uri: string, name: string): void {\n  const link = document.createElement(\"a\");\n  link.download = name;\n  link.href = uri;\n  window.document.body.appendChild(link);\n  link.click();\n  window.document.body.removeChild(link);\n}\n\nexport const toPercent = (min: number, max: number, value: number): number =>\n  (value - min) / (max - min);\n\nexport const percentToRange = (percent: number, min: number, max: number) =>\n  min + Math.round(percent * (max - min));\n\nexport const percentToIndex = (percent: number, length: number): number =>\n  percentToRange(percent, 0, length - 1);\n\nconst rebound = (\n  oldMin: number,\n  oldMax: number,\n  newMin: number,\n  newMax: number\n) => (oldValue: number): number =>\n  percentToRange(toPercent(oldMin, oldMax, oldValue), newMin, newMax);\n\nexport const normalizeEqBand = rebound(1, 64, 0, 2400);\n\nexport const denormalizeEqBand = rebound(0, 2400, 1, 64);\n\nexport const normalizedToDb = (value: number): number => {\n  return (value / 2400) * 24 - 12;\n};\n\nexport const dbToNormalized = (db: number): number => {\n  return Math.round(((db + 12) / 24) * 2400);\n};\n\n// Merge a `source` object to a `target` recursively\n// TODO: The typing here is a bit of a disaster.\nexport function merge<T extends object, S extends object>(\n  target: T,\n  source: S\n): T & S {\n  const s = source as any;\n  const t = target as any;\n  // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties\n  for (const key of Object.keys(s as any)) {\n    if (s[key] instanceof Object) Object.assign(s[key], merge(t[key], s[key]));\n  }\n\n  // Join `target` and modified `source`\n  Object.assign(target || {}, source);\n  return target as any;\n}\n\n// Maps a value in a range (defined my min/max) to a value in an array (options).\nexport function segment<V>(\n  min: number,\n  max: number,\n  value: number,\n  newValues: V[]\n): V {\n  const ratio = toPercent(min, max, value);\n  /*\n  | 0 | 1 | 2 |\n  0   1   2   3\n  */\n  return newValues[percentToIndex(ratio, newValues.length)];\n}\n\n// https://bost.ocks.org/mike/shuffle/\n// Shuffle an array in O(n)\nexport function shuffle<T>(array: T[]): T[] {\n  const sorted = [...array];\n  let m = sorted.length;\n\n  // While there remain elements to shuffle…\n  while (m) {\n    // Pick a remaining element…\n    const i = Math.floor(Math.random() * m--);\n\n    // And swap it with the current element.\n    const val = sorted[m];\n    sorted[m] = sorted[i];\n    sorted[i] = val;\n  }\n\n  return sorted;\n}\n\nexport function sort<T>(\n  array: T[],\n  iteratee: (value: T) => number | string\n): T[] {\n  return [...array].sort((a, b) => {\n    const aKey = iteratee(a);\n    const bKey = iteratee(b);\n    if (aKey < bKey) {\n      return -1;\n    } else if (aKey > bKey) {\n      return 1;\n    }\n    return 0;\n  });\n}\n\nexport function moveSelected<V>(\n  arr: V[],\n  isSelected: (index: number) => boolean,\n  offset: number\n): V[] {\n  const newArr = new Array(arr.length);\n  let next = 0;\n  for (let i = 0; i < newArr.length; i++) {\n    const from = i - offset;\n    // Is a value supposed to move here?\n    if (from >= 0 && from < arr.length && isSelected(from)) {\n      newArr[i] = arr[from];\n    } else {\n      while (next < arr.length && isSelected(next)) {\n        next++;\n      }\n      newArr[i] = arr[next];\n      next++;\n    }\n  }\n  return newArr;\n}\n\nexport function spliceIn<T>(original: T[], start: number, newValues: T[]): T[] {\n  const newArr = [...original];\n  newArr.splice(start, 0, ...newValues);\n  return newArr;\n}\n\nexport function replaceAtIndex<T>(arr: T[], index: number, newValue: T): T[] {\n  return [...arr.slice(0, index), newValue, ...arr.slice(index + 1)];\n}\n\nexport function debounce(func: Function, delay: number): Function {\n  let timeout: number;\n  let callbackArgs: any[] = [];\n\n  return function (context: Object, ...args: any[]): void {\n    callbackArgs = args;\n\n    if (timeout != null) {\n      clearTimeout(timeout);\n    }\n    timeout = window.setTimeout(() => {\n      func.apply(context, callbackArgs);\n    }, delay);\n  };\n}\n\n// Trailing edge only throttle\nexport function throttle(func: Function, delay: number): Function {\n  let timeout: number | null = null;\n  let callbackArgs: any[] = [];\n\n  return function (context: Object, ...args: any[]): void {\n    callbackArgs = args;\n\n    if (!timeout) {\n      timeout = window.setTimeout(() => {\n        func.apply(context, callbackArgs);\n        timeout = null;\n      }, delay);\n    }\n  };\n}\n\nlet counter = 0;\nexport function uniqueId() {\n  return counter++;\n}\n\nexport function objectForEach<V>(\n  obj: { [key: string]: V },\n  cb: (value: V, key: string) => void\n): void {\n  Object.keys(obj).forEach((key) => cb(obj[key], key));\n}\n\nexport function objectMap<V, N>(\n  obj: { [key: string]: V },\n  cb: (value: V, key: string) => N\n): { [key: string]: N } {\n  const modified: { [key: string]: N } = {};\n  Object.keys(obj).forEach((key) => (modified[key] = cb(obj[key], key)));\n  return modified;\n}\n\nexport function objectFilter<V>(\n  obj: { [key: string]: V },\n  predicate: (value: V, key: string) => boolean\n): { [key: string]: V } {\n  // TODO: Could return the original reference if no values change\n  return Object.keys(obj).reduce((newObj: { [key: string]: V }, key) => {\n    if (predicate(obj[key], key)) {\n      newObj[key] = obj[key];\n    }\n    return newObj;\n  }, {});\n}\n\nexport const calculateBoundingBox = (windows: WindowInfo[]) => {\n  if (windows.length === 0) {\n    return null;\n  }\n  const windowSizes = windows.map((w) => ({\n    left: w.x,\n    top: w.y,\n    bottom: w.y + w.height,\n    right: w.x + w.width,\n  }));\n  return windowSizes.reduce((b, w) => ({\n    left: Math.min(b.left, w.left),\n    top: Math.min(b.top, w.top),\n    bottom: Math.max(b.bottom, w.bottom),\n    right: Math.max(b.right, w.right),\n  }));\n};\n\nexport function findLastIndex<T>(arr: T[], cb: (val: T) => boolean) {\n  for (let i = arr.length - 1; i >= 0; i--) {\n    if (cb(arr[i])) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nexport function getWindowSize(): { width: number; height: number } {\n  // Aparently this is crazy across browsers.\n  return {\n    width: Math.max(\n      document.body.scrollWidth,\n      document.documentElement!.scrollWidth,\n      document.body.offsetWidth,\n      document.documentElement!.offsetWidth,\n      document.body.clientWidth,\n      document.documentElement!.clientWidth\n    ),\n    height: Math.max(\n      document.body.scrollHeight,\n      document.documentElement!.scrollHeight,\n      document.body.offsetHeight,\n      document.documentElement!.offsetHeight,\n      document.body.clientHeight,\n      document.documentElement!.clientHeight\n    ),\n  };\n}\n\nexport function getScreenSize(): { width: number; height: number } {\n  return {\n    width: window.screen.width,\n    height: window.screen.height,\n  };\n}\n\nexport function weakMapMemoize<T extends object, R>(\n  func: (value: T) => R\n): (value: T) => R {\n  const cache = new WeakMap();\n  return (value: T) => {\n    if (!cache.has(value)) {\n      cache.set(value, func(value));\n    }\n    return cache.get(value);\n  };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/webamp.js",
    "content": "import JSZip from \"jszip\";\nimport * as musicMetadataBrowser from \"music-metadata\";\nimport WebampLazy from \"./webampLazy\";\n\nexport default class Webamp extends WebampLazy {\n  constructor(options) {\n    super({\n      ...options,\n      requireJSZip: () => JSZip,\n      requireMusicMetadata: () => musicMetadataBrowser,\n    });\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/js/webampLazy.tsx",
    "content": "import * as React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Provider } from \"react-redux\";\n\nimport {\n  Store,\n  AppState,\n  Track,\n  LoadedURLTrack,\n  Middleware,\n  WindowPosition,\n  ButterchurnOptions,\n  Action,\n} from \"./types\";\nimport getStore from \"./store\";\nimport App from \"./components/App\";\nimport { bindHotkeys } from \"./hotkeys\";\nimport Media from \"./media\";\nimport * as Selectors from \"./selectors\";\nimport * as Actions from \"./actionCreators\";\n\nimport { LOAD_STYLE } from \"./constants\";\nimport * as Utils from \"./utils\";\nimport * as FileUtils from \"./fileUtils\";\n\nimport {\n  SET_AVAILABLE_SKINS,\n  NETWORK_CONNECTED,\n  NETWORK_DISCONNECTED,\n  CLOSE_WINAMP,\n  MINIMIZE_WINAMP,\n  LOADED,\n  SET_Z_INDEX,\n  CLOSE_REQUESTED,\n  ENABLE_MILKDROP,\n} from \"./actionTypes\";\nimport Emitter from \"./emitter\";\n\nimport \"../css/base-skin.css\";\nimport { SerializedStateV1 } from \"./serializedStates/v1Types\";\nimport Disposable from \"./Disposable\";\n\ninterface Options {\n  /**\n   * An object representing the initial skin to use.\n   *\n   * If omitted, the default skin, included in the bundle, will be used.\n   * Note: This URL must be served the with correct CORs headers.\n   *\n   * Example: `{ url: './path/to/skin.wsz' }`\n   */\n  initialSkin?: {\n    url: string;\n  };\n\n  /**\n   * An array of `Track`s to prepopulate the playlist with.\n   */\n  initialTracks?: Track[];\n\n  /**\n   * An array of objects representing available skins.\n   *\n   * These will appear in the \"Options\" menu under \"Skins\".\n   * Note: These URLs must be served with the correct CORs headers.\n   *\n   * Example: `[ { url: \"./green.wsz\", name: \"Green Dimension V2\" } ]`\n   */\n  availableSkins?: { url: string; name: string }[];\n\n  /**\n   * Should global hotkeys be enabled?\n   *\n   * Default: `false`\n   */\n  enableHotkeys?: boolean;\n\n  /**\n   * An array of additional file pickers.\n   *\n   * These will appear in the \"Options\" menu under \"Play\".\n   *\n   * In the offical version, this option is used to provide a \"Dropbox\" file picker.\n   */\n  filePickers?: [\n    {\n      /**\n       * The name that will appear in the context menu.\n       *\n       * Example: `\"My File Picker...\"`\n       */\n      contextMenuName: string;\n\n      /**\n       * A function which returns a Promise that resolves to an array of `Track`s\n       *\n       * Example: `() => Promise.resolve([{ url: './rick_roll.mp3' }])`\n       */\n      filePicker: () => Promise<Track[]>;\n\n      /**\n       * Indicates if this options should be made available when the user is offline.\n       */\n      requiresNetwork: boolean;\n    }\n  ];\n  zIndex?: number;\n  handleTrackDropEvent?: (\n    e: React.DragEvent<HTMLDivElement>\n  ) => Track[] | null | Promise<Track[] | null>;\n  handleAddUrlEvent?: () => Track[] | null | Promise<Track[] | null>;\n  handleLoadListEvent?: () => Track[] | null | Promise<Track[] | null>;\n  handleSaveListEvent?: (tracks: Track[]) => null | Promise<null>;\n}\n\ninterface PrivateOptions {\n  avaliableSkins?: { url: string; name: string }[]; // Old misspelled name\n  requireJSZip(): Promise<never>; // TODO: Type JSZip\n  requireMusicMetadata(): Promise<any>; // TODO: Type musicmetadata\n  __initialState?: AppState;\n  __customMiddlewares?: Middleware[];\n  __initialWindowLayout: {\n    [windowId: string]: {\n      size: null | [number, number];\n      position: WindowPosition;\n    };\n  };\n  __butterchurnOptions: ButterchurnOptions;\n  // This is used by https://winampify.io/ to proxy through to Spotify's API.\n  __customMediaClass: typeof Media; // This should have the same interface as Media\n}\n\n// Return a promise that resolves when the store matches a predicate.\n// TODO #leak\nconst storeHas = (\n  store: Store,\n  predicate: (state: AppState) => boolean\n): Promise<void> =>\n  new Promise((resolve) => {\n    if (predicate(store.getState())) {\n      resolve();\n      return;\n    }\n    const unsubscribe = store.subscribe(() => {\n      if (predicate(store.getState())) {\n        resolve();\n        unsubscribe();\n      }\n    });\n  });\n\nclass Winamp {\n  _actionEmitter: Emitter;\n  _node: HTMLElement | null;\n  _disposable: Disposable;\n  options: Options & PrivateOptions; // TODO: Make this _private\n  media: Media; // TODO: Make this _private\n  store: Store; // TODO: Make this _private\n  static browserIsSupported() {\n    const supportsAudioApi = !!(\n      window.AudioContext ||\n      // @ts-ignore\n      window.webkitAudioContext\n    );\n    const supportsCanvas = !!window.document.createElement(\"canvas\").getContext;\n    const supportsPromises = typeof Promise !== \"undefined\";\n    return supportsAudioApi && supportsCanvas && supportsPromises;\n  }\n\n  constructor(options: Options & PrivateOptions) {\n    this._node = null;\n    this._disposable = new Disposable();\n    this._actionEmitter = new Emitter();\n    this.options = options;\n    const {\n      initialTracks,\n      initialSkin,\n      avaliableSkins, // Old misspelled name\n      availableSkins,\n      enableHotkeys = false,\n      zIndex,\n      requireJSZip,\n      requireMusicMetadata,\n      handleTrackDropEvent,\n      handleAddUrlEvent,\n      handleLoadListEvent,\n      handleSaveListEvent,\n      __butterchurnOptions,\n      __customMediaClass,\n    } = this.options;\n\n    // TODO: Make this much cleaner\n    let convertPreset = null;\n    if (__butterchurnOptions != null) {\n      const {\n        importConvertPreset,\n        presetConverterEndpoint,\n      } = __butterchurnOptions;\n\n      if (importConvertPreset != null && presetConverterEndpoint != null) {\n        convertPreset = async (file: File): Promise<Object> => {\n          const { convertPreset: convert } = await importConvertPreset();\n          return convert(\n            await FileUtils.genStringFromFileReference(file),\n            presetConverterEndpoint\n          );\n        };\n      }\n    }\n\n    // TODO: Validate required options\n\n    this.media = new (__customMediaClass || Media)();\n    this.store = getStore(\n      this.media,\n      this._actionEmitter,\n      this.options.__customMiddlewares,\n      this.options.__initialState,\n      {\n        requireJSZip,\n        requireMusicMetadata,\n        convertPreset,\n        // @ts-ignore Typescript is drunk\n        handleTrackDropEvent,\n        handleAddUrlEvent,\n        handleLoadListEvent,\n        handleSaveListEvent,\n      }\n    ) as Store;\n\n    if (navigator.onLine) {\n      this.store.dispatch({ type: NETWORK_CONNECTED });\n    } else {\n      this.store.dispatch({ type: NETWORK_DISCONNECTED });\n    }\n\n    if (zIndex != null) {\n      this.store.dispatch({ type: SET_Z_INDEX, zIndex });\n    }\n\n    if (options.__butterchurnOptions) {\n      this.store.dispatch({\n        type: ENABLE_MILKDROP,\n        open: options.__butterchurnOptions.butterchurnOpen,\n      });\n      this.store.dispatch(\n        Actions.initializePresets(options.__butterchurnOptions)\n      );\n    }\n\n    const handleOnline = () => this.store.dispatch({ type: NETWORK_CONNECTED });\n    const handleOffline = () =>\n      this.store.dispatch({ type: NETWORK_DISCONNECTED });\n\n    window.addEventListener(\"online\", handleOnline);\n    window.addEventListener(\"offline\", handleOffline);\n\n    this._disposable.add(() => {\n      window.removeEventListener(\"online\", handleOnline);\n      window.removeEventListener(\"offline\", handleOffline);\n    });\n\n    if (initialSkin) {\n      this.store.dispatch(Actions.setSkinFromUrl(initialSkin.url));\n    } else {\n      // We are using the default skin.\n      this.store.dispatch({ type: LOADED });\n    }\n\n    if (initialTracks) {\n      this._bufferTracks(initialTracks);\n    }\n\n    if (avaliableSkins != null) {\n      console.warn(\n        \"The misspelled option `avaliableSkins` is deprecated. Please use `availableSkins` instead.\"\n      );\n      this.store.dispatch({ type: SET_AVAILABLE_SKINS, skins: avaliableSkins });\n    } else if (availableSkins != null) {\n      this.store.dispatch({ type: SET_AVAILABLE_SKINS, skins: availableSkins });\n    }\n\n    const layout = options.__initialWindowLayout;\n    if (layout == null) {\n      this.store.dispatch(Actions.stackWindows());\n    } else {\n      Utils.objectForEach(layout, (w, windowId) => {\n        if (w.size != null) {\n          this.store.dispatch(Actions.setWindowSize(windowId, w.size));\n        }\n      });\n      this.store.dispatch(\n        Actions.updateWindowPositions(\n          Utils.objectMap(layout, (w) => w.position),\n          false\n        )\n      );\n    }\n\n    if (enableHotkeys) {\n      this._disposable.add(bindHotkeys(this.store.dispatch));\n    }\n  }\n\n  play() {\n    this.store.dispatch(Actions.play());\n  }\n\n  pause() {\n    this.store.dispatch(Actions.pause());\n  }\n\n  stop() {\n    this.store.dispatch(Actions.stop());\n  }\n\n  seekBackward(seconds: number) {\n    this.store.dispatch(Actions.seekBackward(seconds));\n  }\n\n  seekForward(seconds: number) {\n    this.store.dispatch(Actions.seekForward(seconds));\n  }\n\n  seekToTime(seconds: number) {\n    this.store.dispatch(Actions.seekToTime(seconds));\n  }\n\n  nextTrack() {\n    this.store.dispatch(Actions.next());\n  }\n\n  centerWindowsInView() {\n    this.store.dispatch(Actions.centerWindowsInView());\n  }\n\n  previousTrack() {\n    this.store.dispatch(Actions.previous());\n  }\n\n  _bufferTracks(tracks: Track[]): void {\n    const nextIndex = Selectors.getTrackCount(this.store.getState());\n    this.store.dispatch(\n      Actions.loadMediaFiles(tracks, LOAD_STYLE.BUFFER, nextIndex)\n    );\n  }\n\n  // Append this array of tracks to the end of the current playlist.\n  appendTracks(tracks: Track[]): void {\n    const nextIndex = Selectors.getTrackCount(this.store.getState());\n    this.store.dispatch(\n      Actions.loadMediaFiles(tracks, LOAD_STYLE.NONE, nextIndex)\n    );\n  }\n\n  // Replace any existing tracks with this array of tracks, and begin playing.\n  setTracksToPlay(tracks: Track[]): void {\n    this.store.dispatch(Actions.loadMediaFiles(tracks, LOAD_STYLE.PLAY));\n  }\n\n  getMediaStatus() {\n    return Selectors.getMediaStatus(this.store.getState());\n  }\n\n  onWillClose(cb: (cancel: () => void) => void): () => void {\n    return this._actionEmitter.on(CLOSE_REQUESTED, (action) => {\n      cb(action.cancel);\n    });\n  }\n\n  onClose(cb: () => void): () => void {\n    return this._actionEmitter.on(CLOSE_WINAMP, cb);\n  }\n\n  close(): void {\n    this.store.dispatch(Actions.close());\n  }\n\n  reopen(): void {\n    this.store.dispatch(Actions.open());\n  }\n\n  onTrackDidChange(cb: (trackInfo: LoadedURLTrack | null) => void): () => void {\n    let previousTrackId: number | null = null;\n    // TODO #leak\n    return this.store.subscribe(() => {\n      const state = this.store.getState();\n      const trackId = Selectors.getCurrentlyPlayingTrackIdIfLoaded(state);\n      if (trackId === previousTrackId) {\n        return;\n      }\n      previousTrackId = trackId;\n      cb(trackId == null ? null : Selectors.getCurrentTrackInfo(state));\n    });\n  }\n\n  onMinimize(cb: () => void): () => void {\n    return this._actionEmitter.on(MINIMIZE_WINAMP, cb);\n  }\n\n  setSkinFromUrl(url: string): void {\n    this.store.dispatch(Actions.setSkinFromUrl(url));\n  }\n  setSkinFromClient(data: string): void {\n    this.store.dispatch(Actions.setSkinFromClient(data));\n  }\n\n  setEqFromClient(data: string): void {\n    this.store.dispatch(Actions.setEqFromClient(data));\n  }\n\n\n  async skinIsLoaded(): Promise<void> {\n    // Wait for the skin to load.\n    // TODO #leak\n    await storeHas(this.store, (state) => !state.display.loading);\n    // We attempt to pre-resolve these promises before we declare the skin\n    // loaded. That's because `<EqGraph>` needs these in order to render fully.\n    // As long as these are resolved before we attempt to render, we can ensure\n    // that we will have all the data we need on first paint.\n    //\n    // Note: This won't help for non-initial skin loads.\n    await Promise.all([\n      Selectors.getPreampLineImage(this.store.getState()),\n      Selectors.getLineColorsImage(this.store.getState()),\n    ]);\n    return;\n  }\n\n  __loadSerializedState(serializedState: SerializedStateV1): void {\n    this.store.dispatch(Actions.loadSerializedState(serializedState));\n  }\n\n  __getSerializedState() {\n    return Selectors.getSerlializedState(this.store.getState());\n  }\n\n  __onStateChange(cb: () => void): () => void {\n    // TODO #leak\n    return this.store.subscribe(cb);\n  }\n\n  async renderWhenReady(node: HTMLElement): Promise<void> {\n    this.store.dispatch(Actions.centerWindowsInContainer(node));\n    await this.skinIsLoaded();\n    // TODO #race We may have been destroyed\n    if (this._node != null) {\n      throw new Error(\"Cannot render a Webamp instance twice\");\n    }\n    this._node = node;\n    this._disposable.add(() => {\n      if (this._node != null) {\n        ReactDOM.unmountComponentAtNode(this._node);\n        this._node = null;\n      }\n    });\n\n    ReactDOM.render(\n      <Provider<Action> store={this.store}>\n        <App media={this.media} filePickers={this.options.filePickers || []} />\n      </Provider>,\n      node\n    );\n  }\n\n  dispose(): void {\n    // TODO: Clean up store subscription in onTrackDidChange\n    // TODO: Every storeHas call represents a potential race condition\n    this.media.dispose();\n    this._actionEmitter.dispose();\n    this._disposable.dispose();\n  }\n}\n\nexport default Winamp;\n"
  },
  {
    "path": "webamp/packages/webamp/js/winamp-eqf.d.ts",
    "content": "declare module \"winamp-eqf\" {\n  import { parser, creator } from \"winamp-eqf\";\n  export { parser, creator };\n}\n"
  },
  {
    "path": "webamp/packages/webamp/package.json",
    "content": "{\n  \"name\": \"webamp\",\n  \"version\": \"1.4.3-beta.3\",\n  \"description\": \"Winamp 2 implemented in HTML5 and JavaScript\",\n  \"main\": \"built/webamp.bundle.js\",\n  \"files\": [\n    \"built/webamp.bundle.js\",\n    \"built/webamp.bundle.min.js\",\n    \"built/webamp.bundle.min.js.map\",\n    \"built/webamp.lazy-bundle.js\",\n    \"built/webamp.lazy-bundle.min.js\",\n    \"built/webamp.lazy-bundle.min.js.map\",\n    \"index.d.ts\"\n  ],\n  \"scripts\": {\n    \"lint-fix\": \"eslint . --ext ts,tsx,js --fix\",\n    \"lint\": \"eslint . --ext ts,tsx,js\",\n    \"type-check\": \"tsc\",\n    \"build\": \"webpack --config=demo/config/webpack.prod.js\",\n    \"build-library\": \"webpack --config=config/webpack.library.js\",\n    \"prepublishOnly\": \"npm run build-library\",\n    \"serve\": \"http-server ./demo/built\",\n    \"start\": \"webpack-dev-server --open --config=demo/config/webpack.dev.js\",\n    \"stats\": \"webpack --config=demo/config/webpack.prod.js --json > stats.json\",\n    \"stats-library\": \"webpack --config=config/webpack.library.js --json > stats.json\",\n    \"test\": \"jest --config=config/jest.unit.js\",\n    \"tdd\": \"jest --config=config/jest.unit.js --watch\",\n    \"format\": \"prettier --write \\\"**/*.{js,ts,tsx,d.ts,css}\\\"\",\n    \"integration-tests\": \"jest --config=config/jest.integration.js --runInBand\",\n    \"build-skin\": \"rm assets/skins/base-2.91.wsz && cd assets/skins/base-2.91 && zip -x .* -x 'Skining Updates.txt' -r ../base-2.91.wsz .\",\n    \"compile-skin\": \"node scripts/compileSkin.js > css/base-skin.css\",\n    \"skin-info\": \"unzip -vl assets/skins/base-2.91.wsz\",\n    \"build-presets\": \"node scripts/parsePresetFiles.js > presets/builtin.json\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/captbaritone/webamp.git\",\n    \"directory\": \"packages/webamp\"\n  },\n  \"keywords\": [\n    \"Winamp\",\n    \"HTML5\",\n    \"audio\",\n    \"web-audio-api\"\n  ],\n  \"author\": \"Jordan Eldredge <jordan@jordaneldredge.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/captbaritone/webamp/issues\"\n  },\n  \"homepage\": \"https://github.com/captbaritone/webamp/\",\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.7.2\",\n    \"@babel/node\": \"^7.0.0\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.0.0\",\n    \"@babel/plugin-proposal-nullish-coalescing-operator\": \"^7.4.4\",\n    \"@babel/plugin-proposal-object-rest-spread\": \"^7.0.0\",\n    \"@babel/plugin-proposal-optional-chaining\": \"^7.6.0\",\n    \"@babel/plugin-syntax-dynamic-import\": \"^7.0.0\",\n    \"@babel/plugin-transform-modules-commonjs\": \"^7.0.0\",\n    \"@babel/plugin-transform-runtime\": \"^7.0.0\",\n    \"@babel/polyfill\": \"^7.7.0\",\n    \"@babel/preset-env\": \"^7.7.1\",\n    \"@babel/preset-react\": \"^7.7.0\",\n    \"@babel/preset-typescript\": \"^7.7.2\",\n    \"@babel/runtime\": \"^7.7.2\",\n    \"@sentry/browser\": \"5.9.1\",\n    \"@types/classnames\": \"^2.2.6\",\n    \"@types/css-font-loading-module\": \"^0.0.2\",\n    \"@types/fscreen\": \"^1.0.1\",\n    \"@types/invariant\": \"^2.2.29\",\n    \"@types/jest\": \"^23.3.2\",\n    \"@types/jszip\": \"^3.1.5\",\n    \"@types/lodash\": \"^4.14.116\",\n    \"@types/lodash-es\": \"^4.17.1\",\n    \"@types/react\": \"^16.8.13\",\n    \"@types/react-dom\": \"^16.8.4\",\n    \"@types/react-redux\": \"^7.1.1\",\n    \"@types/webaudioapi\": \"^0.0.27\",\n    \"@typescript-eslint/eslint-plugin\": \"^2.6.1\",\n    \"@typescript-eslint/parser\": \"^2.7.0\",\n    \"babel-core\": \"7.0.0-bridge.0\",\n    \"babel-eslint\": \"^9.0.0-beta.3\",\n    \"babel-jest\": \"^23.4.2\",\n    \"babel-loader\": \"^8.0.4\",\n    \"butterchurn\": \"^2.6.7\",\n    \"caniuse-lite\": \"^1.0.30001154\",\n    \"canvas-mock\": \"0.0.0\",\n    \"classnames\": \"^2.2.5\",\n    \"copy-webpack-plugin\": \"^4.6.0\",\n    \"css-loader\": \"^1.0.1\",\n    \"cssnano\": \"^4.1.10\",\n    \"data-uri-to-buffer\": \"^2.0.0\",\n    \"eslint\": \"^6.5.1\",\n    \"eslint-plugin-import\": \"^2.18.2\",\n    \"eslint-plugin-prettier\": \"^3.1.0\",\n    \"eslint-plugin-react\": \"^7.16.0\",\n    \"file-loader\": \"^2.0.0\",\n    \"git-revision-webpack-plugin\": \"^3.0.3\",\n    \"glob\": \"^7.1.4\",\n    \"html-webpack-inline-svg-plugin\": \"^2.3.0\",\n    \"html-webpack-plugin\": \"^5.6.3\",\n    \"http-server\": \"^0.11.1\",\n    \"imagemin\": \"^6.1.0\",\n    \"imagemin-optipng\": \"^6.0.0\",\n    \"invariant\": \"^2.2.3\",\n    \"jest\": \"^24.9.0\",\n    \"jest-image-snapshot\": \"^2.12.0\",\n    \"jest-puppeteer\": \"^4.4.0\",\n    \"jszip\": \"^3.1.3\",\n    \"lodash\": \"^4.17.11\",\n    \"milkdrop-preset-converter-aws\": \"^0.1.6\",\n    \"music-metadata\": \"^11.0.5\",\n    \"postcss\": \"^7.0.18\",\n    \"postcss-loader\": \"^3.0.0\",\n    \"prettier\": \"^2.0.4\",\n    \"puppeteer\": \"^1.15.0\",\n    \"react\": \"^17.0.1\",\n    \"react-dom\": \"^17.0.1\",\n    \"react-redux\": \"^7.2.2\",\n    \"react-test-renderer\": \"^17.0.1\",\n    \"redux\": \"^4.0.5\",\n    \"redux-devtools-extension\": \"^2.13.2\",\n    \"redux-thunk\": \"^2.3.0\",\n    \"reselect\": \"^3.0.1\",\n    \"screenfull\": \"^4.0.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"style-loader\": \"^0.23.1\",\n    \"terser-webpack-plugin\": \"^5.3.14\",\n    \"tinyqueue\": \"^1.2.3\",\n    \"typescript\": \"^3.7.2\",\n    \"url-loader\": \"^1.1.2\",\n    \"webpack\": \"5.82.0\",\n    \"webpack-bundle-analyzer\": \"^4.3.0\",\n    \"webpack-cli\": \"^3.1.2\",\n    \"webpack-dev-server\": \"^3.8.2\",\n    \"webpack-merge\": \"^4.1.2\",\n    \"winamp-eqf\": \"^1.0.0\"\n  },\n  \"jest\": {\n    \"globalSetup\": \"jest-environment-puppeteer/setup\",\n    \"globalTeardown\": \"jest-environment-puppeteer/teardown\",\n    \"projects\": [\n      \"config/jest.*.js\"\n    ]\n  },\n  \"prettier\": {\n    \"trailingComma\": \"es5\"\n  },\n  \"dependencies\": {\n    \"ani-cursor\": \"^0.0.4\",\n    \"butterchurn-presets\": \"^2.4.7\",\n    \"electron\": \"^26.2.3\",\n    \"eslint-plugin-react-hooks\": \"^2.1.2\",\n    \"fscreen\": \"^1.0.2\",\n    \"html-webpack-inline-svg-plugin\": \"^2.3.0\",\n    \"html-webpack-plugin\": \"^5.6.3\",\n    \"redux-sentry-middleware\": \"^0.1.3\"\n  }\n}\n"
  },
  {
    "path": "webamp/packages/webamp/presets/builtin.json",
    "content": "{\n  \"type\": \"Winamp EQ library file v1.1\",\n  \"presets\": [\n    {\n      \"name\": \"Classical\",\n      \"hz60\": 33,\n      \"hz170\": 33,\n      \"hz310\": 33,\n      \"hz600\": 33,\n      \"hz1000\": 33,\n      \"hz3000\": 33,\n      \"hz6000\": 20,\n      \"hz12000\": 20,\n      \"hz14000\": 20,\n      \"hz16000\": 16,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Club\",\n      \"hz60\": 33,\n      \"hz170\": 33,\n      \"hz310\": 38,\n      \"hz600\": 42,\n      \"hz1000\": 42,\n      \"hz3000\": 42,\n      \"hz6000\": 38,\n      \"hz12000\": 33,\n      \"hz14000\": 33,\n      \"hz16000\": 33,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Dance\",\n      \"hz60\": 48,\n      \"hz170\": 44,\n      \"hz310\": 36,\n      \"hz600\": 32,\n      \"hz1000\": 32,\n      \"hz3000\": 22,\n      \"hz6000\": 20,\n      \"hz12000\": 20,\n      \"hz14000\": 32,\n      \"hz16000\": 32,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Laptop speakers/headphones\",\n      \"hz60\": 40,\n      \"hz170\": 50,\n      \"hz310\": 41,\n      \"hz600\": 26,\n      \"hz1000\": 28,\n      \"hz3000\": 35,\n      \"hz6000\": 40,\n      \"hz12000\": 48,\n      \"hz14000\": 53,\n      \"hz16000\": 56,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Large hall\",\n      \"hz60\": 49,\n      \"hz170\": 49,\n      \"hz310\": 42,\n      \"hz600\": 42,\n      \"hz1000\": 33,\n      \"hz3000\": 24,\n      \"hz6000\": 24,\n      \"hz12000\": 24,\n      \"hz14000\": 33,\n      \"hz16000\": 33,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Party\",\n      \"hz60\": 44,\n      \"hz170\": 44,\n      \"hz310\": 33,\n      \"hz600\": 33,\n      \"hz1000\": 33,\n      \"hz3000\": 33,\n      \"hz6000\": 33,\n      \"hz12000\": 33,\n      \"hz14000\": 44,\n      \"hz16000\": 44,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Pop\",\n      \"hz60\": 29,\n      \"hz170\": 40,\n      \"hz310\": 44,\n      \"hz600\": 45,\n      \"hz1000\": 41,\n      \"hz3000\": 30,\n      \"hz6000\": 28,\n      \"hz12000\": 28,\n      \"hz14000\": 29,\n      \"hz16000\": 29,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Reggae\",\n      \"hz60\": 33,\n      \"hz170\": 33,\n      \"hz310\": 31,\n      \"hz600\": 22,\n      \"hz1000\": 33,\n      \"hz3000\": 43,\n      \"hz6000\": 43,\n      \"hz12000\": 33,\n      \"hz14000\": 33,\n      \"hz16000\": 33,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Rock\",\n      \"hz60\": 45,\n      \"hz170\": 40,\n      \"hz310\": 23,\n      \"hz600\": 19,\n      \"hz1000\": 26,\n      \"hz3000\": 39,\n      \"hz6000\": 47,\n      \"hz12000\": 50,\n      \"hz14000\": 50,\n      \"hz16000\": 50,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Soft\",\n      \"hz60\": 40,\n      \"hz170\": 35,\n      \"hz310\": 30,\n      \"hz600\": 28,\n      \"hz1000\": 30,\n      \"hz3000\": 39,\n      \"hz6000\": 46,\n      \"hz12000\": 48,\n      \"hz14000\": 50,\n      \"hz16000\": 52,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Ska\",\n      \"hz60\": 28,\n      \"hz170\": 24,\n      \"hz310\": 25,\n      \"hz600\": 31,\n      \"hz1000\": 39,\n      \"hz3000\": 42,\n      \"hz6000\": 47,\n      \"hz12000\": 48,\n      \"hz14000\": 50,\n      \"hz16000\": 48,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Full Bass\",\n      \"hz60\": 48,\n      \"hz170\": 48,\n      \"hz310\": 48,\n      \"hz600\": 42,\n      \"hz1000\": 35,\n      \"hz3000\": 25,\n      \"hz6000\": 18,\n      \"hz12000\": 15,\n      \"hz14000\": 14,\n      \"hz16000\": 14,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Soft Rock\",\n      \"hz60\": 39,\n      \"hz170\": 39,\n      \"hz310\": 36,\n      \"hz600\": 31,\n      \"hz1000\": 25,\n      \"hz3000\": 23,\n      \"hz6000\": 26,\n      \"hz12000\": 31,\n      \"hz14000\": 37,\n      \"hz16000\": 47,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Full Treble\",\n      \"hz60\": 16,\n      \"hz170\": 16,\n      \"hz310\": 16,\n      \"hz600\": 25,\n      \"hz1000\": 37,\n      \"hz3000\": 50,\n      \"hz6000\": 58,\n      \"hz12000\": 58,\n      \"hz14000\": 58,\n      \"hz16000\": 60,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Full Bass & Treble\",\n      \"hz60\": 44,\n      \"hz170\": 42,\n      \"hz310\": 33,\n      \"hz600\": 20,\n      \"hz1000\": 24,\n      \"hz3000\": 35,\n      \"hz6000\": 46,\n      \"hz12000\": 50,\n      \"hz14000\": 52,\n      \"hz16000\": 52,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Live\",\n      \"hz60\": 24,\n      \"hz170\": 33,\n      \"hz310\": 39,\n      \"hz600\": 41,\n      \"hz1000\": 42,\n      \"hz3000\": 42,\n      \"hz6000\": 39,\n      \"hz12000\": 37,\n      \"hz14000\": 37,\n      \"hz16000\": 36,\n      \"preamp\": 33\n    },\n    {\n      \"name\": \"Techno\",\n      \"hz60\": 45,\n      \"hz170\": 42,\n      \"hz310\": 33,\n      \"hz600\": 23,\n      \"hz1000\": 24,\n      \"hz3000\": 33,\n      \"hz6000\": 45,\n      \"hz12000\": 48,\n      \"hz14000\": 48,\n      \"hz16000\": 47,\n      \"preamp\": 33\n    }\n  ]\n}\n"
  },
  {
    "path": "webamp/packages/webamp/scripts/compileSkin.js",
    "content": "const puppeteer = require(\"puppeteer\");\n\n// const DATA_URI = /url\\([^)]+\\)/g;\n\n(async () => {\n  const browser = await puppeteer.launch();\n  const page = await browser.newPage();\n  // TODO: allow the skin to be passed in via the CLI.\n  try {\n    await page.goto(\n      'http://localhost:8080/#{\"skinUrl\":\"/assets/skins/base-2.91.wsz\"}'\n    );\n  } catch (e) {\n    console.error(\n      \"Error connecting to localhost:8080. Are you running the dev server?\",\n      \"\\n\\n\",\n      e\n    );\n    await browser.close();\n    return;\n  }\n  // TODO: Wait for node to be ready\n  await new Promise((resolve) => setTimeout(resolve, 500));\n  try {\n    const css = await page.evaluate(\n      () => document.getElementById(\"webamp-skin\").innerText\n    );\n    console.log(css);\n  } catch (e) {\n    console.error(\"Hit an error, putting a screenshot in ./error.png\");\n    page.screenshot({ path: \"./error.png\" });\n    throw e;\n  } finally {\n    await browser.close();\n  }\n\n  // TODO: Extract non-CSS stuff\n\n  // TODO: Write to stdout\n})();\n"
  },
  {
    "path": "webamp/packages/webamp/scripts/parsePresetFiles.js",
    "content": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { parser } = require(\"winamp-eqf\");\n\nconst presetsPath = path.join(__dirname, \"../presets/winamp.q1\");\nconst content = fs.readFileSync(presetsPath);\nconst presetObjects = parser(content);\n\nconsole.log(JSON.stringify(presetObjects, null, \"  \"));\n"
  },
  {
    "path": "webamp/packages/webamp/scripts/postcss-optimize-data-uri-pngs.js",
    "content": "const postcss = require(\"postcss\");\nconst dataUriToBuffer = require(\"data-uri-to-buffer\");\nconst imagemin = require(\"imagemin\");\nconst imageminOptipng = require(\"imagemin-optipng\");\n\nconst DATA_URL_REGEX = new RegExp(/url\\((data:image\\/png;base64,.+)\\)/gi);\nconst DATA_URL_PROPS_REGEX = /^(background(?:-image)?)|(content)|(cursor)/;\n\nasync function optimizeDataUri(dataUri) {\n  const buffer = dataUriToBuffer(dataUri);\n  const optimized = await imagemin.buffer(buffer, {\n    use: [imageminOptipng()],\n  });\n  return `data:image/png;base64,${optimized.toString(\"base64\")}`;\n}\n\nmodule.exports = postcss.plugin(\"postcss-optimize-data-uri-pngs\", () => {\n  return async function (css) {\n    // walkDecls does not let us work async, so we collect the async work we\n    // need to do here, and await it at the end\n    const promisesFactories = [];\n    css.walkDecls(DATA_URL_PROPS_REGEX, (decl) => {\n      let matches;\n      // WTF JavaScript. This is the worst API for iterating RegEx matches.\n      while ((matches = DATA_URL_REGEX.exec(decl.value))) {\n        const [, dataUri] = matches;\n        promisesFactories.push(async () => {\n          decl.value = decl.value.replace(\n            dataUri,\n            await optimizeDataUri(dataUri)\n          );\n        });\n      }\n    });\n    await Promise.all(promisesFactories.map((p) => p()));\n  };\n});\n"
  },
  {
    "path": "webamp/packages/webamp/scripts/postcss-optimize-data-uri-pngs.test.js",
    "content": "const fs = require(\"fs\");\nconst postcss = require(\"postcss\");\n\nconst plugin = require(\"./postcss-optimize-data-uri-pngs\");\n\nconst css = fs.readFileSync(\"./css/base-skin.css\", \"utf8\");\n// This seems to timeout a lot in CI\nit.skip(\"does something\", async () => {\n  const result = await postcss([plugin({})]).process(css);\n  expect(result.css.length).toBeLessThan(css.length);\n});\n"
  },
  {
    "path": "webamp/packages/webamp/static.d.ts",
    "content": "declare module \"*.wsz\";\ndeclare module \"*.mp3\";\ndeclare module \"*.png\";\ndeclare module \"*.ico\";\ndeclare module \"*.jpg\";\ndeclare module \"*.svg\";\n"
  },
  {
    "path": "webamp/packages/webamp/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"moduleResolution\": \"node\",\n    \"module\": \"commonjs\",\n    \"target\": \"esnext\",\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"resolveJsonModule\": true,\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"noEmit\": true,\n    \"pretty\": true\n  },\n  \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n  \"exclude\": [\"node_modules\", \"demo/built\"]\n}\n"
  }
]