diff --git a/asset-manifest.json b/asset-manifest.json index 81d91be..5595e4f 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/webminidisc/static/css/main.0b2cfbb9.chunk.css", - "main.js": "/webminidisc/static/js/main.59c85b51.chunk.js", - "main.js.map": "/webminidisc/static/js/main.59c85b51.chunk.js.map", + "main.js": "/webminidisc/static/js/main.0bfb5ad5.chunk.js", + "main.js.map": "/webminidisc/static/js/main.0bfb5ad5.chunk.js.map", "runtime-main.js": "/webminidisc/static/js/runtime-main.114d47b9.js", "runtime-main.js.map": "/webminidisc/static/js/runtime-main.114d47b9.js.map", "static/js/2.35357f3b.chunk.js": "/webminidisc/static/js/2.35357f3b.chunk.js", @@ -14,7 +14,7 @@ "4a3a421ab134cd5ff776.worker.js.LICENSE.txt": "/webminidisc/4a3a421ab134cd5ff776.worker.js.LICENSE.txt", "4a3a421ab134cd5ff776.worker.js.map": "/webminidisc/4a3a421ab134cd5ff776.worker.js.map", "index.html": "/webminidisc/index.html", - "precache-manifest.12f9dc8b56af5b688691f5358c04acd3.js": "/webminidisc/precache-manifest.12f9dc8b56af5b688691f5358c04acd3.js", + "precache-manifest.25281bdfe8124b8e0ae5bc485ccc33e9.js": "/webminidisc/precache-manifest.25281bdfe8124b8e0ae5bc485ccc33e9.js", "service-worker.js": "/webminidisc/service-worker.js", "static/css/main.0b2cfbb9.chunk.css.map": "/webminidisc/static/css/main.0b2cfbb9.chunk.css.map", "static/js/2.35357f3b.chunk.js.LICENSE.txt": "/webminidisc/static/js/2.35357f3b.chunk.js.LICENSE.txt", @@ -30,6 +30,6 @@ "static/js/runtime-main.114d47b9.js", "static/js/2.35357f3b.chunk.js", "static/css/main.0b2cfbb9.chunk.css", - "static/js/main.59c85b51.chunk.js" + "static/js/main.0bfb5ad5.chunk.js" ] } \ No newline at end of file diff --git a/final-service-worker.js b/final-service-worker.js index 5043b59..abef110 100644 --- a/final-service-worker.js +++ b/final-service-worker.js @@ -35,7 +35,7 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/webminidisc/precache-manifest.12f9dc8b56af5b688691f5358c04acd3.js" + "/webminidisc/precache-manifest.25281bdfe8124b8e0ae5bc485ccc33e9.js" ); self.addEventListener('message', (event) => { diff --git a/index.html b/index.html index 80f7310..cfef51f 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Web MiniDisc - Brings NetMD Devices to the Web
\ No newline at end of file +Web MiniDisc - Brings NetMD Devices to the Web
\ No newline at end of file diff --git a/precache-manifest.12f9dc8b56af5b688691f5358c04acd3.js b/precache-manifest.25281bdfe8124b8e0ae5bc485ccc33e9.js similarity index 95% rename from precache-manifest.12f9dc8b56af5b688691f5358c04acd3.js rename to precache-manifest.25281bdfe8124b8e0ae5bc485ccc33e9.js index e4220d0..8c03da2 100644 --- a/precache-manifest.12f9dc8b56af5b688691f5358c04acd3.js +++ b/precache-manifest.25281bdfe8124b8e0ae5bc485ccc33e9.js @@ -16,11 +16,11 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/webminidisc/4a3a421ab134cd5ff776.worker.js.LICENSE.txt" }, { - "revision": "91163c87069bef4a67c58bbade7c7bf3", + "revision": "39571795da5d98f0fed5638b763b3b39", "url": "/webminidisc/index.html" }, { - "revision": "89fcf67246065d16c6d6", + "revision": "6965b23e7e97f5bb231a", "url": "/webminidisc/static/css/main.0b2cfbb9.chunk.css" }, { @@ -32,8 +32,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/webminidisc/static/js/2.35357f3b.chunk.js.LICENSE.txt" }, { - "revision": "89fcf67246065d16c6d6", - "url": "/webminidisc/static/js/main.59c85b51.chunk.js" + "revision": "6965b23e7e97f5bb231a", + "url": "/webminidisc/static/js/main.0bfb5ad5.chunk.js" }, { "revision": "b873df5f5158f06b4f7b", diff --git a/service-worker.js b/service-worker.js index 4c80336..da2de37 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/webminidisc/precache-manifest.12f9dc8b56af5b688691f5358c04acd3.js" + "/webminidisc/precache-manifest.25281bdfe8124b8e0ae5bc485ccc33e9.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.59c85b51.chunk.js b/static/js/main.0bfb5ad5.chunk.js similarity index 85% rename from static/js/main.59c85b51.chunk.js rename to static/js/main.0bfb5ad5.chunk.js index 5551708..641971b 100644 --- a/static/js/main.59c85b51.chunk.js +++ b/static/js/main.0bfb5ad5.chunk.js @@ -1,4 +1,4 @@ -(this.webpackJsonpwebmd=this.webpackJsonpwebmd||[]).push([[0],{162:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAaElEQVR4Ac3BQQrCQAAEsIz///MobGG7bZUiHkz8laKoe+olplrFtRriJVa1ilUNsYlrNcVQQ+zEe3UWB/FZTXEh3quzOIhrNcVQQ+zEWU2xqiE2D6ua4iwOHqa6J6hNTDXFl+q++oUnXWYXCDnmtMUAAAAASUVORK5CYII="},288:function(e,t,A){e.exports=A.p+"static/media/record-complete-notification-icon.f6ae1070.png"},292:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAAEEfUpiAAAACXBIWXMAAAsSAAALEgHS3X78AAAQR0lEQVRYCQE8EMPvAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAP8AAAIAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA//8AAAAB/wAAAgAAAAAAAAAAAQD/AP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAEAAAAAAAAAAP8AAP8AAAAAAQAAAP8AAAAB/wAAAAAAAAEAAAAAAAAAAAAA//8AAAAAAAABAAAA/wD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA/wAAAAAA/wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAD/AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAP//AAAAAAAAAAAAAAEBAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQL/AAD/AAAAAQAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAgEAAAH/AAD/AAAAAQAAAAAAAAABAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA/wEAAAH/AAD/AAAAAP8AAP//AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAA//8AAAABAAAA/wAAAAAAAAD/AAAA/wAAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAP//AAD//wAAAAAAAAAAAAACAAABAQAA//8AAAABAAAAAAAAAAEAAAABAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD/AAABAQAA//8AAAAAAAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAEAAAAA/wAA/wEAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAQAAAAAAAAAA/wAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAD/AAD/AQAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAABAAABAAAAAP8AAP//AAD/AAAAAAAAAAH/AAD/AAAAAP8AAAD/AAD//wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQEAAAEAAAAAAAAAAP8AAP8BAAABAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAQAAAAAAAD//wAAAQEAAAABAAAAAAAAAP8AAAAAAAAAAQEAAAEAAAD/AAAAAQEAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAEAAAAAAIAAAAAAAAAAfwAAAAAAAAABAAAAAAD//wAAAAAAAIGBAAAAAAAAgAEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAAAAAEBAAAAAAAA//8AAP//AAAAAAAAAAEAAP//AAAAAAAA/wAAAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAQEAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAgAAAAAAAAAAAAAAAAAABAQAAAAAAAICAAAAAAAAAf38AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4NtYBuc2+1AAAAAElFTkSuQmCC"},301:function(e,t,A){e.exports=A.p+"static/media/chrome-icon.f3b6c54c.svg"},306:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVR4Ae3BSQ7CUAxEwde+/50bFkgQyGD/DBZSqrjtZMDsIMaZKTFAjDHzRJGoM+tEgagxOSJJ5JkakSByzBixQWwz+4gVYp05hlgglpljiRlinjmH+CJ+mXOJD2LKXEO8iDdzLfEUNBN5pk5sCJoFzYJmQbOgWdAsaBY0C5oFzUSNyRO3f/AAz+gRJE12Ia8AAAAASUVORK5CYII="},307:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiElEQVR4Ae3BSQ7CQBAEwcz+/58LDkhsxp4xSwtBBD9P5oRxMkDGhXmyoWhWNCuaFc2KZkWzolnRrGhWNJOz8FlyVDSTa+Ez5ETuhfeSC7IsvIfckMfCa8kCWRdeQx6QbeE5skLGhH1kg4wLc2SAzAljZJDMC+tkguwTlskk2S9ckwYBwt83OwASZhEklsYbbQAAAABJRU5ErkJggg=="},311:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAzUlEQVR4AY3BgXHCMBAAwXuHQugEdfanzkRlH3nGgMfjEO8GF6nFjhpMCxeoxZSZrFprTMW0cFFm0nsnU8YYvNy4QGWVKRGgvC38R4uptUYEqKi8BN9okQm9g3IQTMFftMiECHaCg4UzWmRCBCib4MTCkRaZEAEKmXwT7GmRCb2D8laFvfOiBptgo1ZrjTYGKFPwUROriGAKNjd2Wmtsgh2V1fP55OjGpBYfwYneOypnCij+V0Bx8AMIBF+opXK/3xljCHQ2Cxc9Hg/O/AKFdlY5+3GtSAAAAABJRU5ErkJggg=="},312:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfUlEQVR4Aa3BUQ6CMBRFwXOb7vulKz/CR4Ni1RCc4a6wJr+FTeedbFQ+ScLUeOWGKxoH2SRhSgZTMljpPFG5qrOQDKZkMCUDLZ41FrTYaaHFTgstzho3dU6SwZQMpmSgxVnjRIudFlrstNBipXFTY0GLSYtvGjeFg1wT/uEBKpc1Cx/u8CoAAAAASUVORK5CYII="},313:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAt0lEQVR4Ab3Bi1HbYBAGwD2RQlwKVMbnzu6v7IIkZ4CEhzOZya5/Vf7OBHEoLx7cb4JnFJrgurnPJAhXPCNOm+/NjFfhijhtvjYzDo+P7Zc4lBebz82Mw1qtu+0Su3JTPjYzDmu17kYkduWN8qeZcVirdTcisSu/Ke/NjMNarbsRiV35QHk1Mw5rte5GJHblE5vTuFmrdTcisStfeHBKwtMTl8sFkdiVb/zwRkISN+UO5TTeK//LT0efTfwPZVIpAAAAAElFTkSuQmCC"},314:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA3klEQVR4Ae3BwU3EUBBEweeV8+Jn1u3MeiL7eARIPoCFVsLLwVXcbrfb7fZqCwe2Jxeyvax8sj3HGFwlCbv5YGd7jjG4ShK+rLanJK6ybRtHK5+qildY+YUkPGuMwZmVg7cxaJXQktBs8yzbtDEG33nwYisHlXAkiWabZ0miVRXfWTlRVbQ5J8+qKs6s/EJV8VcenEhCS0JLQktCS0JLQktCS0JLQkvCTx6ckESTRJNEk0STRJNEk0STRJNEk8RPFttTElXFFZLQbLNbVnbbtnEl2+wWdgsfJtdauP0X7xi2ahnkEPOyAAAAAElFTkSuQmCC"},315:function(e,t){e.exports="data:image/png;base64,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"},318:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACcklEQVR4Ae3BgW1bRxBF0bs0C1lXss+VWJ3ssBO6kzedWJVM/kIk8kVQMmUlCAL4HP74rzUeFBHFHRHReF9xX2Nz5B0RUVzMGVxlmquIKC4iovFBR+6IiOIi5mSZBPdIYqd40Xit8VpxceRGRFTM4EXxEbZZJBXQeEBjJyIqZvBacVU0lkyzSOKzjlxEREnCaTTEo6qKq9YaVcVea42qYq+1RlXRWqNxEREVc+JMFg3xt2IpGkumWSTxWQc2EVExJ4vGYHGaR1QVVUVVsVQVVcVeVVFV7FUVS2MTESWJRWOwOJNFQ7woisaSaRZJfFaLiJLELY2BM1k0xBKnYC8iqCquWmtUFY9qrdEioiRxj8bAmSy2iQj+aUfe4Uw0BnE6ERFsGq9VRBARXNnmliQ2jTsO/IIzeZRtPurAxjaLbRbbLLZ5hG1s8zsObCRhG0nYRhK2kYRt/k1HNraRhG0kYRtJ2GbOSWYSEUREsRMRSOIzjmwkYRtJ2EYStplzkpmMMVgigr2YE2fyGV9sn3rvIQnbSMI2c04ykzEGmcnSe6f3zvfvT7QWnHvn3DtPz8+8RRKbxhsOXNhGEraZc5KZjDHITPbGEIuGcCaLxuB3HdhERGNjmzknmckYg8zkVqa5R2NwSxKbxjsO7Mw5yUzGGGQm94whrjSEM7nSGHzUgYuIaKfTiTEGmclbMs17NAaLJDaNX/jCju1Tay1677xlDLEEcALO/YzzG+feuTp//cqm8YAv3LB96r3Hz58/6b1z6/n5id7PLCdePD0/0X/8wN++wenEpvGgxjsiothI4moMcdXYNPYaH9R4TPG2xh//Z38BPq9JPdh7I1oAAAAASUVORK5CYII="},343:function(e,t,A){e.exports=A(585)},365:function(e,t){},367:function(e,t){},398:function(e,t){},399:function(e,t){},405:function(e,t){},533:function(e,t){},535:function(e,t){},568:function(e,t,A){},569:function(e,t,A){},584:function(e,t,A){e.exports=function(){return new Worker(A.p+"4a3a421ab134cd5ff776.worker.js")}},585:function(e,t,A){"use strict";A.r(t);var a=A(0),n=A.n(a),l=A(17),i=A.n(l),r=A(20);const o=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function c(e,t){navigator.serviceWorker.register(e).then(e=>{e.onupdatefound=()=>{const A=e.installing;null!=A&&(A.onstatechange=()=>{console.log("state change",A.state),"installed"===A.state&&(navigator.serviceWorker.controller?(console.log("New content is available and will be used when all tabs for this page are closed. See https://bit.ly/CRA-PWA."),t&&t.onUpdate&&t.onUpdate(e)):(console.log("Content is cached for offline use."),t&&t.onSuccess&&t.onSuccess(e)))})},e.update()}).catch(e=>{console.error("Error during service worker registration:",e)})}var s=A(27),d=A(21),m=A(286),u=A(119),p=A.n(u),g=A(57);function h(e){return new Promise(t=>{setTimeout(t,e)})}async function f(e,t){let A=1,a=setInterval(()=>{A++,t(Math.min(100,1e3*A/e*100))},1e3);await h(e),window.clearInterval(a)}function b(e){return Object(r.e)(e,r.c)}function E(e){return`/webminidisc/${e}`}function w(e,t){localStorage.setItem(e,JSON.stringify(t))}function v(e,t){let A=localStorage.getItem(e);if(null===A)return t;try{return JSON.parse(A)}catch(a){return t}}function C(e,t){const A=e=>Math.ceil(e/7);let a=e.groups.filter(e=>null!==e.title),n=e.fullWidthTitle+"0;//",l=e.title+"0;//";if(t||void 0===t)for(let s of a){let e=`${s.tracks[0].index+1}${s.tracks.length-1!==0&&`-${s.tracks[s.tracks.length-1].index+1}`}//`;n+=s.fullWidthTitle+e,l+=s.title+e}let i=0;i+=A(2*n.length),i+=A(y(l));for(let s of Object(d.getTracks)(e)){var r,o,c;i+=A(2*(null!==(r=null===(o=s.fullWidthTitle)||void 0===o?void 0:o.length)&&void 0!==r?r:0)),i+=A(y(null!==(c=s.title)&&void 0!==c?c:""))}return 7*Math.max(255-i,0)}function k(e){return e.normalize("NFD").replace(/[^\x00-\x7F]/g,"")}function y(e){const t={"\u30ac":1,"\u30ae":1,"\u30b0":1,"\u30b2":1,"\u30b4":1,"\u30b6":1,"\u30b8":1,"\u30ba":1,"\u30bc":1,"\u30be":1,"\u30c0":1,"\u30c2":1,"\u30c5":1,"\u30c7":1,"\u30c9":1,"\u30d0":1,"\u30d1":1,"\u30d3":1,"\u30d4":1,"\u30d6":1,"\u30d7":1,"\u30d9":1,"\u30da":1,"\u30dc":1,"\u30dd":1,"\u30ee":1,"\u30f0":1,"\u30f1":1,"\u30f5":1,"\u30f6":1,"\u30f4":1,"\u30fd":1,"\u30fe":1,"\u304c":1,"\u304e":1,"\u3050":1,"\u3052":1,"\u3054":1,"\u3056":1,"\u3058":1,"\u305a":1,"\u305c":1,"\u305e":1,"\u3060":1,"\u3062":1,"\u3065":1,"\u3067":1,"\u3069":1,"\u3070":1,"\u3071":1,"\u3073":1,"\u3074":1,"\u3076":1,"\u3077":1,"\u3079":1,"\u307a":1,"\u307c":1,"\u307d":1,"\u308e":1,"\u3090":1,"\u3091":1,"\u3095":1,"\u3096":1,"\u3094":1,"\u309d":1,"\u309e":1};return e.length+e.split("").map(e=>{var A;return null!==(A=t[e])&&void 0!==A?A:0}).reduce((e,t)=>e+t,0)}function x(e){const t={"\u30a1":"\uff67","\u30a2":"\uff71","\u30a3":"\uff68","\u30a4":"\uff72","\u30a5":"\uff69","\u30a6":"\uff73","\u30a7":"\uff6a","\u30a8":"\uff74","\u30a9":"\uff6b","\u30aa":"\uff75","\u30ab":"\uff76","\u30ac":"\uff76\uff9e","\u30ad":"\uff77","\u30ae":"\uff77\uff9e","\u30af":"\uff78","\u30b0":"\uff78\uff9e","\u30b1":"\uff79","\u30b2":"\uff79\uff9e","\u30b3":"\uff7a","\u30b4":"\uff7a\uff9e","\u30b5":"\uff7b","\u30b6":"\uff7b\uff9e","\u30b7":"\uff7c","\u30b8":"\uff7c\uff9e","\u30b9":"\uff7d","\u30ba":"\uff7d\uff9e","\u30bb":"\uff7e","\u30bc":"\uff7e\uff9e","\u30bd":"\uff7f","\u30be":"\uff7f\uff9e","\u30bf":"\uff80","\u30c0":"\uff80\uff9e","\u30c1":"\uff81","\u30c2":"\uff81\uff9e","\u30c3":"\uff6f","\u30c4":"\uff82","\u30c5":"\uff82\uff9e","\u30c6":"\uff83","\u30c7":"\uff83\uff9e","\u30c8":"\uff84","\u30c9":"\uff84\uff9e","\u30ca":"\uff85","\u30cb":"\uff86","\u30cc":"\uff87","\u30cd":"\uff88","\u30ce":"\uff89","\u30cf":"\uff8a","\u30d0":"\uff8a\uff9e","\u30d1":"\uff8a\uff9f","\u30d2":"\uff8b","\u30d3":"\uff8b\uff9e","\u30d4":"\uff8b\uff9f","\u30d5":"\uff8c","\u30d6":"\uff8c\uff9e","\u30d7":"\uff8c\uff9f","\u30d8":"\uff8d","\u30d9":"\uff8d\uff9e","\u30da":"\uff8d\uff9f","\u30db":"\uff8e","\u30dc":"\uff8e\uff9e","\u30dd":"\uff8e\uff9f","\u30de":"\uff8f","\u30df":"\uff90","\u30e0":"\uff91","\u30e1":"\uff92","\u30e2":"\uff93","\u30e3":"\uff6c","\u30e4":"\uff94","\u30e5":"\uff6d","\u30e6":"\uff95","\u30e7":"\uff6e","\u30e8":"\uff96","\u30e9":"\uff97","\u30ea":"\uff98","\u30eb":"\uff99","\u30ec":"\uff9a","\u30ed":"\uff9b","\u30ef":"\uff9c","\u30f2":"\uff66","\u30f3":"\uff9d","\u30fc":"\uff70","\u30ee":"\u30ee","\u30f0":"\u30f0","\u30f1":"\u30f1","\u30f5":"\u30f5","\u30f6":"\u30f6","\u30f4":"\uff73\uff9e","\u30fd":"\u30fd","\u30fe":"\u30fe","\u30fb":"\uff65","\u300c":"\uff62","\u300d":"\uff63","\u3002":"\uff61","\u3001":"\uff64","\uff01":"!","\uff02":'"',"\uff03":"#","\uff04":"$","\uff05":"%","\uff06":"&","\uff07":"'","\uff08":"(","\uff09":")","\uff0a":"*","\uff0b":"+","\uff0c":",","\uff0d":"-","\uff0e":".","\uff0f":"/","\uff1a":":","\uff1b":";","\uff1c":"<","\uff1d":"=","\uff1e":">","\uff1f":"?","\uff20":"@","\uff21":"A","\uff22":"B","\uff23":"C","\uff24":"D","\uff25":"E","\uff26":"F","\uff27":"G","\uff28":"H","\uff29":"I","\uff2a":"J","\uff2b":"K","\uff2c":"L","\uff2d":"M","\uff2e":"N","\uff2f":"O","\uff30":"P","\uff31":"Q","\uff32":"R","\uff33":"S","\uff34":"T","\uff35":"U","\uff36":"V","\uff37":"W","\uff38":"X","\uff39":"Y","\uff3a":"Z","\uff3b":"[","\uff3c":"\\","\uff3d":"]","\uff3e":"^","\uff3f":"_","\uff40":"`","\uff41":"a","\uff42":"b","\uff43":"c","\uff44":"d","\uff45":"e","\uff46":"f","\uff47":"g","\uff48":"h","\uff49":"i","\uff4a":"j","\uff4b":"k","\uff4c":"l","\uff4d":"m","\uff4e":"n","\uff4f":"o","\uff50":"p","\uff51":"q","\uff52":"r","\uff53":"s","\uff54":"t","\uff55":"u","\uff56":"v","\uff57":"w","\uff58":"x","\uff59":"y","\uff5a":"z","\uff5b":"{","\uff5c":"|","\uff5d":"}","\uff5e":"~","\u3000":" ","\uff10":"0","\uff11":"1","\uff12":"2","\uff13":"3","\uff14":"4","\uff15":"5","\uff16":"6","\uff17":"7","\uff18":"8","\uff19":"9","\u3041":"\uff67","\u3042":"\uff71","\u3043":"\uff68","\u3044":"\uff72","\u3045":"\uff69","\u3046":"\uff73","\u3047":"\uff6a","\u3048":"\uff74","\u3049":"\uff6b","\u304a":"\uff75","\u304b":"\uff76","\u304c":"\uff76\uff9e","\u304d":"\uff77","\u304e":"\uff77\uff9e","\u304f":"\uff78","\u3050":"\uff78\uff9e","\u3051":"\uff79","\u3052":"\uff79\uff9e","\u3053":"\uff7a","\u3054":"\uff7a\uff9e","\u3055":"\uff7b","\u3056":"\uff7b\uff9e","\u3057":"\uff7c","\u3058":"\uff7c\uff9e","\u3059":"\uff7d","\u305a":"\uff7d\uff9e","\u305b":"\uff7e","\u305c":"\uff7e\uff9e","\u305d":"\uff7f","\u305e":"\uff7f\uff9e","\u305f":"\uff80","\u3060":"\uff80\uff9e","\u3061":"\uff81","\u3062":"\uff81\uff9e","\u3063":"\uff6f","\u3064":"\uff82","\u3065":"\uff82\uff9e","\u3066":"\uff83","\u3067":"\uff83\uff9e","\u3068":"\uff84","\u3069":"\uff84\uff9e","\u306a":"\uff85","\u306b":"\uff86","\u306c":"\uff87","\u306d":"\uff88","\u306e":"\uff89","\u306f":"\uff8a","\u3070":"\uff8a\uff9e","\u3071":"\uff8a\uff9f","\u3072":"\uff8b","\u3073":"\uff8b\uff9e","\u3074":"\uff8b\uff9f","\u3075":"\uff8c","\u3076":"\uff8c\uff9e","\u3077":"\uff8c\uff9f","\u3078":"\uff8d","\u3079":"\uff8d\uff9e","\u307a":"\uff8d\uff9f","\u307b":"\uff8e","\u307c":"\uff8e\uff9e","\u307d":"\uff8e\uff9f","\u307e":"\uff8f","\u307f":"\uff90","\u3080":"\uff91","\u3081":"\uff92","\u3082":"\uff93","\u3083":"\uff6c","\u3084":"\uff94","\u3085":"\uff6d","\u3086":"\uff95","\u3087":"\uff6e","\u3088":"\uff96","\u3089":"\uff97","\u308a":"\uff98","\u308b":"\uff99","\u308c":"\uff9a","\u308d":"\uff9b","\u308f":"\uff9c","\u3092":"\uff66","\u3093":"\uff9d","\u308e":"\u30ee","\u3090":"\u30f0","\u3091":"\u30f1","\u3095":"\u30f5","\u3096":"\u30f6","\u3094":"\uff73\uff9e","\u309d":"\u30fd","\u309e":"\u30fe"},A=Object.values(t),a=e.split("").map(e=>t[e]?t[e]:e.charCodeAt(0)<127||A.includes(e)?e:" ").join("");return p.a.encode(a,"SJIS").length!==y(e)?k(e):a}function O(e){const t={"!":"\uff01",'"':"\uff02","#":"\uff03",$:"\uff04","%":"\uff05","&":"\uff06","'":"\uff07","(":"\uff08",")":"\uff09","*":"\uff0a","+":"\uff0b",",":"\uff0c","-":"\uff0d",".":"\uff0e","/":"\uff0f",":":"\uff1a",";":"\uff1b","<":"\uff1c","=":"\uff1d",">":"\uff1e","?":"\uff1f","@":"\uff20",A:"\uff21",B:"\uff22",C:"\uff23",D:"\uff24",E:"\uff25",F:"\uff26",G:"\uff27",H:"\uff28",I:"\uff29",J:"\uff2a",K:"\uff2b",L:"\uff2c",M:"\uff2d",N:"\uff2e",O:"\uff2f",P:"\uff30",Q:"\uff31",R:"\uff32",S:"\uff33",T:"\uff34",U:"\uff35",V:"\uff36",W:"\uff37",X:"\uff38",Y:"\uff39",Z:"\uff3a","[":"\uff3b","\\":"\uff3c","]":"\uff3d","^":"\uff3e",_:"\uff3f","`":"\uff40",a:"\uff41",b:"\uff42",c:"\uff43",d:"\uff44",e:"\uff45",f:"\uff46",g:"\uff47",h:"\uff48",i:"\uff49",j:"\uff4a",k:"\uff4b",l:"\uff4c",m:"\uff4d",n:"\uff4e",o:"\uff4f",p:"\uff50",q:"\uff51",r:"\uff52",s:"\uff53",t:"\uff54",u:"\uff55",v:"\uff56",w:"\uff57",x:"\uff58",y:"\uff59",z:"\uff5a","{":"\uff5b","|":"\uff5c","}":"\uff5d","~":"\uff5e"," ":"\u3000",0:"\uff10",1:"\uff11",2:"\uff12",3:"\uff13",4:"\uff14",5:"\uff15",6:"\uff16",7:"\uff17",8:"\uff18",9:"\uff19","\uff67":"\u30a1","\uff71":"\u30a2","\uff68":"\u30a3","\uff72":"\u30a4","\uff69":"\u30a5","\uff73":"\u30a6","\uff6a":"\u30a7","\uff74":"\u30a8","\uff6b":"\u30a9","\uff75":"\u30aa","\uff76":"\u30ab","\uff76\uff9e":"\u30ac","\uff77":"\u30ad","\uff77\uff9e":"\u30ae","\uff78":"\u30af","\uff78\uff9e":"\u30b0","\uff79":"\u30b1","\uff79\uff9e":"\u30b2","\uff7a":"\u30b3","\uff7a\uff9e":"\u30b4","\uff7b":"\u30b5","\uff7b\uff9e":"\u30b6","\uff7c":"\u30b7","\uff7c\uff9e":"\u30b8","\uff7d":"\u30b9","\uff7d\uff9e":"\u30ba","\uff7e":"\u30bb","\uff7e\uff9e":"\u30bc","\uff7f":"\u30bd","\uff7f\uff9e":"\u30be","\uff80":"\u30bf","\uff80\uff9e":"\u30c0","\uff81":"\u30c1","\uff81\uff9e":"\u30c2","\uff6f":"\u30c3","\uff82":"\u30c4","\uff82\uff9e":"\u30c5","\uff83":"\u30c6","\uff83\uff9e":"\u30c7","\uff84":"\u30c8","\uff84\uff9e":"\u30c9","\uff85":"\u30ca","\uff86":"\u30cb","\uff87":"\u30cc","\uff88":"\u30cd","\uff89":"\u30ce","\uff8a":"\u30cf","\uff8a\uff9e":"\u30d0","\uff8a\uff9f":"\u30d1","\uff8b":"\u30d2","\uff8b\uff9e":"\u30d3","\uff8b\uff9f":"\u30d4","\uff8c":"\u30d5","\uff8c\uff9e":"\u30d6","\uff8c\uff9f":"\u30d7","\uff8d":"\u30d8","\uff8d\uff9e":"\u30d9","\uff8d\uff9f":"\u30da","\uff8e":"\u30db","\uff8e\uff9e":"\u30dc","\uff8e\uff9f":"\u30dd","\uff8f":"\u30de","\uff90":"\u30df","\uff91":"\u30e0","\uff92":"\u30e1","\uff93":"\u30e2","\uff6c":"\u30e3","\uff94":"\u30e4","\uff6d":"\u30e5","\uff95":"\u30e6","\uff6e":"\u30e7","\uff96":"\u30e8","\uff97":"\u30e9","\uff98":"\u30ea","\uff99":"\u30eb","\uff9a":"\u30ec","\uff9b":"\u30ed","\uff9c":"\u30ef","\uff66":"\u30f2","\uff9d":"\u30f3","\uff70":"\u30fc","\u30ee":"\u30ee","\u30f0":"\u30f0","\u30f1":"\u30f1","\u30f5":"\u30f5","\u30f6":"\u30f6","\uff73\uff9e":"\u30f4","\u30fd":"\u30fd","\u30fe":"\u30fe","\uff65":"\u30fb","\uff62":"\u300c","\uff63":"\u300d","\uff61":"\u3002","\uff64":"\u3001"},A=e.split("").map(e=>{var A;return null!==(A=t[e])&&void 0!==A?A:e}).join(""),a=p.a.encode(A,"SJIS");return p.a.decode(a,"SJIS")!==A?k(e):a.length!==2*e.length?k(e):A}const D={[d.Encoding.sp]:"SP",[d.Encoding.lp2]:"LP2",[d.Encoding.lp4]:"LP4"};function S(e){let t=[];if(null!==e)for(let l of e.groups)for(let e of l.tracks){var A,a,n;t.push({index:e.index,title:null!==(A=e.title)&&void 0!==A?A:"Unknown Title",fullWidthTitle:null!==(a=e.fullWidthTitle)&&void 0!==a?a:"",group:null!==(n=l.title)&&void 0!==n?n:null,encoding:D[e.encoding],duration:Object(d.formatTimeFromFrames)(e.duration,!1)})}return t.sort((e,t)=>e.index-t.index),t}function T(e){var t,A;if(!e)return[];let a=[],n=[...null!==(t=null===(A=e.groups.find(e=>null===e.title))||void 0===A?void 0:A.tracks)&&void 0!==t?t:[]],l=0;for(let i of e.groups){if(null===i.title)continue;let e=i.tracks[0].index-l;a.push({index:-1,title:null,fullWidthTitle:null,tracks:0===e?[]:n.splice(0,e)}),l=i.tracks[i.tracks.length-1].index+1,a.push(i)}return a.push({index:-1,title:null,fullWidthTitle:null,tracks:n}),a}function I(e,t,A){let a=t>A?1:-1,n=-1===A;n&&(a=-1,A=e.trackCount);let l=Math.min(t,A),i=Math.max(t,A),r=e.groups.map(e=>e.tracks).reduce((e,t)=>e.concat(t),[]).sort((e,t)=>e.index-t.index).filter(e=>!n||e.index!==t),o=e.groups.filter(e=>null!==e.title).map(e=>({name:e.title,fullWidthName:e.fullWidthTitle,start:e.tracks[0].index,end:e.tracks[0].index+e.tracks.length-1})),c=!1;for(let u of o)u.start>l&&u.start<=i&&(u.start+=a,c=!0),u.end>=l&&u.end({title:e.name,fullWidthTitle:e.fullWidthName,index:e.start,tracks:r.slice(e.start,e.end+1)})).filter(e=>e.tracks.length>0);let d=s.groups.map(e=>e.tracks).reduce((e,t)=>e.concat(t),[]),m=r.filter(e=>!d.includes(e));if(n)for(let u=0;u!!e.fullWidthTitle).length>0||e.groups.map(e=>e.tracks).reduce((e,t)=>e.concat(t),[]).filter(e=>!!e.fullWidthTitle).length>0,a=e=>7*Math.ceil(e/7);let n="",l="";e.title&&(n=`0;${e.title}//`),A&&(l=`\uff10\uff1b${e.fullWidthTitle}\uff0f\uff0f`);for(let o of e.groups){var i;if(null===o.title||0===o.tracks.length)continue;let e=`${o.tracks[0].index+1}`;1!==o.tracks.length&&(e+=`-${o.tracks[0].index+o.tracks.length}`);let r=n+`${e};${o.title}//`,c=l+Object(g.halfWidthToFullWidthRange)(e)+`\uff1b${null!==(i=o.fullWidthTitle)&&void 0!==i?i:""}\uff0f\uff0f`,s=a(y(r));if(A&&(s+=a(2*c.length)),t-s<0)break;n=r,l=c}let r=a(y(n));return A&&(r+=a(2*l.length)),t-r<0?null:{newRawTitle:n,newRawFullWidthTitle:A?l:""}}function B(e){if(0===e.length)return!0;let t=e[0];for(let A of e){if(A!==t)return!1;++t}return!0}function N(e,t,A){const a=A.value;return A.value=async function(...e){const t=this.mutex,A=await t.acquire();try{return await a.apply(this,e)}finally{A()}},A}function R(e){return e.breakpoints.up(600+2*e.spacing(2))}function P(e){return e.breakpoints.down(600+2*e.spacing(2))}function M(e){return e.breakpoints.up(700+2*e.spacing(2))+" and (min-height: 750px)"}var F,Q=A(321);const W=A(466);let z=(F=class{constructor({debug:e=!1}){if(this.netmdInterface=void 0,this.logger=void 0,this.cachedContentList=void 0,this.mutex=new Q.a,this.statusMonitorTimer=void 0,e){const e=(...e)=>{e&&e[0]&&e[0].method&&console.log(...e)};this.logger={debug:e,info:e,warn:e,error:e,child:()=>this.logger}}}async writeRawTitles(e){null!==e&&(await this.netmdInterface.cacheTOC(),await this.netmdInterface.setDiscTitle(x(e.newRawTitle)),await this.netmdInterface.setDiscTitle(O(e.newRawFullWidthTitle),!0),await this.netmdInterface.syncTOC(),this.dropCachedContentList())}async listContentUsingCache(){return this.cachedContentList?console.log("There's a cached TOC available."):(console.log("There's no cached version of the TOC, caching"),this.cachedContentList=await Object(d.listContent)(this.netmdInterface)),JSON.parse(JSON.stringify(this.cachedContentList))}dropCachedContentList(){console.log("Cached TOC Dropped"),this.cachedContentList=void 0}async pair(){this.dropCachedContentList();let e=await Object(d.openNewDevice)(navigator.usb,this.logger);return null!==e&&(this.netmdInterface=e,!0)}async connect(){this.dropCachedContentList();let e=await Object(d.openPairedDevice)(navigator.usb,this.logger);return null!==e&&(this.netmdInterface=e,!0)}async listContent(){return this.dropCachedContentList(),await this.listContentUsingCache()}async getDeviceStatus(){return await Object(d.getDeviceStatus)(this.netmdInterface)}async getDeviceName(){return await this.netmdInterface.netMd.getDeviceName()}async finalize(){await this.netmdInterface.netMd.finalize(),this.dropCachedContentList()}async rewriteGroups(e){const t=await this.listContentUsingCache();t.groups=e,await this.writeRawTitles(j(t))}async renameTrack(e,t,A){t=x(t),await this.netmdInterface.cacheTOC(),await this.netmdInterface.setTrackTitle(e,t),void 0!==A&&await this.netmdInterface.setTrackTitle(e,O(A),!0),await this.netmdInterface.syncTOC(),this.dropCachedContentList()}async renameGroup(e,t,A){const a=await this.listContentUsingCache();let n=a.groups.find(t=>t.index===e);n&&(n.title=t,void 0!==A&&(n.fullWidthTitle=A),await this.writeRawTitles(j(a)))}async addGroup(e,t,A){const a=await this.listContentUsingCache();let n=a.groups.find(e=>null===e.title);if(!n)return;let l=n.tracks.length,i=n.tracks.filter(A=>A.index>=e&&A.index!i.includes(e)),l-n.tracks.length!==t)throw new Error("A track cannot be in 2 groups!");if(!B(i.map(e=>e.index)))throw new Error("Invalid sequence of tracks!");a.groups.push({title:A,fullWidthTitle:"",index:a.groups.length,tracks:i}),a.groups=a.groups.filter(e=>0!==e.tracks.length).sort((e,t)=>e.tracks[0].index-t.tracks[0].index),await this.writeRawTitles(j(a))}async deleteGroup(e){const t=await this.listContentUsingCache();let A=t.groups.findIndex(t=>t.index===e);A>=0&&t.groups.splice(A,1),await this.writeRawTitles(j(t))}async renameDisc(e,t){const A=await this.netmdInterface.getDiscTitle(),a=await this.netmdInterface.getDiscTitle(!0),n=await this.netmdInterface._getDiscTitle(),l=await this.netmdInterface._getDiscTitle(!0),i=n.indexOf("//")>=0,r=n.indexOf("\uff0f\uff0f")>=0,o=n.startsWith("0;"),c=n.startsWith("\uff10\uff1b");if(e=x(e),(t=t&&O(t))!==a&&void 0!==t){let e;e=r?c?l.replace(/^\uff10\uff1b.*?\uff0f\uff0f/,""!==t?`\uff10\uff1b${t}\uff0f\uff0f`:""):`\uff10\uff1b${t}\uff0f\uff0f${l}`:t,await this.netmdInterface.cacheTOC(),await this.netmdInterface.setDiscTitle(e,!0),await this.netmdInterface.syncTOC(),this.dropCachedContentList()}if(e===A)return;let s;s=i?o?n.replace(/^0;.*?\/\//,""!==e?`0;${e}//`:""):`0;${e}//${n}`:e,await this.netmdInterface.cacheTOC(),await this.netmdInterface.setDiscTitle(s),await this.netmdInterface.syncTOC(),this.dropCachedContentList()}async deleteTracks(e){(e=e.sort()).reverse();let t=await this.listContentUsingCache();for(let A of e)t=I(t,A,-1),await this.netmdInterface.eraseTrack(A),await h(100);await this.writeRawTitles(j(t)),this.dropCachedContentList()}async wipeDisc(){await this.netmdInterface.eraseDisc(),this.dropCachedContentList()}async wipeDiscTitleInfo(){await this.writeRawTitles({newRawTitle:"",newRawFullWidthTitle:""})}async moveTrack(e,t,A){await this.netmdInterface.moveTrack(e,t),(void 0===A||A)&&await this.writeRawTitles(j(I(await this.listContentUsingCache(),e,t))),this.dropCachedContentList()}async upload(e,t,A,a,n){let l=A.byteLength,i=0,r=0;function o(){n({written:i,encrypted:r,total:l})}let c=new W,s=Object(m.makeGetAsyncPacketIteratorOnWorkerThread)(c,({encryptedBytes:e})=>{r=e,o()}),u=x(e);t=O(t);let p=new d.MDTrack(u,a,A,524288,t,s);await Object(d.download)(this.netmdInterface,p,({writtenBytes:e})=>{i=e,o()}),c.terminate(),this.dropCachedContentList()}async play(){await this.netmdInterface.play()}async pause(){await this.netmdInterface.pause()}async stop(){await this.netmdInterface.stop()}async next(){await this.netmdInterface.nextTrack()}async prev(){await this.netmdInterface.previousTrack()}async gotoTrack(e){await this.netmdInterface.gotoTrack(e)}async getPosition(){return await this.netmdInterface.getPosition()}},Object(s.a)(F.prototype,"listContent",[N],Object.getOwnPropertyDescriptor(F.prototype,"listContent"),F.prototype),Object(s.a)(F.prototype,"getDeviceStatus",[N],Object.getOwnPropertyDescriptor(F.prototype,"getDeviceStatus"),F.prototype),Object(s.a)(F.prototype,"getDeviceName",[N],Object.getOwnPropertyDescriptor(F.prototype,"getDeviceName"),F.prototype),Object(s.a)(F.prototype,"finalize",[N],Object.getOwnPropertyDescriptor(F.prototype,"finalize"),F.prototype),Object(s.a)(F.prototype,"rewriteGroups",[N],Object.getOwnPropertyDescriptor(F.prototype,"rewriteGroups"),F.prototype),Object(s.a)(F.prototype,"renameTrack",[N],Object.getOwnPropertyDescriptor(F.prototype,"renameTrack"),F.prototype),Object(s.a)(F.prototype,"renameGroup",[N],Object.getOwnPropertyDescriptor(F.prototype,"renameGroup"),F.prototype),Object(s.a)(F.prototype,"addGroup",[N],Object.getOwnPropertyDescriptor(F.prototype,"addGroup"),F.prototype),Object(s.a)(F.prototype,"deleteGroup",[N],Object.getOwnPropertyDescriptor(F.prototype,"deleteGroup"),F.prototype),Object(s.a)(F.prototype,"renameDisc",[N],Object.getOwnPropertyDescriptor(F.prototype,"renameDisc"),F.prototype),Object(s.a)(F.prototype,"deleteTracks",[N],Object.getOwnPropertyDescriptor(F.prototype,"deleteTracks"),F.prototype),Object(s.a)(F.prototype,"wipeDisc",[N],Object.getOwnPropertyDescriptor(F.prototype,"wipeDisc"),F.prototype),Object(s.a)(F.prototype,"wipeDiscTitleInfo",[N],Object.getOwnPropertyDescriptor(F.prototype,"wipeDiscTitleInfo"),F.prototype),Object(s.a)(F.prototype,"moveTrack",[N],Object.getOwnPropertyDescriptor(F.prototype,"moveTrack"),F.prototype),Object(s.a)(F.prototype,"play",[N],Object.getOwnPropertyDescriptor(F.prototype,"play"),F.prototype),Object(s.a)(F.prototype,"pause",[N],Object.getOwnPropertyDescriptor(F.prototype,"pause"),F.prototype),Object(s.a)(F.prototype,"stop",[N],Object.getOwnPropertyDescriptor(F.prototype,"stop"),F.prototype),Object(s.a)(F.prototype,"next",[N],Object.getOwnPropertyDescriptor(F.prototype,"next"),F.prototype),Object(s.a)(F.prototype,"prev",[N],Object.getOwnPropertyDescriptor(F.prototype,"prev"),F.prototype),Object(s.a)(F.prototype,"gotoTrack",[N],Object.getOwnPropertyDescriptor(F.prototype,"gotoTrack"),F.prototype),Object(s.a)(F.prototype,"getPosition",[N],Object.getOwnPropertyDescriptor(F.prototype,"getPosition"),F.prototype),F);var L={},G=A(38),U=A(28),V=A(22);const H=Object(U.b)({name:"uploadDialog",initialState:{visible:!1,cancelled:!1,writtenProgress:0,encryptedProgress:0,totalProgress:1,trackTotal:1,trackConverting:0,trackCurrent:0,titleCurrent:"",titleConverting:""},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setWriteProgress:(e,t)=>{e.encryptedProgress=t.payload.encrypted,e.writtenProgress=t.payload.written,e.totalProgress=t.payload.total},setCancelUpload:(e,t)=>{e.cancelled=t.payload},setTrackProgress:(e,t)=>{e.trackTotal=t.payload.total,e.trackCurrent=t.payload.current,e.trackConverting=t.payload.converting,e.titleCurrent=t.payload.titleCurrent,e.titleConverting=t.payload.titleConverting}}}),{reducer:J,actions:Y}=H;var K=Object(V.enableBatching)(J);const Z=Object(U.b)({name:"renameDialog",initialState:{visible:!1,title:"",fullWidthTitle:"",index:-1,groupIndex:null},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setCurrentName:(e,t)=>{e.title=t.payload},setCurrentFullWidthName:(e,t)=>{e.fullWidthTitle=t.payload},setIndex:(e,t)=>{e.index=t.payload},setGroupIndex:(e,t)=>{e.groupIndex=t.payload}}}),{reducer:X,actions:q}=Z;var $=Object(V.enableBatching)(X);const _={visible:!1,error:""},ee=Object(U.b)({name:"errorDialog",initialState:_,reducers:{setVisible:(e,t)=>{e.visible=t.payload},setErrorMessage:(e,t)=>{e.error=`${t.payload}`}}}),{actions:te,reducer:Ae}=ee;var ae=Object(V.enableBatching)(Ae);const ne=Object(U.b)({name:"panicDialog",initialState:{visible:!1,dismissed:!1},reducers:{setVisible:(e,t)=>{e.visible=t.payload},dismiss:(e,t)=>{e.visible=!1,e.dismissed=!0}}}),{actions:le,reducer:ie}=ne;var re=Object(V.enableBatching)(ie);const oe={visible:!1,format:v("uploadFormat","LP2"),titleFormat:v("trackTitleFormat","filename")},ce=Object(U.b)({name:"convertDialog",initialState:oe,reducers:{setVisible:(e,t)=>{e.visible=t.payload},setFormat:(e,t)=>{e.format=t.payload,w("uploadFormat",e.format)},setTitleFormat:(e,t)=>{e.titleFormat=t.payload,w("trackTitleFormat",e.titleFormat)}}}),{actions:se,reducer:de}=ce;var me=Object(V.enableBatching)(de);const ue=Object(U.b)({name:"dumpDialog",initialState:{visible:!1,inputDeviceId:""},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setInputDeviceId:(e,t)=>{e.inputDeviceId=t.payload}}}),{reducer:pe,actions:ge}=ue;var he=Object(V.enableBatching)(pe);const fe=Object(U.b)({name:"recordDialog",initialState:{visible:!1,trackTotal:1,trackDone:0,trackCurrent:0,titleCurrent:""},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setProgress:(e,t)=>{e.trackTotal=t.payload.trackTotal,e.trackDone=t.payload.trackDone,e.trackCurrent=t.payload.trackCurrent,e.titleCurrent=t.payload.titleCurrent}}}),{reducer:be,actions:Ee}=fe;var we=Object(V.enableBatching)(be);const ve=()=>({mainView:"WELCOME",loading:!1,pairingFailed:!1,pairingMessage:"",browserSupported:!0,darkMode:v("darkMode",!1),vintageMode:v("vintageMode",!1),aboutDialogVisible:!1,notifyWhenFinished:v("notifyWhenFinished",!1),hasNotificationSupport:!0,fullWidthSupport:v("fullWidthSupport",!1)}),Ce=ve(),ke=Object(U.b)({name:"app",initialState:Ce,reducers:{setMainView:(e,t)=>{e.mainView=t.payload},setLoading:(e,t)=>{e.loading=t.payload},setPairingFailed:(e,t)=>{e.pairingFailed=t.payload},setPairingMessage:(e,t)=>{e.pairingMessage=t.payload},setBrowserSupported:(e,t)=>{e.browserSupported=t.payload},setDarkMode:(e,t)=>{e.darkMode=t.payload,w("darkMode",e.darkMode)},setNotifyWhenFinished:(e,t)=>{e.notifyWhenFinished=t.payload,w("notifyWhenFinished",t.payload)},setNotificationSupport:(e,t)=>{e.hasNotificationSupport=t.payload},setVintageMode:(e,t)=>{e.vintageMode=t.payload,w("vintageMode",t.payload)},showAboutDialog:(e,t)=>{e.aboutDialogVisible=t.payload},setFullWidthSupport:(e,t)=>{e.fullWidthSupport=t.payload,w("fullWidthSupport",e.fullWidthSupport)}}}),{reducer:ye,actions:xe}=ke;var Oe=Object(V.enableBatching)(ye);const De=Object(U.b)({name:"main",initialState:{disc:null,deviceName:"",deviceStatus:null},reducers:{setDisc:(e,t)=>{e.disc=t.payload},setDeviceName:(e,t)=>{e.deviceName=t.payload},setDeviceStatus:(e,t)=>{e.deviceStatus=t.payload}}}),{reducer:Se,actions:Te}=De;var Ie=Object(V.enableBatching)(Se);let je=Object(G.c)({renameDialog:$,uploadDialog:K,errorDialog:ae,panicDialog:re,convertDialog:me,dumpDialog:he,recordDialog:we,appState:Oe,main:Ie});const Be=xe.setMainView.toString(),Ne=Object(U.a)({reducer:function(...e){const[t,A]=e;return A.type===Be&&"WELCOME"===A.payload?{...Re,appState:ve()}:je(...e)},middleware:[e=>e=>async t=>{try{await e(t)}catch(A){console.error(A),e(le.setVisible(!0))}},...Object(U.c)()]}),Re=Object.freeze(Ne.getState());var Pe=A(654),Me=A(590),Fe=A(655),Qe=A(630),We=A(320),ze=A(640),Le=A(287),Ge=A(288),Ue=A.n(Ge);function Ve(e,t){return async function(A,a){switch(e){case"play":await L.netmdService.play();break;case"stop":await L.netmdService.stop();break;case"next":await L.netmdService.next();break;case"prev":await L.netmdService.prev();break;case"pause":await L.netmdService.pause();break;case"goto":const e=Object(g.assertNumber)(t,'Invalid track number for "goto" command');await L.netmdService.gotoTrack(e)}await h(500);try{let e=await L.netmdService.getDeviceStatus();A(Te.setDeviceStatus(e))}catch(n){console.log("control: Cannot get device status")}}}function He(){return async function(e,t){e(xe.setPairingFailed(!1)),await L.audioExportService.init();try{if(await L.netmdService.connect())return void e(xe.setMainView("MAIN"))}catch(A){console.error(A)}try{if(await L.netmdService.pair())return void e(xe.setMainView("MAIN"));e(Object(V.batchActions)([xe.setPairingMessage("Connection Failed"),xe.setPairingFailed(!0)]))}catch(A){console.error(A);let t=A.message;e(Object(V.batchActions)([xe.setPairingMessage(t),xe.setPairingFailed(!0)]))}}}function Je(){return async function(e){let t;e(xe.setLoading(!0));try{t=await L.netmdService.listContent()}catch(n){if(!window.confirm("This disc's title seems to be corrupted, do you wish to erase it?\nNone of the tracks will be deleted."))throw n;await L.netmdService.wipeDiscTitleInfo(),t=await L.netmdService.listContent()}let A=await L.netmdService.getDeviceName(),a=null;try{a=await L.netmdService.getDeviceStatus()}catch(l){console.log("listContent: Cannot get device status")}e(Object(V.batchActions)([Te.setDisc(t),Te.setDeviceName(A),Te.setDeviceStatus(a),xe.setLoading(!1)]))}}function Ye(e){return async function(t,A){if("granted"!==Notification.permission){if(!window.confirm("Enable Notification on recording completed?"))return;if("granted"!==await(function(){try{Notification.requestPermission().then()}catch(e){return!1}return!0}()?Notification.requestPermission():new Promise(e=>Notification.requestPermission(e))))return t(xe.setNotificationSupport(!1)),void t(xe.setNotifyWhenFinished(!1))}t(xe.setNotifyWhenFinished(e))}}const Ke={SP:d.Wireformat.pcm,LP2:d.Wireformat.lp2,LP105:d.Wireformat.l105kbps,LP4:d.Wireformat.lp4};async function Ze(e,t){var A,a,n;const l=await e.arrayBuffer(),i=new Blob([new Uint8Array(l)]);let r=await Le.parseBlob(i);const o=null!==(A=r.common.title)&&void 0!==A?A:"Unknown Title",c=null!==(a=r.common.artist)&&void 0!==a?a:"Unknown Artist",s=null!==(n=r.common.album)&&void 0!==n?n:"Unknown Album";switch(t){case"title":return o;case"artist-title":return`${c} - ${o}`;case"title-artist":return`${o} - ${c}`;case"album-title":return`${s} - ${o}`;case"artist-album-title":return`${c} - ${s} - ${o}`;case"filename":{let t=e.name;const A=t.lastIndexOf(".");return A>0&&(t=t.substring(0,A)),t}}}function Xe(e,t,A){return async function(a,n){const{audioExportService:l,netmdService:i}=L,r=Ke[t];await(null===i||void 0===i?void 0:i.stop()),a(Object(V.batchActions)([Y.setVisible(!0),Y.setCancelUpload(!1)]));const o=({written:e,encrypted:t,total:A})=>{a(Y.setWriteProgress({written:e,encrypted:t,total:A}))},c=()=>n().uploadDialog.cancelled;let s={current:0,converting:0,total:e.length,titleCurrent:"",titleConverting:""};const d=()=>{a(Y.setTrackProgress(s))};let m,u=n().main.disc,p=n().appState.fullWidthSupport,g=C(u),h="",f=1;for await(let w of async function*(e){let A=[],a=0;!function n(){if(a===e.length||c())return s.converting=a,s.titleConverting="",void d();let i=e[a];s.converting=a,s.titleConverting=i.name,d(),a++,A.push(new Promise(async(e,A)=>{let a;try{await l.prepare(i),a=await l.export({format:t}),n(),e({file:i,data:a})}catch(r){m=r,h=`${i.name}: Unsupported or unrecognized format`,A(r)}}))}();let n=0;for(;n7*Math.ceil(e/7);let l=a.substr(0,Math.min(y(a),g));g-=n(y(l));let u="";p&&(u=a.substr(0,Math.min(2*a.length,g,210)/2),g-=n(2*u.length)),s.current=f++,s.titleCurrent=l,d(),o({written:0,encrypted:0,total:100});try{await(null===i||void 0===i?void 0:i.upload(l,u,t,r,o))}catch(E){m=E,h=`${e.name}: Error uploading to device. There might not be enough space left.`;break}}let b=[Y.setVisible(!1)];m&&(console.error(m),b=b.concat([te.setVisible(!0),te.setErrorMessage(h)])),a(Object(V.batchActions)(b)),function(){const{notifyWhenFinished:e,hasNotificationSupport:t}=n().appState;t&&e&&(new Notification("MiniDisc recording completed",{icon:Ue.a}).onclick=function(){window.focus(),this.close()})}(),Je()(a)}}var qe=A(629),$e=A(75),_e=A(638),et=A(639),tt=A(661),At=A(627),at=A(621),nt=A(628),lt=A(625),it=A(626),rt=A(624),ot=A(620),ct=A(6),st=A(2);const dt=st.e.div` +(this.webpackJsonpwebmd=this.webpackJsonpwebmd||[]).push([[0],{162:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAaElEQVR4Ac3BQQrCQAAEsIz///MobGG7bZUiHkz8laKoe+olplrFtRriJVa1ilUNsYlrNcVQQ+zEe3UWB/FZTXEh3quzOIhrNcVQQ+zEWU2xqiE2D6ua4iwOHqa6J6hNTDXFl+q++oUnXWYXCDnmtMUAAAAASUVORK5CYII="},288:function(e,t,A){e.exports=A.p+"static/media/record-complete-notification-icon.f6ae1070.png"},292:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAAEEfUpiAAAACXBIWXMAAAsSAAALEgHS3X78AAAQR0lEQVRYCQE8EMPvAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAP8AAAIAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA//8AAAAB/wAAAgAAAAAAAAAAAQD/AP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAEAAAAAAAAAAP8AAP8AAAAAAQAAAP8AAAAB/wAAAAAAAAEAAAAAAAAAAAAA//8AAAAAAAABAAAA/wD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA/wAAAAAA/wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAD/AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAP//AAAAAAAAAAAAAAEBAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQL/AAD/AAAAAQAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAgEAAAH/AAD/AAAAAQAAAAAAAAABAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA/wEAAAH/AAD/AAAAAP8AAP//AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAA//8AAAABAAAA/wAAAAAAAAD/AAAA/wAAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAP//AAD//wAAAAAAAAAAAAACAAABAQAA//8AAAABAAAAAAAAAAEAAAABAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD/AAABAQAA//8AAAAAAAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAEAAAAA/wAA/wEAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAQAAAAAAAAAA/wAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAD/AAD/AQAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAABAAABAAAAAP8AAP//AAD/AAAAAAAAAAH/AAD/AAAAAP8AAAD/AAD//wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQEAAAEAAAAAAAAAAP8AAP8BAAABAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAQAAAAAAAD//wAAAQEAAAABAAAAAAAAAP8AAAAAAAAAAQEAAAEAAAD/AAAAAQEAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAEAAAAAAIAAAAAAAAAAfwAAAAAAAAABAAAAAAD//wAAAAAAAIGBAAAAAAAAgAEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAAAAAEBAAAAAAAA//8AAP//AAAAAAAAAAEAAP//AAAAAAAA/wAAAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAQEAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAgAAAAAAAAAAAAAAAAAABAQAAAAAAAICAAAAAAAAAf38AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4NtYBuc2+1AAAAAElFTkSuQmCC"},301:function(e,t,A){e.exports=A.p+"static/media/chrome-icon.f3b6c54c.svg"},306:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVR4Ae3BSQ7CUAxEwde+/50bFkgQyGD/DBZSqrjtZMDsIMaZKTFAjDHzRJGoM+tEgagxOSJJ5JkakSByzBixQWwz+4gVYp05hlgglpljiRlinjmH+CJ+mXOJD2LKXEO8iDdzLfEUNBN5pk5sCJoFzYJmQbOgWdAsaBY0C5oFzUSNyRO3f/AAz+gRJE12Ia8AAAAASUVORK5CYII="},307:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiElEQVR4Ae3BSQ7CQBAEwcz+/58LDkhsxp4xSwtBBD9P5oRxMkDGhXmyoWhWNCuaFc2KZkWzolnRrGhWNJOz8FlyVDSTa+Ez5ETuhfeSC7IsvIfckMfCa8kCWRdeQx6QbeE5skLGhH1kg4wLc2SAzAljZJDMC+tkguwTlskk2S9ckwYBwt83OwASZhEklsYbbQAAAABJRU5ErkJggg=="},311:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAzUlEQVR4AY3BgXHCMBAAwXuHQugEdfanzkRlH3nGgMfjEO8GF6nFjhpMCxeoxZSZrFprTMW0cFFm0nsnU8YYvNy4QGWVKRGgvC38R4uptUYEqKi8BN9okQm9g3IQTMFftMiECHaCg4UzWmRCBCib4MTCkRaZEAEKmXwT7GmRCb2D8laFvfOiBptgo1ZrjTYGKFPwUROriGAKNjd2Wmtsgh2V1fP55OjGpBYfwYneOypnCij+V0Bx8AMIBF+opXK/3xljCHQ2Cxc9Hg/O/AKFdlY5+3GtSAAAAABJRU5ErkJggg=="},312:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfUlEQVR4Aa3BUQ6CMBRFwXOb7vulKz/CR4Ni1RCc4a6wJr+FTeedbFQ+ScLUeOWGKxoH2SRhSgZTMljpPFG5qrOQDKZkMCUDLZ41FrTYaaHFTgstzho3dU6SwZQMpmSgxVnjRIudFlrstNBipXFTY0GLSYtvGjeFg1wT/uEBKpc1Cx/u8CoAAAAASUVORK5CYII="},313:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAt0lEQVR4Ab3Bi1HbYBAGwD2RQlwKVMbnzu6v7IIkZ4CEhzOZya5/Vf7OBHEoLx7cb4JnFJrgurnPJAhXPCNOm+/NjFfhijhtvjYzDo+P7Zc4lBebz82Mw1qtu+0Su3JTPjYzDmu17kYkduWN8qeZcVirdTcisSu/Ke/NjMNarbsRiV35QHk1Mw5rte5GJHblE5vTuFmrdTcisStfeHBKwtMTl8sFkdiVb/zwRkISN+UO5TTeK//LT0efTfwPZVIpAAAAAElFTkSuQmCC"},314:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA3klEQVR4Ae3BwU3EUBBEweeV8+Jn1u3MeiL7eARIPoCFVsLLwVXcbrfb7fZqCwe2Jxeyvax8sj3HGFwlCbv5YGd7jjG4ShK+rLanJK6ybRtHK5+qildY+YUkPGuMwZmVg7cxaJXQktBs8yzbtDEG33nwYisHlXAkiWabZ0miVRXfWTlRVbQ5J8+qKs6s/EJV8VcenEhCS0JLQktCS0JLQktCS0JLQkvCTx6ckESTRJNEk0STRJNEk0STRJNEk8RPFttTElXFFZLQbLNbVnbbtnEl2+wWdgsfJtdauP0X7xi2ahnkEPOyAAAAAElFTkSuQmCC"},315:function(e,t){e.exports="data:image/png;base64,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"},318:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACcklEQVR4Ae3BgW1bRxBF0bs0C1lXss+VWJ3ssBO6kzedWJVM/kIk8kVQMmUlCAL4HP74rzUeFBHFHRHReF9xX2Nz5B0RUVzMGVxlmquIKC4iovFBR+6IiOIi5mSZBPdIYqd40Xit8VpxceRGRFTM4EXxEbZZJBXQeEBjJyIqZvBacVU0lkyzSOKzjlxEREnCaTTEo6qKq9YaVcVea42qYq+1RlXRWqNxEREVc+JMFg3xt2IpGkumWSTxWQc2EVExJ4vGYHGaR1QVVUVVsVQVVcVeVVFV7FUVS2MTESWJRWOwOJNFQ7woisaSaRZJfFaLiJLELY2BM1k0xBKnYC8iqCquWmtUFY9qrdEioiRxj8bAmSy2iQj+aUfe4Uw0BnE6ERFsGq9VRBARXNnmliQ2jTsO/IIzeZRtPurAxjaLbRbbLLZ5hG1s8zsObCRhG0nYRhK2kYRt/k1HNraRhG0kYRtJ2GbOSWYSEUREsRMRSOIzjmwkYRtJ2EYStplzkpmMMVgigr2YE2fyGV9sn3rvIQnbSMI2c04ykzEGmcnSe6f3zvfvT7QWnHvn3DtPz8+8RRKbxhsOXNhGEraZc5KZjDHITPbGEIuGcCaLxuB3HdhERGNjmzknmckYg8zkVqa5R2NwSxKbxjsO7Mw5yUzGGGQm94whrjSEM7nSGHzUgYuIaKfTiTEGmclbMs17NAaLJDaNX/jCju1Tay1677xlDLEEcALO/YzzG+feuTp//cqm8YAv3LB96r3Hz58/6b1z6/n5id7PLCdePD0/0X/8wN++wenEpvGgxjsiothI4moMcdXYNPYaH9R4TPG2xh//Z38BPq9JPdh7I1oAAAAASUVORK5CYII="},343:function(e,t,A){e.exports=A(585)},365:function(e,t){},367:function(e,t){},398:function(e,t){},399:function(e,t){},405:function(e,t){},533:function(e,t){},535:function(e,t){},568:function(e,t,A){},569:function(e,t,A){},584:function(e,t,A){e.exports=function(){return new Worker(A.p+"4a3a421ab134cd5ff776.worker.js")}},585:function(e,t,A){"use strict";A.r(t);var a=A(0),n=A.n(a),l=A(17),i=A.n(l),r=A(20);const o=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function c(e,t){navigator.serviceWorker.register(e).then(e=>{e.onupdatefound=()=>{const A=e.installing;null!=A&&(A.onstatechange=()=>{console.log("state change",A.state),"installed"===A.state&&(navigator.serviceWorker.controller?(console.log("New content is available and will be used when all tabs for this page are closed. See https://bit.ly/CRA-PWA."),t&&t.onUpdate&&t.onUpdate(e)):(console.log("Content is cached for offline use."),t&&t.onSuccess&&t.onSuccess(e)))})},e.update()}).catch(e=>{console.error("Error during service worker registration:",e)})}var s=A(27),d=A(21),m=A(286),u=A(119),p=A.n(u),g=A(57);function h(e){return new Promise(t=>{setTimeout(t,e)})}async function f(e,t){let A=1,a=setInterval(()=>{A++,t(Math.min(100,1e3*A/e*100))},1e3);await h(e),window.clearInterval(a)}function b(e){return Object(r.e)(e,r.c)}function E(e){return`/webminidisc/${e}`}function w(e,t){localStorage.setItem(e,JSON.stringify(t))}function v(e,t){let A=localStorage.getItem(e);if(null===A)return t;try{return JSON.parse(A)}catch(a){return t}}function k(e,t){const A=e=>Math.ceil(e/7);let a=e.groups.filter(e=>null!==e.title),n=e.fullWidthTitle+"0;//",l=e.title+"0;//";if(t||void 0===t)for(let s of a){let e=`${s.tracks[0].index+1}${s.tracks.length-1!==0&&`-${s.tracks[s.tracks.length-1].index+1}`}//`;n+=s.fullWidthTitle+e,l+=s.title+e}let i=0;i+=A(2*n.length),i+=A(y(l));for(let s of Object(d.getTracks)(e)){var r,o,c;i+=A(2*(null!==(r=null===(o=s.fullWidthTitle)||void 0===o?void 0:o.length)&&void 0!==r?r:0)),i+=A(y(null!==(c=s.title)&&void 0!==c?c:""))}return 7*Math.max(255-i,0)}function C(e){return e.normalize("NFD").replace(/[^\x00-\x7F]/g,"")}function y(e){const t={"\u30ac":1,"\u30ae":1,"\u30b0":1,"\u30b2":1,"\u30b4":1,"\u30b6":1,"\u30b8":1,"\u30ba":1,"\u30bc":1,"\u30be":1,"\u30c0":1,"\u30c2":1,"\u30c5":1,"\u30c7":1,"\u30c9":1,"\u30d0":1,"\u30d1":1,"\u30d3":1,"\u30d4":1,"\u30d6":1,"\u30d7":1,"\u30d9":1,"\u30da":1,"\u30dc":1,"\u30dd":1,"\u30ee":1,"\u30f0":1,"\u30f1":1,"\u30f5":1,"\u30f6":1,"\u30f4":1,"\u30fd":1,"\u30fe":1,"\u304c":1,"\u304e":1,"\u3050":1,"\u3052":1,"\u3054":1,"\u3056":1,"\u3058":1,"\u305a":1,"\u305c":1,"\u305e":1,"\u3060":1,"\u3062":1,"\u3065":1,"\u3067":1,"\u3069":1,"\u3070":1,"\u3071":1,"\u3073":1,"\u3074":1,"\u3076":1,"\u3077":1,"\u3079":1,"\u307a":1,"\u307c":1,"\u307d":1,"\u308e":1,"\u3090":1,"\u3091":1,"\u3095":1,"\u3096":1,"\u3094":1,"\u309d":1,"\u309e":1};return e.length+e.split("").map(e=>{var A;return null!==(A=t[e])&&void 0!==A?A:0}).reduce((e,t)=>e+t,0)}function x(e){const t={"\u30a1":"\uff67","\u30a2":"\uff71","\u30a3":"\uff68","\u30a4":"\uff72","\u30a5":"\uff69","\u30a6":"\uff73","\u30a7":"\uff6a","\u30a8":"\uff74","\u30a9":"\uff6b","\u30aa":"\uff75","\u30ab":"\uff76","\u30ac":"\uff76\uff9e","\u30ad":"\uff77","\u30ae":"\uff77\uff9e","\u30af":"\uff78","\u30b0":"\uff78\uff9e","\u30b1":"\uff79","\u30b2":"\uff79\uff9e","\u30b3":"\uff7a","\u30b4":"\uff7a\uff9e","\u30b5":"\uff7b","\u30b6":"\uff7b\uff9e","\u30b7":"\uff7c","\u30b8":"\uff7c\uff9e","\u30b9":"\uff7d","\u30ba":"\uff7d\uff9e","\u30bb":"\uff7e","\u30bc":"\uff7e\uff9e","\u30bd":"\uff7f","\u30be":"\uff7f\uff9e","\u30bf":"\uff80","\u30c0":"\uff80\uff9e","\u30c1":"\uff81","\u30c2":"\uff81\uff9e","\u30c3":"\uff6f","\u30c4":"\uff82","\u30c5":"\uff82\uff9e","\u30c6":"\uff83","\u30c7":"\uff83\uff9e","\u30c8":"\uff84","\u30c9":"\uff84\uff9e","\u30ca":"\uff85","\u30cb":"\uff86","\u30cc":"\uff87","\u30cd":"\uff88","\u30ce":"\uff89","\u30cf":"\uff8a","\u30d0":"\uff8a\uff9e","\u30d1":"\uff8a\uff9f","\u30d2":"\uff8b","\u30d3":"\uff8b\uff9e","\u30d4":"\uff8b\uff9f","\u30d5":"\uff8c","\u30d6":"\uff8c\uff9e","\u30d7":"\uff8c\uff9f","\u30d8":"\uff8d","\u30d9":"\uff8d\uff9e","\u30da":"\uff8d\uff9f","\u30db":"\uff8e","\u30dc":"\uff8e\uff9e","\u30dd":"\uff8e\uff9f","\u30de":"\uff8f","\u30df":"\uff90","\u30e0":"\uff91","\u30e1":"\uff92","\u30e2":"\uff93","\u30e3":"\uff6c","\u30e4":"\uff94","\u30e5":"\uff6d","\u30e6":"\uff95","\u30e7":"\uff6e","\u30e8":"\uff96","\u30e9":"\uff97","\u30ea":"\uff98","\u30eb":"\uff99","\u30ec":"\uff9a","\u30ed":"\uff9b","\u30ef":"\uff9c","\u30f2":"\uff66","\u30f3":"\uff9d","\u30fc":"\uff70","\u30ee":"\u30ee","\u30f0":"\u30f0","\u30f1":"\u30f1","\u30f5":"\u30f5","\u30f6":"\u30f6","\u30f4":"\uff73\uff9e","\u30fd":"\u30fd","\u30fe":"\u30fe","\u30fb":"\uff65","\u300c":"\uff62","\u300d":"\uff63","\u3002":"\uff61","\u3001":"\uff64","\uff01":"!","\uff02":'"',"\uff03":"#","\uff04":"$","\uff05":"%","\uff06":"&","\uff07":"'","\uff08":"(","\uff09":")","\uff0a":"*","\uff0b":"+","\uff0c":",","\uff0d":"-","\uff0e":".","\uff0f":"/","\uff1a":":","\uff1b":";","\uff1c":"<","\uff1d":"=","\uff1e":">","\uff1f":"?","\uff20":"@","\uff21":"A","\uff22":"B","\uff23":"C","\uff24":"D","\uff25":"E","\uff26":"F","\uff27":"G","\uff28":"H","\uff29":"I","\uff2a":"J","\uff2b":"K","\uff2c":"L","\uff2d":"M","\uff2e":"N","\uff2f":"O","\uff30":"P","\uff31":"Q","\uff32":"R","\uff33":"S","\uff34":"T","\uff35":"U","\uff36":"V","\uff37":"W","\uff38":"X","\uff39":"Y","\uff3a":"Z","\uff3b":"[","\uff3c":"\\","\uff3d":"]","\uff3e":"^","\uff3f":"_","\uff40":"`","\uff41":"a","\uff42":"b","\uff43":"c","\uff44":"d","\uff45":"e","\uff46":"f","\uff47":"g","\uff48":"h","\uff49":"i","\uff4a":"j","\uff4b":"k","\uff4c":"l","\uff4d":"m","\uff4e":"n","\uff4f":"o","\uff50":"p","\uff51":"q","\uff52":"r","\uff53":"s","\uff54":"t","\uff55":"u","\uff56":"v","\uff57":"w","\uff58":"x","\uff59":"y","\uff5a":"z","\uff5b":"{","\uff5c":"|","\uff5d":"}","\uff5e":"~","\u3000":" ","\uff10":"0","\uff11":"1","\uff12":"2","\uff13":"3","\uff14":"4","\uff15":"5","\uff16":"6","\uff17":"7","\uff18":"8","\uff19":"9","\u3041":"\uff67","\u3042":"\uff71","\u3043":"\uff68","\u3044":"\uff72","\u3045":"\uff69","\u3046":"\uff73","\u3047":"\uff6a","\u3048":"\uff74","\u3049":"\uff6b","\u304a":"\uff75","\u304b":"\uff76","\u304c":"\uff76\uff9e","\u304d":"\uff77","\u304e":"\uff77\uff9e","\u304f":"\uff78","\u3050":"\uff78\uff9e","\u3051":"\uff79","\u3052":"\uff79\uff9e","\u3053":"\uff7a","\u3054":"\uff7a\uff9e","\u3055":"\uff7b","\u3056":"\uff7b\uff9e","\u3057":"\uff7c","\u3058":"\uff7c\uff9e","\u3059":"\uff7d","\u305a":"\uff7d\uff9e","\u305b":"\uff7e","\u305c":"\uff7e\uff9e","\u305d":"\uff7f","\u305e":"\uff7f\uff9e","\u305f":"\uff80","\u3060":"\uff80\uff9e","\u3061":"\uff81","\u3062":"\uff81\uff9e","\u3063":"\uff6f","\u3064":"\uff82","\u3065":"\uff82\uff9e","\u3066":"\uff83","\u3067":"\uff83\uff9e","\u3068":"\uff84","\u3069":"\uff84\uff9e","\u306a":"\uff85","\u306b":"\uff86","\u306c":"\uff87","\u306d":"\uff88","\u306e":"\uff89","\u306f":"\uff8a","\u3070":"\uff8a\uff9e","\u3071":"\uff8a\uff9f","\u3072":"\uff8b","\u3073":"\uff8b\uff9e","\u3074":"\uff8b\uff9f","\u3075":"\uff8c","\u3076":"\uff8c\uff9e","\u3077":"\uff8c\uff9f","\u3078":"\uff8d","\u3079":"\uff8d\uff9e","\u307a":"\uff8d\uff9f","\u307b":"\uff8e","\u307c":"\uff8e\uff9e","\u307d":"\uff8e\uff9f","\u307e":"\uff8f","\u307f":"\uff90","\u3080":"\uff91","\u3081":"\uff92","\u3082":"\uff93","\u3083":"\uff6c","\u3084":"\uff94","\u3085":"\uff6d","\u3086":"\uff95","\u3087":"\uff6e","\u3088":"\uff96","\u3089":"\uff97","\u308a":"\uff98","\u308b":"\uff99","\u308c":"\uff9a","\u308d":"\uff9b","\u308f":"\uff9c","\u3092":"\uff66","\u3093":"\uff9d","\u308e":"\u30ee","\u3090":"\u30f0","\u3091":"\u30f1","\u3095":"\u30f5","\u3096":"\u30f6","\u3094":"\uff73\uff9e","\u309d":"\u30fd","\u309e":"\u30fe"},A=Object.values(t),a=e.split("").map(e=>t[e]?t[e]:e.charCodeAt(0)<127||A.includes(e)?e:" ").join("");return p.a.encode(a,"SJIS").length!==y(e)?C(e):a}function O(e){const t={"!":"\uff01",'"':"\uff02","#":"\uff03",$:"\uff04","%":"\uff05","&":"\uff06","'":"\uff07","(":"\uff08",")":"\uff09","*":"\uff0a","+":"\uff0b",",":"\uff0c","-":"\uff0d",".":"\uff0e","/":"\uff0f",":":"\uff1a",";":"\uff1b","<":"\uff1c","=":"\uff1d",">":"\uff1e","?":"\uff1f","@":"\uff20",A:"\uff21",B:"\uff22",C:"\uff23",D:"\uff24",E:"\uff25",F:"\uff26",G:"\uff27",H:"\uff28",I:"\uff29",J:"\uff2a",K:"\uff2b",L:"\uff2c",M:"\uff2d",N:"\uff2e",O:"\uff2f",P:"\uff30",Q:"\uff31",R:"\uff32",S:"\uff33",T:"\uff34",U:"\uff35",V:"\uff36",W:"\uff37",X:"\uff38",Y:"\uff39",Z:"\uff3a","[":"\uff3b","\\":"\uff3c","]":"\uff3d","^":"\uff3e",_:"\uff3f","`":"\uff40",a:"\uff41",b:"\uff42",c:"\uff43",d:"\uff44",e:"\uff45",f:"\uff46",g:"\uff47",h:"\uff48",i:"\uff49",j:"\uff4a",k:"\uff4b",l:"\uff4c",m:"\uff4d",n:"\uff4e",o:"\uff4f",p:"\uff50",q:"\uff51",r:"\uff52",s:"\uff53",t:"\uff54",u:"\uff55",v:"\uff56",w:"\uff57",x:"\uff58",y:"\uff59",z:"\uff5a","{":"\uff5b","|":"\uff5c","}":"\uff5d","~":"\uff5e"," ":"\u3000",0:"\uff10",1:"\uff11",2:"\uff12",3:"\uff13",4:"\uff14",5:"\uff15",6:"\uff16",7:"\uff17",8:"\uff18",9:"\uff19","\uff67":"\u30a1","\uff71":"\u30a2","\uff68":"\u30a3","\uff72":"\u30a4","\uff69":"\u30a5","\uff73":"\u30a6","\uff6a":"\u30a7","\uff74":"\u30a8","\uff6b":"\u30a9","\uff75":"\u30aa","\uff76":"\u30ab","\uff76\uff9e":"\u30ac","\uff77":"\u30ad","\uff77\uff9e":"\u30ae","\uff78":"\u30af","\uff78\uff9e":"\u30b0","\uff79":"\u30b1","\uff79\uff9e":"\u30b2","\uff7a":"\u30b3","\uff7a\uff9e":"\u30b4","\uff7b":"\u30b5","\uff7b\uff9e":"\u30b6","\uff7c":"\u30b7","\uff7c\uff9e":"\u30b8","\uff7d":"\u30b9","\uff7d\uff9e":"\u30ba","\uff7e":"\u30bb","\uff7e\uff9e":"\u30bc","\uff7f":"\u30bd","\uff7f\uff9e":"\u30be","\uff80":"\u30bf","\uff80\uff9e":"\u30c0","\uff81":"\u30c1","\uff81\uff9e":"\u30c2","\uff6f":"\u30c3","\uff82":"\u30c4","\uff82\uff9e":"\u30c5","\uff83":"\u30c6","\uff83\uff9e":"\u30c7","\uff84":"\u30c8","\uff84\uff9e":"\u30c9","\uff85":"\u30ca","\uff86":"\u30cb","\uff87":"\u30cc","\uff88":"\u30cd","\uff89":"\u30ce","\uff8a":"\u30cf","\uff8a\uff9e":"\u30d0","\uff8a\uff9f":"\u30d1","\uff8b":"\u30d2","\uff8b\uff9e":"\u30d3","\uff8b\uff9f":"\u30d4","\uff8c":"\u30d5","\uff8c\uff9e":"\u30d6","\uff8c\uff9f":"\u30d7","\uff8d":"\u30d8","\uff8d\uff9e":"\u30d9","\uff8d\uff9f":"\u30da","\uff8e":"\u30db","\uff8e\uff9e":"\u30dc","\uff8e\uff9f":"\u30dd","\uff8f":"\u30de","\uff90":"\u30df","\uff91":"\u30e0","\uff92":"\u30e1","\uff93":"\u30e2","\uff6c":"\u30e3","\uff94":"\u30e4","\uff6d":"\u30e5","\uff95":"\u30e6","\uff6e":"\u30e7","\uff96":"\u30e8","\uff97":"\u30e9","\uff98":"\u30ea","\uff99":"\u30eb","\uff9a":"\u30ec","\uff9b":"\u30ed","\uff9c":"\u30ef","\uff66":"\u30f2","\uff9d":"\u30f3","\uff70":"\u30fc","\u30ee":"\u30ee","\u30f0":"\u30f0","\u30f1":"\u30f1","\u30f5":"\u30f5","\u30f6":"\u30f6","\uff73\uff9e":"\u30f4","\u30fd":"\u30fd","\u30fe":"\u30fe","\uff65":"\u30fb","\uff62":"\u300c","\uff63":"\u300d","\uff61":"\u3002","\uff64":"\u3001"},A=e.split("").map(e=>{var A;return null!==(A=t[e])&&void 0!==A?A:e}).join(""),a=p.a.encode(A,"SJIS");return p.a.decode(a,"SJIS")!==A?C(e):a.length!==2*e.length?C(e):A}const D={[d.Encoding.sp]:"SP",[d.Encoding.lp2]:"LP2",[d.Encoding.lp4]:"LP4"};function S(e){let t=[];if(null!==e)for(let l of e.groups)for(let e of l.tracks){var A,a,n;t.push({index:e.index,title:null!==(A=e.title)&&void 0!==A?A:"Unknown Title",fullWidthTitle:null!==(a=e.fullWidthTitle)&&void 0!==a?a:"",group:null!==(n=l.title)&&void 0!==n?n:null,encoding:D[e.encoding],duration:Object(d.formatTimeFromFrames)(e.duration,!1)})}return t.sort((e,t)=>e.index-t.index),t}function T(e){var t,A;if(!e)return[];let a=[],n=[...null!==(t=null===(A=e.groups.find(e=>null===e.title))||void 0===A?void 0:A.tracks)&&void 0!==t?t:[]],l=0;for(let i of e.groups){if(null===i.title)continue;let e=i.tracks[0].index-l;a.push({index:-1,title:null,fullWidthTitle:null,tracks:0===e?[]:n.splice(0,e)}),l=i.tracks[i.tracks.length-1].index+1,a.push(i)}return a.push({index:-1,title:null,fullWidthTitle:null,tracks:n}),a}function I(e,t,A){let a=t>A?1:-1,n=-1===A;n&&(a=-1,A=e.trackCount);let l=Math.min(t,A),i=Math.max(t,A),r=e.groups.map(e=>e.tracks).reduce((e,t)=>e.concat(t),[]).sort((e,t)=>e.index-t.index).filter(e=>!n||e.index!==t),o=e.groups.filter(e=>null!==e.title).map(e=>({name:e.title,fullWidthName:e.fullWidthTitle,start:e.tracks[0].index,end:e.tracks[0].index+e.tracks.length-1})),c=!1;for(let u of o)u.start>l&&u.start<=i&&(u.start+=a,c=!0),u.end>=l&&u.end({title:e.name,fullWidthTitle:e.fullWidthName,index:e.start,tracks:r.slice(e.start,e.end+1)})).filter(e=>e.tracks.length>0);let d=s.groups.map(e=>e.tracks).reduce((e,t)=>e.concat(t),[]),m=r.filter(e=>!d.includes(e));if(n)for(let u=0;u!!e.fullWidthTitle).length>0||e.groups.map(e=>e.tracks).reduce((e,t)=>e.concat(t),[]).filter(e=>!!e.fullWidthTitle).length>0,a=e=>7*Math.ceil(e/7);let n="",l="";e.title&&(n=`0;${e.title}//`),A&&(l=`\uff10\uff1b${e.fullWidthTitle}\uff0f\uff0f`);for(let o of e.groups){var i;if(null===o.title||0===o.tracks.length)continue;let e=`${o.tracks[0].index+1}`;1!==o.tracks.length&&(e+=`-${o.tracks[0].index+o.tracks.length}`);let r=n+`${e};${o.title}//`,c=l+Object(g.halfWidthToFullWidthRange)(e)+`\uff1b${null!==(i=o.fullWidthTitle)&&void 0!==i?i:""}\uff0f\uff0f`,s=a(y(r));if(A&&(s+=a(2*c.length)),t-s<0)break;n=r,l=c}let r=a(y(n));return A&&(r+=a(2*l.length)),t-r<0?null:{newRawTitle:n,newRawFullWidthTitle:A?l:""}}function B(e){if(0===e.length)return!0;let t=e[0];for(let A of e){if(A!==t)return!1;++t}return!0}function N(e,t,A){const a=A.value;return A.value=async function(...e){const t=this.mutex,A=await t.acquire();try{return await a.apply(this,e)}finally{A()}},A}function R(e){return e.breakpoints.up(600+2*e.spacing(2))}function P(e){return e.breakpoints.down(600+2*e.spacing(2))}function M(e){return e.breakpoints.up(700+2*e.spacing(2))+" and (min-height: 750px)"}var F,Q=A(321);const W=A(466);let z=(F=class{constructor({debug:e=!1}){if(this.netmdInterface=void 0,this.logger=void 0,this.cachedContentList=void 0,this.mutex=new Q.a,this.statusMonitorTimer=void 0,e){const e=(...e)=>{e&&e[0]&&e[0].method&&console.log(...e)};this.logger={debug:e,info:e,warn:e,error:e,child:()=>this.logger}}}async writeRawTitles(e){null!==e&&(await this.netmdInterface.cacheTOC(),await this.netmdInterface.setDiscTitle(x(e.newRawTitle)),await this.netmdInterface.setDiscTitle(O(e.newRawFullWidthTitle),!0),await this.netmdInterface.syncTOC(),this.dropCachedContentList())}async listContentUsingCache(){return this.cachedContentList?console.log("There's a cached TOC available."):(console.log("There's no cached version of the TOC, caching"),this.cachedContentList=await Object(d.listContent)(this.netmdInterface)),JSON.parse(JSON.stringify(this.cachedContentList))}dropCachedContentList(){console.log("Cached TOC Dropped"),this.cachedContentList=void 0}async pair(){this.dropCachedContentList();let e=await Object(d.openNewDevice)(navigator.usb,this.logger);return null!==e&&(this.netmdInterface=e,!0)}async connect(){this.dropCachedContentList();let e=await Object(d.openPairedDevice)(navigator.usb,this.logger);return null!==e&&(this.netmdInterface=e,!0)}async listContent(){return this.dropCachedContentList(),await this.listContentUsingCache()}async getDeviceStatus(){return await Object(d.getDeviceStatus)(this.netmdInterface)}async getDeviceName(){return await this.netmdInterface.netMd.getDeviceName()}async finalize(){await this.netmdInterface.netMd.finalize(),this.dropCachedContentList()}async rewriteGroups(e){const t=await this.listContentUsingCache();t.groups=e,await this.writeRawTitles(j(t))}async renameTrack(e,t,A){t=x(t),await this.netmdInterface.cacheTOC(),await this.netmdInterface.setTrackTitle(e,t),void 0!==A&&await this.netmdInterface.setTrackTitle(e,O(A),!0),await this.netmdInterface.syncTOC(),this.dropCachedContentList()}async renameGroup(e,t,A){const a=await this.listContentUsingCache();let n=a.groups.find(t=>t.index===e);n&&(n.title=t,void 0!==A&&(n.fullWidthTitle=A),await this.writeRawTitles(j(a)))}async addGroup(e,t,A){const a=await this.listContentUsingCache();let n=a.groups.find(e=>null===e.title);if(!n)return;let l=n.tracks.length,i=n.tracks.filter(A=>A.index>=e&&A.index!i.includes(e)),l-n.tracks.length!==t)throw new Error("A track cannot be in 2 groups!");if(!B(i.map(e=>e.index)))throw new Error("Invalid sequence of tracks!");a.groups.push({title:A,fullWidthTitle:"",index:a.groups.length,tracks:i}),a.groups=a.groups.filter(e=>0!==e.tracks.length).sort((e,t)=>e.tracks[0].index-t.tracks[0].index),await this.writeRawTitles(j(a))}async deleteGroup(e){const t=await this.listContentUsingCache();let A=t.groups.findIndex(t=>t.index===e);A>=0&&t.groups.splice(A,1),await this.writeRawTitles(j(t))}async renameDisc(e,t){const A=await this.netmdInterface.getDiscTitle(),a=await this.netmdInterface.getDiscTitle(!0),n=await this.netmdInterface._getDiscTitle(),l=await this.netmdInterface._getDiscTitle(!0),i=n.indexOf("//")>=0,r=n.indexOf("\uff0f\uff0f")>=0,o=n.startsWith("0;"),c=n.startsWith("\uff10\uff1b");if(e=x(e),(t=t&&O(t))!==a&&void 0!==t){let e;e=r?c?l.replace(/^\uff10\uff1b.*?\uff0f\uff0f/,""!==t?`\uff10\uff1b${t}\uff0f\uff0f`:""):`\uff10\uff1b${t}\uff0f\uff0f${l}`:t,await this.netmdInterface.cacheTOC(),await this.netmdInterface.setDiscTitle(e,!0),await this.netmdInterface.syncTOC(),this.dropCachedContentList()}if(e===A)return;let s;s=i?o?n.replace(/^0;.*?\/\//,""!==e?`0;${e}//`:""):`0;${e}//${n}`:e,await this.netmdInterface.cacheTOC(),await this.netmdInterface.setDiscTitle(s),await this.netmdInterface.syncTOC(),this.dropCachedContentList()}async deleteTracks(e){(e=e.sort()).reverse();let t=await this.listContentUsingCache();for(let A of e)t=I(t,A,-1),await this.netmdInterface.eraseTrack(A),await h(100);await this.writeRawTitles(j(t)),this.dropCachedContentList()}async wipeDisc(){await this.netmdInterface.eraseDisc(),this.dropCachedContentList()}async wipeDiscTitleInfo(){await this.writeRawTitles({newRawTitle:"",newRawFullWidthTitle:""})}async moveTrack(e,t,A){await this.netmdInterface.moveTrack(e,t),(void 0===A||A)&&await this.writeRawTitles(j(I(await this.listContentUsingCache(),e,t))),this.dropCachedContentList()}async upload(e,t,A,a,n){let l=A.byteLength,i=0,r=0;function o(){n({written:i,encrypted:r,total:l})}let c=new W,s=Object(m.makeGetAsyncPacketIteratorOnWorkerThread)(c,({encryptedBytes:e})=>{r=e,o()}),u=x(e);t=O(t);let p=new d.MDTrack(u,a,A,524288,t,s);await Object(d.download)(this.netmdInterface,p,({writtenBytes:e})=>{i=e,o()}),c.terminate(),this.dropCachedContentList()}async play(){await this.netmdInterface.play()}async pause(){await this.netmdInterface.pause()}async stop(){await this.netmdInterface.stop()}async next(){await this.netmdInterface.nextTrack()}async prev(){await this.netmdInterface.previousTrack()}async gotoTrack(e){await this.netmdInterface.gotoTrack(e)}async getPosition(){return await this.netmdInterface.getPosition()}},Object(s.a)(F.prototype,"listContent",[N],Object.getOwnPropertyDescriptor(F.prototype,"listContent"),F.prototype),Object(s.a)(F.prototype,"getDeviceStatus",[N],Object.getOwnPropertyDescriptor(F.prototype,"getDeviceStatus"),F.prototype),Object(s.a)(F.prototype,"getDeviceName",[N],Object.getOwnPropertyDescriptor(F.prototype,"getDeviceName"),F.prototype),Object(s.a)(F.prototype,"finalize",[N],Object.getOwnPropertyDescriptor(F.prototype,"finalize"),F.prototype),Object(s.a)(F.prototype,"rewriteGroups",[N],Object.getOwnPropertyDescriptor(F.prototype,"rewriteGroups"),F.prototype),Object(s.a)(F.prototype,"renameTrack",[N],Object.getOwnPropertyDescriptor(F.prototype,"renameTrack"),F.prototype),Object(s.a)(F.prototype,"renameGroup",[N],Object.getOwnPropertyDescriptor(F.prototype,"renameGroup"),F.prototype),Object(s.a)(F.prototype,"addGroup",[N],Object.getOwnPropertyDescriptor(F.prototype,"addGroup"),F.prototype),Object(s.a)(F.prototype,"deleteGroup",[N],Object.getOwnPropertyDescriptor(F.prototype,"deleteGroup"),F.prototype),Object(s.a)(F.prototype,"renameDisc",[N],Object.getOwnPropertyDescriptor(F.prototype,"renameDisc"),F.prototype),Object(s.a)(F.prototype,"deleteTracks",[N],Object.getOwnPropertyDescriptor(F.prototype,"deleteTracks"),F.prototype),Object(s.a)(F.prototype,"wipeDisc",[N],Object.getOwnPropertyDescriptor(F.prototype,"wipeDisc"),F.prototype),Object(s.a)(F.prototype,"wipeDiscTitleInfo",[N],Object.getOwnPropertyDescriptor(F.prototype,"wipeDiscTitleInfo"),F.prototype),Object(s.a)(F.prototype,"moveTrack",[N],Object.getOwnPropertyDescriptor(F.prototype,"moveTrack"),F.prototype),Object(s.a)(F.prototype,"play",[N],Object.getOwnPropertyDescriptor(F.prototype,"play"),F.prototype),Object(s.a)(F.prototype,"pause",[N],Object.getOwnPropertyDescriptor(F.prototype,"pause"),F.prototype),Object(s.a)(F.prototype,"stop",[N],Object.getOwnPropertyDescriptor(F.prototype,"stop"),F.prototype),Object(s.a)(F.prototype,"next",[N],Object.getOwnPropertyDescriptor(F.prototype,"next"),F.prototype),Object(s.a)(F.prototype,"prev",[N],Object.getOwnPropertyDescriptor(F.prototype,"prev"),F.prototype),Object(s.a)(F.prototype,"gotoTrack",[N],Object.getOwnPropertyDescriptor(F.prototype,"gotoTrack"),F.prototype),Object(s.a)(F.prototype,"getPosition",[N],Object.getOwnPropertyDescriptor(F.prototype,"getPosition"),F.prototype),F);var L={},G=A(38),U=A(28),V=A(22);const H=Object(U.b)({name:"uploadDialog",initialState:{visible:!1,cancelled:!1,writtenProgress:0,encryptedProgress:0,totalProgress:1,trackTotal:1,trackConverting:0,trackCurrent:0,titleCurrent:"",titleConverting:""},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setWriteProgress:(e,t)=>{e.encryptedProgress=t.payload.encrypted,e.writtenProgress=t.payload.written,e.totalProgress=t.payload.total},setCancelUpload:(e,t)=>{e.cancelled=t.payload},setTrackProgress:(e,t)=>{e.trackTotal=t.payload.total,e.trackCurrent=t.payload.current,e.trackConverting=t.payload.converting,e.titleCurrent=t.payload.titleCurrent,e.titleConverting=t.payload.titleConverting}}}),{reducer:J,actions:Y}=H;var K=Object(V.enableBatching)(J);const Z=Object(U.b)({name:"renameDialog",initialState:{visible:!1,title:"",fullWidthTitle:"",index:-1,groupIndex:null},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setCurrentName:(e,t)=>{e.title=t.payload},setCurrentFullWidthName:(e,t)=>{e.fullWidthTitle=t.payload},setIndex:(e,t)=>{e.index=t.payload},setGroupIndex:(e,t)=>{e.groupIndex=t.payload}}}),{reducer:X,actions:q}=Z;var $=Object(V.enableBatching)(X);const _={visible:!1,error:""},ee=Object(U.b)({name:"errorDialog",initialState:_,reducers:{setVisible:(e,t)=>{e.visible=t.payload},setErrorMessage:(e,t)=>{e.error=`${t.payload}`}}}),{actions:te,reducer:Ae}=ee;var ae=Object(V.enableBatching)(Ae);const ne=Object(U.b)({name:"panicDialog",initialState:{visible:!1,dismissed:!1},reducers:{setVisible:(e,t)=>{e.visible=t.payload},dismiss:(e,t)=>{e.visible=!1,e.dismissed=!0}}}),{actions:le,reducer:ie}=ne;var re=Object(V.enableBatching)(ie);const oe={visible:!1,format:v("uploadFormat","LP2"),titleFormat:v("trackTitleFormat","filename")},ce=Object(U.b)({name:"convertDialog",initialState:oe,reducers:{setVisible:(e,t)=>{e.visible=t.payload},setFormat:(e,t)=>{e.format=t.payload,w("uploadFormat",e.format)},setTitleFormat:(e,t)=>{e.titleFormat=t.payload,w("trackTitleFormat",e.titleFormat)}}}),{actions:se,reducer:de}=ce;var me=Object(V.enableBatching)(de);const ue=Object(U.b)({name:"dumpDialog",initialState:{visible:!1,inputDeviceId:""},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setInputDeviceId:(e,t)=>{e.inputDeviceId=t.payload}}}),{reducer:pe,actions:ge}=ue;var he=Object(V.enableBatching)(pe);const fe=Object(U.b)({name:"recordDialog",initialState:{visible:!1,trackTotal:1,trackDone:0,trackCurrent:0,titleCurrent:""},reducers:{setVisible:(e,t)=>{e.visible=t.payload},setProgress:(e,t)=>{e.trackTotal=t.payload.trackTotal,e.trackDone=t.payload.trackDone,e.trackCurrent=t.payload.trackCurrent,e.titleCurrent=t.payload.titleCurrent}}}),{reducer:be,actions:Ee}=fe;var we=Object(V.enableBatching)(be);const ve=()=>({mainView:"WELCOME",loading:!1,pairingFailed:!1,pairingMessage:"",browserSupported:!0,darkMode:v("darkMode",!1),vintageMode:v("vintageMode",!1),aboutDialogVisible:!1,notifyWhenFinished:v("notifyWhenFinished",!1),hasNotificationSupport:!0,fullWidthSupport:v("fullWidthSupport",!1)}),ke=ve(),Ce=Object(U.b)({name:"app",initialState:ke,reducers:{setMainView:(e,t)=>{e.mainView=t.payload},setLoading:(e,t)=>{e.loading=t.payload},setPairingFailed:(e,t)=>{e.pairingFailed=t.payload},setPairingMessage:(e,t)=>{e.pairingMessage=t.payload},setBrowserSupported:(e,t)=>{e.browserSupported=t.payload},setDarkMode:(e,t)=>{e.darkMode=t.payload,w("darkMode",e.darkMode)},setNotifyWhenFinished:(e,t)=>{e.notifyWhenFinished=t.payload,w("notifyWhenFinished",t.payload)},setNotificationSupport:(e,t)=>{e.hasNotificationSupport=t.payload},setVintageMode:(e,t)=>{e.vintageMode=t.payload,w("vintageMode",t.payload)},showAboutDialog:(e,t)=>{e.aboutDialogVisible=t.payload},setFullWidthSupport:(e,t)=>{e.fullWidthSupport=t.payload,w("fullWidthSupport",e.fullWidthSupport)}}}),{reducer:ye,actions:xe}=Ce;var Oe=Object(V.enableBatching)(ye);const De=Object(U.b)({name:"main",initialState:{disc:null,deviceName:"",deviceStatus:null},reducers:{setDisc:(e,t)=>{e.disc=t.payload},setDeviceName:(e,t)=>{e.deviceName=t.payload},setDeviceStatus:(e,t)=>{e.deviceStatus=t.payload}}}),{reducer:Se,actions:Te}=De;var Ie=Object(V.enableBatching)(Se);let je=Object(G.c)({renameDialog:$,uploadDialog:K,errorDialog:ae,panicDialog:re,convertDialog:me,dumpDialog:he,recordDialog:we,appState:Oe,main:Ie});const Be=xe.setMainView.toString(),Ne=Object(U.a)({reducer:function(...e){const[t,A]=e;return A.type===Be&&"WELCOME"===A.payload?{...Re,appState:ve()}:je(...e)},middleware:[e=>e=>async t=>{try{await e(t)}catch(A){console.error(A),e(le.setVisible(!0))}},...Object(U.c)()]}),Re=Object.freeze(Ne.getState());var Pe=A(654),Me=A(590),Fe=A(655),Qe=A(630),We=A(320),ze=A(640),Le=A(287),Ge=A(288),Ue=A.n(Ge);function Ve(e,t){return async function(A,a){switch(e){case"play":await L.netmdService.play();break;case"stop":await L.netmdService.stop();break;case"next":await L.netmdService.next();break;case"prev":await L.netmdService.prev();break;case"pause":await L.netmdService.pause();break;case"goto":const e=Object(g.assertNumber)(t,'Invalid track number for "goto" command');await L.netmdService.gotoTrack(e)}await h(500);try{let e=await L.netmdService.getDeviceStatus();A(Te.setDeviceStatus(e))}catch(n){console.log("control: Cannot get device status")}}}function He(){return async function(e,t){e(xe.setPairingFailed(!1)),await L.audioExportService.init();try{if(await L.netmdService.connect())return void e(xe.setMainView("MAIN"))}catch(A){console.error(A)}try{if(await L.netmdService.pair())return void e(xe.setMainView("MAIN"));e(Object(V.batchActions)([xe.setPairingMessage("Connection Failed"),xe.setPairingFailed(!0)]))}catch(A){console.error(A);let t=A.message;e(Object(V.batchActions)([xe.setPairingMessage(t),xe.setPairingFailed(!0)]))}}}function Je(){return async function(e){let t;e(xe.setLoading(!0));try{t=await L.netmdService.listContent()}catch(n){if(!window.confirm("This disc's title seems to be corrupted, do you wish to erase it?\nNone of the tracks will be deleted."))throw n;await L.netmdService.wipeDiscTitleInfo(),t=await L.netmdService.listContent()}let A=await L.netmdService.getDeviceName(),a=null;try{a=await L.netmdService.getDeviceStatus()}catch(l){console.log("listContent: Cannot get device status")}e(Object(V.batchActions)([Te.setDisc(t),Te.setDeviceName(A),Te.setDeviceStatus(a),xe.setLoading(!1)]))}}function Ye(e){return async function(t,A){if("granted"!==Notification.permission){if(!window.confirm("Enable Notification on recording completed?"))return;if("granted"!==await(function(){try{Notification.requestPermission().then()}catch(e){return!1}return!0}()?Notification.requestPermission():new Promise(e=>Notification.requestPermission(e))))return t(xe.setNotificationSupport(!1)),void t(xe.setNotifyWhenFinished(!1))}t(xe.setNotifyWhenFinished(e))}}const Ke={SP:d.Wireformat.pcm,LP2:d.Wireformat.lp2,LP105:d.Wireformat.l105kbps,LP4:d.Wireformat.lp4};async function Ze(e,t){var A,a,n;const l=await e.arrayBuffer(),i=new Blob([new Uint8Array(l)]);let r=await Le.parseBlob(i);const o=null!==(A=r.common.title)&&void 0!==A?A:"Unknown Title",c=null!==(a=r.common.artist)&&void 0!==a?a:"Unknown Artist",s=null!==(n=r.common.album)&&void 0!==n?n:"Unknown Album";switch(t){case"title":return o;case"artist-title":return`${c} - ${o}`;case"title-artist":return`${o} - ${c}`;case"album-title":return`${s} - ${o}`;case"artist-album-title":return`${c} - ${s} - ${o}`;case"filename":{let t=e.name;const A=t.lastIndexOf(".");return A>0&&(t=t.substring(0,A)),t}}}function Xe(e,t,A){return async function(a,n){const{audioExportService:l,netmdService:i}=L,r=Ke[t];await(null===i||void 0===i?void 0:i.stop()),a(Object(V.batchActions)([Y.setVisible(!0),Y.setCancelUpload(!1)]));const o=({written:e,encrypted:t,total:A})=>{a(Y.setWriteProgress({written:e,encrypted:t,total:A}))},c=()=>n().uploadDialog.cancelled;let s={current:0,converting:0,total:e.length,titleCurrent:"",titleConverting:""};const d=()=>{a(Y.setTrackProgress(s))};let m,u=n().main.disc,p=n().appState.fullWidthSupport,g=k(u),h="",f=1;for await(let w of async function*(e){let A=[],a=0;!function n(){if(a===e.length||c())return s.converting=a,s.titleConverting="",void d();let i=e[a];s.converting=a,s.titleConverting=i.name,d(),a++,A.push(new Promise(async(e,A)=>{let a;try{await l.prepare(i),a=await l.export({format:t}),n(),e({file:i,data:a})}catch(r){m=r,h=`${i.name}: Unsupported or unrecognized format`,A(r)}}))}();let n=0;for(;n7*Math.ceil(e/7);let l=a.substr(0,Math.min(y(a),g));g-=n(y(l));let u="";p&&(u=a.substr(0,Math.min(2*a.length,g,210)/2),g-=n(2*u.length)),s.current=f++,s.titleCurrent=l,d(),o({written:0,encrypted:0,total:100});try{await(null===i||void 0===i?void 0:i.upload(l,u,t,r,o))}catch(E){m=E,h=`${e.name}: Error uploading to device. There might not be enough space left.`;break}}let b=[Y.setVisible(!1)];m&&(console.error(m),b=b.concat([te.setVisible(!0),te.setErrorMessage(h)])),a(Object(V.batchActions)(b)),function(){const{notifyWhenFinished:e,hasNotificationSupport:t}=n().appState;t&&e&&(new Notification("MiniDisc recording completed",{icon:Ue.a}).onclick=function(){window.focus(),this.close()})}(),Je()(a)}}var qe=A(629),$e=A(75),_e=A(638),et=A(639),tt=A(661),At=A(627),at=A(621),nt=A(628),lt=A(625),it=A(626),rt=A(624),ot=A(620),ct=A(6),st=A(2);const dt=st.e.div` position: absolute; top: 0; left: 0; @@ -90,7 +90,7 @@ border-color: rgb(111, 45, 189) rgb(233, 128, 252) rgb(233, 128, 252) rgb(111, 45, 189); box-shadow: rgb(0 0 0 / 55%) 3px 3px 5px 0px; } -`,Et=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("span",{style:{flex:"1 1 auto"}},"About Web MiniDisc"),n.a.createElement(ct.c,{onClick:e.handleClose},n.a.createElement(ft,null))),n.a.createElement(pt,null,"Web MiniDisc uses",n.a.createElement("ul",null,n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://www.ffmpeg.org/",target:"_blank"},"FFmpeg")," ","and"," ",n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/ffmpegjs/FFmpeg",target:"_blank"},"ffmpegjs"),", to read your audio files (wav, mp3, ogg, mp4, etc...)."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/dcherednik/atracdenc/",target:"_blank"},"Atracdenc"),", to support atrac3 encoding (lp2, lp4 audio formats)."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://emscripten.org/",target:"_blank"},"Emscripten"),", to run both FFmpeg and Atracdenc in the browser."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/netmd-js",target:"_blank"},"netmd-js"),", to send commands to NetMD devices using Javascript."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/glaubitz/linux-minidisc",target:"_blank"},"linux-minidisc"),", to make the netmd-js project possible."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://react95.io/",target:"_blank"},"react85"),", to build the vintage user interface."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://material-ui.com/",target:"_blank"},"material-ui"),", to build the user interface.")),n.a.createElement(ut,null,n.a.createElement(gt,{onClick:e.handleClose},"OK"))))):null,wt=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),vt=e=>{const t=Object(r.d)();let A=b(e=>e.appState.aboutDialogVisible);const a=()=>{t(xe.showAboutDialog(!1))};if(b(e=>e.appState.vintageMode)){const e={visible:A,handleClose:a};return n.a.createElement(Et,e)}return n.a.createElement(at.a,{open:A,maxWidth:"sm",fullWidth:!0,TransitionComponent:wt,"aria-labelledby":"about-dialog-slide-title"},n.a.createElement(rt.a,{id:"about-dialog-slide-title"},"About Web MiniDisc"),n.a.createElement(lt.a,null,n.a.createElement(it.a,null,"Web MiniDisc uses"),n.a.createElement("ul",null,n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://www.ffmpeg.org/",target:"_blank"},"FFmpeg")," ","and"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/ffmpegjs/FFmpeg",target:"_blank"},"ffmpegjs"),", to read your audio files (wav, mp3, ogg, mp4, etc...)."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/dcherednik/atracdenc/",target:"_blank"},"Atracdenc"),", to support atrac3 encoding (lp2, lp4 audio formats)."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://emscripten.org/",target:"_blank"},"Emscripten"),", to run both FFmpeg and Atracdenc in the browser."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/netmd-js",target:"_blank"},"netmd-js"),", to send commands to NetMD devices using Javascript."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/glaubitz/linux-minidisc",target:"_blank"},"linux-minidisc"),", to make the netmd-js project possible."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://react95.io/",target:"_blank"},"react95"),", to build the vintage user interface."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://material-ui.com/",target:"_blank"},"material-ui"),", to build the user interface.")),n.a.createElement(it.a,null,"Attribution"),n.a.createElement("ul",null,n.a.createElement("li",null,"MiniDisc logo from"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://en.wikipedia.org/wiki/MiniDisc",target:"_blank"},"https://en.wikipedia.org/wiki/MiniDisc")),n.a.createElement("li",null,"MiniDisc icon from"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://www.deviantart.com/blinkybill/art/Sony-MiniDisc-Plastic-Icon-473812540",target:"_blank"},"http://fav.me/d7u3g3g")))),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:a},"Close")))};var Ct=A(592),kt=A(322),yt=A(631),xt=A(634),Ot=A(300),Dt=A.n(Ot),St=A(632),Tt=A(633),It=A(662),jt=A(293),Bt=A.n(jt),Nt=A(158),Rt=A.n(Nt),Pt=A(299),Mt=A.n(Pt),Ft=A(294),Qt=A.n(Ft),Wt=A(295),zt=A.n(Wt),Lt=A(297),Gt=A.n(Lt),Ut=A(202),Vt=A.n(Ut),Ht=A(201),Jt=A.n(Ht),Yt=A(292),Kt=A.n(Yt),Zt=A(298),Xt=A.n(Zt);const qt=e=>{const t=[];return"MAIN"===e.mainView&&(t.push(n.a.createElement(ct.i,{key:"update",onClick:e.handleRefresh},"Reload TOC")),t.push(n.a.createElement(ct.i,{key:"title",onClick:e.handleRenameDisc},"Rename Disc")),t.push(n.a.createElement(ct.i,{key:"wipe",onClick:e.handleWipeDisc},"Wipe Disc")),t.push(n.a.createElement(ct.i,{key:"vintage",onClick:e.handleVintageMode},n.a.createElement(ct.d,{checked:!0,name:"vintageMode",variant:"menu",value:"vintageMode",label:"Retro Mode (beta)",defaultChecked:!0}))),t.push(n.a.createElement(ct.e,{key:"d1"})),t.push(n.a.createElement(ct.i,{key:"exit",onClick:e.handleExit},"Exit")),t.push(n.a.createElement(ct.e,{key:"d2"}))),t.push(n.a.createElement(ct.i,{key:"about",onClick:e.handleShowAbout},"About...")),t.push(n.a.createElement(ct.i,{key:"menu-gh"},n.a.createElement("a",{rel:"noopener noreferrer",href:"https://github.com/cybercase/webminidisc",target:"_blank"},"Fork me on GitHub"))),n.a.createElement(ct.h,{style:{position:"absolute",left:"0",top:"100%",zIndex:"9999"},onClick:e.onClick},t)},$t=Object(Qe.a)(e=>({listItemIcon:{minWidth:e.spacing(5)},toolTippedText:{textDecoration:"underline",textDecorationStyle:"dotted"}})),_t=function(e){const t=$t(),A=Object(r.d)();let{mainView:l,darkMode:i,vintageMode:o,fullWidthSupport:c}=b(e=>e.appState),s=b(e=>{var t,A;return null!==(t=null===(A=e.main.disc)||void 0===A?void 0:A.title)&&void 0!==t?t:""}),d=b(e=>{var t,A;return null!==(t=null===(A=e.main.disc)||void 0===A?void 0:A.fullWidthTitle)&&void 0!==t?t:""});const m=n.a.useRef(null),u=n.a.useRef(null),[p,g]=n.a.useState(null),h=Boolean(p),f=Object(a.useCallback)(e=>{g(e.currentTarget)},[g]),E=Object(a.useCallback)(()=>{A(xe.setDarkMode(!i))},[A,i]),w=Object(a.useCallback)(()=>{A(xe.setVintageMode(!o))},[A,o]),v=Object(a.useCallback)(()=>{g(null)},[g]),C=Object(a.useCallback)(()=>{A((async function(e){if(!window.confirm("Proceed with Wipe Disc? This operation cannot be undone."))return;const{netmdService:t}=L;e(xe.setLoading(!0)),await t.wipeDisc(),Je()(e)})),v()},[A,v]),k=Object(a.useCallback)(()=>{A(xe.setFullWidthSupport(!c))},[A,c]),y=Object(a.useCallback)(()=>{A(Je()),v()},[A,v]),x=Object(a.useCallback)(()=>{A(Object(V.batchActions)([q.setVisible(!0),q.setCurrentName(s),q.setGroupIndex(null),q.setCurrentFullWidthName(d),q.setIndex(-1)])),v()},[A,v,s,d]),O=Object(a.useCallback)(()=>{A(xe.setMainView("WELCOME")),v()},[A,v]),D=Object(a.useCallback)(()=>{A(xe.showAboutDialog(!0)),v()},[A,v]),S=Object(a.useCallback)(e=>{var t;(e.stopPropagation(),e.target!==m.current)&&(null===(t=m.current)||void 0===t||t.click());v()},[v]),T=Object(a.useCallback)(e=>{var t;(e.stopPropagation(),e.target!==u.current)&&(null===(t=u.current)||void 0===t||t.click());v()},[v]),I=[];if("MAIN"===l&&(I.push(n.a.createElement(yt.a,{key:"update",onClick:y},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Bt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Reload TOC"))),I.push(n.a.createElement(yt.a,{key:"title",onClick:x},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Rt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Rename Disc"))),I.push(n.a.createElement(yt.a,{key:"wipe",onClick:C},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Qt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Wipe Disc"))),I.push(n.a.createElement(yt.a,{key:"exit",onClick:O},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(zt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Exit")))),"MAIN"===l&&(I.push(n.a.createElement(xt.a,{key:"action-divider"})),I.push(n.a.createElement(yt.a,{key:"allowFullWidth",onClick:k},n.a.createElement(St.a,{className:t.listItemIcon},c?n.a.createElement(Jt.a,{fontSize:"small"}):n.a.createElement(Vt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,c?"Disable ":"Enable ",n.a.createElement(It.a,{title:"This advanced feature enables the use of Hiragana and Kanji alphabets. More about this in Support and FAQ.",arrow:!0},n.a.createElement("span",{className:t.toolTippedText},"Full-Width Title Editing")))))),I.push(n.a.createElement(yt.a,{key:"darkMode",onClick:E},n.a.createElement(St.a,{className:t.listItemIcon},i?n.a.createElement(Jt.a,{fontSize:"small"}):n.a.createElement(Vt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Dark Mode"))),"MAIN"===l&&I.push(n.a.createElement(yt.a,{key:"vintageMode",onClick:w},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement("img",{alt:"Windows 95",src:Kt.a,width:"24px",height:"24px"})),n.a.createElement(Tt.a,null,"Retro Mode (beta)"))),"MAIN"===l&&I.push(n.a.createElement(xt.a,{key:"feature-divider"})),I.push(n.a.createElement(yt.a,{key:"about",onClick:D},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Gt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"About"))),I.push(n.a.createElement(yt.a,{key:"support",onClick:T},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Xt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ",target:"_blank",ref:u,onClick:T},"Support and FAQ")))),I.push(n.a.createElement(yt.a,{key:"github",onClick:S},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Mt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/webminidisc",target:"_blank",ref:m,onClick:S},"Fork me on GitHub")))),o){const t={mainView:l,onClick:e.onClick,handleWipeDisc:C,handleRefresh:y,handleRenameDisc:x,handleExit:O,handleShowAbout:D,handleVintageMode:w};return n.a.createElement(qt,t)}return n.a.createElement(n.a.Fragment,null,n.a.createElement(Ct.a,{"aria-label":"actions","aria-controls":"actions-menu","aria-haspopup":"true",onClick:f},n.a.createElement(Dt.a,null)),n.a.createElement(kt.a,{id:"actions-menu",anchorEl:p,keepMounted:!0,open:h,onClose:v},I))};var eA=A(301),tA=A.n(eA);const AA=Object(Qe.a)(e=>({pairingMessage:{color:"red",marginTop:e.spacing(1)},windowContent:{flex:"1 1 auto",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"}})),aA=e=>{let{dispatch:t,pairingFailed:A,pairingMessage:a}=e;const l=AA();return n.a.createElement(n.a.Fragment,null,n.a.createElement(ct.w,{className:l.windowContent},n.a.createElement("p",{style:{paddingBottom:8}},"Press the button to connect to a NetMD device"),n.a.createElement(ct.c,{style:{minWidth:90},onClick:()=>t(He())},"Connect"),n.a.createElement("p",{style:{visibility:A?"visible":"hidden"},className:l.pairingMessage},a)),n.a.createElement(vt,null))};var nA=A(302),lA=A.n(nA);const iA=Object(Qe.a)(e=>({main:{position:"relative",flex:"1 1 auto",display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"},button:{marginTop:e.spacing(3),minWidth:150},spacing:{marginTop:e.spacing(1)},chromeLogo:{marginTop:e.spacing(1),width:96,height:96},why:{alignSelf:"flex-start",marginTop:e.spacing(3)},headBox:{display:"flex",justifyContent:"space-between"},connectContainer:{flex:"1 1 auto",display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"},supportContainer:{flex:"1 1 auto",display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"}})),rA=e=>{const t=iA(),A=Object(r.d)(),{browserSupported:l,pairingFailed:i,pairingMessage:o,vintageMode:c}=b(e=>e.appState);o.toLowerCase().match(/denied/);const[s,d]=Object(a.useState)(!1);if(c){const e={dispatch:A,pairingFailed:i,pairingMessage:o};return n.a.createElement(aA,e)}return n.a.createElement(n.a.Fragment,null,n.a.createElement(tt.a,{className:t.headBox},n.a.createElement($e.a,{component:"h1",variant:"h4"},"Web MiniDisc"),n.a.createElement(_t,null)),n.a.createElement($e.a,{component:"h2",variant:"body2"},"Brings NetMD Devices to the Web"),n.a.createElement(tt.a,{className:t.main},l?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:t.connectContainer},n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},"Press the button to connect to a NetMD device"),n.a.createElement(qe.a,{variant:"contained",color:"primary",onClick:()=>A(He()),className:t.button},"Connect"),n.a.createElement(_e.a,{error:!0,className:t.spacing,style:{visibility:i?"visible":"hidden"}},n.a.createElement(et.a,null,o))),n.a.createElement("div",null,n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ"},n.a.createElement("span",{style:{verticalAlign:"middle"}},"Support and FAQ")," ",n.a.createElement(lA.a,{style:{verticalAlign:"middle"},fontSize:"inherit"}))))):n.a.createElement(n.a.Fragment,null,n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},"This Web browser is not supported.\xa0",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"#",onClick:e=>{e.preventDefault(),d(!0)}},"Learn Why")),n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://www.google.com/chrome/"},n.a.createElement("img",{alt:"Chrome Logo",src:tA.a,className:t.chromeLogo})),n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},"Try using"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://www.google.com/chrome/"},"Chrome")," ","instead"),s?n.a.createElement(n.a.Fragment,null,n.a.createElement($e.a,{component:"p",variant:"body2",className:t.why},"Web MiniDisc requires a browser that supports both"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://wicg.github.io/webusb/"},"WebUSB")," ","and"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://webassembly.org/"},"WebAssembly"),"."),n.a.createElement("ul",null,n.a.createElement("li",null,"WebUSB is needed to control the NetMD device via the USB connection to your computer."),n.a.createElement("li",null,"WebAssembly is used to convert the music to a MiniDisc compatible format"))):null)),n.a.createElement(vt,null))};var oA=A(4),cA=A(167),sA=A(168),dA=A(13),mA=A(200),uA=A(653),pA=A(163),gA=A.n(pA),hA=A(160),fA=A.n(hA),bA=A(316),EA=A.n(bA),wA=A(650),vA=A(652),CA=A(642),kA=A(651),yA=A(641),xA=A(648),OA=A(203),DA=A(304),SA=A.n(DA),TA=A(102),IA=A.n(TA),jA=A(103),BA=A.n(jA),NA=A(305),RA=A.n(NA);const PA=Object(Qe.a)(e=>({currentTrackRow:{color:e.palette.primary.main,"& > td":{color:"inherit"}},inGroupTrackRow:{"& > $indexCell":{transform:`translateX(${e.spacing(3)}px)`},"& > $titleCell":{transform:`translateX(${e.spacing(3)}px)`}},playButtonInTrackList:{display:"none"},trackRow:{"&:hover":{"& $playButtonInTrackList":{display:"inline-flex"},"& $trackIndex":{display:"none"}}},controlButtonInTrackCommon:{width:e.spacing(2),height:e.spacing(2),verticalAlign:"middle",marginLeft:e.spacing(-.5)},formatBadge:{...OA.styles(e).badge,...OA.styles(e).colorPrimary,position:"static",display:"inline-flex",border:`2px solid ${e.palette.background.paper}`,padding:"0 4px",verticalAlign:"middle",width:e.spacing(4.5),marginRight:e.spacing(.5)},durationCell:{whiteSpace:"nowrap"},durationCellSecondary:{whiteSpace:"nowrap",color:e.palette.text.secondary},durationCellTime:{verticalAlign:"middle"},titleCell:{overflow:"hidden",maxWidth:"40ch",textOverflow:"ellipsis"},deleteGroupButton:{display:"none"},indexCell:{whiteSpace:"nowrap",paddingRight:0,width:e.spacing(4)},trackIndex:{display:"inline-block",height:"16px",width:"16px"},dragHandle:{width:20,padding:`${e.spacing(.5)}px 0 0 0`},dragHandleEmpty:{width:20,padding:`${e.spacing(.5)}px 0 0 0`},groupFolderIcon:{},groupHeadRow:{"&:hover":{"& $deleteGroupButton":{display:"inline-flex"},"& $groupFolderIcon":{display:"none"}}}}));function MA({track:e,inGroup:t,isSelected:A,draggableProvided:l,trackStatus:i,onSelect:r,onRename:o,onTogglePlayPause:c}){var s;const m=PA(),u=Object(a.useCallback)(t=>o(t,e.index),[e.index,o]),p=Object(a.useCallback)(t=>r(t,e.index),[e.index,r]),g=Object(a.useCallback)(t=>{t.stopPropagation(),c(t,e.index)},[e.index,c]),h=Object(a.useCallback)(e=>e.stopPropagation(),[]),f="playing"===i||"paused"===i;return n.a.createElement(yA.a,Object.assign({},l.draggableProps,{ref:l.innerRef,hover:!0,selected:A,onDoubleClick:u,onClick:p,color:"inherit",className:Object(oA.default)(m.trackRow,{[m.inGroupTrackRow]:t,[m.currentTrackRow]:f})}),n.a.createElement(CA.a,Object.assign({className:m.dragHandle},l.dragHandleProps,{onClick:e=>e.stopPropagation()}),n.a.createElement(SA.a,{fontSize:"small",color:"disabled"})),n.a.createElement(CA.a,{className:m.indexCell},n.a.createElement("span",{className:m.trackIndex},e.index+1),n.a.createElement(Ct.a,{"aria-label":"delete",className:Object(oA.default)(m.controlButtonInTrackCommon,m.playButtonInTrackList),size:"small",onClick:g,onDoubleClick:h},"paused"===i||"none"===i?n.a.createElement(IA.a,{fontSize:"inherit"}):n.a.createElement(BA.a,{fontSize:"inherit"}))),n.a.createElement(CA.a,{className:m.titleCell,title:null!==(s=e.title)&&void 0!==s?s:""},e.fullWidthTitle?`${e.fullWidthTitle} / `:"",e.title||"No Title"),n.a.createElement(CA.a,{align:"right",className:m.durationCell},n.a.createElement("span",{className:m.formatBadge},D[e.encoding]),n.a.createElement("span",{className:m.durationCellTime},Object(d.formatTimeFromFrames)(e.duration,!1))))}function FA({group:e,onRename:t,onDelete:A}){const l=PA(),i=Object(a.useCallback)(t=>A(t,e.index),[A,e]),r=Object(a.useCallback)(A=>t(A,e.index),[t,e]);return n.a.createElement(yA.a,{hover:!0,className:l.groupHeadRow,onDoubleClick:r},n.a.createElement(CA.a,{className:l.dragHandleEmpty}),n.a.createElement(CA.a,{className:l.indexCell},n.a.createElement(RA.a,{className:Object(oA.default)(l.controlButtonInTrackCommon,l.groupFolderIcon)}),n.a.createElement(Ct.a,{"aria-label":"delete",className:Object(oA.default)(l.controlButtonInTrackCommon,l.deleteGroupButton),size:"small",onClick:i},n.a.createElement(fA.a,{fontSize:"inherit"}))),n.a.createElement(CA.a,{className:l.titleCell,title:e.title},e.fullWidthTitle?`${e.fullWidthTitle} / `:"",e.title||"No Name"),n.a.createElement(CA.a,{align:"right",className:l.durationCellSecondary},n.a.createElement("span",{className:l.durationCellTime},Object(d.formatTimeFromFrames)(e.tracks.map(e=>e.duration).reduce((e,t)=>e+t),!1))))}var QA=A(660);const WA=e=>e.renameDialogVisible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,null,n.a.createElement("span",null,"Rename ",e.what)),n.a.createElement(ct.w,null,n.a.createElement("p",{style:{marginBottom:4}},e.what," Name:"),n.a.createElement(ct.s,{style:{marginBottom:16},value:e.renameDialogTitle,placeholder:"Type here...",onChange:e.handleChange,onKeyDown:t=>{"Enter"===t.key&&e.handleDoRename()},fullWidth:!0}),n.a.createElement(ut,null,n.a.createElement(gt,{onClick:e.handleDoRename},"OK"),n.a.createElement(gt,{onClick:e.handleCancelRename},"Cancel"))))):null,zA=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),LA=Object(Qe.a)(e=>({marginUpDown:{marginTop:e.spacing(3),marginBottom:e.spacing(3)}})),GA=e=>{let t=Object(r.d)(),A=LA(),l=b(e=>e.renameDialog.visible),i=b(e=>e.renameDialog.title),o=b(e=>e.renameDialog.fullWidthTitle),c=b(e=>e.renameDialog.index),s=b(e=>e.renameDialog.groupIndex),d=b(e=>e.appState.fullWidthSupport);const m=null!==s?"Group":c<0?"Disc":"Track",u=Object(a.useCallback)(()=>{t(q.setVisible(!1))},[t]),p=Object(a.useCallback)(()=>{t(null!==s?function({groupIndex:e,newName:t,newFullWidthName:A}){return async function(a,n){var l;await(null===(l=L.netmdService)||void 0===l?void 0:l.renameGroup(e,t,A)),Je()(a)}}({newName:i,newFullWidthName:o,groupIndex:s}):c<0?function({newName:e,newFullWidthName:t}){return async function(A){const{netmdService:a}=L;await a.renameDisc(e.replace(/\/\//g," /"),null===t||void 0===t?void 0:t.replace(/\uff0f\uff0f/g,"\uff0f")),A(q.setVisible(!1)),Je()(A)}}({newName:i,newFullWidthName:o}):function({index:e,newName:t,newFullWidthName:A}){return async function(a){const{netmdService:n}=L;a(q.setVisible(!1));try{await n.renameTrack(e,t,A)}catch(l){console.error(l),a(Object(V.batchActions)([te.setVisible(!0),te.setErrorMessage("Rename failed.")]))}Je()(a)}}({index:c,newName:i,newFullWidthName:o})),u()},[t,u,o,s,c,i]),g=Object(a.useCallback)(e=>{t(q.setCurrentName(e.target.value.substring(0,120)))},[t]),h=Object(a.useCallback)(e=>{t(q.setCurrentFullWidthName(e.target.value.substring(0,105)))},[t]),f=Object(a.useCallback)(e=>{"Enter"===e.key&&(e.stopPropagation(),e.preventDefault(),p())},[p]),{vintageMode:E}=b(e=>e.appState);if(E){const e={renameDialogVisible:l,renameDialogTitle:i,renameDialogIndex:c,what:m,handleCancelRename:u,handleDoRename:p,handleChange:g};return n.a.createElement(WA,e)}return n.a.createElement(at.a,{open:l,onClose:u,maxWidth:"sm",fullWidth:!0,TransitionComponent:zA,"aria-labelledby":"rename-dialog-title"},n.a.createElement(rt.a,{id:"rename-dialog-title"},"Rename ",m),n.a.createElement(lt.a,null,n.a.createElement(QA.a,{autoFocus:!0,id:"name",label:`${m} Name`,type:"text",fullWidth:!0,value:i,onKeyDown:f,onChange:g}),d&&n.a.createElement(QA.a,{id:"fullWidthTitle",label:`Full-Width ${m} Name`,type:"text",fullWidth:!0,className:A.marginUpDown,value:o,onKeyDown:f,onChange:h})),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:u},"Cancel"),n.a.createElement(qe.a,{color:"primary",onClick:p},"Rename")))};var UA=A(645),VA=A(646),HA=A(658);const JA=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,null,n.a.createElement("span",null,"Recording...")),n.a.createElement(pt,null,n.a.createElement("div",{style:{width:"100%"}},100===e.convertedValue&&e.trackConverting===e.trackTotal?"Conversion completed":`Converting ${e.trackConverting+1} of ${e.trackTotal}: ${e.titleConverting}`),n.a.createElement(ct.k,{value:Math.floor(e.convertedValue)}),n.a.createElement("div",{style:{width:"100%",marginTop:16}},"Uploading ",e.trackCurrent," of ",e.trackTotal,": ",e.titleCurrent),n.a.createElement(ct.k,{value:e.progressValue}),n.a.createElement(ut,null,e.hasNotificationSupport?n.a.createElement(ct.d,{name:"notifyOnEnd",label:"Notify when completed",checked:e.notifyWhenFinished,onChange:e.handleNotifyWhenFinishedChanged}):null,n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(ct.c,{disabled:e.cancelled,onClick:e.handleCancelUpload},e.cancelled?"Stopping after current track...":"Cancel Recording"))))):null,YA=Object(Qe.a)(e=>({progressPerc:{marginTop:e.spacing(1)},progressBar:{marginTop:e.spacing(3)},uploadLabel:{marginTop:e.spacing(3)},spacer:{flex:"1 1 auto"},checkBox:{marginLeft:0}})),KA=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),ZA=e=>{const t=YA(),A=Object(r.d)();let{visible:l,cancelled:i,writtenProgress:o,encryptedProgress:c,totalProgress:s,trackTotal:d,trackCurrent:m,trackConverting:u,titleCurrent:p,titleConverting:g}=b(e=>e.uploadDialog);const{vintageMode:h,notifyWhenFinished:f,hasNotificationSupport:E}=b(e=>e.appState),w=Object(a.useCallback)(()=>{A(Y.setCancelUpload(!0))},[A]),v=Object(a.useCallback)(()=>{A(Ye(!f))},[A,f]);let C=Math.floor(o/s*100),k=Math.floor(c/s*100),y=Math.floor(u/d*100);if(h){const e={visible:l,cancelled:i,writtenProgress:o,encryptedProgress:c,totalProgress:s,trackTotal:d,trackCurrent:m,trackConverting:u,titleCurrent:p,titleConverting:g,handleCancelUpload:w,progressValue:C,bufferValue:k,convertedValue:y,notifyWhenFinished:f,hasNotificationSupport:E,handleNotifyWhenFinishedChanged:v};return n.a.createElement(JA,e)}return n.a.createElement(at.a,{open:l,maxWidth:"sm",fullWidth:!0,TransitionComponent:KA,"aria-labelledby":"alert-dialog-slide-title","aria-describedby":"alert-dialog-slide-description"},n.a.createElement(rt.a,{id:"alert-dialog-slide-title"},"Recording..."),n.a.createElement(lt.a,null,n.a.createElement(it.a,{id:"alert-dialog-slide-description"},100===y&&u===d?"Conversion completed":`Converting ${u+1} of ${d}: ${g}`),n.a.createElement(UA.a,{className:t.progressBar,variant:0===y?"indeterminate":"determinate",color:"primary",value:y}),n.a.createElement(tt.a,{className:t.progressPerc},y,"%"),n.a.createElement(it.a,{id:"alert-dialog-slide-description",className:t.uploadLabel},"Uploading ",m," of ",d,": ",p),n.a.createElement(UA.a,{className:t.progressBar,variant:"buffer",color:"secondary",value:C,valueBuffer:k}),n.a.createElement(tt.a,{className:t.progressPerc},C,"%")),n.a.createElement(nt.a,null,E?n.a.createElement(VA.a,{className:t.checkBox,disabled:!E,control:n.a.createElement(HA.a,{checked:f,onChange:v,name:"notifyOnEnd"}),label:"Notify when completed"}):null,n.a.createElement("div",{className:t.spacer}),n.a.createElement(qe.a,{disabled:i,onClick:w},i?"Stopping after current track...":"Cancel Recording")))},XA=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,null,n.a.createElement("span",null,"Recording...")),n.a.createElement(pt,null,n.a.createElement("p",{style:{marginBottom:16,width:"100%"}},`Recording track ${e.trackDone+1} of ${e.trackTotal}: ${e.titleCurrent}`),n.a.createElement(ct.k,{value:e.progressValue,hideValue:e.progressValue<0})))):null,qA=Object(Qe.a)(e=>({progressPerc:{marginTop:e.spacing(1)},progressBar:{marginTop:e.spacing(3)}})),$A=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),_A=e=>{const t=qA();let{visible:A,trackTotal:a,trackDone:l,trackCurrent:i,titleCurrent:r}=b(e=>e.recordDialog),o=Math.round(i);if(b(e=>e.appState.vintageMode)){const e={visible:A,trackTotal:a,trackDone:l,trackCurrent:i,titleCurrent:r,progressValue:o};return n.a.createElement(XA,e)}return n.a.createElement(at.a,{open:A,maxWidth:"sm",fullWidth:!0,TransitionComponent:$A,"aria-labelledby":"record-dialog-slide-title","aria-describedby":"record-dialog-slide-description"},n.a.createElement(rt.a,{id:"record-dialog-slide-title"},"Recording..."),n.a.createElement(lt.a,null,n.a.createElement(it.a,{id:"record-dialog-slide-description"},`Recording track ${l+1} of ${a}: ${r}`),n.a.createElement(UA.a,{className:t.progressBar,variant:i>=0?"determinate":"indeterminate",color:"primary",value:o}),n.a.createElement(tt.a,{className:t.progressPerc},o>=0?`${o}%`:"")),n.a.createElement(nt.a,null))},ea=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),ta=e=>{const t=Object(r.d)();let{visible:A,error:l}=b(e=>e.errorDialog);const i=Object(a.useCallback)(()=>{t(te.setVisible(!1))},[t]);return n.a.createElement(at.a,{open:A,maxWidth:"sm",fullWidth:!0,TransitionComponent:ea,"aria-labelledby":"error-dialog-slide-title","aria-describedby":"error-dialog-slide-description"},n.a.createElement(rt.a,{id:"alert-dialog-slide-title"},"Error"),n.a.createElement(lt.a,null,n.a.createElement(it.a,{id:"alert-dialog-slide-description"},l)),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:i},"Close")))},Aa=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),aa=e=>{const t=Object(r.d)();let{visible:A,dismissed:l}=b(e=>e.panicDialog);const i=Object(a.useCallback)(()=>{window.location.reload()},[]),o=Object(a.useCallback)(()=>{t(le.dismiss())},[t]);return n.a.createElement(at.a,{open:A&&!l,maxWidth:"sm",fullWidth:!0,scroll:"paper",TransitionComponent:Aa,"aria-labelledby":"error-dialog-slide-title","aria-describedby":"error-dialog-slide-description"},n.a.createElement(rt.a,{id:"alert-dialog-slide-title"},"Oops\u2026 Something unexpected happened."),n.a.createElement(lt.a,null,n.a.createElement($e.a,{color:"textSecondary",variant:"body1",component:"div"},"Try to restart the app. If the error persists, try the followings:",n.a.createElement("ol",null,n.a.createElement("li",null,"Use your browser in incognito mode."),n.a.createElement("li",null,"Use a blank MiniDisc."),n.a.createElement("li",null,"Try to use Web MiniDisc on another computer.")),"If this does not solve the error, your unit might not be supported yet or you have encountered a bug. The full error is reported in the JS console.")),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:o,size:"small"},"Ignore and Continue"),n.a.createElement(qe.a,{onClick:i,color:"primary"},"Restart the App")))};var na=A(647),la=A(664),ia=A(657),ra=A(643),oa=A(659),ca=A(649),sa=A(309),da=A.n(sa),ma=A(310),ua=A.n(ma),pa=A(308),ga=A.n(pa),ha=A(636),fa=A(591),ba=A(656),Ea=A(306),wa=A.n(Ea),va=A(307),Ca=A.n(va),ka=A(162),ya=A.n(ka);const xa=[{value:"filename",label:"Filename"},{value:"title",label:"Title"},{value:"album-title",label:"Album - Title"},{value:"artist-title",label:"Artist - Title"},{value:"title-artist",label:"Title - Artist"},{value:"artist-album-title",label:"Artist - Album - Title"}],Oa=[{value:"SP",label:"SP"},{value:"LP2",label:"LP2"},{value:"LP4",label:"LP4"}],Da=e=>{const t=Object(a.useContext)(st.a),A=Object(a.useCallback)(()=>e.files.map((A,a)=>{const l=e.selectedTrackIndex===a,i=l?e.selectedTrackRef:null;return n.a.createElement(ht,{key:`${a}`,onClick:()=>e.setSelectedTrack(a),ref:i,style:l?t.selectedTableRow:{}},n.a.createElement(ct.o,null,A.name))}),[e,t]);return e.dialogVisible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("span",{style:{flex:"1 1 auto"}},"Upload Settings"),n.a.createElement(ct.c,{onClick:e.handleClose},n.a.createElement(ft,null))),n.a.createElement(pt,null,n.a.createElement("div",{style:{display:"flex",width:"100%"}},n.a.createElement(ct.f,{label:"Recording Mode",style:{display:"flex",flex:"1 1 auto"}},n.a.createElement(ct.l,{defaultValue:e.format,options:Oa,width:90,onChange:(t,A)=>e.handleChangeFormat(t,A.value)})),n.a.createElement(ct.f,{label:"Track title",style:{flex:"1 1 auto",marginLeft:16}},n.a.createElement(ct.l,{defaultValue:e.titleFormat,options:xa,width:180,onChange:e.handleChangeTitleFormat}))),e.tracksOrderVisible?n.a.createElement("div",Object.assign({},e.getRootProps(),{style:{width:"100%",marginTop:16}}),n.a.createElement(ct.e,{style:{marginTop:16}}),n.a.createElement(ct.t,{style:{display:"flex"}},n.a.createElement(ct.c,{variant:"menu",onClick:e.open},"Add..."),n.a.createElement(ct.c,{variant:"menu",disabled:e.disableRemove,onClick:e.handleRemoveSelectedTrack},n.a.createElement("img",{alt:"delete",src:ya.a,style:{marginRight:4}}),"Remove"),n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(ct.c,{variant:"menu",disabled:e.disableRemove,onClick:e.moveFileDown},n.a.createElement("img",{alt:"Move Down",src:Ca.a})),n.a.createElement(ct.c,{variant:"menu",disabled:e.disableRemove,onClick:e.moveFileUp},n.a.createElement("img",{alt:"Move Up",src:wa.a}))),n.a.createElement("div",{style:{maxHeight:"30vh",overflow:"scroll"}},n.a.createElement(ct.m,null,n.a.createElement(ct.n,null,A()))),n.a.createElement("input",e.getInputProps())):null,n.a.createElement(ut,null,n.a.createElement(ct.c,{onClick:e.handleToggleTracksOrder},`${e.tracksOrderVisible?"Hide":"Show"} Tracks`),n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(gt,{onClick:e.handleConvert},"OK"),n.a.createElement(gt,{onClick:e.handleClose},"Cancel"))))):null},Sa=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),Ta=Object(Qe.a)(e=>({container:{display:"flex",flexDirection:"row"},formControl:{minWidth:60},toggleButton:{minWidth:40},dialogContent:{display:"flex",flexDirection:"column",justifyContent:"stretch"},formatAndTitle:{display:"flex",flexWrap:"wrap",justifyContent:"space-between"},rightBlock:{display:"flex",flexDirection:"column"},titleFormControl:{minWidth:170,marginTop:4,[P(e)]:{width:114,minWidth:0}},spacer:{display:"flex",flex:"1 1 auto"},showTracksOrderBtn:{marginLeft:e.spacing(1)},tracksOrderAccordion:{"&:before":{opacity:0}},tracksOrderAccordionDetail:{maxHeight:"40vh",overflow:"auto"},toolbarHighlight:"light"===e.palette.type?{color:e.palette.secondary.main,backgroundColor:Object(dA.d)(e.palette.secondary.light,.85)}:{color:e.palette.text.primary,backgroundColor:e.palette.secondary.dark},trackList:{flex:"1 1 auto"},backdrop:{zIndex:e.zIndex.drawer+1,color:"#fff"}})),Ia=e=>{const t=Object(r.d)(),A=Ta();let{visible:l,format:i,titleFormat:o}=b(e=>e.convertDialog);const[c,s]=Object(a.useState)(e.files),[d,m]=Object(a.useState)(-1),u=Object(a.useCallback)(e=>{const t=d+e;if(t>=c.length||t<0)return;const A=c.slice();let a=A[d];A[d]=A[t],A[t]=a,s(A),m(t)},[c,d]),p=Object(a.useCallback)(()=>{u(-1)},[u]),g=Object(a.useCallback)(()=>{u(1)},[u]),h=Object(a.useCallback)(()=>{t(se.setVisible(!1))},[t]),f=Object(a.useCallback)((e,A)=>{null!==A&&t(se.setFormat(A))},[t]),E=Object(a.useCallback)(e=>{t(se.setTitleFormat(e.target.value))},[t]),w=Object(a.useCallback)(()=>{h(),t(Xe(c,i,o))},[t,c,i,o,h]),[v,C]=Object(a.useState)(!1),k=Object(a.useCallback)(()=>{C(!v)},[v,C]);Object(a.useEffect)(()=>{const t=Array.from(e.files);s(t),m(-1),C(!1)},[e.files,m,C]);const y=Object(a.useRef)(null);Object(a.useEffect)(()=>{var e;null===(e=y.current)||void 0===e||e.scrollIntoView({block:"nearest",behavior:"smooth"})},[y,d]);const x=Object(a.useCallback)(()=>c.map((e,t)=>{const A=d===t,a=A?y:null;return n.a.createElement(fa.a,{key:`${t}`,disableGutters:!0,onClick:()=>m(t),ref:a,button:!0},n.a.createElement(St.a,null,n.a.createElement(ba.a,{checked:A,value:`track-${t}`,size:"small"})),n.a.createElement(Tt.a,{primary:e.name}))}),[c,d,m,y]),O=Object(a.useCallback)((e,t)=>{const A=c.slice().concat(e);s(A)},[c,s]),{getRootProps:D,getInputProps:S,isDragActive:T,open:I}=Object(cA.a)({onDrop:O,accept:["audio/*","video/mp4"],noClick:!0}),j=d<0||d>=c.length,B=Object(a.useCallback)(()=>{const e=c.filter((e,t)=>t!==d);s(e),d>=e.length&&m(e.length-1)},[d,c,s]),N=b(e=>e.convertDialog.visible);if(Object(a.useEffect)(()=>{N&&0===c.length&&h()},[c,N,h]),b(e=>e.appState.vintageMode)){const e={visible:l,format:i,titleFormat:o,files:c,setFiles:s,selectedTrackIndex:d,setSelectedTrack:m,moveFileUp:p,moveFileDown:g,handleClose:h,handleChangeFormat:f,handleChangeTitleFormat:E,handleConvert:w,tracksOrderVisible:v,setTracksOrderVisible:C,handleToggleTracksOrder:k,selectedTrackRef:y,getRootProps:D,getInputProps:S,isDragActive:T,open:I,disableRemove:j,handleRemoveSelectedTrack:B,dialogVisible:N};return n.a.createElement(Da,e)}return n.a.createElement(at.a,{open:l,maxWidth:"xs",fullWidth:!0,TransitionComponent:Sa,"aria-labelledby":"convert-dialog-slide-title","aria-describedby":"convert-dialog-slide-description"},n.a.createElement(rt.a,{id:"convert-dialog-slide-title"},"Upload Settings"),n.a.createElement(lt.a,{className:A.dialogContent},n.a.createElement("div",{className:A.formatAndTitle},n.a.createElement(_e.a,null,n.a.createElement($e.a,{component:"label",variant:"caption",color:"textSecondary"},"Recording Mode"),n.a.createElement(la.a,{value:i,exclusive:!0,onChange:f,size:"small"},n.a.createElement(na.a,{className:A.toggleButton,value:"SP"},"SP"),n.a.createElement(na.a,{className:A.toggleButton,value:"LP2"},"LP2"),n.a.createElement(na.a,{className:A.toggleButton,value:"LP4"},"LP4"))),n.a.createElement("div",{className:A.rightBlock},n.a.createElement(_e.a,{className:A.formControl},n.a.createElement($e.a,{component:"label",variant:"caption",color:"textSecondary"},"Track title"),n.a.createElement(_e.a,{className:A.titleFormControl},n.a.createElement(ia.a,{value:o,color:"secondary",input:n.a.createElement(ra.a,null),onChange:E},n.a.createElement(yt.a,{value:"filename"},"Filename"),n.a.createElement(yt.a,{value:"title"},"Title"),n.a.createElement(yt.a,{value:"album-title"},"Album - Title"),n.a.createElement(yt.a,{value:"artist-title"},"Artist - Title"),n.a.createElement(yt.a,{value:"title-artist"},"Title - Artist"),n.a.createElement(yt.a,{value:"artist-album-title"},"Artist - Album - Title")))))),n.a.createElement(oa.a,{expanded:v,className:A.tracksOrderAccordion,square:!0},n.a.createElement("div",null),n.a.createElement("div",Object.assign({},D(),{style:{outline:"none"}}),n.a.createElement(xA.a,{variant:"dense",className:A.toolbarHighlight},n.a.createElement(Ct.a,{edge:"start","aria-label":"add track",onClick:I},n.a.createElement(gA.a,null)),n.a.createElement(Ct.a,{edge:"start","aria-label":"remove track",onClick:B,disabled:j},n.a.createElement(ga.a,null)),n.a.createElement("div",{className:A.spacer}),n.a.createElement(Ct.a,{edge:"end","aria-label":"move up",onClick:g},n.a.createElement(da.a,null)),n.a.createElement(Ct.a,{edge:"end","aria-label":"move down",onClick:p},n.a.createElement(ua.a,null))),n.a.createElement(ca.a,{className:A.tracksOrderAccordionDetail},n.a.createElement(ha.a,{dense:!0,disablePadding:!1,className:A.trackList},x())),n.a.createElement(Me.a,{className:A.backdrop,open:T},"Drop your Music to add it to the queue"),n.a.createElement("input",S())))),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:k,className:A.showTracksOrderBtn},`${v?"Hide":"Show"} Tracks`),n.a.createElement("div",{className:A.spacer}),n.a.createElement(qe.a,{onClick:h},"Cancel"),n.a.createElement(qe.a,{onClick:w},"Ok")))};var ja=A(165),Ba=A.n(ja),Na=A(166),Ra=A.n(Na),Pa=A(164),Ma=A.n(Pa);function Fa(){return(Fa=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",Fa({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Qa),za=n.a.forwardRef((e,t)=>n.a.createElement(Wa,Fa({svgRef:t},e)));A.p;function La(){return(La=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",La({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Ga),Va=n.a.forwardRef((e,t)=>n.a.createElement(Ua,La({svgRef:t},e)));A.p;function Ha(){return(Ha=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",Ha({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Ja),Ka=n.a.forwardRef((e,t)=>n.a.createElement(Ya,Ha({svgRef:t},e)));A.p;function Za(){return(Za=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",Za({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Xa),$a=n.a.forwardRef((e,t)=>n.a.createElement(qa,Za({svgRef:t},e)));A.p;const _a=Object(Qe.a)(e=>({container:{display:"flex",flex:"1 1 auto",alignItems:"center",[P(e)]:{flexWrap:"wrap"}},lcd:{backgroundColor:"black !important",flex:"1 1 auto",margin:"0 80px 0 0px",minWidth:150,height:48,color:"white !important",fontFamily:"LCDDot"}})),en=e=>{const t=_a();return n.a.createElement("div",{className:t.container},n.a.createElement(ct.c,{onClick:e.handlePrev},n.a.createElement(Ma.a,null)),n.a.createElement(ct.c,{onClick:e.handlePlay},n.a.createElement(IA.a,null)),n.a.createElement(ct.c,{onClick:e.handlePause},n.a.createElement(BA.a,null)),n.a.createElement(ct.c,{onClick:e.handleStop},n.a.createElement(Ba.a,null)),n.a.createElement(ct.c,{onClick:e.handleNext,style:{marginRight:16}},n.a.createElement(Ra.a,null)),n.a.createElement(ct.j,{variant:"well",className:t.lcd},n.a.createElement("div",{className:e.classes.lcdText,style:{left:16,width:"calc(100% - 16px)"}},n.a.createElement("span",{className:e.lcdScroll?e.classes.scrollingStatusMessage:e.classes.statusMessage,ref:e.lcdRef,style:e.message&&e.lcdScroll>0?{animationDuration:`${e.lcdScrollDuration}s`,transform:`translate(-${e.lcdScroll}%)`,top:12}:{top:12}},e.message))))},tn=[za,Va,Ka,$a],An=Object(Qe.a)(e=>({"@keyframes scrollLeft":{from:{transform:"translateX(0%)"},to:{}},"@keyframes blink":{"50%":{visibility:"hidden"}},container:{display:"flex",flex:"1 1 auto",[P(e)]:{flexWrap:"wrap"}},lcd:{flex:"1 1 auto",position:"relative",marginLeft:e.spacing(1.5),marginRight:e.spacing(1.5),paddingLeft:e.spacing(3),paddingRight:e.spacing(3),borderRadius:e.spacing(3),backgroundColor:e.palette.background.default,minWidth:150,height:48,[P(e)]:{marginLeft:0,marginRight:e.spacing(2)}},lcdText:{overflow:"hidden",position:"relative",width:"calc(100% - 40px)",left:40,height:"100%",fontFamily:"LCDDot"},lcdDisc:{position:"absolute",top:0,left:20},lcdDiscIcon:{width:28,height:48,"& g":{fill:e.palette.action.active}},scrollingStatusMessage:{position:"absolute",width:"100%",whiteSpace:"nowrap",animationName:"$scrollLeft",animationTimingFunction:"linear",animationIterationCount:"1",top:15,left:1},statusMessage:{position:"absolute",width:"100%",whiteSpace:"nowrap",top:15,left:1},lcdBlink:{animationName:"$blink",animationTimingFunction:"step-end",animationDuration:"1s",animationIterationCount:"infinite"},button:{}})),an=()=>{var e,t,A;const l=Object(r.d)(),i=b(e=>e.main.deviceStatus),o=b(e=>e.main.disc),c=An(),s=Object(a.useCallback)(()=>{l(Ve("prev"))},[l]),d=Object(a.useCallback)(()=>{l(Ve("play"))},[l]),m=Object(a.useCallback)(()=>{l(Ve("stop"))},[l]),u=Object(a.useCallback)(()=>{l(Ve("next"))},[l]),p=Object(a.useCallback)(()=>{l(Ve("pause"))},[l]);let g="",h=null!==(e=null===i||void 0===i?void 0:i.track)&&void 0!==e?e:null,f=null!==(t=null===i||void 0===i?void 0:i.state)&&void 0!==t?t:null,E=null!==(A=null===i||void 0===i?void 0:i.discPresent)&&void 0!==A&&A,w="paused"===(null===i||void 0===i?void 0:i.state);const v=S(o);if(E){if("readingTOC"===f)g="READING TOC";else if(0===v.length)g="BLANKDISC";else if(i&&null!==i.track&&v[i.track]){let e=v[i.track].fullWidthTitle||v[i.track].title;g=(i.track+1).toString().padStart(3,"0")+(e?" - "+e:"")}}else g="";const[C,k]=Object(a.useState)(0),[y,x]=Object(a.useState)(0),[O,D]=Object(a.useState)(0),T=Object(a.useRef)(null),I=Object(a.useRef)(null);Object(a.useEffect)(()=>(clearTimeout(T.current),k(0),T.current=setTimeout(()=>{(()=>{var e,t,A;const a=I.current,n=null!==(e=null===a||void 0===a?void 0:a.scrollWidth)&&void 0!==e?e:0,l=null!==(t=null===a||void 0===a?void 0:null===(A=a.parentElement)||void 0===A?void 0:A.offsetWidth)&&void 0!==t?t:0,i=n>l?n/20:0;k(n>l?100*n/l:0),x(i),i>0&&(T.current=setTimeout(()=>{k(0)},1e3*i+500))})()},2e3),()=>{clearTimeout(T.current)}),[h,f,g]);const j=Object(a.useRef)(null);Object(a.useEffect)(()=>(clearInterval(j.current),"playing"===f||"readingTOC"===f?j.current=setInterval(()=>{D(1+O%(tn.length-1))},600):D(0),()=>{clearInterval(j.current)}),[f,O]);const B=tn[O];if(b(e=>e.appState.vintageMode)){const e={handlePrev:s,handlePlay:d,handleStop:m,handlePause:p,handleNext:u,message:g,discPresent:E,lcdScroll:C,lcdRef:I,lcdScrollDuration:y,classes:c};return n.a.createElement(en,e)}return n.a.createElement(tt.a,{className:c.container},n.a.createElement(Ct.a,{"aria-label":"prev",onClick:s,className:c.button},n.a.createElement(Ma.a,null)),n.a.createElement(Ct.a,{"aria-label":"play",onClick:d,className:c.button},n.a.createElement(IA.a,null)),n.a.createElement(Ct.a,{"aria-label":"pause",onClick:p,className:c.button},n.a.createElement(BA.a,null)),n.a.createElement(Ct.a,{"aria-label":"stop",onClick:m,className:c.button},n.a.createElement(Ba.a,null)),n.a.createElement(Ct.a,{"aria-label":"next",onClick:u,className:c.button},n.a.createElement(Ra.a,null)),n.a.createElement("div",{className:c.lcd},n.a.createElement("div",{className:c.lcdText},n.a.createElement("span",{className:C?c.scrollingStatusMessage:c.statusMessage,ref:I,style:g&&C>0?{animationDuration:`${y}s`,transform:`translate(-${C}%)`}:{}},g)),n.a.createElement("div",{className:c.lcdDisc},E&&n.a.createElement(B,{className:Object(oA.default)(c.lcdDiscIcon,{[c.lcdBlink]:w})}))))},nn=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("span",{style:{flex:"1 1 auto"}},"Record Selected Tracks"),n.a.createElement(ct.c,{onClick:e.handleClose},n.a.createElement(ft,null))),n.a.createElement(pt,null,n.a.createElement("div",{style:{width:"100%",display:"flex",alignItems:"flex-Start",flexDirection:"column"}},n.a.createElement("p",null,"1. Connect your MD Player line-out to your PC audio line-in."),n.a.createElement("p",null,"2. Use the controls at the bottom right to play some tracks."),n.a.createElement("p",null,"3. Select the input source. You should hear the tracks playing on your PC."),n.a.createElement("p",null,"4. Adjust the input gain and the line-out volume of your device."),n.a.createElement(ct.f,{label:"Input Source",style:{display:"flex",flex:"1 1 auto",margin:"32px 0"}},n.a.createElement(ct.l,{defaultValue:e.inputDeviceId||"",options:e.devices.concat([{deviceId:"",label:"None"}]).map(({deviceId:e,label:t})=>({value:e,label:t})),onChange:e.handleChange,width:200})),n.a.createElement(an,null)),n.a.createElement(ut,null,n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(gt,{onClick:e.handleClose},"Cancel"),n.a.createElement(gt,{onClick:e.handleStartTransfer,disabled:""===e.inputDeviceId},"Start Record"))))):null,ln=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),rn=Object(Qe.a)(e=>({container:{display:"flex",flexDirection:"row",alignItems:"flex-end",justifyContent:"space-between",marginRight:-e.spacing(2),flexFlow:"wrap"},formControl:{minWidth:120},selectEmpty:{marginTop:e.spacing(2)},head:{textShadow:"0px 0px 12px rgba(150, 150, 150, 1)",fontSize:e.typography.h2.fontSize,textAlign:"center",marginBottom:e.spacing(2)}})),on=({trackIndexes:e})=>{const t=Object(r.d)(),A=rn(),[l,i]=Object(a.useState)([]),[o,c]=Object(a.useState)("");let{visible:s}=b(e=>e.dumpDialog);const m=Object(a.useCallback)(()=>{var e;c(""),null===(e=L.mediaRecorderService)||void 0===e||e.stopTestInput(),t(ge.setVisible(!1))},[t]),u=Object(a.useCallback)(e=>{var t,A;const a=e.target.value;c(a),null===(t=L.mediaRecorderService)||void 0===t||t.stopTestInput(),null===(A=L.mediaRecorderService)||void 0===A||A.playTestInput(a)},[c]),p=Object(a.useCallback)(()=>{var A,a;t((A=e,a=o,async function(e,t){e(Object(V.batchActions)([Ee.setVisible(!0),Ee.setProgress({trackTotal:A.length,trackDone:0,trackCurrent:0,titleCurrent:""})]));let n=t().main.disc,l=Object(d.getTracks)(n).filter(e=>A.indexOf(e.index)>=0);const{netmdService:i,mediaRecorderService:r}=L;await L.netmdService.stop();for(let[A,c]of l.entries()){var o;e(Ee.setProgress({trackTotal:l.length,trackDone:A,trackCurrent:-1,titleCurrent:null!==(o=c.title)&&void 0!==o?o:""})),await i.gotoTrack(c.index),await i.play(),console.log("Waiting for track to be ready to play");let t=await i.getPosition(),n=[c.index,0,0,1];for(;null===t||!n.every((e,A)=>n[A]===t[A]);)await h(250),t=await i.getPosition();await i.pause(),await(null===i||void 0===i?void 0:i.gotoTrack(c.index)),console.log("Track is ready to play"),await(null===r||void 0===r?void 0:r.initStream(a)),await(null===r||void 0===r?void 0:r.startRecording()),await i.play();let s=c.duration/512;await f(1e3*s,t=>{var a;e(Ee.setProgress({trackTotal:l.length,trackDone:A,trackCurrent:t,titleCurrent:null!==(a=c.title)&&void 0!==a?a:""}))}),await(null===r||void 0===r?void 0:r.stopRecording()),null===r||void 0===r||r.downloadRecorded(`${c.title}`),await(null===r||void 0===r?void 0:r.closeStream())}await i.stop(),e(Ee.setVisible(!1))})),m()},[e,o,t,m]);if(Object(a.useEffect)(()=>{s&&async function(){await navigator.mediaDevices.getUserMedia({audio:!0});let e=(await navigator.mediaDevices.enumerateDevices()).filter(e=>"audioinput"===e.kind).map(e=>({deviceId:e.deviceId,label:e.label}));i(e)}()},[s,i]),b(e=>e.appState.vintageMode)){const e={handleClose:m,handleChange:u,handleStartTransfer:p,visible:s,devices:l,inputDeviceId:o};return n.a.createElement(nn,e)}return n.a.createElement(at.a,{open:s,maxWidth:"sm",fullWidth:!0,TransitionComponent:ln,"aria-labelledby":"dump-dialog-slide-title","aria-describedby":"dump-dialog-slide-description"},n.a.createElement(rt.a,{id:"dump-dialog-slide-title"},"Record Selected Tracks"),n.a.createElement(lt.a,null,n.a.createElement($e.a,{component:"p",variant:"h2",className:A.head},"\ud83d\udcbb \u2b05 \ud83d\udcbd"),n.a.createElement($e.a,{component:"p",variant:"body2"},"1. Connect your MD Player line-out to your PC audio line-in."),n.a.createElement($e.a,{component:"p",variant:"body2"},"2. Use the controls at the bottom right to play some tracks."),n.a.createElement($e.a,{component:"p",variant:"body2"},"3. Select the input source. You should hear the tracks playing on your PC."),n.a.createElement($e.a,{component:"p",variant:"body2"},"4. Adjust the input gain and the line-out volume of your device."),n.a.createElement(tt.a,{className:A.container},n.a.createElement(_e.a,{className:A.formControl},n.a.createElement(ia.a,{value:o,onChange:u,displayEmpty:!0,className:A.selectEmpty},n.a.createElement(yt.a,{value:"",disabled:!0},"Input Source"),l.map(e=>n.a.createElement(yt.a,{key:e.deviceId,value:e.deviceId},e.label))),n.a.createElement(et.a,null,"Input Source")),n.a.createElement(an,null))),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:m},"Cancel"),n.a.createElement(qe.a,{onClick:p,disabled:""===o},"Start Record")))};var cn=A(311),sn=A.n(cn),dn=A(312),mn=A.n(dn),un=A(313),pn=A.n(un),gn=A(314),hn=A.n(gn),fn=A(315),bn=A.n(fn);const En=Object(Qe.a)(e=>({container:{width:"100%",flex:"1 1 auto",display:"flex",minHeight:0,"& > div":{display:"flex",flexDirection:"column",width:"100%"}},table:{height:"100%",width:"100%",display:"flex !important",flexDirection:"column"},windowContent:{flex:"1 1 auto",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",minHeight:0},controlsContainer:{width:"100%",marginTop:16},toolbarIcon:{marginRight:4},toolbarItem:{padding:"6px 10px"}})),wn=e=>{var t,A,l;const i=En(),r=Object(a.useContext)(st.a),{mainView:o}=b(e=>e.appState);return n.a.createElement(n.a.Fragment,null,n.a.createElement(ct.e,null),n.a.createElement(ct.t,{style:{flexWrap:"wrap",position:"relative"}},0===e.selectedCount?n.a.createElement(n.a.Fragment,null,n.a.createElement("img",{alt:"device",src:hn.a,style:{marginTop:-10,marginLeft:10}}),n.a.createElement("div",{className:i.toolbarItem},`${e.deviceName}: (`||"Loading...",(null===(t=e.disc)||void 0===t?void 0:t.fullWidthTitle)&&`${null===(A=e.disc)||void 0===A?void 0:A.fullWidthTitle} / `,(null===(l=e.disc)||void 0===l?void 0:l.title)||"Untitled Disc",")"),n.a.createElement(ct.b,{size:35}),n.a.createElement("img",{alt:"minidisc",src:bn.a,style:{width:32,marginLeft:10}}),null!==e.disc?n.a.createElement(ct.u,{text:`${Object(d.formatTimeFromFrames)(2*e.disc.left,!1)} in LP2 or ${Object(d.formatTimeFromFrames)(4*e.disc.left,!1)} in LP4`,enterDelay:100,leaveDelay:500},n.a.createElement("div",{className:i.toolbarItem},`${Object(d.formatTimeFromFrames)(e.disc.left,!1)} left of ${Object(d.formatTimeFromFrames)(e.disc.total,!1)} `)):null):null,e.selectedCount>0?n.a.createElement(n.a.Fragment,null,n.a.createElement(ct.c,{variant:"menu",disabled:1!==e.selectedCount,onClick:e.handleShowMoveMenu},n.a.createElement("img",{alt:"move",src:mn.a,className:i.toolbarIcon}),"Move"),n.a.createElement(ct.c,{variant:"menu",onClick:e.handleShowDumpDialog},n.a.createElement("img",{alt:"record",src:sn.a,className:i.toolbarIcon}),"Record"),n.a.createElement(ct.c,{variant:"menu",onClick:e.handleDeleteSelected},n.a.createElement("img",{alt:"delete",src:ya.a,className:i.toolbarIcon}),"Delete"),n.a.createElement(ct.c,{variant:"menu",onClick:e.handleRenameActionClick,disabled:e.selectedCount>1},n.a.createElement("img",{alt:"rename",src:pn.a,className:i.toolbarIcon}),"Rename"),e.moveMenuAnchorEl?n.a.createElement(ct.h,{style:{position:"absolute",left:16,top:32,zIndex:2}},Array(e.tracks.length).fill(null).map((t,A)=>n.a.createElement(ct.i,{key:`pos-${A}`,onClick:()=>e.handleMoveSelectedTrack(A)},A+1))):null):null,n.a.createElement(ct.b,{size:35})),n.a.createElement(ct.e,null),n.a.createElement(ct.w,{className:i.windowContent},n.a.createElement("div",Object.assign({className:i.container},e.getRootProps(),{style:{outline:"none"}}),n.a.createElement("input",e.getInputProps()),n.a.createElement(ct.m,{className:i.table},n.a.createElement(ct.p,null,n.a.createElement(ct.r,{head:!0,style:{display:"flex"}},n.a.createElement(ct.q,{style:{width:"2ch"}},"#"),n.a.createElement(ct.q,{style:{textAlign:"left",flex:"1 1 auto"}},"Title"),n.a.createElement(ct.q,{style:{textAlign:"right",width:"20%"}},"Duration"))),n.a.createElement(ct.n,null,e.tracks.map(t=>n.a.createElement(ht,{style:e.selected.includes(t.index)?r.selectedTableRow:{},key:t.index,onDoubleClick:A=>e.handleRenameTrack(A,t.index),onClick:A=>e.handleSelectTrackClick(A,t.index)},n.a.createElement(ct.o,{style:{textAlign:"center",width:"2ch"}},t.index+1),n.a.createElement(ct.o,{style:{width:"80%"}},n.a.createElement("div",null,t.fullWidthTitle&&`${t.fullWidthTitle} / `,t.title||"No Title")),n.a.createElement(ct.o,{style:{textAlign:"right",width:"20%"}},n.a.createElement("span",null,t.encoding),"\xa0",n.a.createElement("span",null,t.duration))))))),n.a.createElement("div",{className:i.controlsContainer},"MAIN"===o?n.a.createElement(an,null):null)),n.a.createElement(bt,{onClick:e.open}),n.a.createElement(ZA,null),n.a.createElement(GA,null),n.a.createElement(ta,null),n.a.createElement(Ia,{files:e.uploadedFiles}),n.a.createElement(_A,null),n.a.createElement(on,{trackIndexes:e.selected}),n.a.createElement(vt,null),n.a.createElement(aa,null))},vn=Object(Qe.a)(e=>({add:{position:"absolute",bottom:e.spacing(3),right:e.spacing(3),[P(e)]:{bottom:e.spacing(2)}},main:{overflowY:"auto",flex:"1 1 auto",marginBottom:e.spacing(3),outline:"none",marginLeft:e.spacing(-1),marginRight:e.spacing(-1),[R(e)]:{marginLeft:e.spacing(-2),marginRight:e.spacing(-2)}},toolbar:{marginTop:e.spacing(3),marginLeft:e.spacing(-2),marginRight:e.spacing(-2),[e.breakpoints.up(600+2*e.spacing(2))]:{marginLeft:e.spacing(-3),marginRight:e.spacing(-3)}},toolbarLabel:{flex:"1 1 100%"},toolbarHighlight:"light"===e.palette.type?{color:e.palette.secondary.main,backgroundColor:Object(dA.d)(e.palette.secondary.light,.85)}:{color:e.palette.text.primary,backgroundColor:e.palette.secondary.dark},headBox:{display:"flex",justifyContent:"space-between"},spacing:{marginTop:e.spacing(1)},indexCell:{whiteSpace:"nowrap",paddingRight:0,width:e.spacing(4)},backdrop:{zIndex:e.zIndex.drawer+1,color:"#fff"},remainingTimeTooltip:{textDecoration:"underline",textDecorationStyle:"dotted"},hoveringOverGroup:{backgroundColor:`${Object(mA.alpha)(e.palette.secondary.dark,.4)}`},dragHandleEmpty:{width:20,padding:`${e.spacing(.5)}px 0 0 0`}}));function Cn(e,t){return t&&e.index===t.track?"playing"===t.state?"playing":"paused"===t.state?"paused":"none":"none"}const kn=e=>{let t=Object(r.d)();const A=b(e=>e.main.disc),l=b(e=>e.main.deviceName),i=b(e=>e.main.deviceStatus),{vintageMode:o}=b(e=>e.appState),[c,s]=n.a.useState([]),[m,u]=n.a.useState([]),[p,g]=Object(a.useState)(-1),[h,f]=n.a.useState(null),E=Object(a.useCallback)(e=>{f(e.currentTarget)},[f]),w=Object(a.useCallback)(()=>{f(null)},[f]),v=Object(a.useCallback)(e=>{t(function(e,t){return async function(A){const{netmdService:a}=L;await a.moveTrack(e,t),Je()(A)}}(c[0],e)),w()},[t,c,w]),C=Object(a.useCallback)((e,A)=>{if(!e.destination)return;let a=parseInt(e.source.droppableId),n=e.source.index,l=parseInt(e.destination.droppableId),i=e.destination.index;t(function(e,t,A,a){return async function(n,l){if(e===A&&t===a)return;n(xe.setLoading(!0));const i=T(await L.netmdService.listContent());let r,o,c,s,d,m,u=i[e].tracks.splice(t,1)[0];eA?(o=A,s=a,c=e,d=t,m=1):t{t(ge.setVisible(!0))},[t]);Object(a.useEffect)(()=>{t(Je())},[t]),Object(a.useEffect)(()=>{s([])},[A]);const y=Object(a.useCallback)((e,A)=>{u(e),t(se.setVisible(!0))},[t]),{getRootProps:x,getInputProps:O,isDragActive:D,open:I}=Object(cA.a)({onDrop:y,accept:["audio/*","video/mp4"],noClick:!0}),j=vn(),N=Object(a.useMemo)(()=>S(A),[A]),R=Object(a.useMemo)(()=>T(A),[A]),P=Object(a.useCallback)((e,t)=>{if(e.shiftKey&&c.length&&-1!==p){let e=Math.min(p+1,t),A=Math.max(p-1,t),a=[...c];for(let t=e;t<=A;t++){let e=a.indexOf(t);-1===e?a.push(t):a.splice(e,1)}a.includes(t)||a.push(t),s(a)}else c.includes(t)?s(c.filter(e=>e!==t)):s([...c,t]);g(t)},[c,s,p,g]),M=Object(a.useCallback)(e=>{c.lengthe.index)):s([])},[c,N]),F=Object(a.useCallback)((e,A)=>{let a=N.find(e=>e.index===A);a&&t(Object(V.batchActions)([q.setVisible(!0),q.setGroupIndex(null),q.setCurrentName(a.title),q.setCurrentFullWidthName(a.fullWidthTitle),q.setIndex(a.index)]))},[t,N]),Q=Object(a.useCallback)((e,A)=>{var a,n;let l=R.find(e=>e.index===A);l&&t(Object(V.batchActions)([q.setVisible(!0),q.setGroupIndex(A),q.setCurrentName(null!==(a=l.title)&&void 0!==a?a:""),q.setCurrentFullWidthName(null!==(n=l.fullWidthTitle)&&void 0!==n?n:""),q.setIndex(-1)]))},[t,R]),W=Object(a.useCallback)(e=>{1===e.detail&&F(e,c[0])},[F,c]),z=Object(a.useCallback)(e=>{var A;t((A=c,async function(e){if(!window.confirm(`Proceed with Delete Track${1!==A.length?"s":""}? This operation cannot be undone.`))return;const{netmdService:t}=L;e(xe.setLoading(!0)),await t.deleteTracks(A),Je()(e)}))},[t,c]),G=Object(a.useCallback)(e=>{var A;t((A=c,async function(e){let t=A[0],a=A[A.length-1]-t+1;const{netmdService:n}=L;n.addGroup(t,a,""),Je()(e)}))},[t,c]),U=Object(a.useCallback)((e,A)=>{t(function(e){return async function(t){const{netmdService:A}=L;A.deleteGroup(e),Je()(t)}}(A))},[t]),H=Object(a.useCallback)((e,A)=>{i&&(i.track!==A?(t(Ve("goto",A)),"playing"!==i.state&&t(Ve("play"))):"playing"===i.state&&t(Ve("pause")))},[t,i]),J=Object(a.useMemo)(()=>N.filter(e=>null===e.group&&c.includes(e.index)).length===c.length&&B(c.sort((e,t)=>e-t)),[N,c]),Y=c.length;if(o){const e={disc:A,deviceName:l,selected:c,setSelected:s,selectedCount:Y,tracks:N,uploadedFiles:m,setUploadedFiles:u,onDrop:y,getRootProps:x,getInputProps:O,isDragActive:D,open:I,moveMenuAnchorEl:h,setMoveMenuAnchorEl:f,handleShowMoveMenu:E,handleCloseMoveMenu:w,handleMoveSelectedTrack:v,handleShowDumpDialog:k,handleDeleteSelected:z,handleRenameActionClick:W,handleRenameTrack:F,handleSelectAllClick:M,handleSelectTrackClick:P};return n.a.createElement(wn,e)}return n.a.createElement(n.a.Fragment,null,n.a.createElement(tt.a,{className:j.headBox},n.a.createElement($e.a,{component:"h1",variant:"h4"},l||"Loading..."),n.a.createElement(_t,null)),n.a.createElement($e.a,{component:"h2",variant:"body2"},null!==A?n.a.createElement(n.a.Fragment,null,n.a.createElement("span",null,`${Object(d.formatTimeFromFrames)(A.left,!1)} left of ${Object(d.formatTimeFromFrames)(A.total,!1)} `),n.a.createElement(It.a,{title:n.a.createElement(n.a.Fragment,null,n.a.createElement("span",null,`${Object(d.formatTimeFromFrames)(2*A.left,!1)} left in LP2 Mode`),n.a.createElement("br",null),n.a.createElement("span",null,`${Object(d.formatTimeFromFrames)(4*A.left,!1)} left in LP4 Mode`)),arrow:!0},n.a.createElement("span",{className:j.remainingTimeTooltip},"SP Mode"))):"Loading..."),n.a.createElement(xA.a,{className:Object(oA.default)(j.toolbar,{[j.toolbarHighlight]:Y>0})},Y>0?n.a.createElement(HA.a,{indeterminate:Y>0&&Y0,onChange:M,inputProps:{"aria-label":"select all tracks"}}):null,Y>0?n.a.createElement($e.a,{className:j.toolbarLabel,color:"inherit",variant:"subtitle1"},Y," selected"):n.a.createElement($e.a,{component:"h3",variant:"h6",className:j.toolbarLabel},(null===A||void 0===A?void 0:A.fullWidthTitle)&&`${A.fullWidthTitle} / `,(null===A||void 0===A?void 0:A.title)||"Untitled Disc"),Y>0?n.a.createElement(n.a.Fragment,null,n.a.createElement(It.a,{title:"Record from MD"},n.a.createElement(qe.a,{"aria-label":"Record",onClick:k},"Record"))):null,Y>0?n.a.createElement(It.a,{title:"Delete"},n.a.createElement(Ct.a,{"aria-label":"delete",onClick:z},n.a.createElement(fA.a,null))):null,Y>0?n.a.createElement(It.a,{title:J?"Group":""},n.a.createElement(Ct.a,{"aria-label":"group",disabled:!J,onClick:G},n.a.createElement(EA.a,null))):null,Y>0?n.a.createElement(It.a,{title:"Rename"},n.a.createElement(Ct.a,{"aria-label":"rename",disabled:1!==Y,onClick:W},n.a.createElement(Rt.a,null))):null),n.a.createElement(tt.a,Object.assign({className:j.main},x(),{id:"main"}),n.a.createElement("input",O()),n.a.createElement(wA.a,{size:"small"},n.a.createElement(kA.a,null,n.a.createElement(yA.a,null,n.a.createElement(CA.a,{className:j.dragHandleEmpty}),n.a.createElement(CA.a,{className:j.indexCell},"#"),n.a.createElement(CA.a,null,"Title"),n.a.createElement(CA.a,{align:"right"},"Duration"))),n.a.createElement(sA.a,{onDragEnd:C},n.a.createElement(vA.a,null,R.map((e,t)=>n.a.createElement(yA.a,{key:`${t}`},n.a.createElement(CA.a,{colSpan:4,style:{padding:"0"}},n.a.createElement(wA.a,{size:"small"},n.a.createElement(sA.c,{droppableId:`${t}`,key:`${t}`},(t,A)=>n.a.createElement(vA.a,Object.assign({},t.droppableProps,{ref:t.innerRef,className:Object(oA.default)({[j.hoveringOverGroup]:A.isDraggingOver})}),null!==e.title&&n.a.createElement(FA,{group:e,onRename:Q,onDelete:U}),null===e.title&&0===e.tracks.length&&n.a.createElement(yA.a,{style:{height:"1px"}}),e.tracks.map((t,A)=>n.a.createElement(sA.b,{draggableId:`${e.index}-${t.index}`,key:`t-${t.index}`,index:A},A=>n.a.createElement(MA,{track:t,draggableProvided:A,inGroup:null!==e.title,isSelected:c.includes(t.index),trackStatus:Cn(t,i),onSelect:P,onRename:F,onTogglePlayPause:H}))),t.placeholder))))))))),D?n.a.createElement(Me.a,{className:j.backdrop,open:D},"Drop your Music to Upload"):null),n.a.createElement(uA.a,{color:"primary","aria-label":"add",className:j.add,onClick:I},n.a.createElement(gA.a,null)),n.a.createElement(ZA,null),n.a.createElement(GA,null),n.a.createElement(ta,null),n.a.createElement(Ia,{files:m}),n.a.createElement(_A,null),n.a.createElement(on,{trackIndexes:c}),n.a.createElement(vt,null),n.a.createElement(aa,null))};var yn=A(586),xn=A(317),On=A.n(xn),Dn=A(318),Sn=A.n(Dn);const Tn=st.c` +`,Et=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("span",{style:{flex:"1 1 auto"}},"About Web MiniDisc"),n.a.createElement(ct.c,{onClick:e.handleClose},n.a.createElement(ft,null))),n.a.createElement(pt,null,"Web MiniDisc uses",n.a.createElement("ul",null,n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://www.ffmpeg.org/",target:"_blank"},"FFmpeg")," ","and"," ",n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/ffmpegjs/FFmpeg",target:"_blank"},"ffmpegjs"),", to read your audio files (wav, mp3, ogg, mp4, etc...)."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/dcherednik/atracdenc/",target:"_blank"},"Atracdenc"),", to support atrac3 encoding (lp2, lp4 audio formats)."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://emscripten.org/",target:"_blank"},"Emscripten"),", to run both FFmpeg and Atracdenc in the browser."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/netmd-js",target:"_blank"},"netmd-js"),", to send commands to NetMD devices using Javascript."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://github.com/glaubitz/linux-minidisc",target:"_blank"},"linux-minidisc"),", to make the netmd-js project possible."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://react95.io/",target:"_blank"},"react85"),", to build the vintage user interface."),n.a.createElement("li",null,n.a.createElement(ct.a,{rel:"noopener noreferrer",href:"https://material-ui.com/",target:"_blank"},"material-ui"),", to build the user interface.")),n.a.createElement(ut,null,n.a.createElement(gt,{onClick:e.handleClose},"OK"))))):null,wt=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),vt=e=>{const t=Object(r.d)();let A=b(e=>e.appState.aboutDialogVisible);const a=()=>{t(xe.showAboutDialog(!1))};if(b(e=>e.appState.vintageMode)){const e={visible:A,handleClose:a};return n.a.createElement(Et,e)}return n.a.createElement(at.a,{open:A,maxWidth:"sm",fullWidth:!0,TransitionComponent:wt,"aria-labelledby":"about-dialog-slide-title"},n.a.createElement(rt.a,{id:"about-dialog-slide-title"},"About Web MiniDisc"),n.a.createElement(lt.a,null,n.a.createElement(it.a,null,"Web MiniDisc uses"),n.a.createElement("ul",null,n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://www.ffmpeg.org/",target:"_blank"},"FFmpeg")," ","and"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/ffmpegjs/FFmpeg",target:"_blank"},"ffmpegjs"),", to read your audio files (wav, mp3, ogg, mp4, etc...)."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/dcherednik/atracdenc/",target:"_blank"},"Atracdenc"),", to support atrac3 encoding (lp2, lp4 audio formats)."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://emscripten.org/",target:"_blank"},"Emscripten"),", to run both FFmpeg and Atracdenc in the browser."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/netmd-js",target:"_blank"},"netmd-js"),", to send commands to NetMD devices using Javascript."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/glaubitz/linux-minidisc",target:"_blank"},"linux-minidisc"),", to make the netmd-js project possible."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://react95.io/",target:"_blank"},"react95"),", to build the vintage user interface."),n.a.createElement("li",null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://material-ui.com/",target:"_blank"},"material-ui"),", to build the user interface.")),n.a.createElement(it.a,null,"Attribution"),n.a.createElement("ul",null,n.a.createElement("li",null,"MiniDisc logo from"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://en.wikipedia.org/wiki/MiniDisc",target:"_blank"},"https://en.wikipedia.org/wiki/MiniDisc")),n.a.createElement("li",null,"MiniDisc icon from"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://www.deviantart.com/blinkybill/art/Sony-MiniDisc-Plastic-Icon-473812540",target:"_blank"},"http://fav.me/d7u3g3g")))),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:a},"Close")))};var kt=A(592),Ct=A(322),yt=A(631),xt=A(634),Ot=A(300),Dt=A.n(Ot),St=A(632),Tt=A(633),It=A(662),jt=A(293),Bt=A.n(jt),Nt=A(158),Rt=A.n(Nt),Pt=A(299),Mt=A.n(Pt),Ft=A(294),Qt=A.n(Ft),Wt=A(295),zt=A.n(Wt),Lt=A(297),Gt=A.n(Lt),Ut=A(202),Vt=A.n(Ut),Ht=A(201),Jt=A.n(Ht),Yt=A(292),Kt=A.n(Yt),Zt=A(298),Xt=A.n(Zt);const qt=e=>{const t=[];return"MAIN"===e.mainView&&(t.push(n.a.createElement(ct.i,{key:"update",onClick:e.handleRefresh},"Reload TOC")),t.push(n.a.createElement(ct.i,{key:"title",onClick:e.handleRenameDisc},"Rename Disc")),t.push(n.a.createElement(ct.i,{key:"wipe",onClick:e.handleWipeDisc},"Wipe Disc")),t.push(n.a.createElement(ct.i,{key:"vintage",onClick:e.handleVintageMode},n.a.createElement(ct.d,{checked:!0,name:"vintageMode",variant:"menu",value:"vintageMode",label:"Retro Mode (beta)",defaultChecked:!0}))),t.push(n.a.createElement(ct.e,{key:"d1"})),t.push(n.a.createElement(ct.i,{key:"exit",onClick:e.handleExit},"Exit")),t.push(n.a.createElement(ct.e,{key:"d2"}))),t.push(n.a.createElement(ct.i,{key:"about",onClick:e.handleShowAbout},"About...")),t.push(n.a.createElement(ct.i,{key:"menu-gh"},n.a.createElement("a",{rel:"noopener noreferrer",href:"https://github.com/cybercase/webminidisc",target:"_blank"},"Fork me on GitHub"))),n.a.createElement(ct.h,{style:{position:"absolute",left:"0",top:"100%",zIndex:"9999"},onClick:e.onClick},t)},$t=Object(Qe.a)(e=>({listItemIcon:{minWidth:e.spacing(5)},toolTippedText:{textDecoration:"underline",textDecorationStyle:"dotted"}})),_t=function(e){const t=$t(),A=Object(r.d)();let{mainView:l,darkMode:i,vintageMode:o,fullWidthSupport:c}=b(e=>e.appState),s=b(e=>{var t,A;return null!==(t=null===(A=e.main.disc)||void 0===A?void 0:A.title)&&void 0!==t?t:""}),d=b(e=>{var t,A;return null!==(t=null===(A=e.main.disc)||void 0===A?void 0:A.fullWidthTitle)&&void 0!==t?t:""});const m=n.a.useRef(null),u=n.a.useRef(null),[p,g]=n.a.useState(null),h=Boolean(p),f=Object(a.useCallback)(e=>{g(e.currentTarget)},[g]),E=Object(a.useCallback)(()=>{A(xe.setDarkMode(!i))},[A,i]),w=Object(a.useCallback)(()=>{A(xe.setVintageMode(!o))},[A,o]),v=Object(a.useCallback)(()=>{g(null)},[g]),k=Object(a.useCallback)(()=>{A((async function(e){if(!window.confirm("Proceed with Wipe Disc? This operation cannot be undone."))return;const{netmdService:t}=L;e(xe.setLoading(!0)),await t.wipeDisc(),Je()(e)})),v()},[A,v]),C=Object(a.useCallback)(()=>{A(xe.setFullWidthSupport(!c))},[A,c]),y=Object(a.useCallback)(()=>{A(Je()),v()},[A,v]),x=Object(a.useCallback)(()=>{A(Object(V.batchActions)([q.setVisible(!0),q.setCurrentName(s),q.setGroupIndex(null),q.setCurrentFullWidthName(d),q.setIndex(-1)])),v()},[A,v,s,d]),O=Object(a.useCallback)(()=>{A(xe.setMainView("WELCOME")),v()},[A,v]),D=Object(a.useCallback)(()=>{A(xe.showAboutDialog(!0)),v()},[A,v]),S=Object(a.useCallback)(e=>{var t;(e.stopPropagation(),e.target!==m.current)&&(null===(t=m.current)||void 0===t||t.click());v()},[v]),T=Object(a.useCallback)(e=>{var t;(e.stopPropagation(),e.target!==u.current)&&(null===(t=u.current)||void 0===t||t.click());v()},[v]),I=[];if("MAIN"===l&&(I.push(n.a.createElement(yt.a,{key:"update",onClick:y},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Bt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Reload TOC"))),I.push(n.a.createElement(yt.a,{key:"title",onClick:x},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Rt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Rename Disc"))),I.push(n.a.createElement(yt.a,{key:"wipe",onClick:k},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Qt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Wipe Disc"))),I.push(n.a.createElement(yt.a,{key:"exit",onClick:O},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(zt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Exit")))),"MAIN"===l&&(I.push(n.a.createElement(xt.a,{key:"action-divider"})),I.push(n.a.createElement(yt.a,{key:"allowFullWidth",onClick:C},n.a.createElement(St.a,{className:t.listItemIcon},c?n.a.createElement(Jt.a,{fontSize:"small"}):n.a.createElement(Vt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,c?"Disable ":"Enable ",n.a.createElement(It.a,{title:"This advanced feature enables the use of Hiragana and Kanji alphabets. More about this in Support and FAQ.",arrow:!0},n.a.createElement("span",{className:t.toolTippedText},"Full-Width Title Editing")))))),I.push(n.a.createElement(yt.a,{key:"darkMode",onClick:E},n.a.createElement(St.a,{className:t.listItemIcon},i?n.a.createElement(Jt.a,{fontSize:"small"}):n.a.createElement(Vt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"Dark Mode"))),"MAIN"===l&&I.push(n.a.createElement(yt.a,{key:"vintageMode",onClick:w},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement("img",{alt:"Windows 95",src:Kt.a,width:"24px",height:"24px"})),n.a.createElement(Tt.a,null,"Retro Mode (beta)"))),"MAIN"===l&&I.push(n.a.createElement(xt.a,{key:"feature-divider"})),I.push(n.a.createElement(yt.a,{key:"about",onClick:D},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Gt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,"About"))),I.push(n.a.createElement(yt.a,{key:"support",onClick:T},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Xt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ",target:"_blank",ref:u,onClick:T},"Support and FAQ")))),I.push(n.a.createElement(yt.a,{key:"github",onClick:S},n.a.createElement(St.a,{className:t.listItemIcon},n.a.createElement(Mt.a,{fontSize:"small"})),n.a.createElement(Tt.a,null,n.a.createElement(At.a,{rel:"noopener noreferrer",href:"https://github.com/cybercase/webminidisc",target:"_blank",ref:m,onClick:S},"Fork me on GitHub")))),o){const t={mainView:l,onClick:e.onClick,handleWipeDisc:k,handleRefresh:y,handleRenameDisc:x,handleExit:O,handleShowAbout:D,handleVintageMode:w};return n.a.createElement(qt,t)}return n.a.createElement(n.a.Fragment,null,n.a.createElement(kt.a,{"aria-label":"actions","aria-controls":"actions-menu","aria-haspopup":"true",onClick:f},n.a.createElement(Dt.a,null)),n.a.createElement(Ct.a,{id:"actions-menu",anchorEl:p,keepMounted:!0,open:h,onClose:v},I))};var eA=A(301),tA=A.n(eA);const AA=Object(Qe.a)(e=>({pairingMessage:{color:"red",marginTop:e.spacing(1)},windowContent:{flex:"1 1 auto",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center"}})),aA=e=>{let{dispatch:t,pairingFailed:A,pairingMessage:a}=e;const l=AA();return n.a.createElement(n.a.Fragment,null,n.a.createElement(ct.w,{className:l.windowContent},n.a.createElement("p",{style:{paddingBottom:8}},"Press the button to connect to a NetMD device"),n.a.createElement(ct.c,{style:{minWidth:90},onClick:()=>t(He())},"Connect"),n.a.createElement("p",{style:{visibility:A?"visible":"hidden"},className:l.pairingMessage},a)),n.a.createElement(vt,null))};var nA=A(302),lA=A.n(nA);const iA=Object(Qe.a)(e=>({main:{position:"relative",flex:"1 1 auto",display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"},button:{marginTop:e.spacing(3),minWidth:150},spacing:{marginTop:e.spacing(1)},chromeLogo:{marginTop:e.spacing(1),width:96,height:96},why:{alignSelf:"flex-start",marginTop:e.spacing(3)},headBox:{display:"flex",justifyContent:"space-between"},connectContainer:{flex:"1 1 auto",display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"},supportContainer:{flex:"1 1 auto",display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"}})),rA=e=>{const t=iA(),A=Object(r.d)(),{browserSupported:l,pairingFailed:i,pairingMessage:o,vintageMode:c}=b(e=>e.appState);o.toLowerCase().match(/denied/);const[s,d]=Object(a.useState)(!1);if(c){const e={dispatch:A,pairingFailed:i,pairingMessage:o};return n.a.createElement(aA,e)}return n.a.createElement(n.a.Fragment,null,n.a.createElement(tt.a,{className:t.headBox},n.a.createElement($e.a,{component:"h1",variant:"h4"},"Web MiniDisc"),n.a.createElement(_t,null)),n.a.createElement($e.a,{component:"h2",variant:"body2"},"Brings NetMD Devices to the Web"),n.a.createElement(tt.a,{className:t.main},l?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:t.connectContainer},n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},"Press the button to connect to a NetMD device"),n.a.createElement(qe.a,{variant:"contained",color:"primary",onClick:()=>A(He()),className:t.button},"Connect"),n.a.createElement(_e.a,{error:!0,className:t.spacing,style:{visibility:i?"visible":"hidden"}},n.a.createElement(et.a,null,o))),n.a.createElement("div",null,n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ"},n.a.createElement("span",{style:{verticalAlign:"middle"}},"Support and FAQ")," ",n.a.createElement(lA.a,{style:{verticalAlign:"middle"},fontSize:"inherit"}))))):n.a.createElement(n.a.Fragment,null,n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},"This Web browser is not supported.\xa0",n.a.createElement(At.a,{rel:"noopener noreferrer",href:"#",onClick:e=>{e.preventDefault(),d(!0)}},"Learn Why")),n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://www.google.com/chrome/"},n.a.createElement("img",{alt:"Chrome Logo",src:tA.a,className:t.chromeLogo})),n.a.createElement($e.a,{component:"h2",variant:"subtitle1",align:"center",className:t.spacing},"Try using"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://www.google.com/chrome/"},"Chrome")," ","instead"),s?n.a.createElement(n.a.Fragment,null,n.a.createElement($e.a,{component:"p",variant:"body2",className:t.why},"Web MiniDisc requires a browser that supports both"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://wicg.github.io/webusb/"},"WebUSB")," ","and"," ",n.a.createElement(At.a,{rel:"noopener noreferrer",target:"_blank",href:"https://webassembly.org/"},"WebAssembly"),"."),n.a.createElement("ul",null,n.a.createElement("li",null,"WebUSB is needed to control the NetMD device via the USB connection to your computer."),n.a.createElement("li",null,"WebAssembly is used to convert the music to a MiniDisc compatible format"))):null)),n.a.createElement(vt,null))};var oA=A(4),cA=A(167),sA=A(168),dA=A(13),mA=A(200),uA=A(653),pA=A(163),gA=A.n(pA),hA=A(160),fA=A.n(hA),bA=A(316),EA=A.n(bA),wA=A(650),vA=A(652),kA=A(642),CA=A(651),yA=A(641),xA=A(648),OA=A(203),DA=A(304),SA=A.n(DA),TA=A(102),IA=A.n(TA),jA=A(103),BA=A.n(jA),NA=A(305),RA=A.n(NA);const PA=Object(Qe.a)(e=>({currentTrackRow:{color:e.palette.primary.main,"& > td":{color:"inherit"}},inGroupTrackRow:{"& > $indexCell":{transform:`translateX(${e.spacing(3)}px)`},"& > $titleCell":{transform:`translateX(${e.spacing(3)}px)`}},playButtonInTrackList:{display:"none"},trackRow:{"&:hover":{"& $playButtonInTrackList":{display:"inline-flex"},"& $trackIndex":{display:"none"}}},controlButtonInTrackCommon:{width:e.spacing(2),height:e.spacing(2),verticalAlign:"middle",marginLeft:e.spacing(-.5)},formatBadge:{...OA.styles(e).badge,...OA.styles(e).colorPrimary,position:"static",display:"inline-flex",border:`2px solid ${e.palette.background.paper}`,padding:"0 4px",verticalAlign:"middle",width:e.spacing(4.5),marginRight:e.spacing(.5)},durationCell:{whiteSpace:"nowrap"},durationCellSecondary:{whiteSpace:"nowrap",color:e.palette.text.secondary},durationCellTime:{verticalAlign:"middle"},titleCell:{overflow:"hidden",maxWidth:"40ch",textOverflow:"ellipsis"},deleteGroupButton:{display:"none"},indexCell:{whiteSpace:"nowrap",paddingRight:0,width:e.spacing(4)},trackIndex:{display:"inline-block",height:"16px",width:"16px"},dragHandle:{width:20,padding:`${e.spacing(.5)}px 0 0 0`},dragHandleEmpty:{width:20,padding:`${e.spacing(.5)}px 0 0 0`},groupFolderIcon:{},groupHeadRow:{"&:hover":{"& $deleteGroupButton":{display:"inline-flex"},"& $groupFolderIcon":{display:"none"}}}}));function MA({track:e,inGroup:t,isSelected:A,draggableProvided:l,trackStatus:i,onSelect:r,onRename:o,onTogglePlayPause:c}){var s;const m=PA(),u=Object(a.useCallback)(t=>o(t,e.index),[e.index,o]),p=Object(a.useCallback)(t=>r(t,e.index),[e.index,r]),g=Object(a.useCallback)(t=>{t.stopPropagation(),c(t,e.index)},[e.index,c]),h=Object(a.useCallback)(e=>e.stopPropagation(),[]),f="playing"===i||"paused"===i;return n.a.createElement(yA.a,Object.assign({},l.draggableProps,{ref:l.innerRef,hover:!0,selected:A,onDoubleClick:u,onClick:p,color:"inherit",className:Object(oA.default)(m.trackRow,{[m.inGroupTrackRow]:t,[m.currentTrackRow]:f})}),n.a.createElement(kA.a,Object.assign({className:m.dragHandle},l.dragHandleProps,{onClick:e=>e.stopPropagation()}),n.a.createElement(SA.a,{fontSize:"small",color:"disabled"})),n.a.createElement(kA.a,{className:m.indexCell},n.a.createElement("span",{className:m.trackIndex},e.index+1),n.a.createElement(kt.a,{"aria-label":"delete",className:Object(oA.default)(m.controlButtonInTrackCommon,m.playButtonInTrackList),size:"small",onClick:g,onDoubleClick:h},"paused"===i||"none"===i?n.a.createElement(IA.a,{fontSize:"inherit"}):n.a.createElement(BA.a,{fontSize:"inherit"}))),n.a.createElement(kA.a,{className:m.titleCell,title:null!==(s=e.title)&&void 0!==s?s:""},e.fullWidthTitle?`${e.fullWidthTitle} / `:"",e.title||"No Title"),n.a.createElement(kA.a,{align:"right",className:m.durationCell},n.a.createElement("span",{className:m.formatBadge},D[e.encoding]),n.a.createElement("span",{className:m.durationCellTime},Object(d.formatTimeFromFrames)(e.duration,!1))))}function FA({group:e,onRename:t,onDelete:A}){const l=PA(),i=Object(a.useCallback)(t=>A(t,e.index),[A,e]),r=Object(a.useCallback)(A=>t(A,e.index),[t,e]);return n.a.createElement(yA.a,{hover:!0,className:l.groupHeadRow,onDoubleClick:r},n.a.createElement(kA.a,{className:l.dragHandleEmpty}),n.a.createElement(kA.a,{className:l.indexCell},n.a.createElement(RA.a,{className:Object(oA.default)(l.controlButtonInTrackCommon,l.groupFolderIcon)}),n.a.createElement(kt.a,{"aria-label":"delete",className:Object(oA.default)(l.controlButtonInTrackCommon,l.deleteGroupButton),size:"small",onClick:i},n.a.createElement(fA.a,{fontSize:"inherit"}))),n.a.createElement(kA.a,{className:l.titleCell,title:e.title},e.fullWidthTitle?`${e.fullWidthTitle} / `:"",e.title||"No Name"),n.a.createElement(kA.a,{align:"right",className:l.durationCellSecondary},n.a.createElement("span",{className:l.durationCellTime},Object(d.formatTimeFromFrames)(e.tracks.map(e=>e.duration).reduce((e,t)=>e+t),!1))))}var QA=A(660);const WA=e=>e.renameDialogVisible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,null,n.a.createElement("span",null,"Rename ",e.what)),n.a.createElement(ct.w,null,n.a.createElement("p",{style:{marginBottom:4}},e.what," Name:"),n.a.createElement(ct.s,{style:{marginBottom:16},value:e.renameDialogTitle,placeholder:"Type here...",onChange:e.handleChange,onKeyDown:t=>{"Enter"===t.key&&e.handleDoRename()},fullWidth:!0}),n.a.createElement(ut,null,n.a.createElement(gt,{onClick:e.handleDoRename},"OK"),n.a.createElement(gt,{onClick:e.handleCancelRename},"Cancel"))))):null,zA=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),LA=Object(Qe.a)(e=>({marginUpDown:{marginTop:e.spacing(3),marginBottom:e.spacing(3)}})),GA=e=>{let t=Object(r.d)(),A=LA(),l=b(e=>e.renameDialog.visible),i=b(e=>e.renameDialog.title),o=b(e=>e.renameDialog.fullWidthTitle),c=b(e=>e.renameDialog.index),s=b(e=>e.renameDialog.groupIndex),d=b(e=>e.appState.fullWidthSupport);const m=null!==s?"Group":c<0?"Disc":"Track",u=Object(a.useCallback)(()=>{t(q.setVisible(!1))},[t]),p=Object(a.useCallback)(()=>{t(null!==s?function({groupIndex:e,newName:t,newFullWidthName:A}){return async function(a,n){var l;await(null===(l=L.netmdService)||void 0===l?void 0:l.renameGroup(e,t,A)),Je()(a)}}({newName:i,newFullWidthName:o,groupIndex:s}):c<0?function({newName:e,newFullWidthName:t}){return async function(A){const{netmdService:a}=L;await a.renameDisc(e.replace(/\/\//g," /"),null===t||void 0===t?void 0:t.replace(/\uff0f\uff0f/g,"\uff0f")),A(q.setVisible(!1)),Je()(A)}}({newName:i,newFullWidthName:o}):function({index:e,newName:t,newFullWidthName:A}){return async function(a){const{netmdService:n}=L;a(q.setVisible(!1));try{await n.renameTrack(e,t,A)}catch(l){console.error(l),a(Object(V.batchActions)([te.setVisible(!0),te.setErrorMessage("Rename failed.")]))}Je()(a)}}({index:c,newName:i,newFullWidthName:o})),u()},[t,u,o,s,c,i]),g=Object(a.useCallback)(e=>{t(q.setCurrentName(e.target.value.substring(0,120)))},[t]),h=Object(a.useCallback)(e=>{t(q.setCurrentFullWidthName(e.target.value.substring(0,105)))},[t]),f=Object(a.useCallback)(e=>{"Enter"===e.key&&(e.stopPropagation(),e.preventDefault(),p())},[p]),{vintageMode:E}=b(e=>e.appState);if(E){const e={renameDialogVisible:l,renameDialogTitle:i,renameDialogIndex:c,what:m,handleCancelRename:u,handleDoRename:p,handleChange:g};return n.a.createElement(WA,e)}return n.a.createElement(at.a,{open:l,onClose:u,maxWidth:"sm",fullWidth:!0,TransitionComponent:zA,"aria-labelledby":"rename-dialog-title"},n.a.createElement(rt.a,{id:"rename-dialog-title"},"Rename ",m),n.a.createElement(lt.a,null,n.a.createElement(QA.a,{autoFocus:!0,id:"name",label:`${m} Name`,type:"text",fullWidth:!0,value:i,onKeyDown:f,onChange:g}),d&&n.a.createElement(QA.a,{id:"fullWidthTitle",label:`Full-Width ${m} Name`,type:"text",fullWidth:!0,className:A.marginUpDown,value:o,onKeyDown:f,onChange:h})),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:u},"Cancel"),n.a.createElement(qe.a,{color:"primary",onClick:p},"Rename")))};var UA=A(645),VA=A(646),HA=A(658);const JA=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,null,n.a.createElement("span",null,"Recording...")),n.a.createElement(pt,null,n.a.createElement("div",{style:{width:"100%"}},100===e.convertedValue&&e.trackConverting===e.trackTotal?"Conversion completed":`Converting ${e.trackConverting+1} of ${e.trackTotal}: ${e.titleConverting}`),n.a.createElement(ct.k,{value:Math.floor(e.convertedValue)}),n.a.createElement("div",{style:{width:"100%",marginTop:16}},"Uploading ",e.trackCurrent," of ",e.trackTotal,": ",e.titleCurrent),n.a.createElement(ct.k,{value:e.progressValue}),n.a.createElement(ut,null,e.hasNotificationSupport?n.a.createElement(ct.d,{name:"notifyOnEnd",label:"Notify when completed",checked:e.notifyWhenFinished,onChange:e.handleNotifyWhenFinishedChanged}):null,n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(ct.c,{disabled:e.cancelled,onClick:e.handleCancelUpload},e.cancelled?"Stopping after current track...":"Cancel Recording"))))):null,YA=Object(Qe.a)(e=>({progressPerc:{marginTop:e.spacing(1)},progressBar:{marginTop:e.spacing(3)},uploadLabel:{marginTop:e.spacing(3)},spacer:{flex:"1 1 auto"},checkBox:{marginLeft:0}})),KA=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),ZA=e=>{const t=YA(),A=Object(r.d)();let{visible:l,cancelled:i,writtenProgress:o,encryptedProgress:c,totalProgress:s,trackTotal:d,trackCurrent:m,trackConverting:u,titleCurrent:p,titleConverting:g}=b(e=>e.uploadDialog);const{vintageMode:h,notifyWhenFinished:f,hasNotificationSupport:E}=b(e=>e.appState),w=Object(a.useCallback)(()=>{A(Y.setCancelUpload(!0))},[A]),v=Object(a.useCallback)(()=>{A(Ye(!f))},[A,f]);let k=Math.floor(o/s*100),C=Math.floor(c/s*100),y=Math.floor(u/d*100);if(h){const e={visible:l,cancelled:i,writtenProgress:o,encryptedProgress:c,totalProgress:s,trackTotal:d,trackCurrent:m,trackConverting:u,titleCurrent:p,titleConverting:g,handleCancelUpload:w,progressValue:k,bufferValue:C,convertedValue:y,notifyWhenFinished:f,hasNotificationSupport:E,handleNotifyWhenFinishedChanged:v};return n.a.createElement(JA,e)}return n.a.createElement(at.a,{open:l,maxWidth:"sm",fullWidth:!0,TransitionComponent:KA,"aria-labelledby":"alert-dialog-slide-title","aria-describedby":"alert-dialog-slide-description"},n.a.createElement(rt.a,{id:"alert-dialog-slide-title"},"Recording..."),n.a.createElement(lt.a,null,n.a.createElement(it.a,{id:"alert-dialog-slide-description"},100===y&&u===d?"Conversion completed":`Converting ${u+1} of ${d}: ${g}`),n.a.createElement(UA.a,{className:t.progressBar,variant:0===y?"indeterminate":"determinate",color:"primary",value:y}),n.a.createElement(tt.a,{className:t.progressPerc},y,"%"),n.a.createElement(it.a,{id:"alert-dialog-slide-description",className:t.uploadLabel},"Uploading ",m," of ",d,": ",p),n.a.createElement(UA.a,{className:t.progressBar,variant:"buffer",color:"secondary",value:k,valueBuffer:C}),n.a.createElement(tt.a,{className:t.progressPerc},k,"%")),n.a.createElement(nt.a,null,E?n.a.createElement(VA.a,{className:t.checkBox,disabled:!E,control:n.a.createElement(HA.a,{checked:f,onChange:v,name:"notifyOnEnd"}),label:"Notify when completed"}):null,n.a.createElement("div",{className:t.spacer}),n.a.createElement(qe.a,{disabled:i,onClick:w},i?"Stopping after current track...":"Cancel Recording")))},XA=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,null,n.a.createElement("span",null,"Recording...")),n.a.createElement(pt,null,n.a.createElement("p",{style:{marginBottom:16,width:"100%"}},`Recording track ${e.trackDone+1} of ${e.trackTotal}: ${e.titleCurrent}`),n.a.createElement(ct.k,{value:e.progressValue,hideValue:e.progressValue<0})))):null,qA=Object(Qe.a)(e=>({progressPerc:{marginTop:e.spacing(1)},progressBar:{marginTop:e.spacing(3)}})),$A=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),_A=e=>{const t=qA();let{visible:A,trackTotal:a,trackDone:l,trackCurrent:i,titleCurrent:r}=b(e=>e.recordDialog),o=Math.round(i);if(b(e=>e.appState.vintageMode)){const e={visible:A,trackTotal:a,trackDone:l,trackCurrent:i,titleCurrent:r,progressValue:o};return n.a.createElement(XA,e)}return n.a.createElement(at.a,{open:A,maxWidth:"sm",fullWidth:!0,TransitionComponent:$A,"aria-labelledby":"record-dialog-slide-title","aria-describedby":"record-dialog-slide-description"},n.a.createElement(rt.a,{id:"record-dialog-slide-title"},"Recording..."),n.a.createElement(lt.a,null,n.a.createElement(it.a,{id:"record-dialog-slide-description"},`Recording track ${l+1} of ${a}: ${r}`),n.a.createElement(UA.a,{className:t.progressBar,variant:i>=0?"determinate":"indeterminate",color:"primary",value:o}),n.a.createElement(tt.a,{className:t.progressPerc},o>=0?`${o}%`:"")),n.a.createElement(nt.a,null))},ea=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),ta=e=>{const t=Object(r.d)();let{visible:A,error:l}=b(e=>e.errorDialog);const i=Object(a.useCallback)(()=>{t(te.setVisible(!1))},[t]);return n.a.createElement(at.a,{open:A,maxWidth:"sm",fullWidth:!0,TransitionComponent:ea,"aria-labelledby":"error-dialog-slide-title","aria-describedby":"error-dialog-slide-description"},n.a.createElement(rt.a,{id:"alert-dialog-slide-title"},"Error"),n.a.createElement(lt.a,null,n.a.createElement(it.a,{id:"alert-dialog-slide-description"},l)),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:i},"Close")))},Aa=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),aa=e=>{const t=Object(r.d)();let{visible:A,dismissed:l}=b(e=>e.panicDialog);const i=Object(a.useCallback)(()=>{window.location.reload()},[]),o=Object(a.useCallback)(()=>{t(le.dismiss())},[t]);return n.a.createElement(at.a,{open:A&&!l,maxWidth:"sm",fullWidth:!0,scroll:"paper",TransitionComponent:Aa,"aria-labelledby":"error-dialog-slide-title","aria-describedby":"error-dialog-slide-description"},n.a.createElement(rt.a,{id:"alert-dialog-slide-title"},"Oops\u2026 Something unexpected happened."),n.a.createElement(lt.a,null,n.a.createElement($e.a,{color:"textSecondary",variant:"body1",component:"div"},"Try to restart the app. If the error persists, try the followings:",n.a.createElement("ol",null,n.a.createElement("li",null,"Use your browser in incognito mode."),n.a.createElement("li",null,"Use a blank MiniDisc."),n.a.createElement("li",null,"Try to use Web MiniDisc on another computer.")),"If this does not solve the error, your unit might not be supported yet or you have encountered a bug. The full error is reported in the JS console.")),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:o,size:"small"},"Ignore and Continue"),n.a.createElement(qe.a,{onClick:i,color:"primary"},"Restart the App")))};var na=A(647),la=A(664),ia=A(657),ra=A(643),oa=A(659),ca=A(649),sa=A(309),da=A.n(sa),ma=A(310),ua=A.n(ma),pa=A(308),ga=A.n(pa),ha=A(636),fa=A(591),ba=A(656),Ea=A(306),wa=A.n(Ea),va=A(307),ka=A.n(va),Ca=A(162),ya=A.n(Ca);const xa=[{value:"filename",label:"Filename"},{value:"title",label:"Title"},{value:"album-title",label:"Album - Title"},{value:"artist-title",label:"Artist - Title"},{value:"title-artist",label:"Title - Artist"},{value:"artist-album-title",label:"Artist - Album - Title"}],Oa=[{value:"SP",label:"SP"},{value:"LP2",label:"LP2"},{value:"LP4",label:"LP4"}],Da=e=>{const t=Object(a.useContext)(st.a),A=Object(a.useCallback)(()=>e.files.map((A,a)=>{const l=e.selectedTrackIndex===a,i=l?e.selectedTrackRef:null;return n.a.createElement(ht,{key:`${a}`,onClick:()=>e.setSelectedTrack(a),ref:i,style:l?t.selectedTableRow:{}},n.a.createElement(ct.o,null,A.name))}),[e,t]);return e.dialogVisible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("span",{style:{flex:"1 1 auto"}},"Upload Settings"),n.a.createElement(ct.c,{onClick:e.handleClose},n.a.createElement(ft,null))),n.a.createElement(pt,null,n.a.createElement("div",{style:{display:"flex",width:"100%"}},n.a.createElement(ct.f,{label:"Recording Mode",style:{display:"flex",flex:"1 1 auto"}},n.a.createElement(ct.l,{defaultValue:e.format,options:Oa,width:90,onChange:(t,A)=>e.handleChangeFormat(t,A.value)})),n.a.createElement(ct.f,{label:"Track title",style:{flex:"1 1 auto",marginLeft:16}},n.a.createElement(ct.l,{defaultValue:e.titleFormat,options:xa,width:180,onChange:e.handleChangeTitleFormat}))),e.tracksOrderVisible?n.a.createElement("div",Object.assign({},e.getRootProps(),{style:{width:"100%",marginTop:16}}),n.a.createElement(ct.e,{style:{marginTop:16}}),n.a.createElement(ct.t,{style:{display:"flex"}},n.a.createElement(ct.c,{variant:"menu",onClick:e.open},"Add..."),n.a.createElement(ct.c,{variant:"menu",disabled:e.disableRemove,onClick:e.handleRemoveSelectedTrack},n.a.createElement("img",{alt:"delete",src:ya.a,style:{marginRight:4}}),"Remove"),n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(ct.c,{variant:"menu",disabled:e.disableRemove,onClick:e.moveFileDown},n.a.createElement("img",{alt:"Move Down",src:ka.a})),n.a.createElement(ct.c,{variant:"menu",disabled:e.disableRemove,onClick:e.moveFileUp},n.a.createElement("img",{alt:"Move Up",src:wa.a}))),n.a.createElement("div",{style:{maxHeight:"30vh",overflow:"scroll"}},n.a.createElement(ct.m,null,n.a.createElement(ct.n,null,A()))),n.a.createElement("input",e.getInputProps())):null,n.a.createElement(ut,null,n.a.createElement(ct.c,{onClick:e.handleToggleTracksOrder},`${e.tracksOrderVisible?"Hide":"Show"} Tracks`),n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(gt,{onClick:e.handleConvert},"OK"),n.a.createElement(gt,{onClick:e.handleClose},"Cancel"))))):null},Sa=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),Ta=Object(Qe.a)(e=>({container:{display:"flex",flexDirection:"row"},formControl:{minWidth:60},toggleButton:{minWidth:40},dialogContent:{display:"flex",flexDirection:"column",justifyContent:"stretch"},formatAndTitle:{display:"flex",flexWrap:"wrap",justifyContent:"space-between"},rightBlock:{display:"flex",flexDirection:"column"},titleFormControl:{minWidth:170,marginTop:4,[P(e)]:{width:114,minWidth:0}},spacer:{display:"flex",flex:"1 1 auto"},showTracksOrderBtn:{marginLeft:e.spacing(1)},tracksOrderAccordion:{"&:before":{opacity:0}},tracksOrderAccordionDetail:{maxHeight:"40vh",overflow:"auto"},toolbarHighlight:"light"===e.palette.type?{color:e.palette.secondary.main,backgroundColor:Object(dA.d)(e.palette.secondary.light,.85)}:{color:e.palette.text.primary,backgroundColor:e.palette.secondary.dark},trackList:{flex:"1 1 auto"},backdrop:{zIndex:e.zIndex.drawer+1,color:"#fff"}})),Ia=e=>{const t=Object(r.d)(),A=Ta();let{visible:l,format:i,titleFormat:o}=b(e=>e.convertDialog);const[c,s]=Object(a.useState)(e.files),[d,m]=Object(a.useState)(-1),u=Object(a.useCallback)(e=>{const t=d+e;if(t>=c.length||t<0)return;const A=c.slice();let a=A[d];A[d]=A[t],A[t]=a,s(A),m(t)},[c,d]),p=Object(a.useCallback)(()=>{u(-1)},[u]),g=Object(a.useCallback)(()=>{u(1)},[u]),h=Object(a.useCallback)(()=>{t(se.setVisible(!1))},[t]),f=Object(a.useCallback)((e,A)=>{null!==A&&t(se.setFormat(A))},[t]),E=Object(a.useCallback)(e=>{t(se.setTitleFormat(e.target.value))},[t]),w=Object(a.useCallback)(()=>{h(),t(Xe(c,i,o))},[t,c,i,o,h]),[v,k]=Object(a.useState)(!1),C=Object(a.useCallback)(()=>{k(!v)},[v,k]);Object(a.useEffect)(()=>{const t=Array.from(e.files);s(t),m(-1),k(!1)},[e.files,m,k]);const y=Object(a.useRef)(null);Object(a.useEffect)(()=>{var e;null===(e=y.current)||void 0===e||e.scrollIntoView({block:"nearest",behavior:"smooth"})},[y,d]);const x=Object(a.useCallback)(()=>c.map((e,t)=>{const A=d===t,a=A?y:null;return n.a.createElement(fa.a,{key:`${t}`,disableGutters:!0,onClick:()=>m(t),ref:a,button:!0},n.a.createElement(St.a,null,n.a.createElement(ba.a,{checked:A,value:`track-${t}`,size:"small"})),n.a.createElement(Tt.a,{primary:e.name}))}),[c,d,m,y]),O=Object(a.useCallback)((e,t)=>{const A=c.slice().concat(e);s(A)},[c,s]),{getRootProps:D,getInputProps:S,isDragActive:T,open:I}=Object(cA.a)({onDrop:O,accept:["audio/*","video/mp4"],noClick:!0}),j=d<0||d>=c.length,B=Object(a.useCallback)(()=>{const e=c.filter((e,t)=>t!==d);s(e),d>=e.length&&m(e.length-1)},[d,c,s]),N=b(e=>e.convertDialog.visible);if(Object(a.useEffect)(()=>{N&&0===c.length&&h()},[c,N,h]),b(e=>e.appState.vintageMode)){const e={visible:l,format:i,titleFormat:o,files:c,setFiles:s,selectedTrackIndex:d,setSelectedTrack:m,moveFileUp:p,moveFileDown:g,handleClose:h,handleChangeFormat:f,handleChangeTitleFormat:E,handleConvert:w,tracksOrderVisible:v,setTracksOrderVisible:k,handleToggleTracksOrder:C,selectedTrackRef:y,getRootProps:D,getInputProps:S,isDragActive:T,open:I,disableRemove:j,handleRemoveSelectedTrack:B,dialogVisible:N};return n.a.createElement(Da,e)}return n.a.createElement(at.a,{open:l,maxWidth:"xs",fullWidth:!0,TransitionComponent:Sa,"aria-labelledby":"convert-dialog-slide-title","aria-describedby":"convert-dialog-slide-description"},n.a.createElement(rt.a,{id:"convert-dialog-slide-title"},"Upload Settings"),n.a.createElement(lt.a,{className:A.dialogContent},n.a.createElement("div",{className:A.formatAndTitle},n.a.createElement(_e.a,null,n.a.createElement($e.a,{component:"label",variant:"caption",color:"textSecondary"},"Recording Mode"),n.a.createElement(la.a,{value:i,exclusive:!0,onChange:f,size:"small"},n.a.createElement(na.a,{className:A.toggleButton,value:"SP"},"SP"),n.a.createElement(na.a,{className:A.toggleButton,value:"LP2"},"LP2"),n.a.createElement(na.a,{className:A.toggleButton,value:"LP4"},"LP4"))),n.a.createElement("div",{className:A.rightBlock},n.a.createElement(_e.a,{className:A.formControl},n.a.createElement($e.a,{component:"label",variant:"caption",color:"textSecondary"},"Track title"),n.a.createElement(_e.a,{className:A.titleFormControl},n.a.createElement(ia.a,{value:o,color:"secondary",input:n.a.createElement(ra.a,null),onChange:E},n.a.createElement(yt.a,{value:"filename"},"Filename"),n.a.createElement(yt.a,{value:"title"},"Title"),n.a.createElement(yt.a,{value:"album-title"},"Album - Title"),n.a.createElement(yt.a,{value:"artist-title"},"Artist - Title"),n.a.createElement(yt.a,{value:"title-artist"},"Title - Artist"),n.a.createElement(yt.a,{value:"artist-album-title"},"Artist - Album - Title")))))),n.a.createElement(oa.a,{expanded:v,className:A.tracksOrderAccordion,square:!0},n.a.createElement("div",null),n.a.createElement("div",Object.assign({},D(),{style:{outline:"none"}}),n.a.createElement(xA.a,{variant:"dense",className:A.toolbarHighlight},n.a.createElement(kt.a,{edge:"start","aria-label":"add track",onClick:I},n.a.createElement(gA.a,null)),n.a.createElement(kt.a,{edge:"start","aria-label":"remove track",onClick:B,disabled:j},n.a.createElement(ga.a,null)),n.a.createElement("div",{className:A.spacer}),n.a.createElement(kt.a,{edge:"end","aria-label":"move up",onClick:g},n.a.createElement(da.a,null)),n.a.createElement(kt.a,{edge:"end","aria-label":"move down",onClick:p},n.a.createElement(ua.a,null))),n.a.createElement(ca.a,{className:A.tracksOrderAccordionDetail},n.a.createElement(ha.a,{dense:!0,disablePadding:!1,className:A.trackList},x())),n.a.createElement(Me.a,{className:A.backdrop,open:T},"Drop your Music to add it to the queue"),n.a.createElement("input",S())))),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:C,className:A.showTracksOrderBtn},`${v?"Hide":"Show"} Tracks`),n.a.createElement("div",{className:A.spacer}),n.a.createElement(qe.a,{onClick:h},"Cancel"),n.a.createElement(qe.a,{onClick:w},"Ok")))};var ja=A(165),Ba=A.n(ja),Na=A(166),Ra=A.n(Na),Pa=A(164),Ma=A.n(Pa);function Fa(){return(Fa=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",Fa({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Qa),za=n.a.forwardRef((e,t)=>n.a.createElement(Wa,Fa({svgRef:t},e)));A.p;function La(){return(La=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",La({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Ga),Va=n.a.forwardRef((e,t)=>n.a.createElement(Ua,La({svgRef:t},e)));A.p;function Ha(){return(Ha=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",Ha({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Ja),Ka=n.a.forwardRef((e,t)=>n.a.createElement(Ya,Ha({svgRef:t},e)));A.p;function Za(){return(Za=Object.assign||function(e){for(var t=1;tn.a.createElement("svg",Za({width:98,height:52,viewBox:"0 0 98 52",ref:e},A),t?n.a.createElement("title",null,t):null,Xa),$a=n.a.forwardRef((e,t)=>n.a.createElement(qa,Za({svgRef:t},e)));A.p;const _a=Object(Qe.a)(e=>({container:{display:"flex",flex:"1 1 auto",alignItems:"center",[P(e)]:{flexWrap:"wrap"}},lcd:{backgroundColor:"black !important",flex:"1 1 auto",margin:"0 80px 0 0px",minWidth:150,height:48,color:"white !important",fontFamily:"LCDDot"}})),en=e=>{const t=_a();return n.a.createElement("div",{className:t.container},n.a.createElement(ct.c,{onClick:e.handlePrev},n.a.createElement(Ma.a,null)),n.a.createElement(ct.c,{onClick:e.handlePlay},n.a.createElement(IA.a,null)),n.a.createElement(ct.c,{onClick:e.handlePause},n.a.createElement(BA.a,null)),n.a.createElement(ct.c,{onClick:e.handleStop},n.a.createElement(Ba.a,null)),n.a.createElement(ct.c,{onClick:e.handleNext,style:{marginRight:16}},n.a.createElement(Ra.a,null)),n.a.createElement(ct.j,{variant:"well",className:t.lcd},n.a.createElement("div",{className:e.classes.lcdText,style:{left:16,width:"calc(100% - 16px)"}},n.a.createElement("span",{className:e.lcdScroll?e.classes.scrollingStatusMessage:e.classes.statusMessage,ref:e.lcdRef,style:e.message&&e.lcdScroll>0?{animationDuration:`${e.lcdScrollDuration}s`,transform:`translate(-${e.lcdScroll}%)`,top:12}:{top:12}},e.message))))},tn=[za,Va,Ka,$a],An=Object(Qe.a)(e=>({"@keyframes scrollLeft":{from:{transform:"translateX(0%)"},to:{}},"@keyframes blink":{"50%":{visibility:"hidden"}},container:{display:"flex",flex:"1 1 auto",[P(e)]:{flexWrap:"wrap"}},lcd:{flex:"1 1 auto",position:"relative",marginLeft:e.spacing(1.5),marginRight:e.spacing(1.5),paddingLeft:e.spacing(3),paddingRight:e.spacing(3),borderRadius:e.spacing(3),backgroundColor:e.palette.background.default,minWidth:150,height:48,[P(e)]:{marginLeft:0,marginRight:e.spacing(2)}},lcdText:{overflow:"hidden",position:"relative",width:"calc(100% - 40px)",left:40,height:"100%",fontFamily:"LCDDot"},lcdDisc:{position:"absolute",top:0,left:20},lcdDiscIcon:{width:28,height:48,"& g":{fill:e.palette.action.active}},scrollingStatusMessage:{position:"absolute",width:"100%",whiteSpace:"nowrap",animationName:"$scrollLeft",animationTimingFunction:"linear",animationIterationCount:"1",top:15,left:1},statusMessage:{position:"absolute",width:"100%",whiteSpace:"nowrap",top:15,left:1},lcdBlink:{animationName:"$blink",animationTimingFunction:"step-end",animationDuration:"1s",animationIterationCount:"infinite"},button:{}})),an=()=>{var e,t,A;const l=Object(r.d)(),i=b(e=>e.main.deviceStatus),o=b(e=>e.main.disc),c=An(),s=Object(a.useCallback)(()=>{l(Ve("prev"))},[l]),d=Object(a.useCallback)(()=>{l(Ve("play"))},[l]),m=Object(a.useCallback)(()=>{l(Ve("stop"))},[l]),u=Object(a.useCallback)(()=>{l(Ve("next"))},[l]),p=Object(a.useCallback)(()=>{l(Ve("pause"))},[l]);let g="",h=null!==(e=null===i||void 0===i?void 0:i.track)&&void 0!==e?e:null,f=null!==(t=null===i||void 0===i?void 0:i.state)&&void 0!==t?t:null,E=null!==(A=null===i||void 0===i?void 0:i.discPresent)&&void 0!==A&&A,w="paused"===(null===i||void 0===i?void 0:i.state);const v=S(o);if(E){if("readingTOC"===f)g="READING TOC";else if(0===v.length)g="BLANKDISC";else if(i&&null!==i.track&&v[i.track]){let e=v[i.track].fullWidthTitle||v[i.track].title;g=(i.track+1).toString().padStart(3,"0")+(e?" - "+e:"")}}else g="";const[k,C]=Object(a.useState)(0),[y,x]=Object(a.useState)(0),[O,D]=Object(a.useState)(0),T=Object(a.useRef)(null),I=Object(a.useRef)(null);Object(a.useEffect)(()=>(clearTimeout(T.current),C(0),T.current=setTimeout(()=>{(()=>{var e,t,A;const a=I.current,n=null!==(e=null===a||void 0===a?void 0:a.scrollWidth)&&void 0!==e?e:0,l=null!==(t=null===a||void 0===a?void 0:null===(A=a.parentElement)||void 0===A?void 0:A.offsetWidth)&&void 0!==t?t:0,i=n>l?n/20:0;C(n>l?100*n/l:0),x(i),i>0&&(T.current=setTimeout(()=>{C(0)},1e3*i+500))})()},2e3),()=>{clearTimeout(T.current)}),[h,f,g]);const j=Object(a.useRef)(null);Object(a.useEffect)(()=>(clearInterval(j.current),"playing"===f||"readingTOC"===f?j.current=setInterval(()=>{D(1+O%(tn.length-1))},600):D(0),()=>{clearInterval(j.current)}),[f,O]);const B=tn[O];if(b(e=>e.appState.vintageMode)){const e={handlePrev:s,handlePlay:d,handleStop:m,handlePause:p,handleNext:u,message:g,discPresent:E,lcdScroll:k,lcdRef:I,lcdScrollDuration:y,classes:c};return n.a.createElement(en,e)}return n.a.createElement(tt.a,{className:c.container},n.a.createElement(kt.a,{"aria-label":"prev",onClick:s,className:c.button},n.a.createElement(Ma.a,null)),n.a.createElement(kt.a,{"aria-label":"play",onClick:d,className:c.button},n.a.createElement(IA.a,null)),n.a.createElement(kt.a,{"aria-label":"pause",onClick:p,className:c.button},n.a.createElement(BA.a,null)),n.a.createElement(kt.a,{"aria-label":"stop",onClick:m,className:c.button},n.a.createElement(Ba.a,null)),n.a.createElement(kt.a,{"aria-label":"next",onClick:u,className:c.button},n.a.createElement(Ra.a,null)),n.a.createElement("div",{className:c.lcd},n.a.createElement("div",{className:c.lcdText},n.a.createElement("span",{className:k?c.scrollingStatusMessage:c.statusMessage,ref:I,style:g&&k>0?{animationDuration:`${y}s`,transform:`translate(-${k}%)`}:{}},g)),n.a.createElement("div",{className:c.lcdDisc},E&&n.a.createElement(B,{className:Object(oA.default)(c.lcdDiscIcon,{[c.lcdBlink]:w})}))))},nn=e=>e.visible?n.a.createElement(dt,null,n.a.createElement(mt,null,n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("span",{style:{flex:"1 1 auto"}},"Record Selected Tracks"),n.a.createElement(ct.c,{onClick:e.handleClose},n.a.createElement(ft,null))),n.a.createElement(pt,null,n.a.createElement("div",{style:{width:"100%",display:"flex",alignItems:"flex-Start",flexDirection:"column"}},n.a.createElement("p",null,"1. Connect your MD Player line-out to your PC audio line-in."),n.a.createElement("p",null,"2. Use the controls at the bottom right to play some tracks."),n.a.createElement("p",null,"3. Select the input source. You should hear the tracks playing on your PC."),n.a.createElement("p",null,"4. Adjust the input gain and the line-out volume of your device."),n.a.createElement(ct.f,{label:"Input Source",style:{display:"flex",flex:"1 1 auto",margin:"32px 0"}},n.a.createElement(ct.l,{defaultValue:e.inputDeviceId||"",options:e.devices.concat([{deviceId:"",label:"None"}]).map(({deviceId:e,label:t})=>({value:e,label:t})),onChange:e.handleChange,width:200})),n.a.createElement(an,null)),n.a.createElement(ut,null,n.a.createElement("div",{style:{flex:"1 1 auto"}}),n.a.createElement(gt,{onClick:e.handleClose},"Cancel"),n.a.createElement(gt,{onClick:e.handleStartTransfer,disabled:""===e.inputDeviceId},"Start Record"))))):null,ln=n.a.forwardRef((function(e,t){return n.a.createElement(ot.a,Object.assign({direction:"up",ref:t},e))})),rn=Object(Qe.a)(e=>({container:{display:"flex",flexDirection:"row",alignItems:"flex-end",justifyContent:"space-between",marginRight:-e.spacing(2),flexFlow:"wrap"},formControl:{minWidth:120},selectEmpty:{marginTop:e.spacing(2)},head:{textShadow:"0px 0px 12px rgba(150, 150, 150, 1)",fontSize:e.typography.h2.fontSize,textAlign:"center",marginBottom:e.spacing(2)}})),on=({trackIndexes:e})=>{const t=Object(r.d)(),A=rn(),[l,i]=Object(a.useState)([]),[o,c]=Object(a.useState)("");let{visible:s}=b(e=>e.dumpDialog);const m=Object(a.useCallback)(()=>{var e;c(""),null===(e=L.mediaRecorderService)||void 0===e||e.stopTestInput(),t(ge.setVisible(!1))},[t]),u=Object(a.useCallback)(e=>{var t,A;const a=e.target.value;c(a),null===(t=L.mediaRecorderService)||void 0===t||t.stopTestInput(),null===(A=L.mediaRecorderService)||void 0===A||A.playTestInput(a)},[c]),p=Object(a.useCallback)(()=>{var A,a;t((A=e,a=o,async function(e,t){e(Object(V.batchActions)([Ee.setVisible(!0),Ee.setProgress({trackTotal:A.length,trackDone:0,trackCurrent:0,titleCurrent:""})]));let n=t().main.disc,l=Object(d.getTracks)(n).filter(e=>A.indexOf(e.index)>=0);const{netmdService:i,mediaRecorderService:r}=L;await L.netmdService.stop();for(let[A,c]of l.entries()){var o;e(Ee.setProgress({trackTotal:l.length,trackDone:A,trackCurrent:-1,titleCurrent:null!==(o=c.title)&&void 0!==o?o:""})),await i.gotoTrack(c.index),await i.play(),console.log("Waiting for track to be ready to play");let t=await i.getPosition(),n=[c.index,0,0,1];for(;null===t||!n.every((e,A)=>n[A]===t[A]);)await h(250),t=await i.getPosition();await i.pause(),await(null===i||void 0===i?void 0:i.gotoTrack(c.index)),console.log("Track is ready to play"),await(null===r||void 0===r?void 0:r.initStream(a)),await(null===r||void 0===r?void 0:r.startRecording()),await i.play();let s=c.duration/512;await f(1e3*s,t=>{var a;e(Ee.setProgress({trackTotal:l.length,trackDone:A,trackCurrent:t,titleCurrent:null!==(a=c.title)&&void 0!==a?a:""}))}),await(null===r||void 0===r?void 0:r.stopRecording());const d=c.title||`Track ${c.index+1}`;null===r||void 0===r||r.downloadRecorded(`${d}`),await(null===r||void 0===r?void 0:r.closeStream())}await i.stop(),e(Ee.setVisible(!1))})),m()},[e,o,t,m]);if(Object(a.useEffect)(()=>{s&&async function(){await navigator.mediaDevices.getUserMedia({audio:!0});let e=(await navigator.mediaDevices.enumerateDevices()).filter(e=>"audioinput"===e.kind).map(e=>({deviceId:e.deviceId,label:e.label}));i(e)}()},[s,i]),b(e=>e.appState.vintageMode)){const e={handleClose:m,handleChange:u,handleStartTransfer:p,visible:s,devices:l,inputDeviceId:o};return n.a.createElement(nn,e)}return n.a.createElement(at.a,{open:s,maxWidth:"sm",fullWidth:!0,TransitionComponent:ln,"aria-labelledby":"dump-dialog-slide-title","aria-describedby":"dump-dialog-slide-description"},n.a.createElement(rt.a,{id:"dump-dialog-slide-title"},"Record Selected Tracks"),n.a.createElement(lt.a,null,n.a.createElement($e.a,{component:"p",variant:"h2",className:A.head},"\ud83d\udcbb \u2b05 \ud83d\udcbd"),n.a.createElement($e.a,{component:"p",variant:"body2"},"1. Connect your MD Player line-out to your PC audio line-in."),n.a.createElement($e.a,{component:"p",variant:"body2"},"2. Use the controls at the bottom right to play some tracks."),n.a.createElement($e.a,{component:"p",variant:"body2"},"3. Select the input source. You should hear the tracks playing on your PC."),n.a.createElement($e.a,{component:"p",variant:"body2"},"4. Adjust the input gain and the line-out volume of your device."),n.a.createElement(tt.a,{className:A.container},n.a.createElement(_e.a,{className:A.formControl},n.a.createElement(ia.a,{value:o,onChange:u,displayEmpty:!0,className:A.selectEmpty},n.a.createElement(yt.a,{value:"",disabled:!0},"Input Source"),l.map(e=>n.a.createElement(yt.a,{key:e.deviceId,value:e.deviceId},e.label))),n.a.createElement(et.a,null,"Input Source")),n.a.createElement(an,null))),n.a.createElement(nt.a,null,n.a.createElement(qe.a,{onClick:m},"Cancel"),n.a.createElement(qe.a,{onClick:p,disabled:""===o},"Start Record")))};var cn=A(311),sn=A.n(cn),dn=A(312),mn=A.n(dn),un=A(313),pn=A.n(un),gn=A(314),hn=A.n(gn),fn=A(315),bn=A.n(fn);const En=Object(Qe.a)(e=>({container:{width:"100%",flex:"1 1 auto",display:"flex",minHeight:0,"& > div":{display:"flex",flexDirection:"column",width:"100%"}},table:{height:"100%",width:"100%",display:"flex !important",flexDirection:"column"},windowContent:{flex:"1 1 auto",display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",minHeight:0},controlsContainer:{width:"100%",marginTop:16},toolbarIcon:{marginRight:4},toolbarItem:{padding:"6px 10px"}})),wn=e=>{var t,A,l;const i=En(),r=Object(a.useContext)(st.a),{mainView:o}=b(e=>e.appState);return n.a.createElement(n.a.Fragment,null,n.a.createElement(ct.e,null),n.a.createElement(ct.t,{style:{flexWrap:"wrap",position:"relative"}},0===e.selectedCount?n.a.createElement(n.a.Fragment,null,n.a.createElement("img",{alt:"device",src:hn.a,style:{marginTop:-10,marginLeft:10}}),n.a.createElement("div",{className:i.toolbarItem},`${e.deviceName}: (`||"Loading...",(null===(t=e.disc)||void 0===t?void 0:t.fullWidthTitle)&&`${null===(A=e.disc)||void 0===A?void 0:A.fullWidthTitle} / `,(null===(l=e.disc)||void 0===l?void 0:l.title)||"Untitled Disc",")"),n.a.createElement(ct.b,{size:35}),n.a.createElement("img",{alt:"minidisc",src:bn.a,style:{width:32,marginLeft:10}}),null!==e.disc?n.a.createElement(ct.u,{text:`${Object(d.formatTimeFromFrames)(2*e.disc.left,!1)} in LP2 or ${Object(d.formatTimeFromFrames)(4*e.disc.left,!1)} in LP4`,enterDelay:100,leaveDelay:500},n.a.createElement("div",{className:i.toolbarItem},`${Object(d.formatTimeFromFrames)(e.disc.left,!1)} left of ${Object(d.formatTimeFromFrames)(e.disc.total,!1)} `)):null):null,e.selectedCount>0?n.a.createElement(n.a.Fragment,null,n.a.createElement(ct.c,{variant:"menu",disabled:1!==e.selectedCount,onClick:e.handleShowMoveMenu},n.a.createElement("img",{alt:"move",src:mn.a,className:i.toolbarIcon}),"Move"),n.a.createElement(ct.c,{variant:"menu",onClick:e.handleShowDumpDialog},n.a.createElement("img",{alt:"record",src:sn.a,className:i.toolbarIcon}),"Record"),n.a.createElement(ct.c,{variant:"menu",onClick:e.handleDeleteSelected},n.a.createElement("img",{alt:"delete",src:ya.a,className:i.toolbarIcon}),"Delete"),n.a.createElement(ct.c,{variant:"menu",onClick:e.handleRenameActionClick,disabled:e.selectedCount>1},n.a.createElement("img",{alt:"rename",src:pn.a,className:i.toolbarIcon}),"Rename"),e.moveMenuAnchorEl?n.a.createElement(ct.h,{style:{position:"absolute",left:16,top:32,zIndex:2}},Array(e.tracks.length).fill(null).map((t,A)=>n.a.createElement(ct.i,{key:`pos-${A}`,onClick:()=>e.handleMoveSelectedTrack(A)},A+1))):null):null,n.a.createElement(ct.b,{size:35})),n.a.createElement(ct.e,null),n.a.createElement(ct.w,{className:i.windowContent},n.a.createElement("div",Object.assign({className:i.container},e.getRootProps(),{style:{outline:"none"}}),n.a.createElement("input",e.getInputProps()),n.a.createElement(ct.m,{className:i.table},n.a.createElement(ct.p,null,n.a.createElement(ct.r,{head:!0,style:{display:"flex"}},n.a.createElement(ct.q,{style:{width:"2ch"}},"#"),n.a.createElement(ct.q,{style:{textAlign:"left",flex:"1 1 auto"}},"Title"),n.a.createElement(ct.q,{style:{textAlign:"right",width:"20%"}},"Duration"))),n.a.createElement(ct.n,null,e.tracks.map(t=>n.a.createElement(ht,{style:e.selected.includes(t.index)?r.selectedTableRow:{},key:t.index,onDoubleClick:A=>e.handleRenameTrack(A,t.index),onClick:A=>e.handleSelectTrackClick(A,t.index)},n.a.createElement(ct.o,{style:{textAlign:"center",width:"2ch"}},t.index+1),n.a.createElement(ct.o,{style:{width:"80%"}},n.a.createElement("div",null,t.fullWidthTitle&&`${t.fullWidthTitle} / `,t.title||"No Title")),n.a.createElement(ct.o,{style:{textAlign:"right",width:"20%"}},n.a.createElement("span",null,t.encoding),"\xa0",n.a.createElement("span",null,t.duration))))))),n.a.createElement("div",{className:i.controlsContainer},"MAIN"===o?n.a.createElement(an,null):null)),n.a.createElement(bt,{onClick:e.open}),n.a.createElement(ZA,null),n.a.createElement(GA,null),n.a.createElement(ta,null),n.a.createElement(Ia,{files:e.uploadedFiles}),n.a.createElement(_A,null),n.a.createElement(on,{trackIndexes:e.selected}),n.a.createElement(vt,null),n.a.createElement(aa,null))},vn=Object(Qe.a)(e=>({add:{position:"absolute",bottom:e.spacing(3),right:e.spacing(3),[P(e)]:{bottom:e.spacing(2)}},main:{overflowY:"auto",flex:"1 1 auto",marginBottom:e.spacing(3),outline:"none",marginLeft:e.spacing(-1),marginRight:e.spacing(-1),[R(e)]:{marginLeft:e.spacing(-2),marginRight:e.spacing(-2)}},toolbar:{marginTop:e.spacing(3),marginLeft:e.spacing(-2),marginRight:e.spacing(-2),[e.breakpoints.up(600+2*e.spacing(2))]:{marginLeft:e.spacing(-3),marginRight:e.spacing(-3)}},toolbarLabel:{flex:"1 1 100%"},toolbarHighlight:"light"===e.palette.type?{color:e.palette.secondary.main,backgroundColor:Object(dA.d)(e.palette.secondary.light,.85)}:{color:e.palette.text.primary,backgroundColor:e.palette.secondary.dark},headBox:{display:"flex",justifyContent:"space-between"},spacing:{marginTop:e.spacing(1)},indexCell:{whiteSpace:"nowrap",paddingRight:0,width:e.spacing(4)},backdrop:{zIndex:e.zIndex.drawer+1,color:"#fff"},remainingTimeTooltip:{textDecoration:"underline",textDecorationStyle:"dotted"},hoveringOverGroup:{backgroundColor:`${Object(mA.alpha)(e.palette.secondary.dark,.4)}`},dragHandleEmpty:{width:20,padding:`${e.spacing(.5)}px 0 0 0`}}));function kn(e,t){return t&&e.index===t.track?"playing"===t.state?"playing":"paused"===t.state?"paused":"none":"none"}const Cn=e=>{let t=Object(r.d)();const A=b(e=>e.main.disc),l=b(e=>e.main.deviceName),i=b(e=>e.main.deviceStatus),{vintageMode:o}=b(e=>e.appState),[c,s]=n.a.useState([]),[m,u]=n.a.useState([]),[p,g]=Object(a.useState)(-1),[h,f]=n.a.useState(null),E=Object(a.useCallback)(e=>{f(e.currentTarget)},[f]),w=Object(a.useCallback)(()=>{f(null)},[f]),v=Object(a.useCallback)(e=>{t(function(e,t){return async function(A){const{netmdService:a}=L;await a.moveTrack(e,t),Je()(A)}}(c[0],e)),w()},[t,c,w]),k=Object(a.useCallback)((e,A)=>{if(!e.destination)return;let a=parseInt(e.source.droppableId),n=e.source.index,l=parseInt(e.destination.droppableId),i=e.destination.index;t(function(e,t,A,a){return async function(n,l){if(e===A&&t===a)return;n(xe.setLoading(!0));const i=T(await L.netmdService.listContent());let r,o,c,s,d,m,u=i[e].tracks.splice(t,1)[0];eA?(o=A,s=a,c=e,d=t,m=1):t{t(ge.setVisible(!0))},[t]);Object(a.useEffect)(()=>{t(Je())},[t]),Object(a.useEffect)(()=>{s([])},[A]);const y=Object(a.useCallback)((e,A)=>{u(e),t(se.setVisible(!0))},[t]),{getRootProps:x,getInputProps:O,isDragActive:D,open:I}=Object(cA.a)({onDrop:y,accept:["audio/*","video/mp4"],noClick:!0}),j=vn(),N=Object(a.useMemo)(()=>S(A),[A]),R=Object(a.useMemo)(()=>T(A),[A]),P=Object(a.useCallback)((e,t)=>{if(e.shiftKey&&c.length&&-1!==p){let e=Math.min(p+1,t),A=Math.max(p-1,t),a=[...c];for(let t=e;t<=A;t++){let e=a.indexOf(t);-1===e?a.push(t):a.splice(e,1)}a.includes(t)||a.push(t),s(a)}else c.includes(t)?s(c.filter(e=>e!==t)):s([...c,t]);g(t)},[c,s,p,g]),M=Object(a.useCallback)(e=>{c.lengthe.index)):s([])},[c,N]),F=Object(a.useCallback)((e,A)=>{let a=N.find(e=>e.index===A);a&&t(Object(V.batchActions)([q.setVisible(!0),q.setGroupIndex(null),q.setCurrentName(a.title),q.setCurrentFullWidthName(a.fullWidthTitle),q.setIndex(a.index)]))},[t,N]),Q=Object(a.useCallback)((e,A)=>{var a,n;let l=R.find(e=>e.index===A);l&&t(Object(V.batchActions)([q.setVisible(!0),q.setGroupIndex(A),q.setCurrentName(null!==(a=l.title)&&void 0!==a?a:""),q.setCurrentFullWidthName(null!==(n=l.fullWidthTitle)&&void 0!==n?n:""),q.setIndex(-1)]))},[t,R]),W=Object(a.useCallback)(e=>{1===e.detail&&F(e,c[0])},[F,c]),z=Object(a.useCallback)(e=>{var A;t((A=c,async function(e){if(!window.confirm(`Proceed with Delete Track${1!==A.length?"s":""}? This operation cannot be undone.`))return;const{netmdService:t}=L;e(xe.setLoading(!0)),await t.deleteTracks(A),Je()(e)}))},[t,c]),G=Object(a.useCallback)(e=>{var A;t((A=c,async function(e){let t=A[0],a=A[A.length-1]-t+1;const{netmdService:n}=L;n.addGroup(t,a,""),Je()(e)}))},[t,c]),U=Object(a.useCallback)((e,A)=>{t(function(e){return async function(t){const{netmdService:A}=L;A.deleteGroup(e),Je()(t)}}(A))},[t]),H=Object(a.useCallback)((e,A)=>{i&&(i.track!==A?(t(Ve("goto",A)),"playing"!==i.state&&t(Ve("play"))):"playing"===i.state&&t(Ve("pause")))},[t,i]),J=Object(a.useMemo)(()=>N.filter(e=>null===e.group&&c.includes(e.index)).length===c.length&&B(c.sort((e,t)=>e-t)),[N,c]),Y=c.length;if(o){const e={disc:A,deviceName:l,selected:c,setSelected:s,selectedCount:Y,tracks:N,uploadedFiles:m,setUploadedFiles:u,onDrop:y,getRootProps:x,getInputProps:O,isDragActive:D,open:I,moveMenuAnchorEl:h,setMoveMenuAnchorEl:f,handleShowMoveMenu:E,handleCloseMoveMenu:w,handleMoveSelectedTrack:v,handleShowDumpDialog:C,handleDeleteSelected:z,handleRenameActionClick:W,handleRenameTrack:F,handleSelectAllClick:M,handleSelectTrackClick:P};return n.a.createElement(wn,e)}return n.a.createElement(n.a.Fragment,null,n.a.createElement(tt.a,{className:j.headBox},n.a.createElement($e.a,{component:"h1",variant:"h4"},l||"Loading..."),n.a.createElement(_t,null)),n.a.createElement($e.a,{component:"h2",variant:"body2"},null!==A?n.a.createElement(n.a.Fragment,null,n.a.createElement("span",null,`${Object(d.formatTimeFromFrames)(A.left,!1)} left of ${Object(d.formatTimeFromFrames)(A.total,!1)} `),n.a.createElement(It.a,{title:n.a.createElement(n.a.Fragment,null,n.a.createElement("span",null,`${Object(d.formatTimeFromFrames)(2*A.left,!1)} left in LP2 Mode`),n.a.createElement("br",null),n.a.createElement("span",null,`${Object(d.formatTimeFromFrames)(4*A.left,!1)} left in LP4 Mode`)),arrow:!0},n.a.createElement("span",{className:j.remainingTimeTooltip},"SP Mode"))):"Loading..."),n.a.createElement(xA.a,{className:Object(oA.default)(j.toolbar,{[j.toolbarHighlight]:Y>0})},Y>0?n.a.createElement(HA.a,{indeterminate:Y>0&&Y0,onChange:M,inputProps:{"aria-label":"select all tracks"}}):null,Y>0?n.a.createElement($e.a,{className:j.toolbarLabel,color:"inherit",variant:"subtitle1"},Y," selected"):n.a.createElement($e.a,{component:"h3",variant:"h6",className:j.toolbarLabel},(null===A||void 0===A?void 0:A.fullWidthTitle)&&`${A.fullWidthTitle} / `,(null===A||void 0===A?void 0:A.title)||"Untitled Disc"),Y>0?n.a.createElement(n.a.Fragment,null,n.a.createElement(It.a,{title:"Record from MD"},n.a.createElement(qe.a,{"aria-label":"Record",onClick:C},"Record"))):null,Y>0?n.a.createElement(It.a,{title:"Delete"},n.a.createElement(kt.a,{"aria-label":"delete",onClick:z},n.a.createElement(fA.a,null))):null,Y>0?n.a.createElement(It.a,{title:J?"Group":""},n.a.createElement(kt.a,{"aria-label":"group",disabled:!J,onClick:G},n.a.createElement(EA.a,null))):null,Y>0?n.a.createElement(It.a,{title:"Rename"},n.a.createElement(kt.a,{"aria-label":"rename",disabled:1!==Y,onClick:W},n.a.createElement(Rt.a,null))):null),n.a.createElement(tt.a,Object.assign({className:j.main},x(),{id:"main"}),n.a.createElement("input",O()),n.a.createElement(wA.a,{size:"small"},n.a.createElement(CA.a,null,n.a.createElement(yA.a,null,n.a.createElement(kA.a,{className:j.dragHandleEmpty}),n.a.createElement(kA.a,{className:j.indexCell},"#"),n.a.createElement(kA.a,null,"Title"),n.a.createElement(kA.a,{align:"right"},"Duration"))),n.a.createElement(sA.a,{onDragEnd:k},n.a.createElement(vA.a,null,R.map((e,t)=>n.a.createElement(yA.a,{key:`${t}`},n.a.createElement(kA.a,{colSpan:4,style:{padding:"0"}},n.a.createElement(wA.a,{size:"small"},n.a.createElement(sA.c,{droppableId:`${t}`,key:`${t}`},(t,A)=>n.a.createElement(vA.a,Object.assign({},t.droppableProps,{ref:t.innerRef,className:Object(oA.default)({[j.hoveringOverGroup]:A.isDraggingOver})}),null!==e.title&&n.a.createElement(FA,{group:e,onRename:Q,onDelete:U}),null===e.title&&0===e.tracks.length&&n.a.createElement(yA.a,{style:{height:"1px"}}),e.tracks.map((t,A)=>n.a.createElement(sA.b,{draggableId:`${e.index}-${t.index}`,key:`t-${t.index}`,index:A},A=>n.a.createElement(MA,{track:t,draggableProvided:A,inGroup:null!==e.title,isSelected:c.includes(t.index),trackStatus:kn(t,i),onSelect:P,onRename:F,onTogglePlayPause:H}))),t.placeholder))))))))),D?n.a.createElement(Me.a,{className:j.backdrop,open:D},"Drop your Music to Upload"):null),n.a.createElement(uA.a,{color:"primary","aria-label":"add",className:j.add,onClick:I},n.a.createElement(gA.a,null)),n.a.createElement(ZA,null),n.a.createElement(GA,null),n.a.createElement(ta,null),n.a.createElement(Ia,{files:m}),n.a.createElement(_A,null),n.a.createElement(on,{trackIndexes:c}),n.a.createElement(vt,null),n.a.createElement(aa,null))};var yn=A(586),xn=A(317),On=A.n(xn),Dn=A(318),Sn=A.n(Dn);const Tn=st.c` ${ct.y} body { font-family: 'ms_sans_serif'; @@ -98,5 +98,5 @@ body { img { image-rendering: pixelated; } -`,In=Object(Qe.a)(e=>({desktop:{width:"100%",height:"100%",backgroundColor:"teal",display:"flex",justifyContent:"center"},window:{display:"flex !important",flexDirection:"column",width:"auto",height:"100%",[R(e)]:{width:600,marginLeft:"auto",marginRight:"auto",height:600,marginTop:e.spacing(2)},[M(e)]:{width:700,height:700,marginTop:e.spacing(2)}},loading:{position:"absolute",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center"}})),jn=()=>{const e=In(),t=Object(r.d)(),{mainView:A,loading:l}=b(e=>e.appState),[i,o]=Object(a.useState)(!1),c=Object(a.useCallback)(()=>{t(xe.setMainView("WELCOME"))},[t]),s=Object(a.useCallback)(()=>{o(!1)},[o]),d=Object(a.useCallback)(()=>{o(!i)},[i,o]),m=Object(a.useCallback)(()=>{window.open("https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ","_blank")},[]),u=On.a,p={...u,selectedTableRow:{background:u.hoverBackground,color:u.canvasTextInvert}};return n.a.createElement("div",{className:e.desktop},n.a.createElement(Tn,null),n.a.createElement(st.b,{theme:p},n.a.createElement(ct.v,{className:e.window},n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("img",{alt:"CD Player",src:Sn.a}),n.a.createElement("span",{style:{flex:"1 1 auto",marginLeft:"4px"}},"Web MiniDisc"),"MAIN"===A?n.a.createElement(ct.c,{onClick:c},n.a.createElement(ft,null)):null),n.a.createElement(ct.t,null,n.a.createElement(ct.c,{variant:"menu",size:"sm",active:i,onClick:d},"File"),n.a.createElement(ct.c,{variant:"menu",size:"sm",onClick:m},"Help"),i?n.a.createElement(_t,{onClick:s}):null),n.a.createElement(n.a.Fragment,null,"WELCOME"===A?n.a.createElement(rA,null):null,"MAIN"===A?n.a.createElement(kn,null):null),n.a.createElement(ct.j,{variant:"well"},"\xa0"," (c) ",n.a.createElement(ct.a,{rel:"noopener noreferrer",color:"inherit",target:"_blank",href:"https://stefano.brilli.me/"},"Stefano Brilli")," ",(new Date).getFullYear(),"."),l?n.a.createElement("div",{className:e.loading},n.a.createElement(ct.g,{size:32})):null)))},Bn=Object(Qe.a)(e=>({layout:{width:"auto",height:"100%",[R(e)]:{width:600,marginLeft:"auto",marginRight:"auto"},[M(e)]:{width:700}},paper:{position:"relative",display:"flex",flexDirection:"column",padding:e.spacing(2),height:"calc(100% - 20px)",[R(e)]:{marginTop:e.spacing(2),marginBottom:e.spacing(1),padding:e.spacing(3),height:600},[M(e)]:{height:700}},bottomBar:{display:"flex",alignItems:"center",[P(e)]:{flexWrap:"wrap"},marginLeft:-e.spacing(2)},copyrightTypography:{textAlign:"center"},backdrop:{zIndex:e.zIndex.drawer+1,color:"#fff"},minidiscLogo:{width:48},controlsContainer:{flex:"0 0 auto",width:"100%",paddingRight:e.spacing(8),[P(e)]:{paddingLeft:0}}})),Nn=Object(We.a)({palette:{type:"dark",primary:{light:"#6ec6ff",main:"#2196f3",dark:"#0069c0",contrastText:"#fff"}}}),Rn=Object(We.a)({palette:{type:"light"}});var Pn=()=>{const e=Bn(),{mainView:t,loading:A,darkMode:a,vintageMode:l}=b(e=>e.appState);return l?n.a.createElement(jn,null):n.a.createElement(n.a.Fragment,null,n.a.createElement(ze.a,{theme:a?Nn:Rn},n.a.createElement(Pe.a,null),n.a.createElement("main",{className:e.layout},n.a.createElement(yn.a,{className:e.paper},"WELCOME"===t?n.a.createElement(rA,null):null,"MAIN"===t?n.a.createElement(kn,null):null,n.a.createElement(tt.a,{className:e.controlsContainer},"MAIN"===t?n.a.createElement(an,null):null)),n.a.createElement($e.a,{variant:"body2",color:"textSecondary",className:e.copyrightTypography},"\xa9 ",n.a.createElement(At.a,{rel:"noopener noreferrer",color:"inherit",target:"_blank",href:"https://stefano.brilli.me/"},"Stefano Brilli")," ",(new Date).getFullYear(),".")),A?n.a.createElement(Me.a,{className:e.backdrop,open:A},n.a.createElement(Fe.a,{color:"inherit"})):null))},Mn=(A(568),A(569),A(204));class Fn{constructor(e){this.worker=e,this.messageCallback=void 0,e.onmessage=this.handleMessage.bind(this)}async init(){await new Promise(e=>{this.messageCallback=e,this.worker.postMessage({action:"init"})})}async encode(e,t){return(await new Promise(A=>{this.messageCallback=A,this.worker.postMessage({action:"encode",bitrate:t,data:e},[e])})).data.result}terminate(){this.worker.terminate()}handleMessage(e){this.messageCallback(e),this.messageCallback=void 0}}if("undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope){let e;onmessage=async t=>{const{action:A,...a}=t.data;if("init"===A)self.importScripts(E("atracdenc.js")),self.Module().then(t=>{e=t,self.postMessage({action:"init"}),e.setLogger&&e.setLogger((e,t)=>console.log(`${t}: ${e}`))});else if("encode"===A){const{bitrate:t,data:A}=a,n="inWavFile.wav",l="outAt3File.aea",i=new Uint8Array(A);e.FS.writeFile(`${n}`,i),e.callMain(["-e","atrac3","-i",n,"-o",l,"--bitrate",t]);let r=e.FS.stat(l).size,o=new Uint8Array(r-96),c=e.FS.open(l,"r");e.FS.read(c,o,0,o.length,96),e.FS.close(c);let s=o.buffer;self.postMessage({action:"encode",result:s},[s])}}}const Qn=A(584);var Wn=A(319),zn=A.n(Wn);if(L.netmdService=new z({debug:!0}),L.audioExportService=new class{constructor(){this.ffmpegProcess=void 0,this.atracdencProcess=void 0,this.loglines=[],this.inFileName="",this.outFileNameNoExt=""}async init(){Object(Mn.setLogging)(!0)}async prepare(e){this.loglines=[],this.ffmpegProcess=Object(Mn.createWorker)({logger:e=>{this.loglines.push(e),console.log(e.action,e.message)},corePath:E("ffmpeg-core.js"),workerPath:E("worker.min.js")}),await this.ffmpegProcess.load(),this.atracdencProcess=new Fn(new Qn),await this.atracdencProcess.init();let t=e.name.split(".").slice(-1);if(0===t.length)throw new Error(`Unrecognized file format: ${e.name}`);this.inFileName=`inAudioFile.${t[0]}`,this.outFileNameNoExt="outAudioFile",await this.ffmpegProcess.write(this.inFileName,e)}async info(){await this.ffmpegProcess.transcode(this.inFileName,`${this.outFileNameNoExt}.metadata`,"-f ffmetadata");let e=/Audio:\s(.*?),/,t=/Input #0,\s(.*?),/,A=null,a=null;for(let n of this.loglines){let l=n.message.match(e);if(null===l)if(l=n.message.match(t),null===l){if(null!==A&&null!==a)break}else a=l[1];else A=l[1]}return{format:A,input:a}}async export({format:e}){let t;if("SP"===e){const e=`${this.outFileNameNoExt}.raw`;await this.ffmpegProcess.transcode(this.inFileName,e,"-ac 2 -ar 44100 -f s16be");let{data:A}=await this.ffmpegProcess.read(e);t=A.buffer}else{const A=`${this.outFileNameNoExt}.wav`;await this.ffmpegProcess.transcode(this.inFileName,A,"-f wav -ar 44100 -ac 2");let{data:a}=await this.ffmpegProcess.read(A),n="0";switch(e){case"LP2":n="128";break;case"LP105":n="102";break;case"LP4":n="64"}t=await this.atracdencProcess.encode(a.buffer,n)}return this.ffmpegProcess.worker.terminate(),this.atracdencProcess.terminate(),t}},L.mediaRecorderService=new class{constructor(){this.recorder=void 0,this.stream=void 0,this.audioContext=void 0,this.analyserNode=void 0,this.gainNode=void 0}playTestInput(e){this.audioContext=new AudioContext,this.gainNode=this.audioContext.createGain(),this.analyserNode=this.audioContext.createAnalyser(),this.initStream(e).then(()=>{this.audioContext.createMediaStreamSource(this.stream).connect(this.gainNode),this.gainNode.connect(this.analyserNode),this.analyserNode.connect(this.audioContext.destination)})}stopTestInput(){var e;this.audioContext&&(null===(e=this.audioContext)||void 0===e||e.close(),delete this.audioContext,this.closeStream())}async initStream(e){const t={autoGainControl:!1,channelCount:2,deviceId:e,echoCancellation:!1,noiseSuppression:!1,sampleRate:44100,highpassFilter:!1};this.stream=await navigator.mediaDevices.getUserMedia({audio:t});const A=this.stream.getAudioTracks();A.length>0&&console.log("Record Setings:",A[0].getSettings())}async startRecording(){this.audioContext=new AudioContext;const e=this.audioContext.createMediaStreamSource(this.stream);this.recorder=new zn.a(e,{workerPath:E("recorderWorker.js")}),this.recorder.record()}async stopRecording(){this.recorder.stop()}async closeStream(){var e;null===(e=this.stream)||void 0===e||e.getTracks().forEach(e=>e.stop())}downloadRecorded(e){this.recorder.exportWAV(t=>{let A=URL.createObjectURL(t),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=A,a.download=`${k(e)}.wav`,a.click(),window.URL.revokeObjectURL(A),document.body.removeChild(a)})}},function(){let e;window.addEventListener("beforeunload",e=>{Ne.getState().uploadDialog.visible&&(e.preventDefault(),e.returnValue="Warning! Recording will be interrupted")}),navigator&&navigator.usb?navigator.usb.ondisconnect=function(){Ne.dispatch(xe.setMainView("WELCOME"))}:Ne.dispatch(xe.setBrowserSupported(!1)),"Notification"in window&&"denied"!==Notification.permission||(Ne.dispatch(xe.setNotificationSupport(!1)),Ne.dispatch(xe.setNotifyWhenFinished(!1))),window.addEventListener("beforeinstallprompt",t=>{t.preventDefault(),e=t})}(),function(){let e=null,t=!1;function A(e){var A;return!t&&"MAIN"===e.appState.mainView&&!1===e.appState.loading&&"playing"===(null===(A=e.main.deviceStatus)||void 0===A?void 0:A.state)&&!1===e.convertDialog.visible&&!1===e.uploadDialog.visible&&!1===e.recordDialog.visible&&!1===e.panicDialog.visible&&!1===e.errorDialog.visible&&!1===e.dumpDialog.visible}Ne.subscribe((function(){const a=Ne.getState();!0===A(a)&&null===e?e=setInterval(async()=>{try{const e=await L.netmdService.getDeviceStatus();Ne.dispatch(Te.setDeviceStatus(e))}catch(e){console.error(e),t=!0}},5e3):!1===A(a)&&null!==e&&(clearInterval(e),e=null)}))}(),i.a.render(n.a.createElement(r.a,{store:Ne},n.a.createElement(Pn,null)),document.getElementById("root")),"true"!==Object({NODE_ENV:"production",PUBLIC_URL:"/webminidisc"}).REACT_APP_NO_GA_RELEASE){!function(e){if("serviceWorker"in navigator){if(new URL("/webminidisc",window.location.href).origin!==window.location.origin)return;window.addEventListener("load",()=>{const t="/webminidisc/final-service-worker.js";o?(!function(e,t){fetch(e,{headers:{"Service-Worker":"script"}}).then(A=>{const a=A.headers.get("content-type");404===A.status||null!=a&&-1===a.indexOf("javascript")?navigator.serviceWorker.ready.then(e=>{e.unregister().then(()=>{window.location.reload()})}):c(e,t)}).catch(()=>{console.log("No internet connection found. App is running in offline mode.")})}(t,e),navigator.serviceWorker.ready.then(()=>{console.log("This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA")})):c(t,e)})}}();try{!function(){let e=document.getElementsByTagName("head")[0],t=document.createElement("script");t.type="text/javascript",t.src="https://www.googletagmanager.com/gtag/js?id=UA-60498490-1",e.appendChild(t);let A=document.createElement("script");A.type="text/javascript",A.text="\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', 'UA-60498490-1');\n ",e.appendChild(A)}()}catch(Ln){}}}},[[343,1,2]]]); -//# sourceMappingURL=main.59c85b51.chunk.js.map \ No newline at end of file +`,In=Object(Qe.a)(e=>({desktop:{width:"100%",height:"100%",backgroundColor:"teal",display:"flex",justifyContent:"center"},window:{display:"flex !important",flexDirection:"column",width:"auto",height:"100%",[R(e)]:{width:600,marginLeft:"auto",marginRight:"auto",height:600,marginTop:e.spacing(2)},[M(e)]:{width:700,height:700,marginTop:e.spacing(2)}},loading:{position:"absolute",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center"}})),jn=()=>{const e=In(),t=Object(r.d)(),{mainView:A,loading:l}=b(e=>e.appState),[i,o]=Object(a.useState)(!1),c=Object(a.useCallback)(()=>{t(xe.setMainView("WELCOME"))},[t]),s=Object(a.useCallback)(()=>{o(!1)},[o]),d=Object(a.useCallback)(()=>{o(!i)},[i,o]),m=Object(a.useCallback)(()=>{window.open("https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ","_blank")},[]),u=On.a,p={...u,selectedTableRow:{background:u.hoverBackground,color:u.canvasTextInvert}};return n.a.createElement("div",{className:e.desktop},n.a.createElement(Tn,null),n.a.createElement(st.b,{theme:p},n.a.createElement(ct.v,{className:e.window},n.a.createElement(ct.x,{style:{display:"flex",alignItems:"center"}},n.a.createElement("img",{alt:"CD Player",src:Sn.a}),n.a.createElement("span",{style:{flex:"1 1 auto",marginLeft:"4px"}},"Web MiniDisc"),"MAIN"===A?n.a.createElement(ct.c,{onClick:c},n.a.createElement(ft,null)):null),n.a.createElement(ct.t,null,n.a.createElement(ct.c,{variant:"menu",size:"sm",active:i,onClick:d},"File"),n.a.createElement(ct.c,{variant:"menu",size:"sm",onClick:m},"Help"),i?n.a.createElement(_t,{onClick:s}):null),n.a.createElement(n.a.Fragment,null,"WELCOME"===A?n.a.createElement(rA,null):null,"MAIN"===A?n.a.createElement(Cn,null):null),n.a.createElement(ct.j,{variant:"well"},"\xa0"," (c) ",n.a.createElement(ct.a,{rel:"noopener noreferrer",color:"inherit",target:"_blank",href:"https://stefano.brilli.me/"},"Stefano Brilli")," ",(new Date).getFullYear(),"."),l?n.a.createElement("div",{className:e.loading},n.a.createElement(ct.g,{size:32})):null)))},Bn=Object(Qe.a)(e=>({layout:{width:"auto",height:"100%",[R(e)]:{width:600,marginLeft:"auto",marginRight:"auto"},[M(e)]:{width:700}},paper:{position:"relative",display:"flex",flexDirection:"column",padding:e.spacing(2),height:"calc(100% - 20px)",[R(e)]:{marginTop:e.spacing(2),marginBottom:e.spacing(1),padding:e.spacing(3),height:600},[M(e)]:{height:700}},bottomBar:{display:"flex",alignItems:"center",[P(e)]:{flexWrap:"wrap"},marginLeft:-e.spacing(2)},copyrightTypography:{textAlign:"center"},backdrop:{zIndex:e.zIndex.drawer+1,color:"#fff"},minidiscLogo:{width:48},controlsContainer:{flex:"0 0 auto",width:"100%",paddingRight:e.spacing(8),[P(e)]:{paddingLeft:0}}})),Nn=Object(We.a)({palette:{type:"dark",primary:{light:"#6ec6ff",main:"#2196f3",dark:"#0069c0",contrastText:"#fff"}}}),Rn=Object(We.a)({palette:{type:"light"}});var Pn=()=>{const e=Bn(),{mainView:t,loading:A,darkMode:a,vintageMode:l}=b(e=>e.appState);return l?n.a.createElement(jn,null):n.a.createElement(n.a.Fragment,null,n.a.createElement(ze.a,{theme:a?Nn:Rn},n.a.createElement(Pe.a,null),n.a.createElement("main",{className:e.layout},n.a.createElement(yn.a,{className:e.paper},"WELCOME"===t?n.a.createElement(rA,null):null,"MAIN"===t?n.a.createElement(Cn,null):null,n.a.createElement(tt.a,{className:e.controlsContainer},"MAIN"===t?n.a.createElement(an,null):null)),n.a.createElement($e.a,{variant:"body2",color:"textSecondary",className:e.copyrightTypography},"\xa9 ",n.a.createElement(At.a,{rel:"noopener noreferrer",color:"inherit",target:"_blank",href:"https://stefano.brilli.me/"},"Stefano Brilli")," ",(new Date).getFullYear(),".")),A?n.a.createElement(Me.a,{className:e.backdrop,open:A},n.a.createElement(Fe.a,{color:"inherit"})):null))},Mn=(A(568),A(569),A(204));class Fn{constructor(e){this.worker=e,this.messageCallback=void 0,e.onmessage=this.handleMessage.bind(this)}async init(){await new Promise(e=>{this.messageCallback=e,this.worker.postMessage({action:"init"})})}async encode(e,t){return(await new Promise(A=>{this.messageCallback=A,this.worker.postMessage({action:"encode",bitrate:t,data:e},[e])})).data.result}terminate(){this.worker.terminate()}handleMessage(e){this.messageCallback(e),this.messageCallback=void 0}}if("undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope){let e;onmessage=async t=>{const{action:A,...a}=t.data;if("init"===A)self.importScripts(E("atracdenc.js")),self.Module().then(t=>{e=t,self.postMessage({action:"init"}),e.setLogger&&e.setLogger((e,t)=>console.log(`${t}: ${e}`))});else if("encode"===A){const{bitrate:t,data:A}=a,n="inWavFile.wav",l="outAt3File.aea",i=new Uint8Array(A);e.FS.writeFile(`${n}`,i),e.callMain(["-e","atrac3","-i",n,"-o",l,"--bitrate",t]);let r=e.FS.stat(l).size,o=new Uint8Array(r-96),c=e.FS.open(l,"r");e.FS.read(c,o,0,o.length,96),e.FS.close(c);let s=o.buffer;self.postMessage({action:"encode",result:s},[s])}}}const Qn=A(584);var Wn=A(319),zn=A.n(Wn);if(L.netmdService=new z({debug:!0}),L.audioExportService=new class{constructor(){this.ffmpegProcess=void 0,this.atracdencProcess=void 0,this.loglines=[],this.inFileName="",this.outFileNameNoExt=""}async init(){Object(Mn.setLogging)(!0)}async prepare(e){this.loglines=[],this.ffmpegProcess=Object(Mn.createWorker)({logger:e=>{this.loglines.push(e),console.log(e.action,e.message)},corePath:E("ffmpeg-core.js"),workerPath:E("worker.min.js")}),await this.ffmpegProcess.load(),this.atracdencProcess=new Fn(new Qn),await this.atracdencProcess.init();let t=e.name.split(".").slice(-1);if(0===t.length)throw new Error(`Unrecognized file format: ${e.name}`);this.inFileName=`inAudioFile.${t[0]}`,this.outFileNameNoExt="outAudioFile",await this.ffmpegProcess.write(this.inFileName,e)}async info(){await this.ffmpegProcess.transcode(this.inFileName,`${this.outFileNameNoExt}.metadata`,"-f ffmetadata");let e=/Audio:\s(.*?),/,t=/Input #0,\s(.*?),/,A=null,a=null;for(let n of this.loglines){let l=n.message.match(e);if(null===l)if(l=n.message.match(t),null===l){if(null!==A&&null!==a)break}else a=l[1];else A=l[1]}return{format:A,input:a}}async export({format:e}){let t;if("SP"===e){const e=`${this.outFileNameNoExt}.raw`;await this.ffmpegProcess.transcode(this.inFileName,e,"-ac 2 -ar 44100 -f s16be");let{data:A}=await this.ffmpegProcess.read(e);t=A.buffer}else{const A=`${this.outFileNameNoExt}.wav`;await this.ffmpegProcess.transcode(this.inFileName,A,"-f wav -ar 44100 -ac 2");let{data:a}=await this.ffmpegProcess.read(A),n="0";switch(e){case"LP2":n="128";break;case"LP105":n="102";break;case"LP4":n="64"}t=await this.atracdencProcess.encode(a.buffer,n)}return this.ffmpegProcess.worker.terminate(),this.atracdencProcess.terminate(),t}},L.mediaRecorderService=new class{constructor(){this.recorder=void 0,this.stream=void 0,this.audioContext=void 0,this.analyserNode=void 0,this.gainNode=void 0}playTestInput(e){this.audioContext=new AudioContext,this.gainNode=this.audioContext.createGain(),this.analyserNode=this.audioContext.createAnalyser(),this.initStream(e).then(()=>{this.audioContext.createMediaStreamSource(this.stream).connect(this.gainNode),this.gainNode.connect(this.analyserNode),this.analyserNode.connect(this.audioContext.destination)})}stopTestInput(){var e;this.audioContext&&(null===(e=this.audioContext)||void 0===e||e.close(),delete this.audioContext,this.closeStream())}async initStream(e){const t={autoGainControl:!1,channelCount:2,deviceId:e,echoCancellation:!1,noiseSuppression:!1,sampleRate:44100,highpassFilter:!1};this.stream=await navigator.mediaDevices.getUserMedia({audio:t});const A=this.stream.getAudioTracks();A.length>0&&console.log("Record Setings:",A[0].getSettings())}async startRecording(){this.audioContext=new AudioContext;const e=this.audioContext.createMediaStreamSource(this.stream);this.recorder=new zn.a(e,{workerPath:E("recorderWorker.js")}),this.recorder.record()}async stopRecording(){this.recorder.stop()}async closeStream(){var e;null===(e=this.stream)||void 0===e||e.getTracks().forEach(e=>e.stop())}downloadRecorded(e){this.recorder.exportWAV(t=>{let A=URL.createObjectURL(t),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=A,a.download=`${C(e)}.wav`,a.click(),window.URL.revokeObjectURL(A),document.body.removeChild(a)})}},function(){let e;window.addEventListener("beforeunload",e=>{Ne.getState().uploadDialog.visible&&(e.preventDefault(),e.returnValue="Warning! Recording will be interrupted")}),navigator&&navigator.usb?navigator.usb.ondisconnect=function(){Ne.dispatch(xe.setMainView("WELCOME"))}:Ne.dispatch(xe.setBrowserSupported(!1)),"Notification"in window&&"denied"!==Notification.permission||(Ne.dispatch(xe.setNotificationSupport(!1)),Ne.dispatch(xe.setNotifyWhenFinished(!1))),window.addEventListener("beforeinstallprompt",t=>{t.preventDefault(),e=t})}(),function(){let e=null,t=!1;function A(e){var A;return!t&&"MAIN"===e.appState.mainView&&!1===e.appState.loading&&"playing"===(null===(A=e.main.deviceStatus)||void 0===A?void 0:A.state)&&!1===e.convertDialog.visible&&!1===e.uploadDialog.visible&&!1===e.recordDialog.visible&&!1===e.panicDialog.visible&&!1===e.errorDialog.visible&&!1===e.dumpDialog.visible}Ne.subscribe((function(){const a=Ne.getState();!0===A(a)&&null===e?e=setInterval(async()=>{try{const e=await L.netmdService.getDeviceStatus();Ne.dispatch(Te.setDeviceStatus(e))}catch(e){console.error(e),t=!0}},5e3):!1===A(a)&&null!==e&&(clearInterval(e),e=null)}))}(),i.a.render(n.a.createElement(r.a,{store:Ne},n.a.createElement(Pn,null)),document.getElementById("root")),"true"!==Object({NODE_ENV:"production",PUBLIC_URL:"/webminidisc"}).REACT_APP_NO_GA_RELEASE){!function(e){if("serviceWorker"in navigator){if(new URL("/webminidisc",window.location.href).origin!==window.location.origin)return;window.addEventListener("load",()=>{const t="/webminidisc/final-service-worker.js";o?(!function(e,t){fetch(e,{headers:{"Service-Worker":"script"}}).then(A=>{const a=A.headers.get("content-type");404===A.status||null!=a&&-1===a.indexOf("javascript")?navigator.serviceWorker.ready.then(e=>{e.unregister().then(()=>{window.location.reload()})}):c(e,t)}).catch(()=>{console.log("No internet connection found. App is running in offline mode.")})}(t,e),navigator.serviceWorker.ready.then(()=>{console.log("This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA")})):c(t,e)})}}();try{!function(){let e=document.getElementsByTagName("head")[0],t=document.createElement("script");t.type="text/javascript",t.src="https://www.googletagmanager.com/gtag/js?id=UA-60498490-1",e.appendChild(t);let A=document.createElement("script");A.type="text/javascript",A.text="\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', 'UA-60498490-1');\n ",e.appendChild(A)}()}catch(Ln){}}}},[[343,1,2]]]); +//# sourceMappingURL=main.0bfb5ad5.chunk.js.map \ No newline at end of file diff --git a/static/js/main.0bfb5ad5.chunk.js.map b/static/js/main.0bfb5ad5.chunk.js.map new file mode 100644 index 0000000..53450b8 --- /dev/null +++ b/static/js/main.0bfb5ad5.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["images/win95/delete.png","images/record-complete-notification-icon.png","images/win95/win95.png","images/chrome-icon.svg","images/win95/arrowup.png","images/win95/arrowdown.png","images/win95/mic.png","images/win95/move.png","images/win95/rename.png","images/win95/device.png","images/win95/minidisc32.png","images/win95/cdplayer.png","webpack:///./src/services/atracdenc-worker.ts?dc3c","serviceWorker.ts","utils.ts","services/netmd.ts","services/registry.ts","redux/upload-dialog-feature.ts","redux/rename-dialog-feature.ts","redux/error-dialog-feature.ts","redux/panic-dialog-feature.ts","redux/convert-dialog-feature.ts","redux/dump-dialog-feature.ts","redux/record-dialog-feature.ts","redux/app-feature.ts","redux/main-feature.ts","redux/store.ts","redux/actions.ts","components/win95/common.tsx","components/win95/about-dialog.tsx","components/about-dialog.tsx","components/win95/topmenu.tsx","components/topmenu.tsx","components/win95/welcome.tsx","components/welcome.tsx","components/main-rows.tsx","components/win95/rename-dialog.tsx","components/rename-dialog.tsx","components/win95/upload-dialog.tsx","components/upload-dialog.tsx","components/win95/record-dialog.tsx","components/record-dialog.tsx","components/error-dialog.tsx","components/panic-dialog.tsx","components/win95/convert-dialog.tsx","components/convert-dialog.tsx","images/md0.svg","images/md1.svg","images/md2.svg","images/md3.svg","components/win95/controls.tsx","components/controls.tsx","components/win95/dump-dialog.tsx","components/dump-dialog.tsx","components/win95/main.tsx","components/main.tsx","components/win95/app.tsx","components/app.tsx","services/atracdenc-worker.ts","services/audio-export.ts","index.tsx","services/mediarecorder.ts"],"names":["module","exports","Worker","isLocalhost","Boolean","window","location","hostname","match","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","console","log","state","controller","onUpdate","onSuccess","update","catch","error","sleep","ms","Promise","resolve","setTimeout","async","sleepWithProgressCallback","cb","elapsedSecs","interval","setInterval","Math","min","clearInterval","useShallowEqualSelector","selector","useSelector","shallowEqual","getPublicPathFor","script","savePreference","key","value","localStorage","setItem","JSON","stringify","loadPreference","defaultValue","res","getItem","parse","e","getAvailableCharsForTitle","disc","includeGroups","fixLength","len","ceil","groups","filter","n","title","fwTitle","fullWidthTitle","hwTitle","undefined","group","range","tracks","index","length","usedCells","getHalfWidthTitleLength","trk","getTracks","max","sanitizeTitle","normalize","replace","multiByteChars","split","map","reduce","a","b","sanitizeHalfWidthTitle","mappings","allowedHalfWidthKana","Object","values","newTitle","charCodeAt","includes","join","jconv","encode","sanitizeFullWidthTitle","sjisEncoded","decode","EncodingName","Encoding","sp","lp2","lp4","getSortedTracks","track","push","encoding","duration","formatTimeFromFrames","sort","l","r","getGroupedTracks","groupedList","ungroupedTracks","find","lastIndex","toCopy","splice","recomputeGroupsAfterTrackMove","trackIndex","targetIndex","offset","deleteMode","trackCount","boundsStart","boundsEnd","allTracks","concat","groupBoundaries","name","fullWidthName","start","end","anyChanges","newDisc","slice","allGrouped","ungrouped","i","unshift","compileDiscTitles","availableCharactersForTitle","useFullWidth","newRawTitle","newRawFullWidthTitle","newRawTitleAfterGroup","newRawFullWidthTitleAfterGroup","halfWidthToFullWidthRange","titlesLengthInTOC","isSequential","numbers","last","num","asyncMutex","target","propertyKey","descriptor","oldValue","args","mutex","this","release","acquire","apply","forAnyDesktop","theme","breakpoints","up","spacing","belowDesktop","down","forWideDesktop","require","NetMDUSBService","constructor","debug","netmdInterface","logger","cachedContentList","Mutex","statusMonitorTimer","_fn","method","info","warn","child","titleObject","cacheTOC","setDiscTitle","syncTOC","dropCachedContentList","listContent","iface","openNewDevice","usb","openPairedDevice","listContentUsingCache","getDeviceStatus","netMd","getDeviceName","finalize","writeRawTitles","setTrackTitle","groupIndex","newName","newFullWidthName","thisGroup","g","groupBegin","groupLength","ungroupedLengthBeforeGroup","thisGroupTracks","Error","findIndex","oldName","getDiscTitle","oldFullWidthName","oldRawName","_getDiscTitle","oldRawFullWidthName","hasGroups","indexOf","hasFullWidthGroups","hasGroupsAndTitle","startsWith","hasFullWidthGroupsAndTitle","newFullWidthNameWithGroups","newNameWithGroups","indexes","reverse","content","eraseTrack","eraseDisc","src","dst","updateGroups","moveTrack","data","format","progressCallback","total","byteLength","written","encrypted","updateProgress","w","webWorkerAsyncPacketIterator","makeGetAsyncPacketIteratorOnWorkerThread","encryptedBytes","halfWidthTitle","mdTrack","MDTrack","download","writtenBytes","terminate","play","pause","stop","nextTrack","previousTrack","gotoTrack","getPosition","ServiceRegistry","createSlice","initialState","visible","cancelled","writtenProgress","encryptedProgress","totalProgress","trackTotal","trackConverting","trackCurrent","titleCurrent","titleConverting","reducers","setVisible","action","payload","setWriteProgress","setCancelUpload","setTrackProgress","current","converting","reducer","actions","enableBatching","setCurrentName","setCurrentFullWidthName","setIndex","setGroupIndex","setErrorMessage","dismissed","dismiss","titleFormat","setFormat","setTitleFormat","inputDeviceId","setInputDeviceId","trackDone","setProgress","buildInitialState","mainView","loading","pairingFailed","pairingMessage","browserSupported","darkMode","vintageMode","aboutDialogVisible","notifyWhenFinished","hasNotificationSupport","fullWidthSupport","setMainView","setLoading","setPairingFailed","setPairingMessage","setBrowserSupported","setDarkMode","setNotifyWhenFinished","setNotificationSupport","setVintageMode","showAboutDialog","setFullWidthSupport","deviceName","deviceStatus","setDisc","setDeviceName","setDeviceStatus","combineReducers","renameDialog","uploadDialog","errorDialog","panicDialog","convertDialog","dumpDialog","recordDialog","appState","main","resetStateAction","appActions","toString","store","configureStore","type","buildInitialAppState","middleware","next","panicDialogActions","getDefaultMiddleware","freeze","getState","control","params","dispatch","serviceRegistry","netmdService","prev","trackNumber","assertNumber","mainActions","pair","appStateActions","audioExportService","init","connect","err","batchActions","message","confirm","wipeDiscTitleInfo","Notification","permission","requestPermission","checkNotificationPromise","WireformatDict","SP","Wireformat","pcm","LP2","LP105","l105kbps","LP4","getTrackNameFromMediaTags","file","fileData","arrayBuffer","blob","Blob","Uint8Array","metadata","mm","common","artist","album","extStartIndex","lastIndexOf","substring","convertAndUpload","files","wireformat","uploadDialogActions","updateProgressCallback","hasUploadBeenCancelled","trackUpdate","updateTrack","availableCharacters","errorMessage","item","converted","convertNext","f","reject","prepare","export","j","conversionIterator","substr","upload","actionToDispatch","errorDialogAction","icon","NotificationCompleteIconUrl","onclick","focus","close","showFinishedNotificationIfNeeded","DialogOverlay","styled","div","DialogWindow","Window","DialogFooter","DialogWindowContent","WindowContent","FooterButton","Button","CustomTableRow","TableRow","canvasText","WindowCloseIcon","span","FloatingButton","button","W95AboutDialog","props","style","display","alignItems","flex","onClick","handleClose","rel","href","Transition","React","forwardRef","ref","Slide","direction","AboutDialog","useDispatch","p","Dialog","open","maxWidth","fullWidth","TransitionComponent","aria-labelledby","DialogTitle","id","DialogContent","DialogContentText","Link","DialogActions","W95TopMenu","items","handleRefresh","handleRenameDisc","handleWipeDisc","handleVintageMode","checked","variant","label","defaultChecked","handleExit","handleShowAbout","position","left","top","zIndex","useStyles","makeStyles","listItemIcon","minWidth","toolTippedText","textDecoration","textDecorationStyle","TopMenu","classes","discTitle","fullWidthDiscTitle","githubLinkRef","useRef","helpLinkRef","menuAnchorEl","setMenuAnchorEl","useState","menuOpen","handleMenuOpen","useCallback","event","currentTarget","handleDarkMode","handleMenuClose","wipeDisc","handleAllowFullWidth","renameDialogActions","handleGithubLink","stopPropagation","click","handleHelpLink","menuItems","MenuItem","ListItemIcon","className","fontSize","ListItemText","Divider","Tooltip","arrow","alt","Win95Icon","width","height","Fragment","IconButton","aria-label","aria-controls","aria-haspopup","Menu","anchorEl","keepMounted","onClose","color","marginTop","windowContent","flexDirection","justifyContent","W95Welcome","paddingBottom","visibility","chromeLogo","why","alignSelf","headBox","connectContainer","supportContainer","Welcome","toLowerCase","showWhyUnsupported","setWhyUnsupported","Box","Typography","component","align","FormControl","FormHelperText","verticalAlign","preventDefault","ChromeIconPath","currentTrackRow","palette","primary","inGroupTrackRow","transform","playButtonInTrackList","trackRow","controlButtonInTrackCommon","marginLeft","formatBadge","BadgeImpl","badge","colorPrimary","border","background","paper","padding","marginRight","durationCell","whiteSpace","durationCellSecondary","text","secondary","durationCellTime","titleCell","overflow","textOverflow","deleteGroupButton","indexCell","paddingRight","dragHandle","dragHandleEmpty","groupFolderIcon","groupHeadRow","TrackRow","inGroup","isSelected","draggableProvided","trackStatus","onSelect","onRename","onTogglePlayPause","handleRename","handleSelect","handlePlayPause","handleDoubleClickOnPlayButton","isPlayingOrPaused","draggableProps","innerRef","hover","selected","onDoubleClick","clsx","TableCell","dragHandleProps","size","GroupRow","onDelete","handleDelete","W95RenameDialog","renameDialogVisible","what","marginBottom","renameDialogTitle","placeholder","onChange","handleChange","onKeyDown","handleDoRename","handleCancelRename","marginUpDown","RenameDialog","renameDialogFullWidthTitle","renameDialogIndex","renameDialogGroupIndex","allowFullWidth","renameGroup","renameDisc","renameTrack","handleFullWidthChange","handleEnterKeyEvent","TextField","autoFocus","W95UploadDialog","convertedValue","floor","progressValue","handleNotifyWhenFinishedChanged","disabled","handleCancelUpload","progressPerc","progressBar","uploadLabel","spacer","checkBox","UploadDialog","bufferValue","aria-describedby","LinearProgress","valueBuffer","FormControlLabel","Checkbox","W95RecordDialog","hideValue","RecordDialog","round","ErrorDialog","errorDialogActions","PanicDialog","handleReloadApp","reload","handleIgnore","scroll","trackTitleOptions","recordModeOptions","W95ConvertDialog","themeContext","useContext","ThemeContext","renderTracks","selectedTrackIndex","selectedTrackRef","setSelectedTrack","selectedTableRow","dialogVisible","options","ev","handleChangeFormat","handleChangeTitleFormat","tracksOrderVisible","getRootProps","disableRemove","handleRemoveSelectedTrack","DeleteIconUrl","moveFileDown","ArrowDownIconUrl","moveFileUp","ArrowUpIconUrl","maxHeight","getInputProps","handleToggleTracksOrder","handleConvert","container","formControl","toggleButton","dialogContent","formatAndTitle","flexWrap","rightBlock","titleFormControl","showTracksOrderBtn","tracksOrderAccordion","opacity","tracksOrderAccordionDetail","toolbarHighlight","backgroundColor","lighten","light","dark","trackList","backdrop","drawer","ConvertDialog","setFiles","moveFile","newFileArray","tmp","convertDialogActions","newFormat","setTracksOrderVisible","useEffect","newFiles","Array","from","scrollIntoView","block","behavior","ListItem","disableGutters","Radio","onDrop","acceptedFiles","rejectedFiles","isDragActive","useDropzone","accept","noClick","ToggleButtonGroup","exclusive","ToggleButton","Select","input","Input","Accordion","expanded","square","outline","Toolbar","edge","AccordionDetails","List","dense","disablePadding","Backdrop","_extends","assign","arguments","source","prototype","hasOwnProperty","call","createElement","fill","fillRule","d","SvgMd0","svgRef","viewBox","ForwardRef","SvgMd1","SvgMd2","SvgMd3","lcd","margin","fontFamily","W95Controls","handlePrev","handlePlay","handlePause","handleStop","handleNext","lcdText","lcdScroll","scrollingStatusMessage","statusMessage","lcdRef","animationDuration","lcdScrollDuration","frames","MDIcon0","MDIcon1","MDIcon2","MDIcon3","to","paddingLeft","borderRadius","default","lcdDisc","lcdDiscIcon","active","animationName","animationTimingFunction","animationIterationCount","lcdBlink","Controls","deviceState","discPresent","paused","padStart","setLcdScroll","setLcdScrollDuration","lcdIconFrame","setLcdIconFrame","scrollTimerRef","clearTimeout","domEl","textWidth","scrollWidth","lcdWidth","parentElement","offsetWidth","scrollDurationInSec","updateLCDScroll","lcdIconAnimationTimer","DiscFrame","W95DumpDialog","devices","deviceId","handleStartTransfer","flexFlow","selectEmpty","head","textShadow","typography","h2","textAlign","DumpDialog","trackIndexes","setDevices","mediaRecorderService","stopTestInput","dumpDialogActions","playTestInput","recordDialogAction","t","entries","expected","every","_","initStream","startRecording","durationInSec","perc","stopRecording","fileName","downloadRecorded","closeStream","mediaDevices","getUserMedia","audio","inputDevices","enumerateDevices","device","kind","updateDeviceList","displayEmpty","minHeight","table","controlsContainer","toolbarIcon","toolbarItem","W95Main","selectedCount","DeviceIconUrl","MDIconUrl","enterDelay","leaveDelay","handleShowMoveMenu","MoveIconUrl","handleShowDumpDialog","MicIconUrl","handleDeleteSelected","handleRenameActionClick","RenameIconUrl","moveMenuAnchorEl","handleMoveSelectedTrack","handleRenameTrack","handleSelectTrackClick","uploadedFiles","add","bottom","right","overflowY","toolbar","toolbarLabel","remainingTimeTooltip","hoveringOverGroup","alpha","getTrackStatus","Main","setSelected","setUploadedFiles","lastClicked","setLastClicked","setMoveMenuAnchorEl","handleCloseMoveMenu","destIndex","srcIndex","handleDrop","result","provided","destination","sourceList","parseInt","droppableId","sourceIndex","targetList","groupedTracks","newIndex","boundsStartList","boundsEndList","boundsStartIndex","boundsEndIndex","movedItem","startingIndex","endingIndex","prevList","normalGroups","rewriteGroups","dragDropTrack","useMemo","shiftKey","rangeBegin","rangeEnd","copy","handleSelectAllClick","handleRenameGroup","detail","deleteTracks","handleGroupTracks","begin","addGroup","handleDeleteGroup","deleteGroup","handleTogglePlayPauseTrack","canGroup","indeterminate","inputProps","Table","TableHead","onDragEnd","TableBody","colSpan","snapshot","droppableProps","isDraggingOver","tidx","draggableId","Fab","GlobalStyles","createGlobalStyle","styleReset","desktop","W95App","isMenuOpen","setMenuOpen","closeMenu","toggleMenu","handleHelpClick","currentTheme","original","hoverBackground","canvasTextInvert","CDPlayerIconUrl","Date","getFullYear","layout","bottomBar","copyrightTypography","minidiscLogo","darkTheme","createTheme","contrastText","lightTheme","App","ThemeProvider","CssBaseline","Paper","CircularProgress","AtracdencProcess","worker","messageCallback","onmessage","handleMessage","bind","postMessage","bitrate","WorkerGlobalScope","self","Module","others","importScripts","m","setLogger","msg","stream","inWavFile","outAt3File","dataArray","FS","writeFile","callMain","stat","outAt3FileStream","read","buffer","AtracdencWorker","ffmpegProcess","atracdencProcess","loglines","inFileName","outFileNameNoExt","setLogging","createWorker","corePath","workerPath","load","ext","write","transcode","audioFormatRegex","inputFormatRegex","line","outFileName","recorder","audioContext","analyserNode","gainNode","AudioContext","createGain","createAnalyser","createMediaStreamSource","recordConstraints","autoGainControl","channelCount","echoCancellation","noiseSuppression","sampleRate","highpassFilter","audioTracks","getAudioTracks","getSettings","Recorder","record","forEach","exportWAV","url","URL","createObjectURL","document","body","appendChild","revokeObjectURL","removeChild","deferredPrompt","addEventListener","returnValue","ondisconnect","statusMonitorInterval","exceptionOccurred","shouldMonitorBeRunning","subscribe","ReactDOM","render","getElementById","process","REACT_APP_NO_GA_RELEASE","origin","fetch","headers","response","contentType","get","status","ready","unregister","checkValidServiceWorker","getElementsByTagName","uascript","pvscript"],"mappings":"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AK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,KAAM,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAU,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,UAC/yFC,EAAiCC,OAAOC,OAAOH,GAE/CI,EAAW7B,EACZmB,MAAM,IACNC,IAAIrB,GACG0B,EAAS1B,GAAW0B,EAAS1B,GAC7BA,EAAE+B,WAAW,GAAK,KAAQJ,EAAqBK,SAAShC,GAAWA,EAChE,KAEViC,KAAK,IAGV,OADoBC,IAAMC,OAAOL,EAAU,QAC3BpB,SAAWE,EAAwBX,GAAee,EAAcf,GACzE6B,EAGJ,SAASM,EAAuBnC,GAEnC,MAAMyB,EAAsC,CAAE,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,EAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,IAAK,SAAK,KAAM,SAAK,IAAK,SAAK,IAAK,SAAK,EAAK,SAAK,IAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAU,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SA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","file":"static/js/main.0bfb5ad5.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAaElEQVR4Ac3BQQrCQAAEsIz///MobGG7bZUiHkz8laKoe+olplrFtRriJVa1ilUNsYlrNcVQQ+zEe3UWB/FZTXEh3quzOIhrNcVQQ+zEWU2xqiE2D6ua4iwOHqa6J6hNTDXFl+q++oUnXWYXCDnmtMUAAAAASUVORK5CYII=\"","module.exports = __webpack_public_path__ + \"static/media/record-complete-notification-icon.f6ae1070.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAAEEfUpiAAAACXBIWXMAAAsSAAALEgHS3X78AAAQR0lEQVRYCQE8EMPvAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAP8AAAIAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA//8AAAAB/wAAAgAAAAAAAAAAAQD/AP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAEAAAAAAAAAAP8AAP8AAAAAAQAAAP8AAAAB/wAAAAAAAAEAAAAAAAAAAAAA//8AAAAAAAABAAAA/wD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA/wAAAAAA/wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAD/AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAP//AAAAAAAAAAAAAAEBAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQL/AAD/AAAAAQAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAgEAAAH/AAD/AAAAAQAAAAAAAAABAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA/wEAAAH/AAD/AAAAAP8AAP//AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAA//8AAAABAAAA/wAAAAAAAAD/AAAA/wAAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAP//AAD//wAAAAAAAAAAAAACAAABAQAA//8AAAABAAAAAAAAAAEAAAABAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD/AAABAQAA//8AAAAAAAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAEAAAAA/wAA/wEAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAQAAAAAAAAAA/wAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAD/AAD/AQAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAABAAABAAAAAP8AAP//AAD/AAAAAAAAAAH/AAD/AAAAAP8AAAD/AAD//wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQEAAAEAAAAAAAAAAP8AAP8BAAABAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAQAAAAAAAD//wAAAQEAAAABAAAAAAAAAP8AAAAAAAAAAQEAAAEAAAD/AAAAAQEAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAEAAAAAAIAAAAAAAAAAfwAAAAAAAAABAAAAAAD//wAAAAAAAIGBAAAAAAAAgAEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAAAAAEBAAAAAAAA//8AAP//AAAAAAAAAAEAAP//AAAAAAAA/wAAAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAQEAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAgAAAAAAAAAAAAAAAAAABAQAAAAAAAICAAAAAAAAAf38AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4NtYBuc2+1AAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/chrome-icon.f3b6c54c.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVR4Ae3BSQ7CUAxEwde+/50bFkgQyGD/DBZSqrjtZMDsIMaZKTFAjDHzRJGoM+tEgagxOSJJ5JkakSByzBixQWwz+4gVYp05hlgglpljiRlinjmH+CJ+mXOJD2LKXEO8iDdzLfEUNBN5pk5sCJoFzYJmQbOgWdAsaBY0C5oFzUSNyRO3f/AAz+gRJE12Ia8AAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiElEQVR4Ae3BSQ7CQBAEwcz+/58LDkhsxp4xSwtBBD9P5oRxMkDGhXmyoWhWNCuaFc2KZkWzolnRrGhWNJOz8FlyVDSTa+Ez5ETuhfeSC7IsvIfckMfCa8kCWRdeQx6QbeE5skLGhH1kg4wLc2SAzAljZJDMC+tkguwTlskk2S9ckwYBwt83OwASZhEklsYbbQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAzUlEQVR4AY3BgXHCMBAAwXuHQugEdfanzkRlH3nGgMfjEO8GF6nFjhpMCxeoxZSZrFprTMW0cFFm0nsnU8YYvNy4QGWVKRGgvC38R4uptUYEqKi8BN9okQm9g3IQTMFftMiECHaCg4UzWmRCBCib4MTCkRaZEAEKmXwT7GmRCb2D8laFvfOiBptgo1ZrjTYGKFPwUROriGAKNjd2Wmtsgh2V1fP55OjGpBYfwYneOypnCij+V0Bx8AMIBF+opXK/3xljCHQ2Cxc9Hg/O/AKFdlY5+3GtSAAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfUlEQVR4Aa3BUQ6CMBRFwXOb7vulKz/CR4Ni1RCc4a6wJr+FTeedbFQ+ScLUeOWGKxoH2SRhSgZTMljpPFG5qrOQDKZkMCUDLZ41FrTYaaHFTgstzho3dU6SwZQMpmSgxVnjRIudFlrstNBipXFTY0GLSYtvGjeFg1wT/uEBKpc1Cx/u8CoAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAt0lEQVR4Ab3Bi1HbYBAGwD2RQlwKVMbnzu6v7IIkZ4CEhzOZya5/Vf7OBHEoLx7cb4JnFJrgurnPJAhXPCNOm+/NjFfhijhtvjYzDo+P7Zc4lBebz82Mw1qtu+0Su3JTPjYzDmu17kYkduWN8qeZcVirdTcisSu/Ke/NjMNarbsRiV35QHk1Mw5rte5GJHblE5vTuFmrdTcisStfeHBKwtMTl8sFkdiVb/zwRkISN+UO5TTeK//LT0efTfwPZVIpAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA3klEQVR4Ae3BwU3EUBBEweeV8+Jn1u3MeiL7eARIPoCFVsLLwVXcbrfb7fZqCwe2Jxeyvax8sj3HGFwlCbv5YGd7jjG4ShK+rLanJK6ybRtHK5+qildY+YUkPGuMwZmVg7cxaJXQktBs8yzbtDEG33nwYisHlXAkiWabZ0miVRXfWTlRVbQ5J8+qKs6s/EJV8VcenEhCS0JLQktCS0JLQktCS0JLQkvCTx6ckESTRJNEk0STRJNEk0STRJNEk8RPFttTElXFFZLQbLNbVnbbtnEl2+wWdgsfJtdauP0X7xi2ahnkEPOyAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACcklEQVR4Ae3BgW1bRxBF0bs0C1lXss+VWJ3ssBO6kzedWJVM/kIk8kVQMmUlCAL4HP74rzUeFBHFHRHReF9xX2Nz5B0RUVzMGVxlmquIKC4iovFBR+6IiOIi5mSZBPdIYqd40Xit8VpxceRGRFTM4EXxEbZZJBXQeEBjJyIqZvBacVU0lkyzSOKzjlxEREnCaTTEo6qKq9YaVcVea42qYq+1RlXRWqNxEREVc+JMFg3xt2IpGkumWSTxWQc2EVExJ4vGYHGaR1QVVUVVsVQVVcVeVVFV7FUVS2MTESWJRWOwOJNFQ7woisaSaRZJfFaLiJLELY2BM1k0xBKnYC8iqCquWmtUFY9qrdEioiRxj8bAmSy2iQj+aUfe4Uw0BnE6ERFsGq9VRBARXNnmliQ2jTsO/IIzeZRtPurAxjaLbRbbLLZ5hG1s8zsObCRhG0nYRhK2kYRt/k1HNraRhG0kYRtJ2GbOSWYSEUREsRMRSOIzjmwkYRtJ2EYStplzkpmMMVgigr2YE2fyGV9sn3rvIQnbSMI2c04ykzEGmcnSe6f3zvfvT7QWnHvn3DtPz8+8RRKbxhsOXNhGEraZc5KZjDHITPbGEIuGcCaLxuB3HdhERGNjmzknmckYg8zkVqa5R2NwSxKbxjsO7Mw5yUzGGGQm94whrjSEM7nSGHzUgYuIaKfTiTEGmclbMs17NAaLJDaNX/jCju1Tay1677xlDLEEcALO/YzzG+feuTp//cqm8YAv3LB96r3Hz58/6b1z6/n5id7PLCdePD0/0X/8wN++wenEpvGgxjsiothI4moMcdXYNPYaH9R4TPG2xh//Z38BPq9JPdh7I1oAAAAASUVORK5CYII=\"","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"4a3a421ab134cd5ff776.worker.js\");\n};","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/final-service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' + 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n console.log('state change', installingWorker.state);\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n registration.update(); // Check for new version everytime we load the page\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { Disc, formatTimeFromFrames, Encoding, getTracks, Group } from 'netmd-js';\nimport { useSelector, shallowEqual } from 'react-redux';\nimport { RootState } from './redux/store';\nimport { Mutex } from 'async-mutex';\nimport { Theme } from '@material-ui/core';\nimport jconv from 'jconv';\nimport { halfWidthToFullWidthRange } from 'netmd-js/dist/utils';\n\nexport function sleep(ms: number) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\nexport async function sleepWithProgressCallback(ms: number, cb: (perc: number) => void) {\n let elapsedSecs = 1;\n let interval = setInterval(() => {\n elapsedSecs++;\n cb(Math.min(100, ((elapsedSecs * 1000) / ms) * 100));\n }, 1000);\n await sleep(ms);\n window.clearInterval(interval);\n}\n\nexport function useShallowEqualSelector(selector: (state: TState) => TSelected): TSelected {\n return useSelector(selector, shallowEqual);\n}\n\nexport function debugEnabled() {\n return process.env.NODE_ENV === 'development';\n}\n\nexport function getPublicPathFor(script: string) {\n return `${process.env.PUBLIC_URL}/${script}`;\n}\n\nexport function savePreference(key: string, value: unknown) {\n localStorage.setItem(key, JSON.stringify(value));\n}\n\nexport function loadPreference(key: string, defaultValue: T): T {\n let res = localStorage.getItem(key);\n if (res === null) {\n return defaultValue;\n } else {\n try {\n return JSON.parse(res) as T;\n } catch (e) {\n return defaultValue;\n }\n }\n}\n\nexport function getAvailableCharsForTitle(disc: Disc, includeGroups?: boolean) {\n const cellLimit = 255;\n // see https://www.minidisc.org/md_toc.html\n const fixLength = (len: number) => Math.ceil(len / 7);\n\n let groups = disc.groups.filter(n => n.title !== null);\n\n // Assume worst-case scenario\n let fwTitle = disc.fullWidthTitle + `0;//`;\n let hwTitle = disc.title + `0;//`;\n if (includeGroups || includeGroups === undefined)\n for (let group of groups) {\n let range = `${group.tracks[0].index + 1}${group.tracks.length - 1 !== 0 &&\n `-${group.tracks[group.tracks.length - 1].index + 1}`}//`;\n // The order of these characters doesn't matter. It's for length only\n fwTitle += group.fullWidthTitle + range;\n hwTitle += group.title + range;\n }\n\n let usedCells = 0;\n usedCells += fixLength(fwTitle.length * 2);\n usedCells += fixLength(getHalfWidthTitleLength(hwTitle));\n for (let trk of getTracks(disc)) {\n usedCells += fixLength((trk.fullWidthTitle?.length ?? 0) * 2);\n usedCells += fixLength(getHalfWidthTitleLength(trk.title ?? ''));\n }\n return Math.max(cellLimit - usedCells, 0) * 7;\n}\n\nexport function framesToSec(frames: number) {\n return frames / 512;\n}\n\nexport function sanitizeTitle(title: string) {\n return title.normalize('NFD').replace(/[^\\x00-\\x7F]/g, '');\n}\n\nexport function getHalfWidthTitleLength(title: string) {\n // Some characters are written as 2 bytes\n // prettier-ignore\n const multiByteChars: { [key: string]: number } = { \"ガ\": 1, \"ギ\": 1, \"グ\": 1, \"ゲ\": 1, \"ゴ\": 1, \"ザ\": 1, \"ジ\": 1, \"ズ\": 1, \"ゼ\": 1, \"ゾ\": 1, \"ダ\": 1, \"ヂ\": 1, \"ヅ\": 1, \"デ\": 1, \"ド\": 1, \"バ\": 1, \"パ\": 1, \"ビ\": 1, \"ピ\": 1, \"ブ\": 1, \"プ\": 1, \"ベ\": 1, \"ペ\": 1, \"ボ\": 1, \"ポ\": 1, \"ヮ\": 1, \"ヰ\": 1, \"ヱ\": 1, \"ヵ\": 1, \"ヶ\": 1, \"ヴ\": 1, \"ヽ\": 1, \"ヾ\": 1, \"が\": 1, \"ぎ\": 1, \"ぐ\": 1, \"げ\": 1, \"ご\": 1, \"ざ\": 1, \"じ\": 1, \"ず\": 1, \"ぜ\": 1, \"ぞ\": 1, \"だ\": 1, \"ぢ\": 1, \"づ\": 1, \"で\": 1, \"ど\": 1, \"ば\": 1, \"ぱ\": 1, \"び\": 1, \"ぴ\": 1, \"ぶ\": 1, \"ぷ\": 1, \"べ\": 1, \"ぺ\": 1, \"ぼ\": 1, \"ぽ\": 1, \"ゎ\": 1, \"ゐ\": 1, \"ゑ\": 1, \"ゕ\": 1, \"ゖ\": 1, \"ゔ\": 1, \"ゝ\": 1, \"ゞ\": 1 };\n return (\n title.length +\n title\n .split('')\n .map(n => multiByteChars[n] ?? 0)\n .reduce((a, b) => a + b, 0)\n );\n}\n\nexport function sanitizeHalfWidthTitle(title: string) {\n // prettier-ignore\n const mappings: { [key: string]: string } = { 'ァ': 'ァ', 'ア': 'ア', 'ィ': 'ィ', 'イ': 'イ', 'ゥ': 'ゥ', 'ウ': 'ウ', 'ェ': 'ェ', 'エ': 'エ', 'ォ': 'ォ', 'オ': 'オ', 'カ': 'カ', 'ガ': 'ガ', 'キ': 'キ', 'ギ': 'ギ', 'ク': 'ク', 'グ': 'グ', 'ケ': 'ケ', 'ゲ': 'ゲ', 'コ': 'コ', 'ゴ': 'ゴ', 'サ': 'サ', 'ザ': 'ザ', 'シ': 'シ', 'ジ': 'ジ', 'ス': 'ス', 'ズ': 'ズ', 'セ': 'セ', 'ゼ': 'ゼ', 'ソ': 'ソ', 'ゾ': 'ゾ', 'タ': 'タ', 'ダ': 'ダ', 'チ': 'チ', 'ヂ': 'ヂ', 'ッ': 'ッ', 'ツ': 'ツ', 'ヅ': 'ヅ', 'テ': 'テ', 'デ': 'デ', 'ト': 'ト', 'ド': 'ド', 'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ', 'ハ': 'ハ', 'バ': 'バ', 'パ': 'パ', 'ヒ': 'ヒ', 'ビ': 'ビ', 'ピ': 'ピ', 'フ': 'フ', 'ブ': 'ブ', 'プ': 'プ', 'ヘ': 'ヘ', 'ベ': 'ベ', 'ペ': 'ペ', 'ホ': 'ホ', 'ボ': 'ボ', 'ポ': 'ポ', 'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ', 'ャ': 'ャ', 'ヤ': 'ヤ', 'ュ': 'ュ', 'ユ': 'ユ', 'ョ': 'ョ', 'ヨ': 'ヨ', 'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ', 'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン', 'ー': 'ー', 'ヮ': 'ヮ', 'ヰ': 'ヰ', 'ヱ': 'ヱ', 'ヵ': 'ヵ', 'ヶ': 'ヶ', 'ヴ': 'ヴ', 'ヽ': 'ヽ', 'ヾ': 'ヾ', '・': '・', '「': '「', '」': '」', '。': '。', '、': '、', '!': '!', '"': '\"', '#': '#', '$': '$', '%': '%', '&': '&', ''': \"'\", '(': '(', ')': ')', '*': '*', '+': '+', ',': ',', '-': '-', '.': '.', '/': '/', ':': ':', ';': ';', '<': '<', '=': '=', '>': '>', '?': '?', '@': '@', 'A': 'A', 'B': 'B', 'C': 'C', 'D': 'D', 'E': 'E', 'F': 'F', 'G': 'G', 'H': 'H', 'I': 'I', 'J': 'J', 'K': 'K', 'L': 'L', 'M': 'M', 'N': 'N', 'O': 'O', 'P': 'P', 'Q': 'Q', 'R': 'R', 'S': 'S', 'T': 'T', 'U': 'U', 'V': 'V', 'W': 'W', 'X': 'X', 'Y': 'Y', 'Z': 'Z', '[': '[', '\': '\\\\', ']': ']', '^': '^', '_': '_', '`': '`', 'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e', 'f': 'f', 'g': 'g', 'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 'l': 'l', 'm': 'm', 'n': 'n', 'o': 'o', 'p': 'p', 'q': 'q', 'r': 'r', 's': 's', 't': 't', 'u': 'u', 'v': 'v', 'w': 'w', 'x': 'x', 'y': 'y', 'z': 'z', '{': '{', '|': '|', '}': '}', '~': '~', '\\u3000': ' ', '0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9', 'ぁ': 'ァ', 'あ': 'ア', 'ぃ': 'ィ', 'い': 'イ', 'ぅ': 'ゥ', 'う': 'ウ', 'ぇ': 'ェ', 'え': 'エ', 'ぉ': 'ォ', 'お': 'オ', 'か': 'カ', 'が': 'ガ', 'き': 'キ', 'ぎ': 'ギ', 'く': 'ク', 'ぐ': 'グ', 'け': 'ケ', 'げ': 'ゲ', 'こ': 'コ', 'ご': 'ゴ', 'さ': 'サ', 'ざ': 'ザ', 'し': 'シ', 'じ': 'ジ', 'す': 'ス', 'ず': 'ズ', 'せ': 'セ', 'ぜ': 'ゼ', 'そ': 'ソ', 'ぞ': 'ゾ', 'た': 'タ', 'だ': 'ダ', 'ち': 'チ', 'ぢ': 'ヂ', 'っ': 'ッ', 'つ': 'ツ', 'づ': 'ヅ', 'て': 'テ', 'で': 'デ', 'と': 'ト', 'ど': 'ド', 'な': 'ナ', 'に': 'ニ', 'ぬ': 'ヌ', 'ね': 'ネ', 'の': 'ノ', 'は': 'ハ', 'ば': 'バ', 'ぱ': 'パ', 'ひ': 'ヒ', 'び': 'ビ', 'ぴ': 'ピ', 'ふ': 'フ', 'ぶ': 'ブ', 'ぷ': 'プ', 'へ': 'ヘ', 'べ': 'ベ', 'ぺ': 'ペ', 'ほ': 'ホ', 'ぼ': 'ボ', 'ぽ': 'ポ', 'ま': 'マ', 'み': 'ミ', 'む': 'ム', 'め': 'メ', 'も': 'モ', 'ゃ': 'ャ', 'や': 'ヤ', 'ゅ': 'ュ', 'ゆ': 'ユ', 'ょ': 'ョ', 'よ': 'ヨ', 'ら': 'ラ', 'り': 'リ', 'る': 'ル', 'れ': 'レ', 'ろ': 'ロ', 'わ': 'ワ', 'を': 'ヲ', 'ん': 'ン', 'ゎ': 'ヮ', 'ゐ': 'ヰ', 'ゑ': 'ヱ', 'ゕ': 'ヵ', 'ゖ': 'ヶ', 'ゔ': 'ヴ', 'ゝ': 'ヽ', 'ゞ': 'ヾ' };\n const allowedHalfWidthKana: string[] = Object.values(mappings);\n\n const newTitle = title\n .split('')\n .map(n => {\n if (mappings[n]) return mappings[n];\n if (n.charCodeAt(0) < 0x7f || allowedHalfWidthKana.includes(n)) return n;\n return ' ';\n })\n .join('');\n // Check if the amount of characters is the same as the amount of encoded bytes (when accounting for dakuten). Otherwise the disc might end up corrupted\n const sjisEncoded = jconv.encode(newTitle, 'SJIS');\n if (sjisEncoded.length !== getHalfWidthTitleLength(title)) return sanitizeTitle(title); //Fallback\n return newTitle;\n}\n\nexport function sanitizeFullWidthTitle(title: string) {\n // prettier-ignore\n const mappings: { [key: string]: string } = { '!': '!', '\"': '"', '#': '#', '$': '$', '%': '%', '&': '&', \"'\": ''', '(': '(', ')': ')', '*': '*', '+': '+', ',': ',', '-': '-', '.': '.', '/': '/', ':': ':', ';': ';', '<': '<', '=': '=', '>': '>', '?': '?', '@': '@', 'A': 'A', 'B': 'B', 'C': 'C', 'D': 'D', 'E': 'E', 'F': 'F', 'G': 'G', 'H': 'H', 'I': 'I', 'J': 'J', 'K': 'K', 'L': 'L', 'M': 'M', 'N': 'N', 'O': 'O', 'P': 'P', 'Q': 'Q', 'R': 'R', 'S': 'S', 'T': 'T', 'U': 'U', 'V': 'V', 'W': 'W', 'X': 'X', 'Y': 'Y', 'Z': 'Z', '[': '[', '\\\\': '\', ']': ']', '^': '^', '_': '_', '`': '`', 'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e', 'f': 'f', 'g': 'g', 'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 'l': 'l', 'm': 'm', 'n': 'n', 'o': 'o', 'p': 'p', 'q': 'q', 'r': 'r', 's': 's', 't': 't', 'u': 'u', 'v': 'v', 'w': 'w', 'x': 'x', 'y': 'y', 'z': 'z', '{': '{', '|': '|', '}': '}', '~': '~', ' ': '\\u3000', '0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9', 'ァ': 'ァ', 'ア': 'ア', 'ィ': 'ィ', 'イ': 'イ', 'ゥ': 'ゥ', 'ウ': 'ウ', 'ェ': 'ェ', 'エ': 'エ', 'ォ': 'ォ', 'オ': 'オ', 'カ': 'カ', 'ガ': 'ガ', 'キ': 'キ', 'ギ': 'ギ', 'ク': 'ク', 'グ': 'グ', 'ケ': 'ケ', 'ゲ': 'ゲ', 'コ': 'コ', 'ゴ': 'ゴ', 'サ': 'サ', 'ザ': 'ザ', 'シ': 'シ', 'ジ': 'ジ', 'ス': 'ス', 'ズ': 'ズ', 'セ': 'セ', 'ゼ': 'ゼ', 'ソ': 'ソ', 'ゾ': 'ゾ', 'タ': 'タ', 'ダ': 'ダ', 'チ': 'チ', 'ヂ': 'ヂ', 'ッ': 'ッ', 'ツ': 'ツ', 'ヅ': 'ヅ', 'テ': 'テ', 'デ': 'デ', 'ト': 'ト', 'ド': 'ド', 'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ', 'ハ': 'ハ', 'バ': 'バ', 'パ': 'パ', 'ヒ': 'ヒ', 'ビ': 'ビ', 'ピ': 'ピ', 'フ': 'フ', 'ブ': 'ブ', 'プ': 'プ', 'ヘ': 'ヘ', 'ベ': 'ベ', 'ペ': 'ペ', 'ホ': 'ホ', 'ボ': 'ボ', 'ポ': 'ポ', 'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ', 'ャ': 'ャ', 'ヤ': 'ヤ', 'ュ': 'ュ', 'ユ': 'ユ', 'ョ': 'ョ', 'ヨ': 'ヨ', 'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ', 'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン', 'ー': 'ー', 'ヮ': 'ヮ', 'ヰ': 'ヰ', 'ヱ': 'ヱ', 'ヵ': 'ヵ', 'ヶ': 'ヶ', 'ヴ': 'ヴ', 'ヽ': 'ヽ', 'ヾ': 'ヾ', '・': '・', '「': '「', '」': '」', '。': '。', '、': '、' };\n\n const newTitle = title\n .split('')\n .map(n => mappings[n] ?? n)\n .join('');\n\n const sjisEncoded = jconv.encode(newTitle, 'SJIS');\n if (jconv.decode(sjisEncoded, 'SJIS') !== newTitle) return sanitizeTitle(title); // Fallback\n if (sjisEncoded.length !== title.length * 2) return sanitizeTitle(title); // Fallback (every character in the full-width title is 2 bytes)\n return newTitle;\n}\n\nexport const EncodingName: { [k: number]: string } = {\n [Encoding.sp]: 'SP',\n [Encoding.lp2]: 'LP2',\n [Encoding.lp4]: 'LP4',\n};\n\nexport type DisplayTrack = {\n index: number;\n title: string;\n fullWidthTitle: string;\n group: string | null;\n duration: string;\n encoding: string;\n};\n\nexport function getSortedTracks(disc: Disc | null) {\n let tracks: DisplayTrack[] = [];\n if (disc !== null) {\n for (let group of disc.groups) {\n for (let track of group.tracks) {\n tracks.push({\n index: track.index,\n title: track.title ?? `Unknown Title`,\n fullWidthTitle: track.fullWidthTitle ?? ``,\n group: group.title ?? null,\n encoding: EncodingName[track.encoding],\n duration: formatTimeFromFrames(track.duration, false),\n });\n }\n }\n }\n tracks.sort((l, r) => l.index - r.index);\n return tracks;\n}\n\nexport function getGroupedTracks(disc: Disc | null) {\n if (!disc) {\n return [];\n }\n let groupedList: Group[] = [];\n let ungroupedTracks = [...(disc.groups.find(n => n.title === null)?.tracks ?? [])];\n\n let lastIndex = 0;\n\n for (let group of disc.groups) {\n if (group.title === null) {\n continue; // Ungrouped tracks\n }\n let toCopy = group.tracks[0].index - lastIndex;\n groupedList.push({\n index: -1,\n title: null,\n fullWidthTitle: null,\n tracks: toCopy === 0 ? [] : ungroupedTracks.splice(0, toCopy),\n });\n lastIndex = group.tracks[group.tracks.length - 1].index + 1;\n groupedList.push(group);\n }\n groupedList.push({\n index: -1,\n title: null,\n fullWidthTitle: null,\n tracks: ungroupedTracks,\n });\n return groupedList;\n}\n\nexport function recomputeGroupsAfterTrackMove(disc: Disc, trackIndex: number, targetIndex: number) {\n // Used for moving tracks in netmd-mock and deleting\n let offset = trackIndex > targetIndex ? 1 : -1;\n let deleteMode = targetIndex === -1;\n\n if (deleteMode) {\n offset = -1;\n targetIndex = disc.trackCount;\n }\n\n let boundsStart = Math.min(trackIndex, targetIndex);\n let boundsEnd = Math.max(trackIndex, targetIndex);\n\n let allTracks = disc.groups\n .map(n => n.tracks)\n .reduce((a, b) => a.concat(b), [])\n .sort((a, b) => a.index - b.index)\n .filter(n => !deleteMode || n.index !== trackIndex);\n\n let groupBoundaries: {\n name: string | null;\n fullWidthName: string | null;\n start: number;\n end: number;\n }[] = disc.groups\n .filter(n => n.title !== null)\n .map(group => ({\n name: group.title,\n fullWidthName: group.fullWidthTitle,\n start: group.tracks[0].index,\n end: group.tracks[0].index + group.tracks.length - 1,\n })); // Convert to a format better for shifting\n\n let anyChanges = false;\n\n for (let group of groupBoundaries) {\n if (group.start > boundsStart && group.start <= boundsEnd) {\n group.start += offset;\n anyChanges = true;\n }\n if (group.end >= boundsStart && group.end < boundsEnd) {\n group.end += offset;\n anyChanges = true;\n }\n }\n\n if (!anyChanges) return disc;\n\n let newDisc: Disc = { ...disc };\n\n // Convert back\n newDisc.groups = groupBoundaries\n .map(n => ({\n title: n.name,\n fullWidthTitle: n.fullWidthName,\n index: n.start,\n tracks: allTracks.slice(n.start, n.end + 1),\n }))\n .filter(n => n.tracks.length > 0);\n\n // Convert ungrouped tracks\n let allGrouped = newDisc.groups.map(n => n.tracks).reduce((a, b) => a.concat(b), []);\n let ungrouped = allTracks.filter(n => !allGrouped.includes(n));\n\n // Fix all the track indexes\n if (deleteMode) {\n for (let i = 0; i < allTracks.length; i++) {\n allTracks[i].index = i;\n }\n }\n\n if (ungrouped.length) newDisc.groups.unshift({ title: null, fullWidthTitle: null, index: 0, tracks: ungrouped });\n\n return newDisc;\n}\n\nexport function compileDiscTitles(disc: Disc) {\n let availableCharactersForTitle = getAvailableCharsForTitle(\n {\n ...disc,\n title: '',\n fullWidthTitle: '',\n },\n false\n );\n // If the disc or any of the groups, or any track has a full-width title, provide support for them\n const useFullWidth =\n disc.fullWidthTitle ||\n disc.groups.filter(n => !!n.fullWidthTitle).length > 0 ||\n disc.groups\n .map(n => n.tracks)\n .reduce((a, b) => a.concat(b), [])\n .filter(n => !!n.fullWidthTitle).length > 0;\n\n const fixLength = (l: number) => Math.ceil(l / 7) * 7;\n\n let newRawTitle = '',\n newRawFullWidthTitle = '';\n if (disc.title) newRawTitle = `0;${disc.title}//`;\n if (useFullWidth) newRawFullWidthTitle = `0;${disc.fullWidthTitle}//`;\n for (let n of disc.groups) {\n if (n.title === null || n.tracks.length === 0) continue;\n let range = `${n.tracks[0].index + 1}`;\n if (n.tracks.length !== 1) {\n // Special case\n range += `-${n.tracks[0].index + n.tracks.length}`;\n }\n\n let newRawTitleAfterGroup = newRawTitle + `${range};${n.title}//`,\n newRawFullWidthTitleAfterGroup = newRawFullWidthTitle + halfWidthToFullWidthRange(range) + `;${n.fullWidthTitle ?? ''}//`;\n\n let titlesLengthInTOC = fixLength(getHalfWidthTitleLength(newRawTitleAfterGroup));\n\n if (useFullWidth) titlesLengthInTOC += fixLength(newRawFullWidthTitleAfterGroup.length * 2);\n\n if (availableCharactersForTitle - titlesLengthInTOC < 0) break;\n\n newRawTitle = newRawTitleAfterGroup;\n newRawFullWidthTitle = newRawFullWidthTitleAfterGroup;\n }\n\n let titlesLengthInTOC = fixLength(getHalfWidthTitleLength(newRawTitle));\n if (useFullWidth) titlesLengthInTOC += fixLength(newRawFullWidthTitle.length * 2); // If this check fails the titles without the groups already take too much space, don't change anything\n if (availableCharactersForTitle - titlesLengthInTOC < 0) {\n return null;\n }\n\n return {\n newRawTitle,\n newRawFullWidthTitle: useFullWidth ? newRawFullWidthTitle : '',\n };\n}\n\nexport function isSequential(numbers: number[]) {\n if (numbers.length === 0) return true;\n let last = numbers[0];\n for (let num of numbers) {\n if (num === last) {\n ++last;\n } else return false;\n }\n return true;\n}\n\nexport function asyncMutex(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n // This is meant to be used only with classes having a \"mutex\" instance property\n const oldValue = descriptor.value;\n descriptor.value = async function(...args: any) {\n const mutex = (this as any).mutex as Mutex;\n const release = await mutex.acquire();\n try {\n return await oldValue.apply(this, args);\n } finally {\n release();\n }\n };\n return descriptor;\n}\n\nexport function forAnyDesktop(theme: Theme) {\n return theme.breakpoints.up(600 + theme.spacing(2) * 2);\n}\n\nexport function belowDesktop(theme: Theme) {\n return theme.breakpoints.down(600 + theme.spacing(2) * 2);\n}\n\nexport function forWideDesktop(theme: Theme) {\n return theme.breakpoints.up(700 + theme.spacing(2) * 2) + ` and (min-height: 750px)`;\n}\n\nexport function askNotificationPermission(): Promise {\n // Adapted from: https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API/Using_the_Notifications_API\n function checkNotificationPromise() {\n try {\n Notification.requestPermission().then();\n } catch (e) {\n return false;\n }\n return true;\n }\n\n if (checkNotificationPromise()) {\n return Notification.requestPermission();\n } else {\n return new Promise(resolve => Notification.requestPermission(resolve));\n }\n}\n\ndeclare let process: any;\n","import {\n openNewDevice,\n NetMDInterface,\n Disc,\n listContent,\n openPairedDevice,\n Wireformat,\n MDTrack,\n download,\n getDeviceStatus,\n DeviceStatus,\n Group,\n} from 'netmd-js';\nimport { makeGetAsyncPacketIteratorOnWorkerThread } from 'netmd-js/dist/web-encrypt-worker';\nimport { Logger } from 'netmd-js/dist/logger';\nimport {\n asyncMutex,\n sanitizeHalfWidthTitle,\n sanitizeFullWidthTitle,\n sleep,\n isSequential,\n compileDiscTitles,\n recomputeGroupsAfterTrackMove,\n} from '../utils';\nimport { Mutex } from 'async-mutex';\n\nconst Worker = require('worker-loader!netmd-js/dist/web-encrypt-worker.js'); // eslint-disable-line import/no-webpack-loader-syntax\n\nexport interface NetMDService {\n mutex: Mutex;\n getDeviceStatus(): Promise;\n pair(): Promise;\n connect(): Promise;\n listContent(): Promise;\n getDeviceName(): Promise;\n finalize(): Promise;\n renameTrack(index: number, newTitle: string, newFullWidthTitle?: string): Promise;\n renameDisc(newName: string, newFullWidthName?: string): Promise;\n renameGroup(groupIndex: number, newTitle: string, newFullWidthTitle?: string): Promise;\n addGroup(groupBegin: number, groupLength: number, name: string): Promise;\n deleteGroup(groupIndex: number): Promise;\n rewriteGroups(groups: Group[]): Promise;\n deleteTracks(indexes: number[]): Promise;\n moveTrack(src: number, dst: number, updateGroups?: boolean): Promise;\n wipeDisc(): Promise;\n wipeDiscTitleInfo(): Promise;\n upload(\n title: string,\n fullWidthTitle: string,\n data: ArrayBuffer,\n format: Wireformat,\n progressCallback: (progress: { written: number; encrypted: number; total: number }) => void\n ): Promise;\n\n play(): Promise;\n pause(): Promise;\n stop(): Promise;\n next(): Promise;\n prev(): Promise;\n gotoTrack(index: number): Promise;\n getPosition(): Promise;\n}\n\nexport class NetMDUSBService implements NetMDService {\n private netmdInterface?: NetMDInterface;\n private logger?: Logger;\n private cachedContentList?: Disc;\n public mutex = new Mutex();\n public statusMonitorTimer: any;\n\n constructor({ debug = false }: { debug: boolean }) {\n if (debug) {\n // Logging a few methods that have been causing issues with some units\n const _fn = (...args: any) => {\n if (args && args[0] && args[0].method) {\n console.log(...args);\n }\n };\n this.logger = {\n debug: _fn,\n info: _fn,\n warn: _fn,\n error: _fn,\n child: () => this.logger!,\n };\n }\n }\n\n private async writeRawTitles(titleObject: { newRawTitle: string; newRawFullWidthTitle: string } | null) {\n if (titleObject === null) return;\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setDiscTitle(sanitizeHalfWidthTitle(titleObject.newRawTitle));\n await this.netmdInterface!.setDiscTitle(sanitizeFullWidthTitle(titleObject.newRawFullWidthTitle), true);\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n private async listContentUsingCache() {\n if (!this.cachedContentList) {\n console.log(\"There's no cached version of the TOC, caching\");\n this.cachedContentList = await listContent(this.netmdInterface!);\n } else {\n console.log(\"There's a cached TOC available.\");\n }\n return JSON.parse(JSON.stringify(this.cachedContentList)) as Disc;\n }\n\n private dropCachedContentList() {\n console.log('Cached TOC Dropped');\n this.cachedContentList = undefined;\n }\n\n async pair() {\n this.dropCachedContentList();\n let iface = await openNewDevice(navigator.usb, this.logger);\n if (iface === null) {\n return false;\n }\n this.netmdInterface = iface;\n return true;\n }\n\n async connect() {\n this.dropCachedContentList();\n let iface = await openPairedDevice(navigator.usb, this.logger);\n if (iface === null) {\n return false;\n }\n this.netmdInterface = iface;\n return true;\n }\n\n @asyncMutex\n async listContent() {\n this.dropCachedContentList();\n return await this.listContentUsingCache();\n }\n\n @asyncMutex\n async getDeviceStatus() {\n return await getDeviceStatus(this.netmdInterface!);\n }\n\n @asyncMutex\n async getDeviceName() {\n return await this.netmdInterface!.netMd.getDeviceName();\n }\n\n @asyncMutex\n async finalize() {\n await this.netmdInterface!.netMd.finalize();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async rewriteGroups(groups: Group[]) {\n const disc = await this.listContentUsingCache();\n disc.groups = groups;\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async renameTrack(index: number, title: string, fullWidthTitle?: string) {\n title = sanitizeHalfWidthTitle(title);\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setTrackTitle(index, title);\n if (fullWidthTitle !== undefined) {\n await this.netmdInterface!.setTrackTitle(index, sanitizeFullWidthTitle(fullWidthTitle), true);\n }\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async renameGroup(groupIndex: number, newName: string, newFullWidthName?: string) {\n const disc = await this.listContentUsingCache();\n let thisGroup = disc.groups.find(g => g.index === groupIndex);\n if (!thisGroup) {\n return;\n }\n\n thisGroup.title = newName;\n if (newFullWidthName !== undefined) {\n thisGroup.fullWidthTitle = newFullWidthName;\n }\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async addGroup(groupBegin: number, groupLength: number, title: string) {\n const disc = await this.listContentUsingCache();\n let ungrouped = disc.groups.find(n => n.title === null);\n if (!ungrouped) {\n return; // You can only group tracks that aren't already in a different group, if there's no such tracks, there's no point to continue\n }\n\n let ungroupedLengthBeforeGroup = ungrouped.tracks.length;\n\n let thisGroupTracks = ungrouped.tracks.filter(n => n.index >= groupBegin && n.index < groupBegin + groupLength);\n ungrouped.tracks = ungrouped.tracks.filter(n => !thisGroupTracks.includes(n));\n\n if (ungroupedLengthBeforeGroup - ungrouped.tracks.length !== groupLength) {\n throw new Error('A track cannot be in 2 groups!');\n }\n\n if (!isSequential(thisGroupTracks.map(n => n.index))) {\n throw new Error('Invalid sequence of tracks!');\n }\n\n disc.groups.push({\n title,\n fullWidthTitle: '',\n index: disc.groups.length,\n tracks: thisGroupTracks,\n });\n disc.groups = disc.groups.filter(g => g.tracks.length !== 0).sort((a, b) => a.tracks[0].index - b.tracks[0].index);\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async deleteGroup(index: number) {\n const disc = await this.listContentUsingCache();\n\n let groupIndex = disc.groups.findIndex(g => g.index === index);\n if (groupIndex >= 0) {\n disc.groups.splice(groupIndex, 1);\n }\n\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async renameDisc(newName: string, newFullWidthName?: string) {\n // TODO: This whole function should be moved in netmd-js\n const oldName = await this.netmdInterface!.getDiscTitle();\n const oldFullWidthName = await this.netmdInterface!.getDiscTitle(true);\n const oldRawName = await this.netmdInterface!._getDiscTitle();\n const oldRawFullWidthName = await this.netmdInterface!._getDiscTitle(true);\n const hasGroups = oldRawName.indexOf('//') >= 0;\n const hasFullWidthGroups = oldRawName.indexOf('//') >= 0;\n const hasGroupsAndTitle = oldRawName.startsWith('0;');\n const hasFullWidthGroupsAndTitle = oldRawName.startsWith('0;');\n\n newName = sanitizeHalfWidthTitle(newName);\n newFullWidthName = newFullWidthName && sanitizeFullWidthTitle(newFullWidthName);\n\n if (newFullWidthName !== oldFullWidthName && newFullWidthName !== undefined) {\n let newFullWidthNameWithGroups;\n if (hasFullWidthGroups) {\n if (hasFullWidthGroupsAndTitle) {\n newFullWidthNameWithGroups = oldRawFullWidthName.replace(\n /^0;.*?///,\n newFullWidthName !== '' ? `0;${newFullWidthName}//` : ``\n );\n } else {\n newFullWidthNameWithGroups = `0;${newFullWidthName}//${oldRawFullWidthName}`; // Add the new title\n }\n } else {\n newFullWidthNameWithGroups = newFullWidthName;\n }\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setDiscTitle(newFullWidthNameWithGroups, true);\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n if (newName === oldName) {\n return;\n }\n\n let newNameWithGroups;\n\n if (hasGroups) {\n if (hasGroupsAndTitle) {\n newNameWithGroups = oldRawName.replace(/^0;.*?\\/\\//, newName !== '' ? `0;${newName}//` : ``); // Replace or delete the old title\n } else {\n newNameWithGroups = `0;${newName}//${oldRawName}`; // Add the new title\n }\n } else {\n newNameWithGroups = newName;\n }\n\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setDiscTitle(newNameWithGroups);\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async deleteTracks(indexes: number[]) {\n indexes = indexes.sort();\n indexes.reverse();\n let content = await this.listContentUsingCache();\n for (let index of indexes) {\n content = recomputeGroupsAfterTrackMove(content, index, -1);\n await this.netmdInterface!.eraseTrack(index);\n await sleep(100);\n }\n await this.writeRawTitles(compileDiscTitles(content));\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async wipeDisc() {\n await this.netmdInterface!.eraseDisc();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async wipeDiscTitleInfo() {\n await this.writeRawTitles({\n newRawTitle: '',\n newRawFullWidthTitle: '',\n });\n }\n\n @asyncMutex\n async moveTrack(src: number, dst: number, updateGroups?: boolean) {\n await this.netmdInterface!.moveTrack(src, dst);\n\n if (updateGroups === undefined || updateGroups) {\n await this.writeRawTitles(compileDiscTitles(recomputeGroupsAfterTrackMove(await this.listContentUsingCache(), src, dst)));\n }\n this.dropCachedContentList();\n }\n\n async upload(\n title: string,\n fullWidthTitle: string,\n data: ArrayBuffer,\n format: Wireformat,\n progressCallback: (progress: { written: number; encrypted: number; total: number }) => void\n ) {\n let total = data.byteLength;\n let written = 0;\n let encrypted = 0;\n function updateProgress() {\n progressCallback({ written, encrypted, total });\n }\n\n let w = new Worker();\n\n let webWorkerAsyncPacketIterator = makeGetAsyncPacketIteratorOnWorkerThread(w, ({ encryptedBytes }) => {\n encrypted = encryptedBytes;\n updateProgress();\n });\n\n let halfWidthTitle = sanitizeHalfWidthTitle(title);\n fullWidthTitle = sanitizeFullWidthTitle(fullWidthTitle);\n let mdTrack = new MDTrack(halfWidthTitle, format, data, 0x80000, fullWidthTitle, webWorkerAsyncPacketIterator);\n\n await download(this.netmdInterface!, mdTrack, ({ writtenBytes }) => {\n written = writtenBytes;\n updateProgress();\n });\n\n w.terminate();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async play() {\n await this.netmdInterface!.play();\n }\n @asyncMutex\n async pause() {\n await this.netmdInterface!.pause();\n }\n @asyncMutex\n async stop() {\n await this.netmdInterface!.stop();\n }\n @asyncMutex\n async next() {\n await this.netmdInterface!.nextTrack();\n }\n @asyncMutex\n async prev() {\n await this.netmdInterface!.previousTrack();\n }\n\n @asyncMutex\n async gotoTrack(index: number) {\n await this.netmdInterface!.gotoTrack(index);\n }\n\n @asyncMutex\n async getPosition() {\n return await this.netmdInterface!.getPosition();\n }\n}\n","import { NetMDService } from './netmd';\nimport { AudioExportService } from './audio-export';\nimport { MediaRecorderService } from './mediarecorder';\n\ninterface ServiceRegistry {\n netmdService?: NetMDService;\n audioExportService?: AudioExportService;\n mediaRecorderService?: MediaRecorderService;\n}\n\nconst ServiceRegistry: ServiceRegistry = {};\n\nexport default ServiceRegistry;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface LoadingDialogState {\n visible: boolean;\n cancelled: boolean;\n\n writtenProgress: number;\n encryptedProgress: number;\n totalProgress: number;\n\n trackTotal: number;\n trackConverting: number;\n trackCurrent: number;\n\n titleCurrent: string;\n titleConverting: string;\n}\n\nconst initialState: LoadingDialogState = {\n visible: false,\n cancelled: false,\n\n // Current Track Upload\n writtenProgress: 0,\n encryptedProgress: 0,\n totalProgress: 1,\n\n // Tracks done\n trackTotal: 1,\n trackConverting: 0,\n trackCurrent: 0,\n titleCurrent: '',\n titleConverting: '',\n};\n\nexport const slice = createSlice({\n name: 'uploadDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setWriteProgress: (state, action: PayloadAction<{ written: number; encrypted: number; total: number }>) => {\n state.encryptedProgress = action.payload.encrypted;\n state.writtenProgress = action.payload.written;\n state.totalProgress = action.payload.total;\n },\n setCancelUpload: (state, action: PayloadAction) => {\n state.cancelled = action.payload;\n },\n setTrackProgress: (\n state,\n action: PayloadAction<{ total: number; current: number; converting: number; titleCurrent: string; titleConverting: string }>\n ) => {\n state.trackTotal = action.payload.total;\n state.trackCurrent = action.payload.current;\n state.trackConverting = action.payload.converting;\n state.titleCurrent = action.payload.titleCurrent;\n state.titleConverting = action.payload.titleConverting;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface RenameDialogState {\n visible: boolean;\n title: string;\n fullWidthTitle: string;\n index: number;\n groupIndex: number | null;\n}\n\nconst initialState: RenameDialogState = {\n visible: false,\n title: '',\n fullWidthTitle: '',\n index: -1,\n groupIndex: null,\n};\n\nexport const slice = createSlice({\n name: 'renameDialog',\n initialState,\n reducers: {\n setVisible: (state: RenameDialogState, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setCurrentName: (state: RenameDialogState, action: PayloadAction) => {\n state.title = action.payload;\n },\n setCurrentFullWidthName: (state: RenameDialogState, action: PayloadAction) => {\n state.fullWidthTitle = action.payload;\n },\n setIndex: (state: RenameDialogState, action: PayloadAction) => {\n state.index = action.payload;\n },\n setGroupIndex: (state: RenameDialogState, action: PayloadAction) => {\n state.groupIndex = action.payload;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface ErrorDialogState {\n visible: boolean;\n error: string;\n}\n\nconst initialState: ErrorDialogState = {\n visible: false,\n error: ``,\n};\n\nconst slice = createSlice({\n name: 'errorDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setErrorMessage: (state, action: PayloadAction) => {\n state.error = `${action.payload}`;\n },\n },\n});\n\nexport const { actions, reducer } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport const initialState = {\n visible: false,\n dismissed: false, // This will prevent showing the dialog during the same session\n};\n\nconst slice = createSlice({\n name: 'panicDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n dismiss: (state, action: PayloadAction) => {\n state.visible = false;\n state.dismissed = true;\n },\n },\n});\n\nexport const { actions, reducer } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\nimport { savePreference, loadPreference } from '../utils';\n\nexport type TitleFormatType = 'filename' | 'title' | 'album-title' | 'artist-title' | 'artist-album-title' | 'title-artist';\nexport type UploadFormat = 'SP' | 'LP2' | 'LP4';\n\nexport interface ConvertDialogFeature {\n visible: boolean;\n format: UploadFormat;\n titleFormat: TitleFormatType;\n}\n\nconst initialState: ConvertDialogFeature = {\n visible: false,\n format: loadPreference('uploadFormat', 'LP2') as UploadFormat,\n titleFormat: loadPreference('trackTitleFormat', 'filename') as TitleFormatType,\n};\n\nconst slice = createSlice({\n name: 'convertDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setFormat: (state, action: PayloadAction) => {\n state.format = action.payload;\n savePreference('uploadFormat', state.format);\n },\n setTitleFormat: (state, action: PayloadAction) => {\n state.titleFormat = action.payload;\n savePreference('trackTitleFormat', state.titleFormat);\n },\n },\n});\n\nexport const { actions, reducer } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface DumpDialogState {\n visible: boolean;\n inputDeviceId: string;\n}\n\nconst initialState: DumpDialogState = {\n visible: false,\n inputDeviceId: '',\n};\n\nexport const slice = createSlice({\n name: 'dumpDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setInputDeviceId: (state, action: PayloadAction) => {\n state.inputDeviceId = action.payload;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface RecordingDialogState {\n visible: boolean;\n\n trackTotal: number;\n trackDone: number;\n trackCurrent: number;\n\n titleCurrent: string;\n}\n\nconst initialState: RecordingDialogState = {\n visible: false,\n\n trackTotal: 1,\n trackDone: 0,\n trackCurrent: 0,\n\n titleCurrent: '',\n\n // visible: true,\n // trackTotal: 4,\n // trackDone: 1,\n // trackCurrent: 25,\n\n // titleCurrent: 'Seconda traccia',\n};\n\nexport const slice = createSlice({\n name: 'recordDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setProgress: (\n state,\n action: PayloadAction<{ trackTotal: number; trackDone: number; trackCurrent: number; titleCurrent: string }>\n ) => {\n state.trackTotal = action.payload.trackTotal;\n state.trackDone = action.payload.trackDone;\n state.trackCurrent = action.payload.trackCurrent;\n state.titleCurrent = action.payload.titleCurrent;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\nimport { savePreference, loadPreference } from '../utils';\n\nexport type Views = 'WELCOME' | 'MAIN';\n\nexport interface AppState {\n mainView: Views;\n loading: boolean;\n pairingFailed: boolean;\n pairingMessage: string;\n browserSupported: boolean;\n darkMode: boolean;\n vintageMode: boolean;\n aboutDialogVisible: boolean;\n notifyWhenFinished: boolean;\n hasNotificationSupport: boolean;\n fullWidthSupport: boolean;\n}\n\nexport const buildInitialState = (): AppState => {\n return {\n mainView: 'WELCOME',\n loading: false,\n pairingFailed: false,\n pairingMessage: ``,\n browserSupported: true,\n darkMode: loadPreference('darkMode', false),\n vintageMode: loadPreference('vintageMode', false),\n aboutDialogVisible: false,\n notifyWhenFinished: loadPreference('notifyWhenFinished', false),\n hasNotificationSupport: true,\n fullWidthSupport: loadPreference('fullWidthSupport', false),\n };\n};\n\nconst initialState: AppState = buildInitialState();\n\nexport const slice = createSlice({\n name: 'app',\n initialState,\n reducers: {\n setMainView: (state, action: PayloadAction) => {\n // CAVEAT: There's a middleware that resets the state when mainView is set to WELCOME\n state.mainView = action.payload;\n },\n setLoading: (state, action: PayloadAction) => {\n state.loading = action.payload;\n },\n setPairingFailed: (state, action: PayloadAction) => {\n state.pairingFailed = action.payload;\n },\n setPairingMessage: (state, action: PayloadAction) => {\n state.pairingMessage = action.payload;\n },\n setBrowserSupported: (state, action: PayloadAction) => {\n state.browserSupported = action.payload;\n },\n setDarkMode: (state, action: PayloadAction) => {\n state.darkMode = action.payload;\n savePreference('darkMode', state.darkMode);\n },\n setNotifyWhenFinished: (state, action: PayloadAction) => {\n state.notifyWhenFinished = action.payload;\n savePreference('notifyWhenFinished', action.payload);\n },\n setNotificationSupport: (state, action: PayloadAction) => {\n state.hasNotificationSupport = action.payload;\n },\n setVintageMode: (state, action: PayloadAction) => {\n state.vintageMode = action.payload;\n savePreference('vintageMode', action.payload);\n },\n showAboutDialog: (state, action: PayloadAction) => {\n state.aboutDialogVisible = action.payload;\n },\n setFullWidthSupport: (state, action: PayloadAction) => {\n state.fullWidthSupport = action.payload;\n savePreference('fullWidthSupport', state.fullWidthSupport);\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { Disc, DeviceStatus } from 'netmd-js';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface MainState {\n disc: Disc | null;\n deviceName: string;\n deviceStatus: DeviceStatus | null;\n}\n\nconst initialState: MainState = {\n disc: null,\n deviceName: '',\n deviceStatus: null,\n};\n\nexport const slice = createSlice({\n name: 'main',\n initialState,\n reducers: {\n setDisc: (state, action: PayloadAction) => {\n state.disc = action.payload;\n },\n setDeviceName: (state, action: PayloadAction) => {\n state.deviceName = action.payload;\n },\n setDeviceStatus: (state, action: PayloadAction) => {\n state.deviceStatus = action.payload;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { configureStore, getDefaultMiddleware, Middleware, combineReducers } from '@reduxjs/toolkit';\nimport uploadDialog from './upload-dialog-feature';\nimport renameDialog from './rename-dialog-feature';\nimport errorDialog from './error-dialog-feature';\nimport panicDialog, { actions as panicDialogActions } from './panic-dialog-feature';\nimport convertDialog from './convert-dialog-feature';\nimport dumpDialog from './dump-dialog-feature';\nimport recordDialog from './record-dialog-feature';\nimport appState, { actions as appActions, buildInitialState as buildInitialAppState } from './app-feature';\nimport main from './main-feature';\n\nconst errorCatcher: Middleware = store => next => async action => {\n try {\n await next(action);\n } catch (e) {\n console.error(e);\n next(panicDialogActions.setVisible(true));\n }\n};\n\nlet reducer = combineReducers({\n renameDialog,\n uploadDialog,\n errorDialog,\n panicDialog,\n convertDialog,\n dumpDialog,\n recordDialog,\n appState,\n main,\n});\n\nconst resetStateAction = appActions.setMainView.toString();\nconst resetStatePayoload = 'WELCOME';\nconst resetStateReducer: typeof reducer = function(...args) {\n const [state, action] = args;\n if (action.type === resetStateAction && action.payload === resetStatePayoload) {\n return {\n ...initialState,\n appState: buildInitialAppState(),\n };\n }\n return reducer(...args);\n};\n\nexport const store = configureStore({\n reducer: resetStateReducer,\n middleware: [errorCatcher, ...getDefaultMiddleware()],\n});\n\nconst initialState = Object.freeze(store.getState());\n\nexport type RootState = ReturnType;\nexport type AppDispatch = typeof store.dispatch;\n","import { batchActions } from 'redux-batched-actions';\nimport { AppDispatch, RootState } from './store';\nimport { actions as uploadDialogActions } from './upload-dialog-feature';\nimport { actions as renameDialogActions } from './rename-dialog-feature';\nimport { actions as errorDialogAction } from './error-dialog-feature';\nimport { actions as recordDialogAction } from './record-dialog-feature';\nimport { actions as appStateActions } from './app-feature';\nimport { actions as mainActions } from './main-feature';\nimport serviceRegistry from '../services/registry';\nimport { Wireformat, getTracks } from 'netmd-js';\nimport { AnyAction } from '@reduxjs/toolkit';\nimport {\n getAvailableCharsForTitle,\n framesToSec,\n sleepWithProgressCallback,\n sleep,\n askNotificationPermission,\n getGroupedTracks,\n getHalfWidthTitleLength,\n} from '../utils';\nimport * as mm from 'music-metadata-browser';\nimport { TitleFormatType, UploadFormat } from './convert-dialog-feature';\nimport NotificationCompleteIconUrl from '../images/record-complete-notification-icon.png';\nimport { assertNumber } from 'netmd-js/dist/utils';\n\nexport function control(action: 'play' | 'stop' | 'next' | 'prev' | 'goto' | 'pause', params?: unknown) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n switch (action) {\n case 'play':\n await serviceRegistry.netmdService!.play();\n break;\n case 'stop':\n await serviceRegistry.netmdService!.stop();\n break;\n case 'next':\n await serviceRegistry.netmdService!.next();\n break;\n case 'prev':\n await serviceRegistry.netmdService!.prev();\n break;\n case 'pause':\n await serviceRegistry.netmdService!.pause();\n break;\n case 'goto':\n const trackNumber = assertNumber(params, 'Invalid track number for \"goto\" command');\n await serviceRegistry.netmdService!.gotoTrack(trackNumber);\n break;\n }\n // CAVEAT: change-track might take a up to a few seconds to complete.\n // We wait 500ms and let the monitor do further updates\n await sleep(500);\n try {\n let deviceStatus = await serviceRegistry.netmdService!.getDeviceStatus();\n dispatch(mainActions.setDeviceStatus(deviceStatus));\n } catch (e) {\n console.log('control: Cannot get device status');\n }\n };\n}\n\nexport function renameGroup({ groupIndex, newName, newFullWidthName }: { groupIndex: number; newName: string; newFullWidthName?: string }) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n await serviceRegistry!.netmdService?.renameGroup(groupIndex, newName, newFullWidthName);\n listContent()(dispatch);\n };\n}\n\nexport function groupTracks(indexes: number[]) {\n return async function(dispatch: AppDispatch) {\n let begin = indexes[0];\n let length = indexes[indexes.length - 1] - begin + 1;\n const { netmdService } = serviceRegistry;\n\n netmdService!.addGroup(begin, length, '');\n listContent()(dispatch);\n };\n}\n\nexport function deleteGroup(index: number) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n netmdService!.deleteGroup(index);\n listContent()(dispatch);\n };\n}\n\nexport function dragDropTrack(sourceList: number, sourceIndex: number, targetList: number, targetIndex: number) {\n // This code is here, because it would need to be duplicated in both netmd and netmd-mock.\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n if (sourceList === targetList && sourceIndex === targetIndex) return;\n dispatch(appStateActions.setLoading(true));\n const groupedTracks = getGroupedTracks(await serviceRegistry.netmdService!.listContent());\n // Remove the moved item from its current list\n let movedItem = groupedTracks[sourceList].tracks.splice(sourceIndex, 1)[0];\n let newIndex: number;\n\n // Calculate bounds\n let boundsStartList, boundsEndList, boundsStartIndex, boundsEndIndex, offset;\n\n if (sourceList < targetList) {\n boundsStartList = sourceList;\n boundsStartIndex = sourceIndex;\n boundsEndList = targetList;\n boundsEndIndex = targetIndex;\n offset = -1;\n } else if (sourceList > targetList) {\n boundsStartList = targetList;\n boundsStartIndex = targetIndex;\n boundsEndList = sourceList;\n boundsEndIndex = sourceIndex;\n offset = 1;\n } else {\n if (sourceIndex < targetIndex) {\n boundsStartList = boundsEndList = sourceList;\n boundsStartIndex = sourceIndex;\n boundsEndIndex = targetIndex;\n offset = -1;\n } else {\n boundsStartList = boundsEndList = targetList;\n boundsStartIndex = targetIndex;\n boundsEndIndex = sourceIndex;\n offset = 1;\n }\n }\n\n // Shift indices\n for (let i = boundsStartList; i <= boundsEndList; i++) {\n let startingIndex = i === boundsStartList ? boundsStartIndex : 0;\n let endingIndex = i === boundsEndList ? boundsEndIndex : groupedTracks[i].tracks.length;\n for (let j = startingIndex; j < endingIndex; j++) {\n groupedTracks[i].tracks[j].index += offset;\n }\n }\n\n // Calculate the moved track's destination index\n if (targetList === 0) {\n newIndex = targetIndex;\n } else {\n if (targetIndex === 0) {\n let prevList = groupedTracks[targetList - 1];\n let i = 2;\n while (prevList && prevList.tracks.length === 0) {\n // Skip past all the empty lists\n prevList = groupedTracks[targetList - i++];\n }\n if (prevList) {\n // If there's a previous list, make this tracks's index previous list's last item's index + 1\n let lastIndexOfPrevList = prevList.tracks[prevList.tracks.length - 1].index;\n newIndex = lastIndexOfPrevList + 1;\n } else newIndex = 0; // Else default to index 0\n } else {\n newIndex = groupedTracks[targetList].tracks[0].index + targetIndex;\n }\n }\n\n if (movedItem.index !== newIndex) {\n await serviceRegistry!.netmdService!.moveTrack(movedItem.index, newIndex, false);\n }\n\n movedItem.index = newIndex;\n groupedTracks[targetList].tracks.splice(targetIndex, 0, movedItem);\n let ungrouped = [];\n\n // Recompile the groups and update them on the player\n let normalGroups = [];\n for (let group of groupedTracks) {\n if (group.tracks.length === 0) continue;\n if (group.index === -1) ungrouped.push(...group.tracks);\n else normalGroups.push(group);\n }\n if (ungrouped.length)\n normalGroups.unshift({\n index: 0,\n title: null,\n fullWidthTitle: null,\n tracks: ungrouped,\n });\n await serviceRegistry.netmdService!.rewriteGroups(normalGroups);\n listContent()(dispatch);\n };\n}\n\nexport function pair() {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n dispatch(appStateActions.setPairingFailed(false));\n\n await serviceRegistry.audioExportService!.init();\n\n try {\n let connected = await serviceRegistry.netmdService!.connect();\n if (connected) {\n dispatch(appStateActions.setMainView('MAIN'));\n return;\n }\n } catch (err) {\n console.error(err);\n // In case of error, just log and try to pair\n }\n\n try {\n let paired = await serviceRegistry.netmdService!.pair();\n if (paired) {\n dispatch(appStateActions.setMainView('MAIN'));\n return;\n }\n dispatch(batchActions([appStateActions.setPairingMessage(`Connection Failed`), appStateActions.setPairingFailed(true)]));\n } catch (err) {\n console.error(err);\n let message = (err as Error).message;\n dispatch(batchActions([appStateActions.setPairingMessage(message), appStateActions.setPairingFailed(true)]));\n }\n };\n}\n\nexport function listContent() {\n return async function(dispatch: AppDispatch) {\n // Issue loading\n dispatch(appStateActions.setLoading(true));\n let disc;\n try {\n disc = await serviceRegistry.netmdService!.listContent();\n } catch (err) {\n if (window.confirm(\"This disc's title seems to be corrupted, do you wish to erase it?\\nNone of the tracks will be deleted.\")) {\n await serviceRegistry.netmdService!.wipeDiscTitleInfo();\n disc = await serviceRegistry.netmdService!.listContent();\n } else throw err;\n }\n let deviceName = await serviceRegistry.netmdService!.getDeviceName();\n let deviceStatus = null;\n try {\n deviceStatus = await serviceRegistry.netmdService!.getDeviceStatus();\n } catch (e) {\n console.log('listContent: Cannot get device status');\n }\n dispatch(\n batchActions([\n mainActions.setDisc(disc),\n mainActions.setDeviceName(deviceName),\n mainActions.setDeviceStatus(deviceStatus),\n appStateActions.setLoading(false),\n ])\n );\n };\n}\n\nexport function renameTrack({ index, newName, newFullWidthName }: { index: number; newName: string; newFullWidthName?: string }) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n dispatch(renameDialogActions.setVisible(false));\n try {\n await netmdService!.renameTrack(index, newName, newFullWidthName);\n } catch (err) {\n console.error(err);\n dispatch(batchActions([errorDialogAction.setVisible(true), errorDialogAction.setErrorMessage(`Rename failed.`)]));\n }\n listContent()(dispatch);\n };\n}\n\nexport function renameDisc({ newName, newFullWidthName }: { newName: string; newFullWidthName?: string }) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n await netmdService!.renameDisc(\n newName.replace(/\\/\\//g, ' /'), // Make sure the title doesn't interfere with the groups\n newFullWidthName?.replace(////g, '/')\n );\n dispatch(renameDialogActions.setVisible(false));\n listContent()(dispatch);\n };\n}\n\nexport function deleteTracks(indexes: number[]) {\n return async function(dispatch: AppDispatch) {\n const confirmation = window.confirm(\n `Proceed with Delete Track${indexes.length !== 1 ? 's' : ''}? This operation cannot be undone.`\n );\n if (!confirmation) {\n return;\n }\n const { netmdService } = serviceRegistry;\n dispatch(appStateActions.setLoading(true));\n await netmdService!.deleteTracks(indexes);\n listContent()(dispatch);\n };\n}\n\nexport function wipeDisc() {\n return async function(dispatch: AppDispatch) {\n const confirmation = window.confirm(`Proceed with Wipe Disc? This operation cannot be undone.`);\n if (!confirmation) {\n return;\n }\n const { netmdService } = serviceRegistry;\n dispatch(appStateActions.setLoading(true));\n await netmdService!.wipeDisc();\n listContent()(dispatch);\n };\n}\n\nexport function moveTrack(srcIndex: number, destIndex: number) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n await netmdService!.moveTrack(srcIndex, destIndex);\n listContent()(dispatch);\n };\n}\n\nexport function recordTracks(indexes: number[], deviceId: string) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n dispatch(\n batchActions([\n recordDialogAction.setVisible(true),\n recordDialogAction.setProgress({ trackTotal: indexes.length, trackDone: 0, trackCurrent: 0, titleCurrent: '' }),\n ])\n );\n\n let disc = getState().main.disc;\n let tracks = getTracks(disc!).filter(t => indexes.indexOf(t.index) >= 0);\n\n const { netmdService, mediaRecorderService } = serviceRegistry;\n await serviceRegistry.netmdService!.stop();\n\n for (let [i, track] of tracks.entries()) {\n dispatch(\n recordDialogAction.setProgress({\n trackTotal: tracks.length,\n trackDone: i,\n trackCurrent: -1,\n titleCurrent: track.title ?? '',\n })\n );\n\n // Wait for the track to be ready to play from 0:00\n await netmdService!.gotoTrack(track.index);\n await netmdService!.play();\n console.log('Waiting for track to be ready to play');\n let position = await netmdService!.getPosition();\n let expected = [track.index, 0, 0, 1];\n while (position === null || !expected.every((_, i) => expected[i] === position![i])) {\n await sleep(250);\n position = await netmdService!.getPosition();\n }\n await netmdService!.pause();\n await netmdService?.gotoTrack(track.index);\n console.log('Track is ready to play');\n\n // Start recording and play track\n await mediaRecorderService?.initStream(deviceId);\n await mediaRecorderService?.startRecording();\n await netmdService!.play();\n\n // Wait until track is finished\n let durationInSec = framesToSec(track.duration);\n // await sleep(durationInSec * 1000);\n await sleepWithProgressCallback(durationInSec * 1000, (perc: number) => {\n dispatch(\n recordDialogAction.setProgress({\n trackTotal: tracks.length,\n trackDone: i,\n trackCurrent: perc,\n titleCurrent: track.title ?? '',\n })\n );\n });\n\n // Stop recording and download the wav\n await mediaRecorderService?.stopRecording();\n const fileName = track.title || `Track ${track.index + 1}`;\n mediaRecorderService?.downloadRecorded(`${fileName}`);\n\n await mediaRecorderService?.closeStream();\n }\n\n await netmdService!.stop();\n dispatch(recordDialogAction.setVisible(false));\n };\n}\n\nexport function setNotifyWhenFinished(value: boolean) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n if (Notification.permission !== 'granted') {\n const confirmation = window.confirm(`Enable Notification on recording completed?`);\n if (!confirmation) {\n return;\n }\n const result = await askNotificationPermission();\n if (result !== 'granted') {\n dispatch(appStateActions.setNotificationSupport(false));\n dispatch(appStateActions.setNotifyWhenFinished(false));\n return;\n }\n }\n dispatch(appStateActions.setNotifyWhenFinished(value));\n };\n}\n\nexport const WireformatDict: { [k: string]: Wireformat } = {\n SP: Wireformat.pcm,\n LP2: Wireformat.lp2,\n LP105: Wireformat.l105kbps,\n LP4: Wireformat.lp4,\n};\n\nasync function getTrackNameFromMediaTags(file: File, titleFormat: TitleFormatType) {\n const fileData = await file.arrayBuffer();\n const blob = new Blob([new Uint8Array(fileData)]);\n let metadata = await mm.parseBlob(blob);\n const title = metadata.common.title ?? 'Unknown Title';\n const artist = metadata.common.artist ?? 'Unknown Artist';\n const album = metadata.common.album ?? 'Unknown Album';\n switch (titleFormat) {\n case 'title': {\n return title;\n }\n case 'artist-title': {\n return `${artist} - ${title}`;\n }\n case 'title-artist': {\n return `${title} - ${artist}`;\n }\n case 'album-title': {\n return `${album} - ${title}`;\n }\n case 'artist-album-title': {\n return `${artist} - ${album} - ${title}`;\n }\n case 'filename': {\n let title = file.name;\n // Remove file extension\n const extStartIndex = title.lastIndexOf('.');\n if (extStartIndex > 0) {\n title = title.substring(0, extStartIndex);\n }\n return title;\n }\n }\n}\n\nexport function convertAndUpload(files: File[], format: UploadFormat, titleFormat: TitleFormatType) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n const { audioExportService, netmdService } = serviceRegistry;\n const wireformat = WireformatDict[format];\n\n await netmdService?.stop();\n dispatch(batchActions([uploadDialogActions.setVisible(true), uploadDialogActions.setCancelUpload(false)]));\n\n const updateProgressCallback = ({ written, encrypted, total }: { written: number; encrypted: number; total: number }) => {\n dispatch(uploadDialogActions.setWriteProgress({ written, encrypted, total }));\n };\n\n const hasUploadBeenCancelled = () => {\n return getState().uploadDialog.cancelled;\n };\n\n function showFinishedNotificationIfNeeded() {\n const { notifyWhenFinished, hasNotificationSupport } = getState().appState;\n if (!hasNotificationSupport || !notifyWhenFinished) {\n return;\n }\n const notification = new Notification('MiniDisc recording completed', {\n icon: NotificationCompleteIconUrl,\n });\n notification.onclick = function() {\n window.focus();\n this.close();\n };\n }\n\n let trackUpdate: {\n current: number;\n converting: number;\n total: number;\n titleCurrent: string;\n titleConverting: string;\n } = {\n current: 0,\n converting: 0,\n total: files.length,\n titleCurrent: '',\n titleConverting: '',\n };\n const updateTrack = () => {\n dispatch(uploadDialogActions.setTrackProgress(trackUpdate));\n };\n\n let conversionIterator = async function*(files: File[]) {\n let converted: Promise<{ file: File; data: ArrayBuffer }>[] = [];\n\n let i = 0;\n function convertNext() {\n if (i === files.length || hasUploadBeenCancelled()) {\n trackUpdate.converting = i;\n trackUpdate.titleConverting = ``;\n updateTrack();\n return;\n }\n\n let f = files[i];\n trackUpdate.converting = i;\n trackUpdate.titleConverting = f.name;\n updateTrack();\n i++;\n\n converted.push(\n new Promise(async (resolve, reject) => {\n let data: ArrayBuffer;\n try {\n await audioExportService!.prepare(f);\n data = await audioExportService!.export({ format });\n convertNext();\n resolve({ file: f, data: data });\n } catch (err) {\n error = err;\n errorMessage = `${f.name}: Unsupported or unrecognized format`;\n reject(err);\n }\n })\n );\n }\n convertNext();\n\n let j = 0;\n while (j < converted.length) {\n yield await converted[j];\n delete converted[j];\n j++;\n }\n };\n\n let disc = getState().main.disc;\n let useFullWidth = getState().appState.fullWidthSupport;\n let availableCharacters = getAvailableCharsForTitle(disc!);\n\n let error: any;\n let errorMessage = ``;\n let i = 1;\n for await (let item of conversionIterator(files)) {\n if (hasUploadBeenCancelled()) {\n break;\n }\n\n const { file, data } = item;\n\n let title = file.name;\n try {\n title = await getTrackNameFromMediaTags(file, titleFormat);\n } catch (err) {\n console.error(err);\n }\n\n const fixLength = (l: number) => Math.ceil(l / 7) * 7;\n let halfWidthTitle = title.substr(0, Math.min(getHalfWidthTitleLength(title), availableCharacters));\n availableCharacters -= fixLength(getHalfWidthTitleLength(halfWidthTitle));\n\n let fullWidthTitle = '';\n if (useFullWidth) {\n fullWidthTitle = title.substr(0, Math.min(title.length * 2, availableCharacters, 210 /* limit is 105 */) / 2);\n availableCharacters -= fixLength(fullWidthTitle.length * 2);\n }\n\n trackUpdate.current = i++;\n trackUpdate.titleCurrent = halfWidthTitle;\n updateTrack();\n updateProgressCallback({ written: 0, encrypted: 0, total: 100 });\n try {\n await netmdService?.upload(halfWidthTitle, fullWidthTitle, data, wireformat, updateProgressCallback);\n } catch (err) {\n error = err;\n errorMessage = `${file.name}: Error uploading to device. There might not be enough space left.`;\n break;\n }\n }\n\n let actionToDispatch: AnyAction[] = [uploadDialogActions.setVisible(false)];\n\n if (error) {\n console.error(error);\n actionToDispatch = actionToDispatch.concat([\n errorDialogAction.setVisible(true),\n errorDialogAction.setErrorMessage(errorMessage),\n ]);\n }\n\n dispatch(batchActions(actionToDispatch));\n showFinishedNotificationIfNeeded();\n listContent()(dispatch);\n };\n}\n","import { Button, Window, WindowContent, TableRow } from 'react95';\nimport styled from 'styled-components';\n\nexport const DialogOverlay = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2;\n`;\n\nexport const DialogWindow = styled(Window)`\n width: 80%;\n left: 10%;\n top: 20%;\n`;\n\nexport const DialogFooter = styled.div`\n display: flex;\n justify-content: flex-end;\n padding-top: 16px;\n width: 100%;\n`;\n\nexport const DialogWindowContent = styled(WindowContent)`\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport const FooterButton = styled(Button)`\n margin-left: 16px;\n min-width: 90px;\n`;\n\nexport const CustomTableRow = styled(TableRow)`\n cursor: default;\n &:hover {\n color: ${(styled: any) => styled.theme.canvasText};\n background-color: initial;\n }\n`;\n\nexport const WindowCloseIcon = styled.span`\n display: inline-block;\n width: 16px;\n height: 16px;\n margin-left: -1px;\n margin-top: -1px;\n transform: rotateZ(45deg);\n position: relative;\n\n &:before {\n content: '';\n position: absolute;\n height: 100%;\n width: 3px;\n left: 50%;\n transform: translateX(-50%);\n background-color: #0a0a0a;\n }\n\n &:after {\n content: '';\n position: absolute;\n height: 3px;\n width: 100%;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n background-color: #0a0a0a;\n }\n`;\n\nexport const FloatingButton = styled.button`\n width: 60px;\n height: 60px;\n position: absolute;\n bottom: 40px;\n right: 24px;\n z-index: 1;\n border-radius: 50%;\n background: rgb(185, 106, 201);\n border-width: 4px;\n border-style: solid;\n border-color: rgb(233, 128, 252) rgb(111, 45, 189) rgb(111, 45, 189) rgb(233, 128, 252);\n box-shadow: rgb(0 0 0 / 45%) 4px 4px 10px 0px;\n\n &:after {\n content: '';\n display: inline-block;\n width: 100%;\n height: 100%;\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADKgAAAyoBEJdYGAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHWSURBVHic7d3BbdYwGIDhz1wYAakXNmOGdhKY4d+MC1JH4BQurcQ1EmmE3+cZwLbkV04OjrKO45idrLWeZ+b7RcO/HMfx46Kxb/Hp7gVwLwHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAuB0DePpPx77F2umXMWutzzPzc2a+XDTF68x8PY7j90Xjf7g1M893L+IfeZqZb3Pd5r97nZnHzPy6eJ4PsWZmnyOA03Z8B+AEAcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAohzLfy8va6F+zDklO0+DNnqEfC2MY8Lp3jstPkzmwXw5sqjeYtj/287BsAJAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxfwAw2y4BcmRzJgAAAABJRU5ErkJggg==');\n background-size: 30px;\n background-repeat: no-repeat;\n filter: drop-shadow(rgb(233, 128, 252) 1px 1px 0px) drop-shadow(rgb(111, 45, 189) -1px -1px 0px);\n background-position: center center;\n }\n\n &:active {\n border-width: 4px;\n border-style: solid;\n border-color: rgb(111, 45, 189) rgb(233, 128, 252) rgb(233, 128, 252) rgb(111, 45, 189);\n box-shadow: rgb(0 0 0 / 55%) 3px 3px 5px 0px;\n }\n`;\n","import React from 'react';\nimport { Button, WindowHeader, Anchor } from 'react95';\nimport { FooterButton, DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent, WindowCloseIcon } from './common';\n\nexport const W95AboutDialog = (props: { visible: boolean; handleClose: () => void }) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n \n \n \n About Web MiniDisc\n \n \n \n Web MiniDisc uses\n
    \n
  • \n \n FFmpeg\n {' '}\n and{' '}\n \n ffmpegjs\n \n , to read your audio files (wav, mp3, ogg, mp4, etc...).\n
  • \n
  • \n \n Atracdenc\n \n , to support atrac3 encoding (lp2, lp4 audio formats).\n
  • \n
  • \n \n Emscripten\n \n , to run both FFmpeg and Atracdenc in the browser.\n
  • \n
  • \n \n netmd-js\n \n , to send commands to NetMD devices using Javascript.\n
  • \n
  • \n \n linux-minidisc\n \n , to make the netmd-js project possible.\n
  • \n
  • \n \n react85\n \n , to build the vintage user interface.\n
  • \n
  • \n \n material-ui\n \n , to build the user interface.\n
  • \n
\n \n OK\n \n
\n
\n
\n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { actions as appActions } from '../redux/app-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport Link from '@material-ui/core/Link';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95AboutDialog } from './win95/about-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const AboutDialog = (props: {}) => {\n const dispatch = useDispatch();\n\n let visible = useShallowEqualSelector(state => state.appState.aboutDialogVisible);\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n\n const handleClose = () => {\n dispatch(appActions.showAboutDialog(false));\n };\n\n if (vintageMode) {\n const p = {\n visible,\n handleClose,\n };\n return ;\n }\n\n return (\n \n About Web MiniDisc\n \n Web MiniDisc uses\n
    \n
  • \n \n FFmpeg\n {' '}\n and{' '}\n \n ffmpegjs\n \n , to read your audio files (wav, mp3, ogg, mp4, etc...).\n
  • \n
  • \n \n Atracdenc\n \n , to support atrac3 encoding (lp2, lp4 audio formats).\n
  • \n
  • \n \n Emscripten\n \n , to run both FFmpeg and Atracdenc in the browser.\n
  • \n
  • \n \n netmd-js\n \n , to send commands to NetMD devices using Javascript.\n
  • \n
  • \n \n linux-minidisc\n \n , to make the netmd-js project possible.\n
  • \n
  • \n \n react95\n \n , to build the vintage user interface.\n
  • \n
  • \n \n material-ui\n \n , to build the user interface.\n
  • \n
\n Attribution\n
    \n
  • \n MiniDisc logo from{' '}\n \n https://en.wikipedia.org/wiki/MiniDisc\n \n
  • \n
  • \n MiniDisc icon from{' '}\n \n http://fav.me/d7u3g3g\n \n
  • \n
\n
\n \n \n \n \n );\n};\n","import React from 'react';\nimport { List, ListItem, Checkbox, Divider } from 'react95';\nimport { Views } from '../../redux/app-feature';\n\nexport const W95TopMenu = (props: {\n mainView: Views;\n onClick?: () => void;\n handleWipeDisc: () => void;\n handleRefresh: () => void;\n handleRenameDisc: () => void;\n handleExit: () => void;\n handleShowAbout: () => void;\n handleVintageMode: () => void;\n}) => {\n const items = [];\n\n if (props.mainView === 'MAIN') {\n items.push(\n \n Reload TOC\n \n );\n items.push(\n \n Rename Disc\n \n );\n items.push(\n \n Wipe Disc\n \n );\n items.push(\n \n \n \n );\n\n items.push();\n items.push(\n \n Exit\n \n );\n items.push();\n }\n items.push(\n \n About...\n \n );\n items.push(\n \n \n Fork me on GitHub\n \n \n );\n return (\n \n {items}\n \n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { batchActions } from 'redux-batched-actions';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Divider from '@material-ui/core/Divider';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\n\nimport { wipeDisc, listContent } from '../redux/actions';\nimport { actions as appActions } from '../redux/app-feature';\nimport { actions as renameDialogActions } from '../redux/rename-dialog-feature';\nimport { useShallowEqualSelector } from '../utils';\nimport Link from '@material-ui/core/Link';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport EditIcon from '@material-ui/icons/Edit';\nimport GitHubIcon from '@material-ui/icons/GitHub';\nimport DeleteForeverIcon from '@material-ui/icons/DeleteForever';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport InfoIcon from '@material-ui/icons/Info';\nimport ToggleOffIcon from '@material-ui/icons/ToggleOff';\nimport ToggleOnIcon from '@material-ui/icons/ToggleOn';\nimport Win95Icon from '../images/win95/win95.png';\nimport HelpIcon from '@material-ui/icons/Help';\n\nimport { W95TopMenu } from './win95/topmenu';\n\nconst useStyles = makeStyles(theme => ({\n listItemIcon: {\n minWidth: theme.spacing(5),\n },\n toolTippedText: {\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n },\n}));\n\nexport const TopMenu = function(props: { onClick?: () => void }) {\n const classes = useStyles();\n const dispatch = useDispatch();\n\n let { mainView, darkMode, vintageMode, fullWidthSupport } = useShallowEqualSelector(state => state.appState);\n let discTitle = useShallowEqualSelector(state => state.main.disc?.title ?? ``);\n let fullWidthDiscTitle = useShallowEqualSelector(state => state.main.disc?.fullWidthTitle ?? ``);\n\n const githubLinkRef = React.useRef(null);\n const helpLinkRef = React.useRef(null);\n const [menuAnchorEl, setMenuAnchorEl] = React.useState(null);\n const menuOpen = Boolean(menuAnchorEl);\n\n const handleMenuOpen = useCallback(\n (event: React.MouseEvent) => {\n setMenuAnchorEl(event.currentTarget);\n },\n [setMenuAnchorEl]\n );\n\n const handleDarkMode = useCallback(() => {\n dispatch(appActions.setDarkMode(!darkMode));\n }, [dispatch, darkMode]);\n\n const handleVintageMode = useCallback(() => {\n dispatch(appActions.setVintageMode(!vintageMode));\n }, [dispatch, vintageMode]);\n\n const handleMenuClose = useCallback(() => {\n setMenuAnchorEl(null);\n }, [setMenuAnchorEl]);\n\n const handleWipeDisc = useCallback(() => {\n dispatch(wipeDisc());\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleAllowFullWidth = useCallback(() => {\n dispatch(appActions.setFullWidthSupport(!fullWidthSupport));\n }, [dispatch, fullWidthSupport]);\n\n const handleRefresh = useCallback(() => {\n dispatch(listContent());\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleRenameDisc = useCallback(() => {\n dispatch(\n batchActions([\n renameDialogActions.setVisible(true),\n renameDialogActions.setCurrentName(discTitle),\n renameDialogActions.setGroupIndex(null),\n renameDialogActions.setCurrentFullWidthName(fullWidthDiscTitle),\n renameDialogActions.setIndex(-1),\n ])\n );\n handleMenuClose();\n }, [dispatch, handleMenuClose, discTitle, fullWidthDiscTitle]);\n\n const handleExit = useCallback(() => {\n dispatch(appActions.setMainView('WELCOME'));\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleShowAbout = useCallback(() => {\n dispatch(appActions.showAboutDialog(true));\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleGithubLink = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n if (event.target !== githubLinkRef.current) {\n // Prevent opening the link twice\n githubLinkRef.current?.click();\n }\n handleMenuClose();\n },\n [handleMenuClose]\n );\n\n const handleHelpLink = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n if (event.target !== helpLinkRef.current) {\n // Prevent opening the link twice\n helpLinkRef.current?.click();\n }\n handleMenuClose();\n },\n [handleMenuClose]\n );\n\n const menuItems = [];\n if (mainView === 'MAIN') {\n menuItems.push(\n \n \n \n \n Reload TOC\n \n );\n menuItems.push(\n \n \n \n \n Rename Disc\n \n );\n menuItems.push(\n \n \n \n \n Wipe Disc\n \n );\n menuItems.push(\n \n \n \n \n Exit\n \n );\n }\n if (mainView === 'MAIN') {\n menuItems.push();\n menuItems.push(\n \n \n {fullWidthSupport ? : }\n \n \n {fullWidthSupport ? `Disable ` : `Enable `}\n \n Full-Width Title Editing\n \n \n \n );\n }\n menuItems.push(\n \n \n {/* */}\n {darkMode ? : }\n \n Dark Mode\n \n );\n if (mainView === 'MAIN') {\n menuItems.push(\n \n \n \"Windows\n \n Retro Mode (beta)\n \n );\n }\n if (mainView === 'MAIN') {\n menuItems.push();\n }\n menuItems.push(\n \n \n \n \n About\n \n );\n menuItems.push(\n \n \n \n \n \n \n Support and FAQ\n \n \n \n );\n menuItems.push(\n \n \n \n \n \n \n Fork me on GitHub\n \n \n \n );\n\n if (vintageMode) {\n const p = {\n mainView,\n onClick: props.onClick,\n handleWipeDisc,\n handleRefresh,\n handleRenameDisc,\n handleExit,\n handleShowAbout,\n handleVintageMode,\n };\n return ;\n }\n return (\n \n \n \n \n \n {menuItems}\n \n \n );\n};\n","import React from 'react';\nimport { Button, WindowContent } from 'react95';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { pair } from '../../redux/actions';\nimport { Dispatch } from '@reduxjs/toolkit';\nimport { AboutDialog } from '../about-dialog';\n\nconst useStyles = makeStyles(theme => ({\n pairingMessage: {\n color: 'red',\n marginTop: theme.spacing(1),\n },\n windowContent: {\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n}));\n\nexport interface W95WelcomeProps {\n dispatch: Dispatch;\n pairingFailed: boolean;\n pairingMessage: string;\n}\n\nexport const W95Welcome = (props: W95WelcomeProps) => {\n let { dispatch, pairingFailed, pairingMessage } = props;\n const classes = useStyles();\n return (\n <>\n \n

Press the button to connect to a NetMD device

\n \n

\n {pairingMessage}\n

\n
\n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { pair } from '../redux/actions';\n\nimport { useShallowEqualSelector } from '../utils';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Box from '@material-ui/core/Box';\nimport Link from '@material-ui/core/Link';\n\nimport { AboutDialog } from './about-dialog';\nimport { TopMenu } from './topmenu';\nimport ChromeIconPath from '../images/chrome-icon.svg';\nimport { W95Welcome } from './win95/welcome';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nconst useStyles = makeStyles(theme => ({\n main: {\n position: 'relative',\n flex: '1 1 auto',\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n },\n button: {\n marginTop: theme.spacing(3),\n minWidth: 150,\n },\n spacing: {\n marginTop: theme.spacing(1),\n },\n chromeLogo: {\n marginTop: theme.spacing(1),\n width: 96,\n height: 96,\n },\n why: {\n alignSelf: 'flex-start',\n marginTop: theme.spacing(3),\n },\n headBox: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n connectContainer: {\n flex: '1 1 auto',\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n },\n supportContainer: {\n flex: '1 1 auto',\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n },\n}));\n\nexport const Welcome = (props: {}) => {\n const classes = useStyles();\n const dispatch = useDispatch();\n const { browserSupported, pairingFailed, pairingMessage, vintageMode } = useShallowEqualSelector(state => state.appState);\n if (pairingMessage.toLowerCase().match(/denied/)) {\n // show linux instructions\n }\n // Access denied.\n\n const [showWhyUnsupported, setWhyUnsupported] = useState(false);\n const handleLearnWhy = (event: React.SyntheticEvent) => {\n event.preventDefault();\n setWhyUnsupported(true);\n };\n\n if (vintageMode) {\n const p = {\n dispatch,\n pairingFailed,\n pairingMessage,\n };\n return ;\n }\n\n return (\n \n \n \n Web MiniDisc\n \n \n \n \n Brings NetMD Devices to the Web\n \n \n {browserSupported ? (\n \n
\n \n Press the button to connect to a NetMD device\n \n\n \n\n \n {pairingMessage}\n \n
\n
\n \n \n Support and FAQ{' '}\n \n \n \n
\n
\n ) : (\n \n \n This Web browser is not supported. \n \n Learn Why\n \n \n\n \n \"Chrome\n \n\n \n Try using{' '}\n \n Chrome\n {' '}\n instead\n \n\n {showWhyUnsupported ? (\n <>\n \n Web MiniDisc requires a browser that supports both{' '}\n \n WebUSB\n {' '}\n and{' '}\n \n WebAssembly\n \n .\n \n
    \n
  • WebUSB is needed to control the NetMD device via the USB connection to your computer.
  • \n
  • WebAssembly is used to convert the music to a MiniDisc compatible format
  • \n
\n \n ) : null}\n
\n )}\n
\n \n
\n );\n};\n","import React, { useCallback } from 'react';\nimport clsx from 'clsx';\n\nimport { EncodingName } from '../utils';\n\nimport { formatTimeFromFrames, Track, Group } from 'netmd-js';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableRow from '@material-ui/core/TableRow';\nimport * as BadgeImpl from '@material-ui/core/Badge/Badge';\n\nimport DragIndicator from '@material-ui/icons/DragIndicator';\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport IconButton from '@material-ui/core/IconButton';\nimport FolderIcon from '@material-ui/icons/Folder';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nimport { DraggableProvided } from 'react-beautiful-dnd';\n\nconst useStyles = makeStyles(theme => ({\n currentTrackRow: {\n color: theme.palette.primary.main,\n '& > td': {\n color: 'inherit',\n },\n },\n inGroupTrackRow: {\n '& > $indexCell': {\n transform: `translateX(${theme.spacing(3)}px)`,\n },\n '& > $titleCell': {\n transform: `translateX(${theme.spacing(3)}px)`,\n },\n },\n playButtonInTrackList: {\n display: 'none',\n },\n trackRow: {\n '&:hover': {\n '& $playButtonInTrackList': {\n display: 'inline-flex',\n },\n '& $trackIndex': {\n display: 'none',\n },\n },\n },\n controlButtonInTrackCommon: {\n width: theme.spacing(2),\n height: theme.spacing(2),\n verticalAlign: 'middle',\n marginLeft: theme.spacing(-0.5),\n },\n formatBadge: {\n ...(BadgeImpl as any).styles(theme).badge,\n ...(BadgeImpl as any).styles(theme).colorPrimary,\n position: 'static',\n display: 'inline-flex',\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n verticalAlign: 'middle',\n width: theme.spacing(4.5),\n marginRight: theme.spacing(0.5),\n },\n durationCell: {\n whiteSpace: 'nowrap',\n },\n durationCellSecondary: {\n whiteSpace: 'nowrap',\n color: theme.palette.text.secondary,\n },\n durationCellTime: {\n verticalAlign: 'middle',\n },\n titleCell: {\n overflow: 'hidden',\n maxWidth: '40ch',\n textOverflow: 'ellipsis',\n // whiteSpace: 'nowrap',\n },\n deleteGroupButton: {\n display: 'none',\n },\n indexCell: {\n whiteSpace: 'nowrap',\n paddingRight: 0,\n width: theme.spacing(4),\n },\n trackIndex: {\n display: 'inline-block',\n height: '16px',\n width: '16px',\n },\n dragHandle: {\n width: 20,\n padding: `${theme.spacing(0.5)}px 0 0 0`,\n },\n dragHandleEmpty: {\n width: 20,\n padding: `${theme.spacing(0.5)}px 0 0 0`,\n },\n groupFolderIcon: {},\n groupHeadRow: {\n '&:hover': {\n '& $deleteGroupButton': {\n display: 'inline-flex',\n },\n '& $groupFolderIcon': {\n display: 'none',\n },\n },\n },\n}));\n\ninterface TrackRowProps {\n track: Track;\n inGroup: boolean;\n isSelected: boolean;\n trackStatus: 'playing' | 'paused' | 'none';\n draggableProvided: DraggableProvided;\n onSelect: (event: React.MouseEvent, trackIdx: number) => void;\n onRename: (event: React.MouseEvent, trackIdx: number) => void;\n onTogglePlayPause: (event: React.MouseEvent, trackIdx: number) => void;\n}\n\nexport function TrackRow({\n track,\n inGroup,\n isSelected,\n draggableProvided,\n trackStatus,\n onSelect,\n onRename,\n onTogglePlayPause,\n}: TrackRowProps) {\n const classes = useStyles();\n\n const handleRename = useCallback(event => onRename(event, track.index), [track.index, onRename]);\n const handleSelect = useCallback(event => onSelect(event, track.index), [track.index, onSelect]);\n const handlePlayPause: React.MouseEventHandler = useCallback(\n event => {\n event.stopPropagation();\n onTogglePlayPause(event, track.index);\n },\n [track.index, onTogglePlayPause]\n );\n const handleDoubleClickOnPlayButton: React.MouseEventHandler = useCallback(event => event.stopPropagation(), []);\n const isPlayingOrPaused = trackStatus === 'playing' || trackStatus === 'paused';\n\n return (\n \n event.stopPropagation()}>\n \n \n \n {track.index + 1}\n \n {trackStatus === 'paused' || trackStatus === 'none' ? (\n \n ) : (\n \n )}\n \n \n \n {track.fullWidthTitle ? `${track.fullWidthTitle} / ` : ``}\n {track.title || `No Title`}\n \n \n {EncodingName[track.encoding]}\n {formatTimeFromFrames(track.duration, false)}\n \n \n );\n}\n\ninterface GroupRowProps {\n group: Group;\n onRename: (event: React.MouseEvent, groupIdx: number) => void;\n onDelete: (event: React.MouseEvent, groupIdx: number) => void;\n}\n\nexport function GroupRow({ group, onRename, onDelete }: GroupRowProps) {\n const classes = useStyles();\n\n const handleDelete = useCallback((event: React.MouseEvent) => onDelete(event, group.index), [onDelete, group]);\n const handleRename = useCallback((event: React.MouseEvent) => onRename(event, group.index), [onRename, group]);\n return (\n \n \n \n \n \n \n \n \n \n {group.fullWidthTitle ? `${group.fullWidthTitle} / ` : ``}\n {group.title || `No Name`}\n \n \n \n {formatTimeFromFrames(\n group.tracks.map(n => n.duration).reduce((a, b) => a + b),\n false\n )}\n \n \n \n );\n}\n","import React from 'react';\nimport { WindowHeader, WindowContent, TextField } from 'react95';\nimport { DialogOverlay, DialogFooter, DialogWindow, FooterButton } from './common';\n\nexport const W95RenameDialog = (props: {\n renameDialogVisible: boolean;\n renameDialogTitle: string;\n renameDialogIndex: number;\n what: string;\n handleCancelRename: () => void;\n handleDoRename: () => void;\n handleChange: (event: React.ChangeEvent) => void;\n}) => {\n if (!props.renameDialogVisible) {\n return null;\n }\n\n return (\n \n \n \n Rename {props.what}\n \n \n

{props.what} Name:

\n {\n event.key === `Enter` && props.handleDoRename();\n }}\n fullWidth\n />\n \n OK\n Cancel\n \n
\n
\n
\n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\nimport { actions as renameDialogActions } from '../redux/rename-dialog-feature';\nimport { renameTrack, renameDisc, renameGroup } from '../redux/actions';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95RenameDialog } from './win95/rename-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nconst useStyles = makeStyles(theme => ({\n marginUpDown: {\n marginTop: theme.spacing(3),\n marginBottom: theme.spacing(3),\n },\n}));\n\nexport const RenameDialog = (props: {}) => {\n let dispatch = useDispatch();\n let classes = useStyles();\n\n let renameDialogVisible = useShallowEqualSelector(state => state.renameDialog.visible);\n let renameDialogTitle = useShallowEqualSelector(state => state.renameDialog.title);\n let renameDialogFullWidthTitle = useShallowEqualSelector(state => state.renameDialog.fullWidthTitle);\n let renameDialogIndex = useShallowEqualSelector(state => state.renameDialog.index);\n let renameDialogGroupIndex = useShallowEqualSelector(state => state.renameDialog.groupIndex);\n let allowFullWidth = useShallowEqualSelector(state => state.appState.fullWidthSupport);\n\n const what = renameDialogGroupIndex !== null ? `Group` : renameDialogIndex < 0 ? `Disc` : `Track`;\n\n const handleCancelRename = useCallback(() => {\n dispatch(renameDialogActions.setVisible(false));\n }, [dispatch]);\n\n const handleDoRename = useCallback(() => {\n if (renameDialogGroupIndex !== null) {\n // Just rename the group with this range\n dispatch(\n renameGroup({\n newName: renameDialogTitle,\n newFullWidthName: renameDialogFullWidthTitle,\n groupIndex: renameDialogGroupIndex,\n })\n );\n } else if (renameDialogIndex < 0) {\n dispatch(\n renameDisc({\n newName: renameDialogTitle,\n newFullWidthName: renameDialogFullWidthTitle,\n })\n );\n } else {\n dispatch(\n renameTrack({\n index: renameDialogIndex,\n newName: renameDialogTitle,\n newFullWidthName: renameDialogFullWidthTitle,\n })\n );\n }\n handleCancelRename(); // Close the dialog\n }, [dispatch, handleCancelRename, renameDialogFullWidthTitle, renameDialogGroupIndex, renameDialogIndex, renameDialogTitle]);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent) => {\n dispatch(renameDialogActions.setCurrentName(event.target.value.substring(0, 120))); // MAX title length\n },\n [dispatch]\n );\n\n const handleFullWidthChange = useCallback(\n (event: React.ChangeEvent) => {\n dispatch(renameDialogActions.setCurrentFullWidthName(event.target.value.substring(0, 105)));\n },\n [dispatch]\n );\n\n const handleEnterKeyEvent = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === `Enter`) {\n event.stopPropagation();\n event.preventDefault();\n handleDoRename();\n }\n },\n [handleDoRename]\n );\n\n const { vintageMode } = useShallowEqualSelector(state => state.appState);\n if (vintageMode) {\n const p = {\n renameDialogVisible,\n renameDialogTitle,\n renameDialogIndex,\n what,\n handleCancelRename,\n handleDoRename,\n handleChange,\n };\n return ;\n }\n\n return (\n \n Rename {what}\n \n \n {allowFullWidth && (\n \n )}\n \n \n \n \n \n \n );\n};\n","import React from 'react';\nimport { WindowHeader, Button, Progress, Checkbox } from 'react95';\nimport { DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent } from './common';\n\nexport const W95UploadDialog = (props: {\n visible: boolean;\n cancelled: boolean;\n writtenProgress: number;\n encryptedProgress: number;\n totalProgress: number;\n trackTotal: number;\n trackCurrent: number;\n trackConverting: number;\n titleCurrent: string;\n titleConverting: string;\n handleCancelUpload: () => void;\n progressValue: number;\n bufferValue: number;\n convertedValue: number;\n notifyWhenFinished: boolean;\n hasNotificationSupport: boolean;\n handleNotifyWhenFinishedChanged: () => void;\n}) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n \n \n \n Recording...\n \n \n
\n {props.convertedValue === 100 && props.trackConverting === props.trackTotal\n ? `Conversion completed`\n : `Converting ${props.trackConverting + 1} of ${props.trackTotal}: ${props.titleConverting}`}\n
\n \n\n
\n Uploading {props.trackCurrent} of {props.trackTotal}: {props.titleCurrent}\n
\n \n\n \n {props.hasNotificationSupport ? (\n \n ) : null}\n
\n \n
\n
\n
\n
\n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { actions as uploadDialogActions } from '../redux/upload-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Box from '@material-ui/core/Box';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { Button } from '@material-ui/core';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport { W95UploadDialog } from './win95/upload-dialog';\nimport { setNotifyWhenFinished } from '../redux/actions';\n\nconst useStyles = makeStyles(theme => ({\n progressPerc: {\n marginTop: theme.spacing(1),\n },\n progressBar: {\n marginTop: theme.spacing(3),\n },\n uploadLabel: {\n marginTop: theme.spacing(3),\n },\n spacer: {\n flex: '1 1 auto',\n },\n checkBox: {\n marginLeft: 0,\n },\n}));\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const UploadDialog = (props: {}) => {\n const classes = useStyles();\n const dispatch = useDispatch();\n\n let {\n visible,\n cancelled,\n writtenProgress,\n encryptedProgress,\n totalProgress,\n\n trackTotal,\n trackCurrent,\n trackConverting,\n titleCurrent,\n titleConverting,\n } = useShallowEqualSelector(state => state.uploadDialog);\n const { vintageMode, notifyWhenFinished, hasNotificationSupport } = useShallowEqualSelector(state => state.appState);\n\n const handleCancelUpload = useCallback(() => {\n dispatch(uploadDialogActions.setCancelUpload(true));\n }, [dispatch]);\n\n const handleNotifyWhenFinishedChanged = useCallback(() => {\n dispatch(setNotifyWhenFinished(!notifyWhenFinished));\n }, [dispatch, notifyWhenFinished]);\n\n let progressValue = Math.floor((writtenProgress / totalProgress) * 100);\n let bufferValue = Math.floor((encryptedProgress / totalProgress) * 100);\n let convertedValue = Math.floor((trackConverting / trackTotal) * 100);\n\n if (vintageMode) {\n const p = {\n visible,\n cancelled,\n writtenProgress,\n encryptedProgress,\n totalProgress,\n\n trackTotal,\n trackCurrent,\n trackConverting,\n titleCurrent,\n titleConverting,\n\n handleCancelUpload,\n progressValue,\n bufferValue,\n convertedValue,\n notifyWhenFinished,\n hasNotificationSupport,\n handleNotifyWhenFinishedChanged,\n };\n return ;\n }\n return (\n \n Recording...\n \n \n {convertedValue === 100 && trackConverting === trackTotal\n ? `Conversion completed`\n : `Converting ${trackConverting + 1} of ${trackTotal}: ${titleConverting}`}\n \n \n {convertedValue}%\n\n \n Uploading {trackCurrent} of {trackTotal}: {titleCurrent}\n \n \n {progressValue}%\n \n \n {hasNotificationSupport ? (\n }\n label=\"Notify when completed\"\n />\n ) : null}\n
\n \n
\n \n );\n};\n","import React from 'react';\nimport { WindowHeader, Progress } from 'react95';\nimport { DialogOverlay, DialogWindow, DialogWindowContent } from './common';\n\nexport const W95RecordDialog = (props: {\n visible: boolean;\n trackTotal: number;\n trackDone: number;\n trackCurrent: number;\n titleCurrent: string;\n progressValue: number;\n}) => {\n if (!props.visible) {\n return null;\n }\n return (\n \n \n \n Recording...\n \n \n

{`Recording track ${props.trackDone + 1} of ${props.trackTotal}: ${\n props.titleCurrent\n }`}

\n \n
\n
\n
\n );\n};\n","import React from 'react';\nimport { useShallowEqualSelector } from '../utils';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Box from '@material-ui/core/Box';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95RecordDialog } from './win95/record-dialog';\n\nconst useStyles = makeStyles(theme => ({\n progressPerc: {\n marginTop: theme.spacing(1),\n },\n progressBar: {\n marginTop: theme.spacing(3),\n },\n}));\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const RecordDialog = (props: {}) => {\n const classes = useStyles();\n\n let { visible, trackTotal, trackDone, trackCurrent, titleCurrent } = useShallowEqualSelector(state => state.recordDialog);\n\n let progressValue = Math.round(trackCurrent);\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n if (vintageMode) {\n const p = {\n visible,\n trackTotal,\n trackDone,\n trackCurrent,\n titleCurrent,\n progressValue,\n };\n return ;\n }\n\n return (\n \n Recording...\n \n \n {`Recording track ${trackDone + 1} of ${trackTotal}: ${titleCurrent}`}\n \n = 0 ? 'determinate' : 'indeterminate'}\n color=\"primary\"\n value={progressValue}\n />\n {progressValue >= 0 ? `${progressValue}%` : ``}\n \n \n \n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { actions as errorDialogActions } from '../redux/error-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { TransitionProps } from '@material-ui/core/transitions';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const ErrorDialog = (props: {}) => {\n const dispatch = useDispatch();\n\n let { visible, error } = useShallowEqualSelector(state => state.errorDialog);\n\n const handleClose = useCallback(() => {\n dispatch(errorDialogActions.setVisible(false));\n }, [dispatch]);\n\n return (\n \n Error\n \n {error}\n \n \n \n \n \n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\nimport { actions as panicDialogActions } from '../redux/panic-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { Typography } from '@material-ui/core';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const PanicDialog = (props: {}) => {\n const dispatch = useDispatch();\n\n let { visible, dismissed } = useShallowEqualSelector(state => state.panicDialog);\n\n const handleReloadApp = useCallback(() => {\n window.location.reload();\n }, []);\n\n const handleIgnore = useCallback(() => {\n dispatch(panicDialogActions.dismiss());\n }, [dispatch]);\n\n return (\n \n Oops… Something unexpected happened.\n \n \n Try to restart the app. If the error persists, try the followings:\n
    \n
  1. Use your browser in incognito mode.
  2. \n
  3. Use a blank MiniDisc.
  4. \n
  5. Try to use Web MiniDisc on another computer.
  6. \n
\n If this does not solve the error, your unit might not be supported yet or you have encountered a bug. The full error is\n reported in the JS console.\n
\n
\n \n \n \n \n \n );\n};\n","import React, { useCallback, useContext } from 'react';\nimport { Button, WindowHeader, Fieldset, Select, Table, TableBody, TableDataCell, Divider, Toolbar } from 'react95';\nimport { DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent, WindowCloseIcon, FooterButton, CustomTableRow } from './common';\nimport { TitleFormatType, UploadFormat } from '../../redux/convert-dialog-feature';\nimport { DropzoneInputProps, DropzoneRootProps } from 'react-dropzone';\nimport { ThemeContext } from 'styled-components';\nimport ArrowUpIconUrl from '../../images/win95/arrowup.png';\nimport ArrowDownIconUrl from '../../images/win95/arrowdown.png';\nimport DeleteIconUrl from '../../images/win95/delete.png';\n\nconst trackTitleOptions = [\n { value: 'filename', label: 'Filename' },\n { value: 'title', label: 'Title' },\n { value: 'album-title', label: 'Album - Title' },\n { value: 'artist-title', label: 'Artist - Title' },\n { value: 'title-artist', label: 'Title - Artist' },\n { value: 'artist-album-title', label: 'Artist - Album - Title' },\n];\n\nconst recordModeOptions = [\n { value: 'SP', label: 'SP' },\n { value: 'LP2', label: 'LP2' },\n { value: 'LP4', label: 'LP4' },\n];\n\nexport const W95ConvertDialog = (props: {\n visible: boolean;\n format: UploadFormat;\n titleFormat: TitleFormatType;\n files: File[];\n setFiles: React.Dispatch>;\n selectedTrackIndex: number;\n setSelectedTrack: React.Dispatch>;\n moveFileUp: () => void;\n moveFileDown: () => void;\n handleClose: () => void;\n handleChangeFormat: (ev: any, newFormat: any) => void;\n handleChangeTitleFormat: (\n event: React.ChangeEvent<{\n value: any;\n }>\n ) => void;\n handleConvert: () => void;\n tracksOrderVisible: boolean;\n setTracksOrderVisible: React.Dispatch>;\n handleToggleTracksOrder: () => void;\n selectedTrackRef: React.MutableRefObject;\n getRootProps: (props?: DropzoneRootProps | undefined) => DropzoneRootProps;\n getInputProps: (props?: DropzoneInputProps | undefined) => DropzoneInputProps;\n isDragActive: boolean;\n open: () => void;\n disableRemove: boolean;\n handleRemoveSelectedTrack: () => void;\n dialogVisible: boolean;\n}) => {\n const themeContext = useContext(ThemeContext);\n\n const renderTracks = useCallback(() => {\n return props.files.map((file, i) => {\n const isSelected = props.selectedTrackIndex === i;\n const ref = isSelected ? props.selectedTrackRef : null;\n return (\n props.setSelectedTrack(i)}\n ref={ref}\n style={isSelected ? themeContext.selectedTableRow : {}}\n >\n {file.name}\n \n );\n });\n }, [props, themeContext]);\n\n if (!props.dialogVisible) {\n return null;\n }\n\n return (\n \n \n \n Upload Settings\n \n \n \n
\n
\n props.handleChangeFormat(ev, format.value)}\n />\n
\n
\n \n
\n
\n {props.tracksOrderVisible ? (\n
\n \n \n \n \n
\n \n \n
\n
\n \n {renderTracks()}\n
\n
\n \n
\n ) : null}\n\n \n \n
\n OK\n Cancel\n
\n
\n
\n
\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { belowDesktop, useShallowEqualSelector } from '../utils';\n\nimport { actions as convertDialogActions } from '../redux/convert-dialog-feature';\nimport { convertAndUpload } from '../redux/actions';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport FormControl from '@material-ui/core/FormControl';\nimport ToggleButton from '@material-ui/lab/ToggleButton';\nimport ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { Typography } from '@material-ui/core';\nimport Select from '@material-ui/core/Select';\nimport Input from '@material-ui/core/Input';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport AddIcon from '@material-ui/icons/Add';\nimport RemoveIcon from '@material-ui/icons/Remove';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport IconButton from '@material-ui/core/IconButton';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport { lighten } from '@material-ui/core/styles';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport Radio from '@material-ui/core/Radio';\nimport { useDropzone } from 'react-dropzone';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport { W95ConvertDialog } from './win95/convert-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flexDirection: 'row',\n },\n formControl: {\n minWidth: 60,\n },\n toggleButton: {\n minWidth: 40,\n },\n dialogContent: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'stretch',\n },\n formatAndTitle: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n },\n rightBlock: {\n display: 'flex',\n flexDirection: 'column',\n },\n titleFormControl: {\n minWidth: 170,\n marginTop: 4,\n [belowDesktop(theme)]: {\n width: 114,\n minWidth: 0,\n },\n },\n spacer: {\n display: 'flex',\n flex: '1 1 auto',\n },\n showTracksOrderBtn: {\n marginLeft: theme.spacing(1),\n },\n tracksOrderAccordion: {\n '&:before': {\n opacity: 0,\n },\n },\n tracksOrderAccordionDetail: {\n maxHeight: '40vh',\n overflow: 'auto',\n },\n toolbarHighlight:\n theme.palette.type === 'light'\n ? {\n color: theme.palette.secondary.main,\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\n }\n : {\n color: theme.palette.text.primary,\n backgroundColor: theme.palette.secondary.dark,\n },\n trackList: {\n flex: '1 1 auto',\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff',\n },\n}));\n\nexport const ConvertDialog = (props: { files: File[] }) => {\n const dispatch = useDispatch();\n const classes = useStyles();\n\n let { visible, format, titleFormat } = useShallowEqualSelector(state => state.convertDialog);\n\n // Track reodering\n const [files, setFiles] = useState(props.files);\n const [selectedTrackIndex, setSelectedTrack] = useState(-1);\n\n const moveFile = useCallback(\n (offset: number) => {\n const targetIndex = selectedTrackIndex + offset;\n if (targetIndex >= files.length || targetIndex < 0) {\n return; // This should not be allowed by the UI\n }\n\n const newFileArray = files.slice();\n\n // Swap trakcs\n let tmp = newFileArray[selectedTrackIndex];\n newFileArray[selectedTrackIndex] = newFileArray[targetIndex];\n newFileArray[targetIndex] = tmp;\n\n setFiles(newFileArray);\n setSelectedTrack(targetIndex);\n },\n [files, selectedTrackIndex]\n );\n\n const moveFileUp = useCallback(() => {\n moveFile(-1);\n }, [moveFile]);\n\n const moveFileDown = useCallback(() => {\n moveFile(1);\n }, [moveFile]);\n\n const handleClose = useCallback(() => {\n dispatch(convertDialogActions.setVisible(false));\n }, [dispatch]);\n\n const handleChangeFormat = useCallback(\n (ev, newFormat) => {\n if (newFormat === null) {\n return;\n }\n dispatch(convertDialogActions.setFormat(newFormat));\n },\n [dispatch]\n );\n\n const handleChangeTitleFormat = useCallback(\n (event: React.ChangeEvent<{ value: any }>) => {\n dispatch(convertDialogActions.setTitleFormat(event.target.value));\n },\n [dispatch]\n );\n\n const handleConvert = useCallback(() => {\n handleClose();\n dispatch(convertAndUpload(files, format, titleFormat));\n }, [dispatch, files, format, titleFormat, handleClose]);\n\n const [tracksOrderVisible, setTracksOrderVisible] = useState(false);\n const handleToggleTracksOrder = useCallback(() => {\n setTracksOrderVisible(!tracksOrderVisible);\n }, [tracksOrderVisible, setTracksOrderVisible]);\n\n // Dialog init on new files\n useEffect(() => {\n const newFiles = Array.from(props.files);\n setFiles(newFiles);\n setSelectedTrack(-1);\n setTracksOrderVisible(false);\n }, [props.files, setSelectedTrack, setTracksOrderVisible]);\n\n // scroll selected track into view\n const selectedTrackRef = useRef(null);\n useEffect(() => {\n selectedTrackRef.current?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, [selectedTrackRef, selectedTrackIndex]);\n\n const renderTracks = useCallback(() => {\n return files.map((file, i) => {\n const isSelected = selectedTrackIndex === i;\n const ref = isSelected ? selectedTrackRef : null;\n return (\n setSelectedTrack(i)} ref={ref} button>\n \n \n \n \n \n );\n });\n }, [files, selectedTrackIndex, setSelectedTrack, selectedTrackRef]);\n\n // Add/Remove tracks\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: File[]) => {\n const newFileArray = files.slice().concat(acceptedFiles);\n setFiles(newFileArray);\n },\n [files, setFiles]\n );\n const { getRootProps, getInputProps, isDragActive, open } = useDropzone({\n onDrop,\n accept: [`audio/*`, `video/mp4`],\n noClick: true,\n });\n const disableRemove = selectedTrackIndex < 0 || selectedTrackIndex >= files.length;\n const handleRemoveSelectedTrack = useCallback(() => {\n const newFileArray = files.filter((f, i) => i !== selectedTrackIndex);\n setFiles(newFileArray);\n if (selectedTrackIndex >= newFileArray.length) {\n setSelectedTrack(newFileArray.length - 1);\n }\n }, [selectedTrackIndex, files, setFiles]);\n\n const dialogVisible = useShallowEqualSelector(state => state.convertDialog.visible);\n useEffect(() => {\n if (dialogVisible && files.length === 0) {\n handleClose();\n }\n }, [files, dialogVisible, handleClose]);\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n if (vintageMode) {\n const p = {\n visible,\n format,\n titleFormat,\n\n files,\n setFiles,\n selectedTrackIndex,\n setSelectedTrack,\n\n moveFileUp,\n moveFileDown,\n\n handleClose,\n handleChangeFormat,\n handleChangeTitleFormat,\n handleConvert,\n\n tracksOrderVisible,\n setTracksOrderVisible,\n handleToggleTracksOrder,\n selectedTrackRef,\n\n getRootProps,\n getInputProps,\n isDragActive,\n open,\n\n disableRemove,\n handleRemoveSelectedTrack,\n dialogVisible,\n };\n return ;\n }\n\n return (\n \n Upload Settings\n \n
\n \n \n Recording Mode\n \n \n \n SP\n \n \n LP2\n \n \n LP4\n \n \n \n
\n \n \n Track title\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 {renderTracks()}\n \n \n \n Drop your Music to add it to the queue\n \n \n
\n
\n
\n \n \n
\n \n \n
\n \n );\n};\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M53.259 20.337c6.582-5.574 6.582-5.574 14.753-12.436C62.599 6.72 56.322 6 49.946 6c-6.485 0-12.82.747-18.303 1.966 6.675 5.894 7.084 6.191 14.006 12.252 3.48-.293 3.97-.293 7.61.12zM36.927 24.504c.992-1.544 2.25-2.448 5.124-3.474-5.486-4.744-7.34-6.324-14.003-12.173-11.485 3.264-19.33 9.02-20.049 15.647h28.928zM61.159 24.504c14.02 0 20.615 0 30.732-.004-.789-6.629-8.72-12.468-20.269-15.706-2.061 1.766-11.14 9.316-14.827 12.484 1.793.813 3.226 1.35 4.364 3.226zM40.996 30.602c-2.045-.884-3.476-1.935-4.042-3.102-1.056 0-26.431 0-28.782.039C9.53 33.6 16.924 38.847 27.455 41.964c4.236-3.528 8.255-6.948 13.541-11.362zM49.946 45c6.284 0 12.247-.64 17.6-1.79-4.721-4.135-7.729-6.721-13.454-11.689-3.681.692-6.213.59-9.6.068-4.888 4.125-10.974 9.218-13.473 11.324C36.707 44.248 43.137 45 49.946 45zM57.47 30.45c4.38 3.707 9.262 8.068 13.687 11.884 11.265-3.066 19.178-8.5 20.57-14.83H61.18c-.667.999-1.516 1.917-3.71 2.946z\"\n}));\n\nconst SvgMd0 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd0, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md0.a7574f83.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M36.927 24.504c.992-1.544 2.25-2.448 5.124-3.474-5.486-4.744-7.34-6.324-14.003-12.173-11.485 3.264-19.33 9.02-20.049 15.647h28.928zM57.47 30.45c4.38 3.707 9.262 8.068 13.687 11.884 11.265-3.066 19.178-8.5 20.57-14.83H61.18c-.667.999-1.516 1.917-3.71 2.946z\"\n}));\n\nconst SvgMd1 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd1, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md1.1ffb5f6c.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M53.259 20.337c6.582-5.574 6.582-5.574 14.753-12.436C62.599 6.72 56.322 6 49.946 6c-6.485 0-12.82.747-18.303 1.966 6.675 5.894 7.084 6.191 14.006 12.252 3.48-.293 3.97-.293 7.61.12zM49.946 45c6.284 0 12.247-.64 17.6-1.79-4.721-4.135-7.729-6.721-13.454-11.689-3.681.692-6.213.59-9.6.068-4.888 4.125-10.974 9.218-13.473 11.324C36.707 44.248 43.137 45 49.946 45z\"\n}));\n\nconst SvgMd2 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd2, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md2.33dd03b3.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M61.159 24.504c14.02 0 20.615 0 30.732-.004-.789-6.629-8.72-12.468-20.269-15.706-2.061 1.766-11.14 9.316-14.827 12.484 1.793.813 3.226 1.35 4.364 3.226zM40.996 30.602c-2.045-.884-3.476-1.935-4.042-3.102-1.056 0-26.431 0-28.782.039C9.53 33.6 16.924 38.847 27.455 41.964c4.236-3.528 8.255-6.948 13.541-11.362z\"\n}));\n\nconst SvgMd3 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd3, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md3.80f42826.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react';\nimport { Button, Panel } from 'react95';\nimport { belowDesktop } from '../../utils';\n\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport StopIcon from '@material-ui/icons/Stop';\nimport SkipNextIcon from '@material-ui/icons/SkipNext';\nimport SkipPreviousIcon from '@material-ui/icons/SkipPrevious';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flex: '1 1 auto',\n alignItems: 'center',\n [belowDesktop(theme)]: {\n flexWrap: 'wrap',\n },\n },\n lcd: {\n backgroundColor: 'black !important',\n flex: '1 1 auto',\n margin: '0 80px 0 0px',\n minWidth: 150,\n height: 48,\n color: 'white !important',\n fontFamily: 'LCDDot',\n },\n}));\n\nexport const W95Controls = (props: {\n handlePrev: () => void;\n handlePlay: () => void;\n handleStop: () => void;\n handlePause: () => void;\n handleNext: () => void;\n message: string;\n discPresent: boolean;\n classes: any;\n lcdScroll: number;\n lcdRef: React.RefObject;\n lcdScrollDuration: number;\n}) => {\n const classes = useStyles();\n return (\n
\n \n \n \n \n \n\n \n
\n 0\n ? {\n animationDuration: `${props.lcdScrollDuration}s`,\n transform: `translate(-${props.lcdScroll}%)`,\n top: 12,\n }\n : { top: 12 }\n }\n >\n {props.message}\n \n
\n
\n
\n );\n};\n","import React, { useCallback, useRef, useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport StopIcon from '@material-ui/icons/Stop';\nimport SkipNextIcon from '@material-ui/icons/SkipNext';\nimport SkipPreviousIcon from '@material-ui/icons/SkipPrevious';\nimport PauseIcon from '@material-ui/icons/Pause';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Box from '@material-ui/core/Box';\n\nimport { makeStyles } from '@material-ui/core';\nimport { belowDesktop, getSortedTracks, useShallowEqualSelector } from '../utils';\nimport { control } from '../redux/actions';\nimport { useDispatch } from 'react-redux';\n\nimport { ReactComponent as MDIcon0 } from '../images/md0.svg';\nimport { ReactComponent as MDIcon1 } from '../images/md1.svg';\nimport { ReactComponent as MDIcon2 } from '../images/md2.svg';\nimport { ReactComponent as MDIcon3 } from '../images/md3.svg';\nimport { W95Controls } from './win95/controls';\n\nconst frames = [MDIcon0, MDIcon1, MDIcon2, MDIcon3];\n\nconst useStyles = makeStyles(theme => ({\n '@keyframes scrollLeft': {\n from: {\n transform: `translateX(0%)`,\n },\n to: {},\n },\n '@keyframes blink': {\n '50%': {\n visibility: 'hidden',\n },\n },\n container: {\n display: 'flex',\n flex: '1 1 auto',\n [belowDesktop(theme)]: {\n flexWrap: 'wrap',\n },\n },\n lcd: {\n flex: '1 1 auto',\n position: 'relative',\n marginLeft: theme.spacing(1.5),\n marginRight: theme.spacing(1.5),\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n borderRadius: theme.spacing(3),\n backgroundColor: theme.palette.background.default,\n minWidth: 150,\n height: 48,\n [belowDesktop(theme)]: {\n marginLeft: 0,\n marginRight: theme.spacing(2),\n },\n },\n lcdText: {\n overflow: 'hidden',\n position: 'relative',\n width: 'calc(100% - 40px)',\n left: 40,\n height: '100%',\n fontFamily: 'LCDDot',\n },\n lcdDisc: {\n position: 'absolute',\n top: 0,\n left: 20,\n },\n lcdDiscIcon: {\n width: 28,\n height: 48,\n '& g': {\n fill: theme.palette.action.active,\n },\n },\n scrollingStatusMessage: {\n position: 'absolute',\n width: '100%',\n whiteSpace: 'nowrap',\n animationName: '$scrollLeft',\n animationTimingFunction: 'linear',\n animationIterationCount: '1',\n top: 15,\n left: 1,\n },\n statusMessage: {\n position: 'absolute',\n width: '100%',\n whiteSpace: 'nowrap',\n top: 15,\n left: 1,\n },\n lcdBlink: {\n animationName: '$blink',\n animationTimingFunction: 'step-end',\n animationDuration: '1s',\n animationIterationCount: 'infinite',\n },\n button: {\n // padding: 8,\n },\n}));\n\nexport const Controls = () => {\n const dispatch = useDispatch();\n // TODO: The shallow equality won't work for these 2 states\n const deviceStatus = useShallowEqualSelector(state => state.main.deviceStatus);\n const disc = useShallowEqualSelector(state => state.main.disc);\n\n const classes = useStyles();\n const handlePrev = useCallback(() => {\n dispatch(control('prev'));\n }, [dispatch]);\n const handlePlay = useCallback(() => {\n dispatch(control('play'));\n }, [dispatch]);\n const handleStop = useCallback(() => {\n dispatch(control('stop'));\n }, [dispatch]);\n const handleNext = useCallback(() => {\n dispatch(control('next'));\n }, [dispatch]);\n const handlePause = useCallback(() => {\n dispatch(control('pause'));\n }, [dispatch]);\n\n let message = ``;\n let trackIndex = deviceStatus?.track ?? null;\n let deviceState = deviceStatus?.state ?? null;\n let discPresent = deviceStatus?.discPresent ?? false;\n let paused = deviceStatus?.state === 'paused';\n const tracks = getSortedTracks(disc);\n if (!discPresent) {\n message = ``;\n } else if (deviceState === 'readingTOC') {\n message = 'READING TOC';\n } else if (tracks.length === 0) {\n message = `BLANKDISC`;\n } else if (deviceStatus && deviceStatus.track !== null && tracks[deviceStatus.track]) {\n let title = tracks[deviceStatus.track].fullWidthTitle || tracks[deviceStatus.track].title;\n message =\n (deviceStatus.track + 1).toString().padStart(3, '0') +\n (title ? ' - ' + title : '');\n }\n\n const [lcdScroll, setLcdScroll] = useState(0);\n const [lcdScrollDuration, setLcdScrollDuration] = useState(0);\n const [lcdIconFrame, setLcdIconFrame] = useState(0);\n\n // LCD Text scrolling\n const animationDelayInMS = 2000;\n const scrollTimerRef = useRef(null);\n const lcdRef = useRef(null);\n useEffect(() => {\n const updateLCDScroll = () => {\n const domEl = lcdRef.current;\n const textWidth = domEl?.scrollWidth ?? 0;\n const lcdWidth = domEl?.parentElement?.offsetWidth ?? 0;\n const scrollPerc = textWidth > lcdWidth ? (textWidth * 100) / lcdWidth : 0;\n const scrollDurationInSec = textWidth > lcdWidth ? textWidth / 20 : 0; // Compute duration to achieve constant speed\n setLcdScroll(scrollPerc);\n setLcdScrollDuration(scrollDurationInSec);\n if (scrollDurationInSec > 0) {\n scrollTimerRef.current = setTimeout(() => {\n setLcdScroll(0);\n }, scrollDurationInSec * 1000 + 500); // stop animation timer\n }\n };\n\n clearTimeout(scrollTimerRef.current);\n setLcdScroll(0);\n scrollTimerRef.current = setTimeout(() => {\n updateLCDScroll();\n }, animationDelayInMS); // start animation timer\n\n return () => {\n clearTimeout(scrollTimerRef.current); // clear all the timers on unmount\n };\n }, [trackIndex, deviceState, message]);\n\n // Disc animation\n const lcdIconAnimationTimer = useRef(null);\n useEffect(() => {\n clearInterval(lcdIconAnimationTimer.current);\n if (deviceState === 'playing' || deviceState === 'readingTOC') {\n lcdIconAnimationTimer.current = setInterval(() => {\n setLcdIconFrame(1 + (lcdIconFrame % (frames.length - 1)));\n }, 600);\n } else {\n setLcdIconFrame(0);\n }\n return () => {\n clearInterval(lcdIconAnimationTimer.current);\n };\n }, [deviceState, lcdIconFrame]);\n\n const DiscFrame = frames[lcdIconFrame];\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n if (vintageMode) {\n const p = {\n handlePrev,\n handlePlay,\n handleStop,\n handlePause,\n handleNext,\n\n message,\n discPresent,\n lcdScroll,\n lcdRef,\n lcdScrollDuration,\n\n classes,\n };\n return ;\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n 0\n ? { animationDuration: `${lcdScrollDuration}s`, transform: `translate(-${lcdScroll}%)` }\n : {}\n }\n >\n {message}\n \n
\n
\n {discPresent && }\n
\n
\n
\n );\n};\n","import React from 'react';\nimport { Button, WindowHeader, Fieldset, Select } from 'react95';\nimport { Controls } from '../controls';\nimport { DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent, WindowCloseIcon, FooterButton } from './common';\n\nexport const W95DumpDialog = (props: {\n handleClose: () => void;\n handleChange: (\n ev: React.ChangeEvent<{\n value: unknown;\n }>\n ) => void;\n handleStartTransfer: () => void;\n visible: boolean;\n devices: {\n deviceId: string;\n label: string;\n }[];\n inputDeviceId: string;\n}) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n \n \n \n Record Selected Tracks\n \n \n \n
\n

1. Connect your MD Player line-out to your PC audio line-in.

\n

2. Use the controls at the bottom right to play some tracks.

\n

3. Select the input source. You should hear the tracks playing on your PC.

\n

4. Adjust the input gain and the line-out volume of your device.

\n
\n ({ value: deviceId, label }))}\n onChange={props.handleChange}\n width={200}\n />\n
\n \n
\n \n
\n Cancel\n \n Start Record\n \n
\n
\n
\n
\n );\n};\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { recordTracks } from '../redux/actions';\nimport { actions as dumpDialogActions } from '../redux/dump-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport { Controls } from './controls';\nimport Box from '@material-ui/core/Box';\nimport serviceRegistry from '../services/registry';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95DumpDialog } from './win95/dump-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-end',\n justifyContent: 'space-between',\n marginRight: -theme.spacing(2),\n flexFlow: 'wrap',\n },\n formControl: {\n minWidth: 120,\n },\n selectEmpty: {\n marginTop: theme.spacing(2),\n },\n head: {\n textShadow: '0px 0px 12px rgba(150, 150, 150, 1)',\n fontSize: theme.typography.h2.fontSize,\n textAlign: 'center',\n marginBottom: theme.spacing(2),\n },\n}));\n\nexport const DumpDialog = ({ trackIndexes }: { trackIndexes: number[] }) => {\n const dispatch = useDispatch();\n const classes = useStyles();\n\n const [devices, setDevices] = useState<{ deviceId: string; label: string }[]>([]);\n const [inputDeviceId, setInputDeviceId] = useState('');\n\n let { visible } = useShallowEqualSelector(state => state.dumpDialog);\n\n const handleClose = useCallback(() => {\n setInputDeviceId('');\n serviceRegistry.mediaRecorderService?.stopTestInput();\n dispatch(dumpDialogActions.setVisible(false));\n }, [dispatch]);\n\n const handleChange = useCallback(\n (ev: React.ChangeEvent<{ value: unknown }>) => {\n const deviceId = ev.target.value as string;\n setInputDeviceId(deviceId);\n serviceRegistry.mediaRecorderService?.stopTestInput();\n serviceRegistry.mediaRecorderService?.playTestInput(deviceId);\n },\n [setInputDeviceId]\n );\n\n const handleStartTransfer = useCallback(() => {\n dispatch(recordTracks(trackIndexes, inputDeviceId));\n handleClose();\n }, [trackIndexes, inputDeviceId, dispatch, handleClose]);\n\n useEffect(() => {\n async function updateDeviceList() {\n await navigator.mediaDevices.getUserMedia({ audio: true });\n let devices = await navigator.mediaDevices.enumerateDevices();\n let inputDevices = devices\n .filter(device => device.kind === 'audioinput')\n .map(device => ({ deviceId: device.deviceId, label: device.label }));\n setDevices(inputDevices);\n }\n if (visible) {\n updateDeviceList();\n }\n }, [visible, setDevices]);\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n\n if (vintageMode) {\n const p = {\n handleClose,\n handleChange,\n handleStartTransfer,\n visible,\n devices,\n inputDeviceId,\n };\n return ;\n }\n\n return (\n \n Record Selected Tracks\n \n \n {`💻 ⬅ 💽`}\n \n \n 1. Connect your MD Player line-out to your PC audio line-in.\n \n \n 2. Use the controls at the bottom right to play some tracks.\n \n \n 3. Select the input source. You should hear the tracks playing on your PC.\n \n \n 4. Adjust the input gain and the line-out volume of your device.\n \n \n \n \n Input Source\n \n \n \n \n \n \n \n \n \n );\n};\n","import React, { useContext } from 'react';\nimport {\n Table,\n TableHead,\n TableRow,\n TableHeadCell,\n TableBody,\n TableDataCell,\n Divider,\n Toolbar,\n Bar,\n Button,\n WindowContent,\n Tooltip,\n List,\n ListItem,\n} from 'react95';\nimport { Disc, formatTimeFromFrames } from 'netmd-js';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { DropzoneRootProps, DropzoneInputProps } from 'react-dropzone';\nimport { ThemeContext } from 'styled-components';\nimport { Controls } from '../controls';\nimport { useShallowEqualSelector } from '../../utils';\n\nimport DeleteIconUrl from '../../images/win95/delete.png';\nimport MicIconUrl from '../../images/win95/mic.png';\nimport MoveIconUrl from '../../images/win95/move.png';\nimport RenameIconUrl from '../../images/win95/rename.png';\nimport DeviceIconUrl from '../../images/win95/device.png';\nimport { RenameDialog } from '../rename-dialog';\nimport { AboutDialog } from '../about-dialog';\n\nimport MDIconUrl from '../../images/win95/minidisc32.png';\nimport { FloatingButton, CustomTableRow } from './common';\nimport { ConvertDialog } from '../convert-dialog';\nimport { UploadDialog } from '../upload-dialog';\nimport { ErrorDialog } from '../error-dialog';\nimport { RecordDialog } from '../record-dialog';\nimport { DumpDialog } from '../dump-dialog';\nimport { PanicDialog } from '../panic-dialog';\n\nconst useStyles = makeStyles((theme: any) => ({\n container: {\n width: '100%',\n flex: '1 1 auto',\n display: 'flex',\n minHeight: 0,\n '& > div': {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n },\n },\n table: {\n height: '100%',\n width: '100%',\n display: 'flex !important',\n flexDirection: 'column',\n },\n windowContent: {\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 0,\n },\n controlsContainer: {\n width: '100%',\n marginTop: 16,\n },\n toolbarIcon: {\n marginRight: 4,\n },\n toolbarItem: {\n padding: '6px 10px',\n },\n}));\n\nexport const W95Main = (props: {\n disc: Disc | null;\n deviceName: string;\n selected: number[];\n setSelected: React.Dispatch>;\n selectedCount: number;\n tracks: {\n index: number;\n title: string;\n fullWidthTitle: string;\n group: string | null;\n duration: string;\n encoding: string;\n }[];\n uploadedFiles: File[];\n setUploadedFiles: React.Dispatch>;\n onDrop: (acceptedFiles: File[], rejectedFiles: File[]) => void;\n getRootProps: (props?: DropzoneRootProps | undefined) => DropzoneRootProps;\n getInputProps: (props?: DropzoneInputProps | undefined) => DropzoneInputProps;\n isDragActive: boolean;\n open: () => void;\n moveMenuAnchorEl: HTMLElement | null;\n setMoveMenuAnchorEl: React.Dispatch>;\n handleShowMoveMenu: (event: React.MouseEvent) => void;\n handleCloseMoveMenu: () => void;\n handleMoveSelectedTrack: (destIndex: number) => void;\n handleShowDumpDialog: () => void;\n handleDeleteSelected: (event: React.MouseEvent) => void;\n handleRenameActionClick: (event: React.MouseEvent) => void;\n handleRenameTrack: (event: React.MouseEvent, item: number) => void;\n handleSelectAllClick: (event: React.ChangeEvent) => void;\n handleSelectTrackClick: (event: React.MouseEvent, item: number) => void;\n}) => {\n const classes = useStyles();\n const themeContext = useContext(ThemeContext);\n const { mainView } = useShallowEqualSelector(state => state.appState);\n\n return (\n <>\n \n \n {props.selectedCount === 0 ? (\n <>\n \"device\"\n
\n {`${props.deviceName}: (` || `Loading...`}\n {props.disc?.fullWidthTitle && `${props.disc?.fullWidthTitle} / `}\n {props.disc?.title || `Untitled Disc`}\n {`)`}\n
\n \n \"minidisc\"\n {props.disc !== null ? (\n \n
{`${formatTimeFromFrames(\n props.disc.left,\n false\n )} left of ${formatTimeFromFrames(props.disc.total, false)} `}
\n \n ) : null}\n \n ) : null}\n\n {props.selectedCount > 0 ? (\n <>\n \n \n \n \n {!!props.moveMenuAnchorEl ? (\n \n {Array(props.tracks.length)\n .fill(null)\n .map((_, i) => {\n return (\n props.handleMoveSelectedTrack(i)}>\n {i + 1}\n \n );\n })}\n \n ) : null}\n \n ) : null}\n \n
\n \n \n
\n \n \n \n \n #\n Title\n Duration\n \n \n \n {props.tracks.map(track => (\n props.handleRenameTrack(event, track.index)}\n onClick={(event: React.MouseEvent) => props.handleSelectTrackClick(event, track.index)}\n >\n {track.index + 1}\n \n
\n {track.fullWidthTitle && `${track.fullWidthTitle} / `}\n {track.title || `No Title`}\n
\n
\n \n {track.encoding}\n  \n {track.duration}\n \n \n ))}\n
\n
\n
\n
{mainView === 'MAIN' ? : null}
\n
\n \n\n \n \n \n \n \n \n \n \n \n );\n};\n","import React, { useEffect, useCallback, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport clsx from 'clsx';\nimport { useDropzone } from 'react-dropzone';\nimport {\n DragDropContext,\n Draggable,\n DraggableProvided,\n DropResult,\n ResponderProvided,\n Droppable,\n DroppableProvided,\n DroppableStateSnapshot,\n} from 'react-beautiful-dnd';\nimport { listContent, deleteTracks, moveTrack, groupTracks, deleteGroup, dragDropTrack } from '../redux/actions';\nimport { actions as renameDialogActions } from '../redux/rename-dialog-feature';\nimport { actions as convertDialogActions } from '../redux/convert-dialog-feature';\nimport { actions as dumpDialogActions } from '../redux/dump-dialog-feature';\n\nimport { DeviceStatus, formatTimeFromFrames, Track } from 'netmd-js';\nimport { control } from '../redux/actions';\n\nimport { belowDesktop, forAnyDesktop, getGroupedTracks, getSortedTracks, isSequential, useShallowEqualSelector } from '../utils';\n\nimport { lighten, makeStyles } from '@material-ui/core/styles';\nimport { alpha } from '@material-ui/core/styles/colorManipulator';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Fab from '@material-ui/core/Fab';\nimport AddIcon from '@material-ui/icons/Add';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport CreateNewFolderIcon from '@material-ui/icons/CreateNewFolder';\n\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { batchActions } from 'redux-batched-actions';\n\nimport { GroupRow, TrackRow } from './main-rows';\nimport { RenameDialog } from './rename-dialog';\nimport { UploadDialog } from './upload-dialog';\nimport { RecordDialog } from './record-dialog';\nimport { ErrorDialog } from './error-dialog';\nimport { PanicDialog } from './panic-dialog';\nimport { ConvertDialog } from './convert-dialog';\nimport { AboutDialog } from './about-dialog';\nimport { DumpDialog } from './dump-dialog';\nimport { TopMenu } from './topmenu';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Button from '@material-ui/core/Button';\nimport { W95Main } from './win95/main';\nimport { useMemo } from 'react';\n\nconst useStyles = makeStyles(theme => ({\n add: {\n position: 'absolute',\n bottom: theme.spacing(3),\n right: theme.spacing(3),\n [belowDesktop(theme)]: {\n bottom: theme.spacing(2),\n },\n },\n main: {\n overflowY: 'auto',\n flex: '1 1 auto',\n marginBottom: theme.spacing(3),\n outline: 'none',\n marginLeft: theme.spacing(-1),\n marginRight: theme.spacing(-1),\n [forAnyDesktop(theme)]: {\n marginLeft: theme.spacing(-2),\n marginRight: theme.spacing(-2),\n },\n },\n toolbar: {\n marginTop: theme.spacing(3),\n marginLeft: theme.spacing(-2),\n marginRight: theme.spacing(-2),\n [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: {\n marginLeft: theme.spacing(-3),\n marginRight: theme.spacing(-3),\n },\n },\n toolbarLabel: {\n flex: '1 1 100%',\n },\n toolbarHighlight:\n theme.palette.type === 'light'\n ? {\n color: theme.palette.secondary.main,\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\n }\n : {\n color: theme.palette.text.primary,\n backgroundColor: theme.palette.secondary.dark,\n },\n headBox: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n spacing: {\n marginTop: theme.spacing(1),\n },\n indexCell: {\n whiteSpace: 'nowrap',\n paddingRight: 0,\n width: theme.spacing(4),\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff',\n },\n remainingTimeTooltip: {\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n },\n hoveringOverGroup: {\n backgroundColor: `${alpha(theme.palette.secondary.dark, 0.4)}`,\n },\n dragHandleEmpty: {\n width: 20,\n padding: `${theme.spacing(0.5)}px 0 0 0`,\n },\n}));\n\nfunction getTrackStatus(track: Track, deviceStatus: DeviceStatus | null): 'playing' | 'paused' | 'none' {\n if (!deviceStatus || track.index !== deviceStatus.track) {\n return 'none';\n }\n\n if (deviceStatus.state === 'playing') {\n return 'playing';\n } else if (deviceStatus.state === 'paused') {\n return 'paused';\n } else {\n return 'none';\n }\n}\n\nexport const Main = (props: {}) => {\n let dispatch = useDispatch();\n const disc = useShallowEqualSelector(state => state.main.disc);\n const deviceName = useShallowEqualSelector(state => state.main.deviceName);\n const deviceStatus = useShallowEqualSelector(state => state.main.deviceStatus);\n const { vintageMode } = useShallowEqualSelector(state => state.appState);\n\n const [selected, setSelected] = React.useState([]);\n const [uploadedFiles, setUploadedFiles] = React.useState([]);\n const [lastClicked, setLastClicked] = useState(-1);\n const [moveMenuAnchorEl, setMoveMenuAnchorEl] = React.useState(null);\n\n const handleShowMoveMenu = useCallback(\n (event: React.MouseEvent) => {\n setMoveMenuAnchorEl(event.currentTarget);\n },\n [setMoveMenuAnchorEl]\n );\n const handleCloseMoveMenu = useCallback(() => {\n setMoveMenuAnchorEl(null);\n }, [setMoveMenuAnchorEl]);\n\n const handleMoveSelectedTrack = useCallback(\n (destIndex: number) => {\n dispatch(moveTrack(selected[0], destIndex));\n handleCloseMoveMenu();\n },\n [dispatch, selected, handleCloseMoveMenu]\n );\n\n const handleDrop = useCallback(\n (result: DropResult, provided: ResponderProvided) => {\n if (!result.destination) return;\n let sourceList = parseInt(result.source.droppableId),\n sourceIndex = result.source.index,\n targetList = parseInt(result.destination.droppableId),\n targetIndex = result.destination.index;\n dispatch(dragDropTrack(sourceList, sourceIndex, targetList, targetIndex));\n },\n [dispatch]\n );\n\n const handleShowDumpDialog = useCallback(() => {\n dispatch(dumpDialogActions.setVisible(true));\n }, [dispatch]);\n\n useEffect(() => {\n dispatch(listContent());\n }, [dispatch]);\n\n useEffect(() => {\n setSelected([]); // Reset selection if disc changes\n }, [disc]);\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: File[]) => {\n setUploadedFiles(acceptedFiles);\n dispatch(convertDialogActions.setVisible(true));\n },\n [dispatch]\n );\n\n const { getRootProps, getInputProps, isDragActive, open } = useDropzone({\n onDrop,\n accept: [`audio/*`, `video/mp4`],\n noClick: true,\n });\n\n const classes = useStyles();\n const tracks = useMemo(() => getSortedTracks(disc), [disc]);\n const groupedTracks = useMemo(() => getGroupedTracks(disc), [disc]);\n\n // Action Handlers\n const handleSelectTrackClick = useCallback(\n (event: React.MouseEvent, item: number) => {\n if (event.shiftKey && selected.length && lastClicked !== -1) {\n let rangeBegin = Math.min(lastClicked + 1, item),\n rangeEnd = Math.max(lastClicked - 1, item);\n let copy = [...selected];\n for (let i = rangeBegin; i <= rangeEnd; i++) {\n let index = copy.indexOf(i);\n if (index === -1) copy.push(i);\n else copy.splice(index, 1);\n }\n if (!copy.includes(item)) copy.push(item);\n setSelected(copy);\n } else if (selected.includes(item)) {\n setSelected(selected.filter(i => i !== item));\n } else {\n setSelected([...selected, item]);\n }\n setLastClicked(item);\n },\n [selected, setSelected, lastClicked, setLastClicked]\n );\n\n const handleSelectAllClick = useCallback(\n (event: React.ChangeEvent) => {\n if (selected.length < tracks.length) {\n setSelected(tracks.map(t => t.index));\n } else {\n setSelected([]);\n }\n },\n [selected, tracks]\n );\n\n const handleRenameTrack = useCallback(\n (event: React.MouseEvent, index: number) => {\n let track = tracks.find(t => t.index === index);\n if (!track) {\n return;\n }\n\n dispatch(\n batchActions([\n renameDialogActions.setVisible(true),\n renameDialogActions.setGroupIndex(null),\n renameDialogActions.setCurrentName(track.title),\n renameDialogActions.setCurrentFullWidthName(track.fullWidthTitle),\n renameDialogActions.setIndex(track.index),\n ])\n );\n },\n [dispatch, tracks]\n );\n\n const handleRenameGroup = useCallback(\n (event: React.MouseEvent, index: number) => {\n let group = groupedTracks.find(g => g.index === index);\n if (!group) {\n return;\n }\n\n dispatch(\n batchActions([\n renameDialogActions.setVisible(true),\n renameDialogActions.setGroupIndex(index),\n renameDialogActions.setCurrentName(group.title ?? ''),\n renameDialogActions.setCurrentFullWidthName(group.fullWidthTitle ?? ''),\n renameDialogActions.setIndex(-1),\n ])\n );\n },\n [dispatch, groupedTracks]\n );\n\n const handleRenameActionClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.detail !== 1) return; //Event retriggering when hitting enter in the dialog\n handleRenameTrack(event, selected[0]);\n },\n [handleRenameTrack, selected]\n );\n\n const handleDeleteSelected = useCallback(\n (event: React.MouseEvent) => {\n dispatch(deleteTracks(selected));\n },\n [dispatch, selected]\n );\n\n const handleGroupTracks = useCallback(\n (event: React.MouseEvent) => {\n dispatch(groupTracks(selected));\n },\n [dispatch, selected]\n );\n\n const handleDeleteGroup = useCallback(\n (event: React.MouseEvent, index: number) => {\n dispatch(deleteGroup(index));\n },\n [dispatch]\n );\n\n const handleTogglePlayPauseTrack = useCallback(\n (event: React.MouseEvent, track: number) => {\n if (!deviceStatus) {\n return;\n }\n if (deviceStatus.track !== track) {\n dispatch(control('goto', track));\n if (deviceStatus.state !== 'playing') {\n dispatch(control('play'));\n }\n } else if (deviceStatus.state === 'playing') {\n dispatch(control('pause'));\n }\n },\n [dispatch, deviceStatus]\n );\n\n const canGroup = useMemo(() => {\n return (\n tracks.filter(n => n.group === null && selected.includes(n.index)).length === selected.length &&\n isSequential(selected.sort((a, b) => a - b))\n );\n }, [tracks, selected]);\n const selectedCount = selected.length;\n\n if (vintageMode) {\n const p = {\n disc,\n deviceName,\n\n selected,\n setSelected,\n selectedCount,\n\n tracks,\n uploadedFiles,\n setUploadedFiles,\n\n onDrop,\n getRootProps,\n getInputProps,\n isDragActive,\n open,\n\n moveMenuAnchorEl,\n setMoveMenuAnchorEl,\n\n handleShowMoveMenu,\n handleCloseMoveMenu,\n handleMoveSelectedTrack,\n handleShowDumpDialog,\n handleDeleteSelected,\n handleRenameActionClick,\n handleRenameTrack,\n handleSelectAllClick,\n handleSelectTrackClick,\n };\n return ;\n }\n\n return (\n \n \n \n {deviceName || `Loading...`}\n \n \n \n \n {disc !== null ? (\n \n {`${formatTimeFromFrames(disc.left, false)} left of ${formatTimeFromFrames(disc.total, false)} `}\n \n {`${formatTimeFromFrames(disc.left * 2, false)} left in LP2 Mode`}\n
\n {`${formatTimeFromFrames(disc.left * 4, false)} left in LP4 Mode`}\n
\n }\n arrow\n >\n SP Mode\n \n
\n ) : (\n `Loading...`\n )}\n \n 0,\n })}\n >\n {selectedCount > 0 ? (\n 0 && selectedCount < tracks.length}\n checked={selectedCount > 0}\n onChange={handleSelectAllClick}\n inputProps={{ 'aria-label': 'select all tracks' }}\n />\n ) : null}\n {selectedCount > 0 ? (\n \n {selectedCount} selected\n \n ) : (\n \n {disc?.fullWidthTitle && `${disc.fullWidthTitle} / `}\n {disc?.title || `Untitled Disc`}\n \n )}\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n \n \n \n \n \n \n \n #\n Title\n Duration\n \n \n \n \n {groupedTracks.map((group, index) => (\n \n \n
\n \n {(provided: DroppableProvided, snapshot: DroppableStateSnapshot) => (\n \n {group.title !== null && (\n \n )}\n {group.title === null && group.tracks.length === 0 && (\n \n )}\n {group.tracks.map((t, tidx) => (\n \n {(provided: DraggableProvided) => (\n \n )}\n \n ))}\n {provided.placeholder}\n \n )}\n \n
\n \n \n ))}\n \n \n \n {isDragActive ? (\n \n Drop your Music to Upload\n \n ) : null}\n
\n \n \n \n\n \n \n \n \n \n \n \n \n \n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { forAnyDesktop, forWideDesktop, useShallowEqualSelector } from '../../utils';\n\nimport { Welcome } from '../welcome';\nimport { Main } from '../main';\nimport { actions as appActions } from '../../redux/app-feature';\n\nimport { Window, WindowHeader, Button, Toolbar, Panel, Hourglass, styleReset, Anchor } from 'react95';\nimport { createGlobalStyle, ThemeProvider as StyledThemeProvider } from 'styled-components';\nimport original from 'react95/dist/themes/original';\nimport { TopMenu } from '../topmenu';\nimport { useDispatch } from 'react-redux';\n\nimport CDPlayerIconUrl from '../../images/win95/cdplayer.png';\nimport { WindowCloseIcon } from './common';\n\nconst GlobalStyles = createGlobalStyle`\n${styleReset}\nbody {\n font-family: 'ms_sans_serif';\n}\nimg {\n image-rendering: pixelated;\n}\n`;\n\nconst useStyles = makeStyles(theme => ({\n desktop: {\n width: '100%',\n height: '100%',\n backgroundColor: 'teal',\n display: 'flex',\n justifyContent: 'center',\n },\n window: {\n display: 'flex !important', // This is needed to override the styledComponent prop :(\n flexDirection: 'column',\n width: 'auto',\n height: '100%',\n [forAnyDesktop(theme)]: {\n width: 600,\n marginLeft: 'auto',\n marginRight: 'auto',\n height: 600,\n marginTop: theme.spacing(2),\n },\n [forWideDesktop(theme)]: {\n width: 700,\n height: 700,\n marginTop: theme.spacing(2),\n },\n },\n loading: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n}));\n\nexport const W95App = () => {\n const classes = useStyles();\n const dispatch = useDispatch();\n const { mainView, loading } = useShallowEqualSelector(state => state.appState);\n const [isMenuOpen, setMenuOpen] = useState(false);\n\n const handleExit = useCallback(() => {\n dispatch(appActions.setMainView('WELCOME'));\n }, [dispatch]);\n\n const closeMenu = useCallback(() => {\n setMenuOpen(false);\n }, [setMenuOpen]);\n\n const toggleMenu = useCallback(() => {\n setMenuOpen(!isMenuOpen);\n }, [isMenuOpen, setMenuOpen]);\n\n const handleHelpClick = useCallback(() => {\n window.open('https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ', '_blank');\n }, []);\n\n const currentTheme = original;\n const theme = {\n ...currentTheme,\n selectedTableRow: {\n background: currentTheme.hoverBackground,\n color: currentTheme.canvasTextInvert,\n },\n };\n\n return (\n
\n \n \n \n \n \"CD\n Web MiniDisc\n {mainView === 'MAIN' ? (\n \n ) : null}\n \n \n \n \n {isMenuOpen ? : null}\n \n <>\n {mainView === 'WELCOME' ? : null}\n {mainView === 'MAIN' ?
: null}\n \n \n  \n {' (c) '}\n \n Stefano Brilli\n {' '}\n {new Date().getFullYear()}\n {'.'}\n \n {loading ? (\n
\n \n
\n ) : null}\n \n \n
\n );\n};\n","import React from 'react';\nimport { belowDesktop, forAnyDesktop, forWideDesktop, useShallowEqualSelector } from '../utils';\n\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport { makeStyles, createTheme, ThemeProvider } from '@material-ui/core/styles';\n\nimport { Welcome } from './welcome';\nimport { Main } from './main';\nimport { Controls } from './controls';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport Link from '@material-ui/core/Link';\nimport Box from '@material-ui/core/Box';\nimport { W95App } from './win95/app';\n\nconst useStyles = makeStyles(theme => ({\n layout: {\n width: 'auto',\n height: '100%',\n [forAnyDesktop(theme)]: {\n width: 600,\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n [forWideDesktop(theme)]: {\n width: 700,\n },\n },\n\n paper: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(2),\n height: 'calc(100% - 20px)',\n [forAnyDesktop(theme)]: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(1),\n padding: theme.spacing(3),\n height: 600,\n },\n [forWideDesktop(theme)]: {\n height: 700,\n },\n },\n bottomBar: {\n display: 'flex',\n alignItems: 'center',\n [belowDesktop(theme)]: {\n flexWrap: 'wrap',\n },\n marginLeft: -theme.spacing(2),\n },\n copyrightTypography: {\n textAlign: 'center',\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff',\n },\n minidiscLogo: {\n width: 48,\n },\n controlsContainer: {\n flex: '0 0 auto',\n width: '100%',\n paddingRight: theme.spacing(8),\n [belowDesktop(theme)]: {\n paddingLeft: 0,\n },\n },\n}));\n\nconst darkTheme = createTheme({\n palette: {\n type: 'dark',\n primary: {\n light: '#6ec6ff',\n main: '#2196f3',\n dark: '#0069c0',\n contrastText: '#fff',\n },\n },\n});\n\nconst lightTheme = createTheme({\n palette: {\n type: 'light',\n },\n});\n\nconst App = () => {\n const classes = useStyles();\n const { mainView, loading, darkMode, vintageMode } = useShallowEqualSelector(state => state.appState);\n\n if (vintageMode) {\n return ;\n }\n\n return (\n \n \n \n\n
\n \n {mainView === 'WELCOME' ? : null}\n {mainView === 'MAIN' ?
: null}\n\n {mainView === 'MAIN' ? : null}\n \n \n {'© '}\n \n Stefano Brilli\n {' '}\n {new Date().getFullYear()}\n {'.'}\n \n
\n\n {loading ? (\n \n \n \n ) : null}\n \n \n );\n};\n\nexport default App;\n","/* eslint no-restricted-globals: 0 */\nimport { getPublicPathFor } from '../utils';\nexport class AtracdencProcess {\n private messageCallback?: (ev: MessageEvent) => void;\n\n constructor(public worker: Worker) {\n worker.onmessage = this.handleMessage.bind(this);\n }\n\n async init() {\n await new Promise(resolve => {\n this.messageCallback = resolve;\n this.worker.postMessage({ action: 'init' });\n });\n }\n\n async encode(data: ArrayBuffer, bitrate: string) {\n let eventData = await new Promise(resolve => {\n this.messageCallback = resolve;\n this.worker.postMessage({ action: 'encode', bitrate, data }, [data]);\n });\n return eventData.data.result as Uint8Array;\n }\n\n terminate() {\n this.worker.terminate();\n }\n\n handleMessage(ev: MessageEvent) {\n this.messageCallback!(ev);\n this.messageCallback = undefined;\n }\n}\n\nif (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n // Worker\n let Module: any;\n onmessage = async (ev: MessageEvent) => {\n const { action, ...others } = ev.data;\n if (action === 'init') {\n self.importScripts(getPublicPathFor(`atracdenc.js`));\n (self as any).Module().then((m: any) => {\n Module = m;\n self.postMessage({ action: 'init' });\n Module.setLogger && Module.setLogger((msg: string, stream: string) => console.log(`${stream}: ${msg}`));\n });\n } else if (action === 'encode') {\n const { bitrate, data } = others;\n const inWavFile = `inWavFile.wav`;\n const outAt3File = `outAt3File.aea`;\n const dataArray = new Uint8Array(data);\n Module.FS.writeFile(`${inWavFile}`, dataArray);\n Module.callMain([`-e`, `atrac3`, `-i`, inWavFile, `-o`, outAt3File, `--bitrate`, bitrate]);\n\n // Read file and trim header (96 bytes)\n let fileStat = Module.FS.stat(outAt3File);\n let size = fileStat.size;\n let tmp = new Uint8Array(size - 96);\n let outAt3FileStream = Module.FS.open(outAt3File, 'r');\n Module.FS.read(outAt3FileStream, tmp, 0, tmp.length, 96);\n Module.FS.close(outAt3FileStream);\n\n let result = tmp.buffer;\n\n self.postMessage(\n {\n action: 'encode',\n result,\n },\n [result]\n );\n }\n };\n} else {\n // Main\n}\n","import { createWorker, setLogging } from '@ffmpeg/ffmpeg';\nimport { AtracdencProcess } from './atracdenc-worker';\nimport { getPublicPathFor } from '../utils';\nconst AtracdencWorker = require('worker-loader!./atracdenc-worker'); // eslint-disable-line import/no-webpack-loader-syntax\n\ninterface LogPayload {\n message: string;\n action: string;\n}\n\nexport interface AudioExportService {\n init(): Promise;\n export(params: { format: string }): Promise;\n info(): Promise<{ format: string | null; input: string | null }>;\n prepare(file: File): Promise;\n}\n\nexport class FFMpegAudioExportService implements AudioExportService {\n public ffmpegProcess: any;\n public atracdencProcess?: AtracdencProcess;\n public loglines: { action: string; message: string }[] = [];\n public inFileName: string = ``;\n public outFileNameNoExt: string = ``;\n\n async init() {\n setLogging(true);\n }\n\n async prepare(file: File) {\n this.loglines = [];\n this.ffmpegProcess = createWorker({\n logger: (payload: LogPayload) => {\n this.loglines.push(payload);\n console.log(payload.action, payload.message);\n },\n corePath: getPublicPathFor('ffmpeg-core.js'),\n workerPath: getPublicPathFor('worker.min.js'),\n });\n await this.ffmpegProcess.load();\n\n this.atracdencProcess = new AtracdencProcess(new AtracdencWorker());\n await this.atracdencProcess.init();\n\n let ext = file.name.split('.').slice(-1);\n if (ext.length === 0) {\n throw new Error(`Unrecognized file format: ${file.name}`);\n }\n\n this.inFileName = `inAudioFile.${ext[0]}`;\n this.outFileNameNoExt = `outAudioFile`;\n\n await this.ffmpegProcess.write(this.inFileName, file);\n }\n\n async info() {\n await this.ffmpegProcess.transcode(this.inFileName, `${this.outFileNameNoExt}.metadata`, `-f ffmetadata`);\n\n let audioFormatRegex = /Audio:\\s(.*?),/; // Actual content\n let inputFormatRegex = /Input #0,\\s(.*?),/; // Container\n let format: string | null = null;\n let input: string | null = null;\n\n for (let line of this.loglines) {\n let match = line.message.match(audioFormatRegex);\n if (match !== null) {\n format = match[1];\n continue;\n }\n match = line.message.match(inputFormatRegex);\n if (match !== null) {\n input = match[1];\n continue;\n }\n if (format !== null && input !== null) {\n break;\n }\n }\n\n return { format, input };\n }\n\n async export({ format }: { format: string }) {\n let result: ArrayBuffer;\n if (format === `SP`) {\n const outFileName = `${this.outFileNameNoExt}.raw`;\n await this.ffmpegProcess.transcode(this.inFileName, outFileName, '-ac 2 -ar 44100 -f s16be');\n let { data } = await this.ffmpegProcess.read(outFileName);\n result = data.buffer;\n } else {\n const outFileName = `${this.outFileNameNoExt}.wav`;\n await this.ffmpegProcess.transcode(this.inFileName, outFileName, '-f wav -ar 44100 -ac 2');\n let { data } = await this.ffmpegProcess.read(outFileName);\n let bitrate: string = `0`;\n switch (format) {\n case `LP2`:\n bitrate = `128`;\n break;\n case `LP105`:\n bitrate = `102`;\n break;\n case `LP4`:\n bitrate = `64`;\n break;\n }\n result = await this.atracdencProcess!.encode(data.buffer, bitrate);\n }\n this.ffmpegProcess.worker.terminate();\n this.atracdencProcess!.terminate();\n return result;\n }\n}\n","/* eslint no-restricted-globals: 0 */\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport * as serviceWorker from './serviceWorker';\nimport { NetMDUSBService } from './services/netmd';\nimport { NetMDMockService } from './services/netmd-mock';\nimport serviceRegistry from './services/registry';\n\nimport { store } from './redux/store';\nimport { actions as appActions } from './redux/app-feature';\nimport { actions as mainActions } from './redux/main-feature';\n\nimport App from './components/app';\n\nimport './index.css';\nimport './fonts/fonts.css';\n\nimport { FFMpegAudioExportService } from './services/audio-export';\nimport { MediaRecorderService } from './services/mediarecorder';\n\nserviceRegistry.netmdService = new NetMDUSBService({ debug: true });\n// serviceRegistry.netmdService = new NetMDMockService(); // Uncomment to work without a device attached\nserviceRegistry.audioExportService = new FFMpegAudioExportService();\nserviceRegistry.mediaRecorderService = new MediaRecorderService();\n\n(function setupEventHandlers() {\n window.addEventListener('beforeunload', ev => {\n let isUploading = store.getState().uploadDialog.visible;\n if (!isUploading) {\n return;\n }\n ev.preventDefault();\n ev.returnValue = `Warning! Recording will be interrupted`;\n });\n\n if (navigator && navigator.usb) {\n navigator.usb.ondisconnect = function() {\n store.dispatch(appActions.setMainView('WELCOME'));\n };\n } else {\n store.dispatch(appActions.setBrowserSupported(false));\n }\n\n if (!('Notification' in window) || Notification.permission === 'denied') {\n store.dispatch(appActions.setNotificationSupport(false));\n store.dispatch(appActions.setNotifyWhenFinished(false));\n }\n\n // eslint-disable-next-line\n let deferredPrompt: any;\n window.addEventListener('beforeinstallprompt', (e: any) => {\n e.preventDefault();\n deferredPrompt = e;\n });\n})();\n\n(function statusMonitorManager() {\n // Polls the device for its state while playing tracks\n let statusMonitorInterval: ReturnType | null = null;\n let exceptionOccurred: boolean = false;\n\n function shouldMonitorBeRunning(state: ReturnType): boolean {\n return (\n !exceptionOccurred &&\n // App ready\n state.appState.mainView === 'MAIN' &&\n state.appState.loading === false &&\n // Disc playing\n state.main.deviceStatus?.state === 'playing' &&\n // No operational dialogs running\n state.convertDialog.visible === false &&\n state.uploadDialog.visible === false &&\n state.recordDialog.visible === false &&\n state.panicDialog.visible === false &&\n state.errorDialog.visible === false &&\n state.dumpDialog.visible === false\n );\n }\n\n store.subscribe(function() {\n const state = store.getState();\n if (shouldMonitorBeRunning(state) === true && statusMonitorInterval === null) {\n // start monitor\n statusMonitorInterval = setInterval(async () => {\n try {\n const deviceStatus = await serviceRegistry.netmdService!.getDeviceStatus();\n store.dispatch(mainActions.setDeviceStatus(deviceStatus));\n } catch (e) {\n console.error(e);\n exceptionOccurred = true; // Stop monitor on exception\n }\n }, 5000);\n } else if (shouldMonitorBeRunning(state) === false && statusMonitorInterval !== null) {\n // stop monitor\n clearInterval(statusMonitorInterval);\n statusMonitorInterval = null;\n }\n });\n})();\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\nif (process.env.REACT_APP_NO_GA_RELEASE !== 'true') {\n serviceWorker.register();\n // serviceWorker.unregister();\n\n try {\n (function() {\n let head = document.getElementsByTagName('head')[0];\n let uascript = document.createElement('script');\n uascript.type = 'text/javascript';\n uascript.src = 'https://www.googletagmanager.com/gtag/js?id=UA-60498490-1';\n head.appendChild(uascript);\n\n let pvscript = document.createElement('script');\n pvscript.type = 'text/javascript';\n pvscript.text = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', 'UA-60498490-1');\n `;\n head.appendChild(pvscript);\n })();\n } catch (err) {}\n}\n","import { sanitizeTitle, getPublicPathFor } from '../utils';\nimport Recorder from 'recorderjs';\n\nexport class MediaRecorderService {\n public recorder: any;\n public stream?: MediaStream;\n public audioContext?: AudioContext;\n public analyserNode?: AnalyserNode;\n public gainNode?: GainNode;\n\n playTestInput(deviceId: string) {\n this.audioContext = new AudioContext();\n this.gainNode = this.audioContext.createGain();\n this.analyserNode = this.audioContext.createAnalyser();\n\n this.initStream(deviceId).then(() => {\n const source = this.audioContext!.createMediaStreamSource(this.stream!);\n source.connect(this.gainNode!);\n this.gainNode!.connect(this.analyserNode!);\n this.analyserNode!.connect(this.audioContext!.destination);\n });\n }\n\n stopTestInput() {\n if (!this.audioContext) {\n return;\n }\n this.audioContext?.close();\n delete this.audioContext;\n this.closeStream();\n }\n\n async initStream(deviceId: string) {\n const recordConstraints = {\n // Try to set the best recording params for ripping the audio tracks\n autoGainControl: false,\n channelCount: 2,\n deviceId: deviceId,\n echoCancellation: false,\n noiseSuppression: false,\n sampleRate: 44100,\n highpassFilter: false,\n };\n this.stream = await navigator.mediaDevices.getUserMedia({ audio: recordConstraints });\n\n // Dump recording settings\n const audioTracks = this.stream.getAudioTracks();\n if (audioTracks.length > 0) {\n console.log('Record Setings:', audioTracks[0].getSettings());\n }\n }\n\n async startRecording() {\n this.audioContext = new AudioContext();\n const input = this.audioContext.createMediaStreamSource(this.stream!);\n this.recorder = new Recorder(input, { workerPath: getPublicPathFor(`recorderWorker.js`) });\n this.recorder.record();\n }\n\n async stopRecording() {\n this.recorder.stop();\n }\n\n async closeStream() {\n this.stream?.getTracks().forEach(track => track.stop());\n }\n\n downloadRecorded(title: string) {\n this.recorder.exportWAV((buffer: Blob) => {\n let url = URL.createObjectURL(buffer);\n let a = document.createElement('a');\n document.body.appendChild(a);\n a.style.display = 'none';\n a.href = url;\n a.download = `${sanitizeTitle(title)}.wav`;\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n });\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.59c85b51.chunk.js.map b/static/js/main.59c85b51.chunk.js.map deleted file mode 100644 index 1925e47..0000000 --- a/static/js/main.59c85b51.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["images/win95/delete.png","images/record-complete-notification-icon.png","images/win95/win95.png","images/chrome-icon.svg","images/win95/arrowup.png","images/win95/arrowdown.png","images/win95/mic.png","images/win95/move.png","images/win95/rename.png","images/win95/device.png","images/win95/minidisc32.png","images/win95/cdplayer.png","webpack:///./src/services/atracdenc-worker.ts?dc3c","serviceWorker.ts","utils.ts","services/netmd.ts","services/registry.ts","redux/upload-dialog-feature.ts","redux/rename-dialog-feature.ts","redux/error-dialog-feature.ts","redux/panic-dialog-feature.ts","redux/convert-dialog-feature.ts","redux/dump-dialog-feature.ts","redux/record-dialog-feature.ts","redux/app-feature.ts","redux/main-feature.ts","redux/store.ts","redux/actions.ts","components/win95/common.tsx","components/win95/about-dialog.tsx","components/about-dialog.tsx","components/win95/topmenu.tsx","components/topmenu.tsx","components/win95/welcome.tsx","components/welcome.tsx","components/main-rows.tsx","components/win95/rename-dialog.tsx","components/rename-dialog.tsx","components/win95/upload-dialog.tsx","components/upload-dialog.tsx","components/win95/record-dialog.tsx","components/record-dialog.tsx","components/error-dialog.tsx","components/panic-dialog.tsx","components/win95/convert-dialog.tsx","components/convert-dialog.tsx","images/md0.svg","images/md1.svg","images/md2.svg","images/md3.svg","components/win95/controls.tsx","components/controls.tsx","components/win95/dump-dialog.tsx","components/dump-dialog.tsx","components/win95/main.tsx","components/main.tsx","components/win95/app.tsx","components/app.tsx","services/atracdenc-worker.ts","services/audio-export.ts","index.tsx","services/mediarecorder.ts"],"names":["module","exports","Worker","isLocalhost","Boolean","window","location","hostname","match","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","console","log","state","controller","onUpdate","onSuccess","update","catch","error","sleep","ms","Promise","resolve","setTimeout","async","sleepWithProgressCallback","cb","elapsedSecs","interval","setInterval","Math","min","clearInterval","useShallowEqualSelector","selector","useSelector","shallowEqual","getPublicPathFor","script","savePreference","key","value","localStorage","setItem","JSON","stringify","loadPreference","defaultValue","res","getItem","parse","e","getAvailableCharsForTitle","disc","includeGroups","fixLength","len","ceil","groups","filter","n","title","fwTitle","fullWidthTitle","hwTitle","undefined","group","range","tracks","index","length","usedCells","getHalfWidthTitleLength","trk","getTracks","max","sanitizeTitle","normalize","replace","multiByteChars","split","map","reduce","a","b","sanitizeHalfWidthTitle","mappings","allowedHalfWidthKana","Object","values","newTitle","charCodeAt","includes","join","jconv","encode","sanitizeFullWidthTitle","sjisEncoded","decode","EncodingName","Encoding","sp","lp2","lp4","getSortedTracks","track","push","encoding","duration","formatTimeFromFrames","sort","l","r","getGroupedTracks","groupedList","ungroupedTracks","find","lastIndex","toCopy","splice","recomputeGroupsAfterTrackMove","trackIndex","targetIndex","offset","deleteMode","trackCount","boundsStart","boundsEnd","allTracks","concat","groupBoundaries","name","fullWidthName","start","end","anyChanges","newDisc","slice","allGrouped","ungrouped","i","unshift","compileDiscTitles","availableCharactersForTitle","useFullWidth","newRawTitle","newRawFullWidthTitle","newRawTitleAfterGroup","newRawFullWidthTitleAfterGroup","halfWidthToFullWidthRange","titlesLengthInTOC","isSequential","numbers","last","num","asyncMutex","target","propertyKey","descriptor","oldValue","args","mutex","this","release","acquire","apply","forAnyDesktop","theme","breakpoints","up","spacing","belowDesktop","down","forWideDesktop","require","NetMDUSBService","constructor","debug","netmdInterface","logger","cachedContentList","Mutex","statusMonitorTimer","_fn","method","info","warn","child","titleObject","cacheTOC","setDiscTitle","syncTOC","dropCachedContentList","listContent","iface","openNewDevice","usb","openPairedDevice","listContentUsingCache","getDeviceStatus","netMd","getDeviceName","finalize","writeRawTitles","setTrackTitle","groupIndex","newName","newFullWidthName","thisGroup","g","groupBegin","groupLength","ungroupedLengthBeforeGroup","thisGroupTracks","Error","findIndex","oldName","getDiscTitle","oldFullWidthName","oldRawName","_getDiscTitle","oldRawFullWidthName","hasGroups","indexOf","hasFullWidthGroups","hasGroupsAndTitle","startsWith","hasFullWidthGroupsAndTitle","newFullWidthNameWithGroups","newNameWithGroups","indexes","reverse","content","eraseTrack","eraseDisc","src","dst","updateGroups","moveTrack","data","format","progressCallback","total","byteLength","written","encrypted","updateProgress","w","webWorkerAsyncPacketIterator","makeGetAsyncPacketIteratorOnWorkerThread","encryptedBytes","halfWidthTitle","mdTrack","MDTrack","download","writtenBytes","terminate","play","pause","stop","nextTrack","previousTrack","gotoTrack","getPosition","ServiceRegistry","createSlice","initialState","visible","cancelled","writtenProgress","encryptedProgress","totalProgress","trackTotal","trackConverting","trackCurrent","titleCurrent","titleConverting","reducers","setVisible","action","payload","setWriteProgress","setCancelUpload","setTrackProgress","current","converting","reducer","actions","enableBatching","setCurrentName","setCurrentFullWidthName","setIndex","setGroupIndex","setErrorMessage","dismissed","dismiss","titleFormat","setFormat","setTitleFormat","inputDeviceId","setInputDeviceId","trackDone","setProgress","buildInitialState","mainView","loading","pairingFailed","pairingMessage","browserSupported","darkMode","vintageMode","aboutDialogVisible","notifyWhenFinished","hasNotificationSupport","fullWidthSupport","setMainView","setLoading","setPairingFailed","setPairingMessage","setBrowserSupported","setDarkMode","setNotifyWhenFinished","setNotificationSupport","setVintageMode","showAboutDialog","setFullWidthSupport","deviceName","deviceStatus","setDisc","setDeviceName","setDeviceStatus","combineReducers","renameDialog","uploadDialog","errorDialog","panicDialog","convertDialog","dumpDialog","recordDialog","appState","main","resetStateAction","appActions","toString","store","configureStore","type","buildInitialAppState","middleware","next","panicDialogActions","getDefaultMiddleware","freeze","getState","control","params","dispatch","serviceRegistry","netmdService","prev","trackNumber","assertNumber","mainActions","pair","appStateActions","audioExportService","init","connect","err","batchActions","message","confirm","wipeDiscTitleInfo","Notification","permission","requestPermission","checkNotificationPromise","WireformatDict","SP","Wireformat","pcm","LP2","LP105","l105kbps","LP4","getTrackNameFromMediaTags","file","fileData","arrayBuffer","blob","Blob","Uint8Array","metadata","mm","common","artist","album","extStartIndex","lastIndexOf","substring","convertAndUpload","files","wireformat","uploadDialogActions","updateProgressCallback","hasUploadBeenCancelled","trackUpdate","updateTrack","availableCharacters","errorMessage","item","converted","convertNext","f","reject","prepare","export","j","conversionIterator","substr","upload","actionToDispatch","errorDialogAction","icon","NotificationCompleteIconUrl","onclick","focus","close","showFinishedNotificationIfNeeded","DialogOverlay","styled","div","DialogWindow","Window","DialogFooter","DialogWindowContent","WindowContent","FooterButton","Button","CustomTableRow","TableRow","canvasText","WindowCloseIcon","span","FloatingButton","button","W95AboutDialog","props","style","display","alignItems","flex","onClick","handleClose","rel","href","Transition","React","forwardRef","ref","Slide","direction","AboutDialog","useDispatch","p","Dialog","open","maxWidth","fullWidth","TransitionComponent","aria-labelledby","DialogTitle","id","DialogContent","DialogContentText","Link","DialogActions","W95TopMenu","items","handleRefresh","handleRenameDisc","handleWipeDisc","handleVintageMode","checked","variant","label","defaultChecked","handleExit","handleShowAbout","position","left","top","zIndex","useStyles","makeStyles","listItemIcon","minWidth","toolTippedText","textDecoration","textDecorationStyle","TopMenu","classes","discTitle","fullWidthDiscTitle","githubLinkRef","useRef","helpLinkRef","menuAnchorEl","setMenuAnchorEl","useState","menuOpen","handleMenuOpen","useCallback","event","currentTarget","handleDarkMode","handleMenuClose","wipeDisc","handleAllowFullWidth","renameDialogActions","handleGithubLink","stopPropagation","click","handleHelpLink","menuItems","MenuItem","ListItemIcon","className","fontSize","ListItemText","Divider","Tooltip","arrow","alt","Win95Icon","width","height","Fragment","IconButton","aria-label","aria-controls","aria-haspopup","Menu","anchorEl","keepMounted","onClose","color","marginTop","windowContent","flexDirection","justifyContent","W95Welcome","paddingBottom","visibility","chromeLogo","why","alignSelf","headBox","connectContainer","supportContainer","Welcome","toLowerCase","showWhyUnsupported","setWhyUnsupported","Box","Typography","component","align","FormControl","FormHelperText","verticalAlign","preventDefault","ChromeIconPath","currentTrackRow","palette","primary","inGroupTrackRow","transform","playButtonInTrackList","trackRow","controlButtonInTrackCommon","marginLeft","formatBadge","BadgeImpl","badge","colorPrimary","border","background","paper","padding","marginRight","durationCell","whiteSpace","durationCellSecondary","text","secondary","durationCellTime","titleCell","overflow","textOverflow","deleteGroupButton","indexCell","paddingRight","dragHandle","dragHandleEmpty","groupFolderIcon","groupHeadRow","TrackRow","inGroup","isSelected","draggableProvided","trackStatus","onSelect","onRename","onTogglePlayPause","handleRename","handleSelect","handlePlayPause","handleDoubleClickOnPlayButton","isPlayingOrPaused","draggableProps","innerRef","hover","selected","onDoubleClick","clsx","TableCell","dragHandleProps","size","GroupRow","onDelete","handleDelete","W95RenameDialog","renameDialogVisible","what","marginBottom","renameDialogTitle","placeholder","onChange","handleChange","onKeyDown","handleDoRename","handleCancelRename","marginUpDown","RenameDialog","renameDialogFullWidthTitle","renameDialogIndex","renameDialogGroupIndex","allowFullWidth","renameGroup","renameDisc","renameTrack","handleFullWidthChange","handleEnterKeyEvent","TextField","autoFocus","W95UploadDialog","convertedValue","floor","progressValue","handleNotifyWhenFinishedChanged","disabled","handleCancelUpload","progressPerc","progressBar","uploadLabel","spacer","checkBox","UploadDialog","bufferValue","aria-describedby","LinearProgress","valueBuffer","FormControlLabel","Checkbox","W95RecordDialog","hideValue","RecordDialog","round","ErrorDialog","errorDialogActions","PanicDialog","handleReloadApp","reload","handleIgnore","scroll","trackTitleOptions","recordModeOptions","W95ConvertDialog","themeContext","useContext","ThemeContext","renderTracks","selectedTrackIndex","selectedTrackRef","setSelectedTrack","selectedTableRow","dialogVisible","options","ev","handleChangeFormat","handleChangeTitleFormat","tracksOrderVisible","getRootProps","disableRemove","handleRemoveSelectedTrack","DeleteIconUrl","moveFileDown","ArrowDownIconUrl","moveFileUp","ArrowUpIconUrl","maxHeight","getInputProps","handleToggleTracksOrder","handleConvert","container","formControl","toggleButton","dialogContent","formatAndTitle","flexWrap","rightBlock","titleFormControl","showTracksOrderBtn","tracksOrderAccordion","opacity","tracksOrderAccordionDetail","toolbarHighlight","backgroundColor","lighten","light","dark","trackList","backdrop","drawer","ConvertDialog","setFiles","moveFile","newFileArray","tmp","convertDialogActions","newFormat","setTracksOrderVisible","useEffect","newFiles","Array","from","scrollIntoView","block","behavior","ListItem","disableGutters","Radio","onDrop","acceptedFiles","rejectedFiles","isDragActive","useDropzone","accept","noClick","ToggleButtonGroup","exclusive","ToggleButton","Select","input","Input","Accordion","expanded","square","outline","Toolbar","edge","AccordionDetails","List","dense","disablePadding","Backdrop","_extends","assign","arguments","source","prototype","hasOwnProperty","call","createElement","fill","fillRule","d","SvgMd0","svgRef","viewBox","ForwardRef","SvgMd1","SvgMd2","SvgMd3","lcd","margin","fontFamily","W95Controls","handlePrev","handlePlay","handlePause","handleStop","handleNext","lcdText","lcdScroll","scrollingStatusMessage","statusMessage","lcdRef","animationDuration","lcdScrollDuration","frames","MDIcon0","MDIcon1","MDIcon2","MDIcon3","to","paddingLeft","borderRadius","default","lcdDisc","lcdDiscIcon","active","animationName","animationTimingFunction","animationIterationCount","lcdBlink","Controls","deviceState","discPresent","paused","padStart","setLcdScroll","setLcdScrollDuration","lcdIconFrame","setLcdIconFrame","scrollTimerRef","clearTimeout","domEl","textWidth","scrollWidth","lcdWidth","parentElement","offsetWidth","scrollDurationInSec","updateLCDScroll","lcdIconAnimationTimer","DiscFrame","W95DumpDialog","devices","deviceId","handleStartTransfer","flexFlow","selectEmpty","head","textShadow","typography","h2","textAlign","DumpDialog","trackIndexes","setDevices","mediaRecorderService","stopTestInput","dumpDialogActions","playTestInput","recordDialogAction","t","entries","expected","every","_","initStream","startRecording","durationInSec","perc","stopRecording","downloadRecorded","closeStream","mediaDevices","getUserMedia","audio","inputDevices","enumerateDevices","device","kind","updateDeviceList","displayEmpty","minHeight","table","controlsContainer","toolbarIcon","toolbarItem","W95Main","selectedCount","DeviceIconUrl","MDIconUrl","enterDelay","leaveDelay","handleShowMoveMenu","MoveIconUrl","handleShowDumpDialog","MicIconUrl","handleDeleteSelected","handleRenameActionClick","RenameIconUrl","moveMenuAnchorEl","handleMoveSelectedTrack","handleRenameTrack","handleSelectTrackClick","uploadedFiles","add","bottom","right","overflowY","toolbar","toolbarLabel","remainingTimeTooltip","hoveringOverGroup","alpha","getTrackStatus","Main","setSelected","setUploadedFiles","lastClicked","setLastClicked","setMoveMenuAnchorEl","handleCloseMoveMenu","destIndex","srcIndex","handleDrop","result","provided","destination","sourceList","parseInt","droppableId","sourceIndex","targetList","groupedTracks","newIndex","boundsStartList","boundsEndList","boundsStartIndex","boundsEndIndex","movedItem","startingIndex","endingIndex","prevList","normalGroups","rewriteGroups","dragDropTrack","useMemo","shiftKey","rangeBegin","rangeEnd","copy","handleSelectAllClick","handleRenameGroup","detail","deleteTracks","handleGroupTracks","begin","addGroup","handleDeleteGroup","deleteGroup","handleTogglePlayPauseTrack","canGroup","indeterminate","inputProps","Table","TableHead","onDragEnd","TableBody","colSpan","snapshot","droppableProps","isDraggingOver","tidx","draggableId","Fab","GlobalStyles","createGlobalStyle","styleReset","desktop","W95App","isMenuOpen","setMenuOpen","closeMenu","toggleMenu","handleHelpClick","currentTheme","original","hoverBackground","canvasTextInvert","CDPlayerIconUrl","Date","getFullYear","layout","bottomBar","copyrightTypography","minidiscLogo","darkTheme","createTheme","contrastText","lightTheme","App","ThemeProvider","CssBaseline","Paper","CircularProgress","AtracdencProcess","worker","messageCallback","onmessage","handleMessage","bind","postMessage","bitrate","WorkerGlobalScope","self","Module","others","importScripts","m","setLogger","msg","stream","inWavFile","outAt3File","dataArray","FS","writeFile","callMain","stat","outAt3FileStream","read","buffer","AtracdencWorker","ffmpegProcess","atracdencProcess","loglines","inFileName","outFileNameNoExt","setLogging","createWorker","corePath","workerPath","load","ext","write","transcode","audioFormatRegex","inputFormatRegex","line","outFileName","recorder","audioContext","analyserNode","gainNode","AudioContext","createGain","createAnalyser","createMediaStreamSource","recordConstraints","autoGainControl","channelCount","echoCancellation","noiseSuppression","sampleRate","highpassFilter","audioTracks","getAudioTracks","getSettings","Recorder","record","forEach","exportWAV","url","URL","createObjectURL","document","body","appendChild","revokeObjectURL","removeChild","deferredPrompt","addEventListener","returnValue","ondisconnect","statusMonitorInterval","exceptionOccurred","shouldMonitorBeRunning","subscribe","ReactDOM","render","getElementById","process","REACT_APP_NO_GA_RELEASE","origin","fetch","headers","response","contentType","get","status","ready","unregister","checkValidServiceWorker","getElementsByTagName","uascript","pvscript"],"mappings":"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AK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,KAAM,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAU,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,eAAM,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,UAC/yFC,EAAiCC,OAAOC,OAAOH,GAE/CI,EAAW7B,EACZmB,MAAM,IACNC,IAAIrB,GACG0B,EAAS1B,GAAW0B,EAAS1B,GAC7BA,EAAE+B,WAAW,GAAK,KAAQJ,EAAqBK,SAAShC,GAAWA,EAChE,KAEViC,KAAK,IAGV,OADoBC,IAAMC,OAAOL,EAAU,QAC3BpB,SAAWE,EAAwBX,GAAee,EAAcf,GACzE6B,EAGJ,SAASM,EAAuBnC,GAEnC,MAAMyB,EAAsC,CAAE,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,EAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,IAAK,SAAK,KAAM,SAAK,IAAK,SAAK,IAAK,SAAK,EAAK,SAAK,IAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAK,IAAK,SAAU,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,EAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SAAK,eAAM,SAAK,SAAK,SA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","file":"static/js/main.59c85b51.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAaElEQVR4Ac3BQQrCQAAEsIz///MobGG7bZUiHkz8laKoe+olplrFtRriJVa1ilUNsYlrNcVQQ+zEe3UWB/FZTXEh3quzOIhrNcVQQ+zEWU2xqiE2D6ua4iwOHqa6J6hNTDXFl+q++oUnXWYXCDnmtMUAAAAASUVORK5CYII=\"","module.exports = __webpack_public_path__ + \"static/media/record-complete-notification-icon.f6ae1070.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAAEEfUpiAAAACXBIWXMAAAsSAAALEgHS3X78AAAQR0lEQVRYCQE8EMPvAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAP8AAAIAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA//8AAAAB/wAAAgAAAAAAAAAAAQD/AP8AAAAAAAAAAAAAAP8AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAEAAAAAAAAAAP8AAP8AAAAAAQAAAP8AAAAB/wAAAAAAAAEAAAAAAAAAAAAA//8AAAAAAAABAAAA/wD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA/wAAAAAA/wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAD/AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAP//AAAAAAAAAAAAAAEBAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQL/AAD/AAAAAQAAAP8AAAAAAAAA/wAAAP8AAAAAAAAAAP8AAAD/AAAA/wAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAgEAAAH/AAD/AAAAAQAAAAAAAAABAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA/wEAAAH/AAD/AAAAAP8AAP//AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAA//8AAAABAAAA/wAAAAAAAAD/AAAA/wAAAAAAAAAAAAD/AAAA/wAAAP8AAAAAAP//AAD//wAAAAAAAAAAAAACAAABAQAA//8AAAABAAAAAAAAAAEAAAABAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD/AAABAQAA//8AAAAAAAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAEAAAAA/wAA/wEAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAQAAAAAAAAAA/wAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAD/AAD/AQAAAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAABAAABAAAAAP8AAP//AAD/AAAAAAAAAAH/AAD/AAAAAP8AAAD/AAD//wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQEAAAEAAAAAAAAAAP8AAP8BAAABAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAACAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAQAAAAAAAD//wAAAQEAAAABAAAAAAAAAP8AAAAAAAAAAQEAAAEAAAD/AAAAAQEAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAEAAAAAAIAAAAAAAAAAfwAAAAAAAAABAAAAAAD//wAAAAAAAIGBAAAAAAAAgAEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAP8AAAABAAAAAAAAAAAAAAD/AAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAQIAAAAAAAAA/wAAAAAAAAEBAAAAAAAA//8AAP//AAAAAAAAAAEAAP//AAAAAAAA/wAAAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAD/AAAAAQAAAQEAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAgAAAAAAAAAAAAAAAAAABAQAAAAAAAICAAAAAAAAAf38AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAP8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4NtYBuc2+1AAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/chrome-icon.f3b6c54c.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVR4Ae3BSQ7CUAxEwde+/50bFkgQyGD/DBZSqrjtZMDsIMaZKTFAjDHzRJGoM+tEgagxOSJJ5JkakSByzBixQWwz+4gVYp05hlgglpljiRlinjmH+CJ+mXOJD2LKXEO8iDdzLfEUNBN5pk5sCJoFzYJmQbOgWdAsaBY0C5oFzUSNyRO3f/AAz+gRJE12Ia8AAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiElEQVR4Ae3BSQ7CQBAEwcz+/58LDkhsxp4xSwtBBD9P5oRxMkDGhXmyoWhWNCuaFc2KZkWzolnRrGhWNJOz8FlyVDSTa+Ez5ETuhfeSC7IsvIfckMfCa8kCWRdeQx6QbeE5skLGhH1kg4wLc2SAzAljZJDMC+tkguwTlskk2S9ckwYBwt83OwASZhEklsYbbQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAzUlEQVR4AY3BgXHCMBAAwXuHQugEdfanzkRlH3nGgMfjEO8GF6nFjhpMCxeoxZSZrFprTMW0cFFm0nsnU8YYvNy4QGWVKRGgvC38R4uptUYEqKi8BN9okQm9g3IQTMFftMiECHaCg4UzWmRCBCib4MTCkRaZEAEKmXwT7GmRCb2D8laFvfOiBptgo1ZrjTYGKFPwUROriGAKNjd2Wmtsgh2V1fP55OjGpBYfwYneOypnCij+V0Bx8AMIBF+opXK/3xljCHQ2Cxc9Hg/O/AKFdlY5+3GtSAAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfUlEQVR4Aa3BUQ6CMBRFwXOb7vulKz/CR4Ni1RCc4a6wJr+FTeedbFQ+ScLUeOWGKxoH2SRhSgZTMljpPFG5qrOQDKZkMCUDLZ41FrTYaaHFTgstzho3dU6SwZQMpmSgxVnjRIudFlrstNBipXFTY0GLSYtvGjeFg1wT/uEBKpc1Cx/u8CoAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAt0lEQVR4Ab3Bi1HbYBAGwD2RQlwKVMbnzu6v7IIkZ4CEhzOZya5/Vf7OBHEoLx7cb4JnFJrgurnPJAhXPCNOm+/NjFfhijhtvjYzDo+P7Zc4lBebz82Mw1qtu+0Su3JTPjYzDmu17kYkduWN8qeZcVirdTcisSu/Ke/NjMNarbsRiV35QHk1Mw5rte5GJHblE5vTuFmrdTcisStfeHBKwtMTl8sFkdiVb/zwRkISN+UO5TTeK//LT0efTfwPZVIpAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA3klEQVR4Ae3BwU3EUBBEweeV8+Jn1u3MeiL7eARIPoCFVsLLwVXcbrfb7fZqCwe2Jxeyvax8sj3HGFwlCbv5YGd7jjG4ShK+rLanJK6ybRtHK5+qildY+YUkPGuMwZmVg7cxaJXQktBs8yzbtDEG33nwYisHlXAkiWabZ0miVRXfWTlRVbQ5J8+qKs6s/EJV8VcenEhCS0JLQktCS0JLQktCS0JLQkvCTx6ckESTRJNEk0STRJNEk0STRJNEk8RPFttTElXFFZLQbLNbVnbbtnEl2+wWdgsfJtdauP0X7xi2ahnkEPOyAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACcklEQVR4Ae3BgW1bRxBF0bs0C1lXss+VWJ3ssBO6kzedWJVM/kIk8kVQMmUlCAL4HP74rzUeFBHFHRHReF9xX2Nz5B0RUVzMGVxlmquIKC4iovFBR+6IiOIi5mSZBPdIYqd40Xit8VpxceRGRFTM4EXxEbZZJBXQeEBjJyIqZvBacVU0lkyzSOKzjlxEREnCaTTEo6qKq9YaVcVea42qYq+1RlXRWqNxEREVc+JMFg3xt2IpGkumWSTxWQc2EVExJ4vGYHGaR1QVVUVVsVQVVcVeVVFV7FUVS2MTESWJRWOwOJNFQ7woisaSaRZJfFaLiJLELY2BM1k0xBKnYC8iqCquWmtUFY9qrdEioiRxj8bAmSy2iQj+aUfe4Uw0BnE6ERFsGq9VRBARXNnmliQ2jTsO/IIzeZRtPurAxjaLbRbbLLZ5hG1s8zsObCRhG0nYRhK2kYRt/k1HNraRhG0kYRtJ2GbOSWYSEUREsRMRSOIzjmwkYRtJ2EYStplzkpmMMVgigr2YE2fyGV9sn3rvIQnbSMI2c04ykzEGmcnSe6f3zvfvT7QWnHvn3DtPz8+8RRKbxhsOXNhGEraZc5KZjDHITPbGEIuGcCaLxuB3HdhERGNjmzknmckYg8zkVqa5R2NwSxKbxjsO7Mw5yUzGGGQm94whrjSEM7nSGHzUgYuIaKfTiTEGmclbMs17NAaLJDaNX/jCju1Tay1677xlDLEEcALO/YzzG+feuTp//cqm8YAv3LB96r3Hz58/6b1z6/n5id7PLCdePD0/0X/8wN++wenEpvGgxjsiothI4moMcdXYNPYaH9R4TPG2xh//Z38BPq9JPdh7I1oAAAAASUVORK5CYII=\"","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"4a3a421ab134cd5ff776.worker.js\");\n};","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/final-service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' + 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n console.log('state change', installingWorker.state);\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n registration.update(); // Check for new version everytime we load the page\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { Disc, formatTimeFromFrames, Encoding, getTracks, Group } from 'netmd-js';\nimport { useSelector, shallowEqual } from 'react-redux';\nimport { RootState } from './redux/store';\nimport { Mutex } from 'async-mutex';\nimport { Theme } from '@material-ui/core';\nimport jconv from 'jconv';\nimport { halfWidthToFullWidthRange } from 'netmd-js/dist/utils';\n\nexport function sleep(ms: number) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\nexport async function sleepWithProgressCallback(ms: number, cb: (perc: number) => void) {\n let elapsedSecs = 1;\n let interval = setInterval(() => {\n elapsedSecs++;\n cb(Math.min(100, ((elapsedSecs * 1000) / ms) * 100));\n }, 1000);\n await sleep(ms);\n window.clearInterval(interval);\n}\n\nexport function useShallowEqualSelector(selector: (state: TState) => TSelected): TSelected {\n return useSelector(selector, shallowEqual);\n}\n\nexport function debugEnabled() {\n return process.env.NODE_ENV === 'development';\n}\n\nexport function getPublicPathFor(script: string) {\n return `${process.env.PUBLIC_URL}/${script}`;\n}\n\nexport function savePreference(key: string, value: unknown) {\n localStorage.setItem(key, JSON.stringify(value));\n}\n\nexport function loadPreference(key: string, defaultValue: T): T {\n let res = localStorage.getItem(key);\n if (res === null) {\n return defaultValue;\n } else {\n try {\n return JSON.parse(res) as T;\n } catch (e) {\n return defaultValue;\n }\n }\n}\n\nexport function getAvailableCharsForTitle(disc: Disc, includeGroups?: boolean) {\n const cellLimit = 255;\n // see https://www.minidisc.org/md_toc.html\n const fixLength = (len: number) => Math.ceil(len / 7);\n\n let groups = disc.groups.filter(n => n.title !== null);\n\n // Assume worst-case scenario\n let fwTitle = disc.fullWidthTitle + `0;//`;\n let hwTitle = disc.title + `0;//`;\n if (includeGroups || includeGroups === undefined)\n for (let group of groups) {\n let range = `${group.tracks[0].index + 1}${group.tracks.length - 1 !== 0 &&\n `-${group.tracks[group.tracks.length - 1].index + 1}`}//`;\n // The order of these characters doesn't matter. It's for length only\n fwTitle += group.fullWidthTitle + range;\n hwTitle += group.title + range;\n }\n\n let usedCells = 0;\n usedCells += fixLength(fwTitle.length * 2);\n usedCells += fixLength(getHalfWidthTitleLength(hwTitle));\n for (let trk of getTracks(disc)) {\n usedCells += fixLength((trk.fullWidthTitle?.length ?? 0) * 2);\n usedCells += fixLength(getHalfWidthTitleLength(trk.title ?? ''));\n }\n return Math.max(cellLimit - usedCells, 0) * 7;\n}\n\nexport function framesToSec(frames: number) {\n return frames / 512;\n}\n\nexport function sanitizeTitle(title: string) {\n return title.normalize('NFD').replace(/[^\\x00-\\x7F]/g, '');\n}\n\nexport function getHalfWidthTitleLength(title: string) {\n // Some characters are written as 2 bytes\n // prettier-ignore\n const multiByteChars: { [key: string]: number } = { \"ガ\": 1, \"ギ\": 1, \"グ\": 1, \"ゲ\": 1, \"ゴ\": 1, \"ザ\": 1, \"ジ\": 1, \"ズ\": 1, \"ゼ\": 1, \"ゾ\": 1, \"ダ\": 1, \"ヂ\": 1, \"ヅ\": 1, \"デ\": 1, \"ド\": 1, \"バ\": 1, \"パ\": 1, \"ビ\": 1, \"ピ\": 1, \"ブ\": 1, \"プ\": 1, \"ベ\": 1, \"ペ\": 1, \"ボ\": 1, \"ポ\": 1, \"ヮ\": 1, \"ヰ\": 1, \"ヱ\": 1, \"ヵ\": 1, \"ヶ\": 1, \"ヴ\": 1, \"ヽ\": 1, \"ヾ\": 1, \"が\": 1, \"ぎ\": 1, \"ぐ\": 1, \"げ\": 1, \"ご\": 1, \"ざ\": 1, \"じ\": 1, \"ず\": 1, \"ぜ\": 1, \"ぞ\": 1, \"だ\": 1, \"ぢ\": 1, \"づ\": 1, \"で\": 1, \"ど\": 1, \"ば\": 1, \"ぱ\": 1, \"び\": 1, \"ぴ\": 1, \"ぶ\": 1, \"ぷ\": 1, \"べ\": 1, \"ぺ\": 1, \"ぼ\": 1, \"ぽ\": 1, \"ゎ\": 1, \"ゐ\": 1, \"ゑ\": 1, \"ゕ\": 1, \"ゖ\": 1, \"ゔ\": 1, \"ゝ\": 1, \"ゞ\": 1 };\n return (\n title.length +\n title\n .split('')\n .map(n => multiByteChars[n] ?? 0)\n .reduce((a, b) => a + b, 0)\n );\n}\n\nexport function sanitizeHalfWidthTitle(title: string) {\n // prettier-ignore\n const mappings: { [key: string]: string } = { 'ァ': 'ァ', 'ア': 'ア', 'ィ': 'ィ', 'イ': 'イ', 'ゥ': 'ゥ', 'ウ': 'ウ', 'ェ': 'ェ', 'エ': 'エ', 'ォ': 'ォ', 'オ': 'オ', 'カ': 'カ', 'ガ': 'ガ', 'キ': 'キ', 'ギ': 'ギ', 'ク': 'ク', 'グ': 'グ', 'ケ': 'ケ', 'ゲ': 'ゲ', 'コ': 'コ', 'ゴ': 'ゴ', 'サ': 'サ', 'ザ': 'ザ', 'シ': 'シ', 'ジ': 'ジ', 'ス': 'ス', 'ズ': 'ズ', 'セ': 'セ', 'ゼ': 'ゼ', 'ソ': 'ソ', 'ゾ': 'ゾ', 'タ': 'タ', 'ダ': 'ダ', 'チ': 'チ', 'ヂ': 'ヂ', 'ッ': 'ッ', 'ツ': 'ツ', 'ヅ': 'ヅ', 'テ': 'テ', 'デ': 'デ', 'ト': 'ト', 'ド': 'ド', 'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ', 'ハ': 'ハ', 'バ': 'バ', 'パ': 'パ', 'ヒ': 'ヒ', 'ビ': 'ビ', 'ピ': 'ピ', 'フ': 'フ', 'ブ': 'ブ', 'プ': 'プ', 'ヘ': 'ヘ', 'ベ': 'ベ', 'ペ': 'ペ', 'ホ': 'ホ', 'ボ': 'ボ', 'ポ': 'ポ', 'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ', 'ャ': 'ャ', 'ヤ': 'ヤ', 'ュ': 'ュ', 'ユ': 'ユ', 'ョ': 'ョ', 'ヨ': 'ヨ', 'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ', 'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン', 'ー': 'ー', 'ヮ': 'ヮ', 'ヰ': 'ヰ', 'ヱ': 'ヱ', 'ヵ': 'ヵ', 'ヶ': 'ヶ', 'ヴ': 'ヴ', 'ヽ': 'ヽ', 'ヾ': 'ヾ', '・': '・', '「': '「', '」': '」', '。': '。', '、': '、', '!': '!', '"': '\"', '#': '#', '$': '$', '%': '%', '&': '&', ''': \"'\", '(': '(', ')': ')', '*': '*', '+': '+', ',': ',', '-': '-', '.': '.', '/': '/', ':': ':', ';': ';', '<': '<', '=': '=', '>': '>', '?': '?', '@': '@', 'A': 'A', 'B': 'B', 'C': 'C', 'D': 'D', 'E': 'E', 'F': 'F', 'G': 'G', 'H': 'H', 'I': 'I', 'J': 'J', 'K': 'K', 'L': 'L', 'M': 'M', 'N': 'N', 'O': 'O', 'P': 'P', 'Q': 'Q', 'R': 'R', 'S': 'S', 'T': 'T', 'U': 'U', 'V': 'V', 'W': 'W', 'X': 'X', 'Y': 'Y', 'Z': 'Z', '[': '[', '\': '\\\\', ']': ']', '^': '^', '_': '_', '`': '`', 'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e', 'f': 'f', 'g': 'g', 'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 'l': 'l', 'm': 'm', 'n': 'n', 'o': 'o', 'p': 'p', 'q': 'q', 'r': 'r', 's': 's', 't': 't', 'u': 'u', 'v': 'v', 'w': 'w', 'x': 'x', 'y': 'y', 'z': 'z', '{': '{', '|': '|', '}': '}', '~': '~', '\\u3000': ' ', '0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9', 'ぁ': 'ァ', 'あ': 'ア', 'ぃ': 'ィ', 'い': 'イ', 'ぅ': 'ゥ', 'う': 'ウ', 'ぇ': 'ェ', 'え': 'エ', 'ぉ': 'ォ', 'お': 'オ', 'か': 'カ', 'が': 'ガ', 'き': 'キ', 'ぎ': 'ギ', 'く': 'ク', 'ぐ': 'グ', 'け': 'ケ', 'げ': 'ゲ', 'こ': 'コ', 'ご': 'ゴ', 'さ': 'サ', 'ざ': 'ザ', 'し': 'シ', 'じ': 'ジ', 'す': 'ス', 'ず': 'ズ', 'せ': 'セ', 'ぜ': 'ゼ', 'そ': 'ソ', 'ぞ': 'ゾ', 'た': 'タ', 'だ': 'ダ', 'ち': 'チ', 'ぢ': 'ヂ', 'っ': 'ッ', 'つ': 'ツ', 'づ': 'ヅ', 'て': 'テ', 'で': 'デ', 'と': 'ト', 'ど': 'ド', 'な': 'ナ', 'に': 'ニ', 'ぬ': 'ヌ', 'ね': 'ネ', 'の': 'ノ', 'は': 'ハ', 'ば': 'バ', 'ぱ': 'パ', 'ひ': 'ヒ', 'び': 'ビ', 'ぴ': 'ピ', 'ふ': 'フ', 'ぶ': 'ブ', 'ぷ': 'プ', 'へ': 'ヘ', 'べ': 'ベ', 'ぺ': 'ペ', 'ほ': 'ホ', 'ぼ': 'ボ', 'ぽ': 'ポ', 'ま': 'マ', 'み': 'ミ', 'む': 'ム', 'め': 'メ', 'も': 'モ', 'ゃ': 'ャ', 'や': 'ヤ', 'ゅ': 'ュ', 'ゆ': 'ユ', 'ょ': 'ョ', 'よ': 'ヨ', 'ら': 'ラ', 'り': 'リ', 'る': 'ル', 'れ': 'レ', 'ろ': 'ロ', 'わ': 'ワ', 'を': 'ヲ', 'ん': 'ン', 'ゎ': 'ヮ', 'ゐ': 'ヰ', 'ゑ': 'ヱ', 'ゕ': 'ヵ', 'ゖ': 'ヶ', 'ゔ': 'ヴ', 'ゝ': 'ヽ', 'ゞ': 'ヾ' };\n const allowedHalfWidthKana: string[] = Object.values(mappings);\n\n const newTitle = title\n .split('')\n .map(n => {\n if (mappings[n]) return mappings[n];\n if (n.charCodeAt(0) < 0x7f || allowedHalfWidthKana.includes(n)) return n;\n return ' ';\n })\n .join('');\n // Check if the amount of characters is the same as the amount of encoded bytes (when accounting for dakuten). Otherwise the disc might end up corrupted\n const sjisEncoded = jconv.encode(newTitle, 'SJIS');\n if (sjisEncoded.length !== getHalfWidthTitleLength(title)) return sanitizeTitle(title); //Fallback\n return newTitle;\n}\n\nexport function sanitizeFullWidthTitle(title: string) {\n // prettier-ignore\n const mappings: { [key: string]: string } = { '!': '!', '\"': '"', '#': '#', '$': '$', '%': '%', '&': '&', \"'\": ''', '(': '(', ')': ')', '*': '*', '+': '+', ',': ',', '-': '-', '.': '.', '/': '/', ':': ':', ';': ';', '<': '<', '=': '=', '>': '>', '?': '?', '@': '@', 'A': 'A', 'B': 'B', 'C': 'C', 'D': 'D', 'E': 'E', 'F': 'F', 'G': 'G', 'H': 'H', 'I': 'I', 'J': 'J', 'K': 'K', 'L': 'L', 'M': 'M', 'N': 'N', 'O': 'O', 'P': 'P', 'Q': 'Q', 'R': 'R', 'S': 'S', 'T': 'T', 'U': 'U', 'V': 'V', 'W': 'W', 'X': 'X', 'Y': 'Y', 'Z': 'Z', '[': '[', '\\\\': '\', ']': ']', '^': '^', '_': '_', '`': '`', 'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e', 'f': 'f', 'g': 'g', 'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 'l': 'l', 'm': 'm', 'n': 'n', 'o': 'o', 'p': 'p', 'q': 'q', 'r': 'r', 's': 's', 't': 't', 'u': 'u', 'v': 'v', 'w': 'w', 'x': 'x', 'y': 'y', 'z': 'z', '{': '{', '|': '|', '}': '}', '~': '~', ' ': '\\u3000', '0': '0', '1': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9', 'ァ': 'ァ', 'ア': 'ア', 'ィ': 'ィ', 'イ': 'イ', 'ゥ': 'ゥ', 'ウ': 'ウ', 'ェ': 'ェ', 'エ': 'エ', 'ォ': 'ォ', 'オ': 'オ', 'カ': 'カ', 'ガ': 'ガ', 'キ': 'キ', 'ギ': 'ギ', 'ク': 'ク', 'グ': 'グ', 'ケ': 'ケ', 'ゲ': 'ゲ', 'コ': 'コ', 'ゴ': 'ゴ', 'サ': 'サ', 'ザ': 'ザ', 'シ': 'シ', 'ジ': 'ジ', 'ス': 'ス', 'ズ': 'ズ', 'セ': 'セ', 'ゼ': 'ゼ', 'ソ': 'ソ', 'ゾ': 'ゾ', 'タ': 'タ', 'ダ': 'ダ', 'チ': 'チ', 'ヂ': 'ヂ', 'ッ': 'ッ', 'ツ': 'ツ', 'ヅ': 'ヅ', 'テ': 'テ', 'デ': 'デ', 'ト': 'ト', 'ド': 'ド', 'ナ': 'ナ', 'ニ': 'ニ', 'ヌ': 'ヌ', 'ネ': 'ネ', 'ノ': 'ノ', 'ハ': 'ハ', 'バ': 'バ', 'パ': 'パ', 'ヒ': 'ヒ', 'ビ': 'ビ', 'ピ': 'ピ', 'フ': 'フ', 'ブ': 'ブ', 'プ': 'プ', 'ヘ': 'ヘ', 'ベ': 'ベ', 'ペ': 'ペ', 'ホ': 'ホ', 'ボ': 'ボ', 'ポ': 'ポ', 'マ': 'マ', 'ミ': 'ミ', 'ム': 'ム', 'メ': 'メ', 'モ': 'モ', 'ャ': 'ャ', 'ヤ': 'ヤ', 'ュ': 'ュ', 'ユ': 'ユ', 'ョ': 'ョ', 'ヨ': 'ヨ', 'ラ': 'ラ', 'リ': 'リ', 'ル': 'ル', 'レ': 'レ', 'ロ': 'ロ', 'ワ': 'ワ', 'ヲ': 'ヲ', 'ン': 'ン', 'ー': 'ー', 'ヮ': 'ヮ', 'ヰ': 'ヰ', 'ヱ': 'ヱ', 'ヵ': 'ヵ', 'ヶ': 'ヶ', 'ヴ': 'ヴ', 'ヽ': 'ヽ', 'ヾ': 'ヾ', '・': '・', '「': '「', '」': '」', '。': '。', '、': '、' };\n\n const newTitle = title\n .split('')\n .map(n => mappings[n] ?? n)\n .join('');\n\n const sjisEncoded = jconv.encode(newTitle, 'SJIS');\n if (jconv.decode(sjisEncoded, 'SJIS') !== newTitle) return sanitizeTitle(title); // Fallback\n if (sjisEncoded.length !== title.length * 2) return sanitizeTitle(title); // Fallback (every character in the full-width title is 2 bytes)\n return newTitle;\n}\n\nexport const EncodingName: { [k: number]: string } = {\n [Encoding.sp]: 'SP',\n [Encoding.lp2]: 'LP2',\n [Encoding.lp4]: 'LP4',\n};\n\nexport type DisplayTrack = {\n index: number;\n title: string;\n fullWidthTitle: string;\n group: string | null;\n duration: string;\n encoding: string;\n};\n\nexport function getSortedTracks(disc: Disc | null) {\n let tracks: DisplayTrack[] = [];\n if (disc !== null) {\n for (let group of disc.groups) {\n for (let track of group.tracks) {\n tracks.push({\n index: track.index,\n title: track.title ?? `Unknown Title`,\n fullWidthTitle: track.fullWidthTitle ?? ``,\n group: group.title ?? null,\n encoding: EncodingName[track.encoding],\n duration: formatTimeFromFrames(track.duration, false),\n });\n }\n }\n }\n tracks.sort((l, r) => l.index - r.index);\n return tracks;\n}\n\nexport function getGroupedTracks(disc: Disc | null) {\n if (!disc) {\n return [];\n }\n let groupedList: Group[] = [];\n let ungroupedTracks = [...(disc.groups.find(n => n.title === null)?.tracks ?? [])];\n\n let lastIndex = 0;\n\n for (let group of disc.groups) {\n if (group.title === null) {\n continue; // Ungrouped tracks\n }\n let toCopy = group.tracks[0].index - lastIndex;\n groupedList.push({\n index: -1,\n title: null,\n fullWidthTitle: null,\n tracks: toCopy === 0 ? [] : ungroupedTracks.splice(0, toCopy),\n });\n lastIndex = group.tracks[group.tracks.length - 1].index + 1;\n groupedList.push(group);\n }\n groupedList.push({\n index: -1,\n title: null,\n fullWidthTitle: null,\n tracks: ungroupedTracks,\n });\n return groupedList;\n}\n\nexport function recomputeGroupsAfterTrackMove(disc: Disc, trackIndex: number, targetIndex: number) {\n // Used for moving tracks in netmd-mock and deleting\n let offset = trackIndex > targetIndex ? 1 : -1;\n let deleteMode = targetIndex === -1;\n\n if (deleteMode) {\n offset = -1;\n targetIndex = disc.trackCount;\n }\n\n let boundsStart = Math.min(trackIndex, targetIndex);\n let boundsEnd = Math.max(trackIndex, targetIndex);\n\n let allTracks = disc.groups\n .map(n => n.tracks)\n .reduce((a, b) => a.concat(b), [])\n .sort((a, b) => a.index - b.index)\n .filter(n => !deleteMode || n.index !== trackIndex);\n\n let groupBoundaries: {\n name: string | null;\n fullWidthName: string | null;\n start: number;\n end: number;\n }[] = disc.groups\n .filter(n => n.title !== null)\n .map(group => ({\n name: group.title,\n fullWidthName: group.fullWidthTitle,\n start: group.tracks[0].index,\n end: group.tracks[0].index + group.tracks.length - 1,\n })); // Convert to a format better for shifting\n\n let anyChanges = false;\n\n for (let group of groupBoundaries) {\n if (group.start > boundsStart && group.start <= boundsEnd) {\n group.start += offset;\n anyChanges = true;\n }\n if (group.end >= boundsStart && group.end < boundsEnd) {\n group.end += offset;\n anyChanges = true;\n }\n }\n\n if (!anyChanges) return disc;\n\n let newDisc: Disc = { ...disc };\n\n // Convert back\n newDisc.groups = groupBoundaries\n .map(n => ({\n title: n.name,\n fullWidthTitle: n.fullWidthName,\n index: n.start,\n tracks: allTracks.slice(n.start, n.end + 1),\n }))\n .filter(n => n.tracks.length > 0);\n\n // Convert ungrouped tracks\n let allGrouped = newDisc.groups.map(n => n.tracks).reduce((a, b) => a.concat(b), []);\n let ungrouped = allTracks.filter(n => !allGrouped.includes(n));\n\n // Fix all the track indexes\n if (deleteMode) {\n for (let i = 0; i < allTracks.length; i++) {\n allTracks[i].index = i;\n }\n }\n\n if (ungrouped.length) newDisc.groups.unshift({ title: null, fullWidthTitle: null, index: 0, tracks: ungrouped });\n\n return newDisc;\n}\n\nexport function compileDiscTitles(disc: Disc) {\n let availableCharactersForTitle = getAvailableCharsForTitle(\n {\n ...disc,\n title: '',\n fullWidthTitle: '',\n },\n false\n );\n // If the disc or any of the groups, or any track has a full-width title, provide support for them\n const useFullWidth =\n disc.fullWidthTitle ||\n disc.groups.filter(n => !!n.fullWidthTitle).length > 0 ||\n disc.groups\n .map(n => n.tracks)\n .reduce((a, b) => a.concat(b), [])\n .filter(n => !!n.fullWidthTitle).length > 0;\n\n const fixLength = (l: number) => Math.ceil(l / 7) * 7;\n\n let newRawTitle = '',\n newRawFullWidthTitle = '';\n if (disc.title) newRawTitle = `0;${disc.title}//`;\n if (useFullWidth) newRawFullWidthTitle = `0;${disc.fullWidthTitle}//`;\n for (let n of disc.groups) {\n if (n.title === null || n.tracks.length === 0) continue;\n let range = `${n.tracks[0].index + 1}`;\n if (n.tracks.length !== 1) {\n // Special case\n range += `-${n.tracks[0].index + n.tracks.length}`;\n }\n\n let newRawTitleAfterGroup = newRawTitle + `${range};${n.title}//`,\n newRawFullWidthTitleAfterGroup = newRawFullWidthTitle + halfWidthToFullWidthRange(range) + `;${n.fullWidthTitle ?? ''}//`;\n\n let titlesLengthInTOC = fixLength(getHalfWidthTitleLength(newRawTitleAfterGroup));\n\n if (useFullWidth) titlesLengthInTOC += fixLength(newRawFullWidthTitleAfterGroup.length * 2);\n\n if (availableCharactersForTitle - titlesLengthInTOC < 0) break;\n\n newRawTitle = newRawTitleAfterGroup;\n newRawFullWidthTitle = newRawFullWidthTitleAfterGroup;\n }\n\n let titlesLengthInTOC = fixLength(getHalfWidthTitleLength(newRawTitle));\n if (useFullWidth) titlesLengthInTOC += fixLength(newRawFullWidthTitle.length * 2); // If this check fails the titles without the groups already take too much space, don't change anything\n if (availableCharactersForTitle - titlesLengthInTOC < 0) {\n return null;\n }\n\n return {\n newRawTitle,\n newRawFullWidthTitle: useFullWidth ? newRawFullWidthTitle : '',\n };\n}\n\nexport function isSequential(numbers: number[]) {\n if (numbers.length === 0) return true;\n let last = numbers[0];\n for (let num of numbers) {\n if (num === last) {\n ++last;\n } else return false;\n }\n return true;\n}\n\nexport function asyncMutex(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n // This is meant to be used only with classes having a \"mutex\" instance property\n const oldValue = descriptor.value;\n descriptor.value = async function(...args: any) {\n const mutex = (this as any).mutex as Mutex;\n const release = await mutex.acquire();\n try {\n return await oldValue.apply(this, args);\n } finally {\n release();\n }\n };\n return descriptor;\n}\n\nexport function forAnyDesktop(theme: Theme) {\n return theme.breakpoints.up(600 + theme.spacing(2) * 2);\n}\n\nexport function belowDesktop(theme: Theme) {\n return theme.breakpoints.down(600 + theme.spacing(2) * 2);\n}\n\nexport function forWideDesktop(theme: Theme) {\n return theme.breakpoints.up(700 + theme.spacing(2) * 2) + ` and (min-height: 750px)`;\n}\n\nexport function askNotificationPermission(): Promise {\n // Adapted from: https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API/Using_the_Notifications_API\n function checkNotificationPromise() {\n try {\n Notification.requestPermission().then();\n } catch (e) {\n return false;\n }\n return true;\n }\n\n if (checkNotificationPromise()) {\n return Notification.requestPermission();\n } else {\n return new Promise(resolve => Notification.requestPermission(resolve));\n }\n}\n\ndeclare let process: any;\n","import {\n openNewDevice,\n NetMDInterface,\n Disc,\n listContent,\n openPairedDevice,\n Wireformat,\n MDTrack,\n download,\n getDeviceStatus,\n DeviceStatus,\n Group,\n} from 'netmd-js';\nimport { makeGetAsyncPacketIteratorOnWorkerThread } from 'netmd-js/dist/web-encrypt-worker';\nimport { Logger } from 'netmd-js/dist/logger';\nimport {\n asyncMutex,\n sanitizeHalfWidthTitle,\n sanitizeFullWidthTitle,\n sleep,\n isSequential,\n compileDiscTitles,\n recomputeGroupsAfterTrackMove,\n} from '../utils';\nimport { Mutex } from 'async-mutex';\n\nconst Worker = require('worker-loader!netmd-js/dist/web-encrypt-worker.js'); // eslint-disable-line import/no-webpack-loader-syntax\n\nexport interface NetMDService {\n mutex: Mutex;\n getDeviceStatus(): Promise;\n pair(): Promise;\n connect(): Promise;\n listContent(): Promise;\n getDeviceName(): Promise;\n finalize(): Promise;\n renameTrack(index: number, newTitle: string, newFullWidthTitle?: string): Promise;\n renameDisc(newName: string, newFullWidthName?: string): Promise;\n renameGroup(groupIndex: number, newTitle: string, newFullWidthTitle?: string): Promise;\n addGroup(groupBegin: number, groupLength: number, name: string): Promise;\n deleteGroup(groupIndex: number): Promise;\n rewriteGroups(groups: Group[]): Promise;\n deleteTracks(indexes: number[]): Promise;\n moveTrack(src: number, dst: number, updateGroups?: boolean): Promise;\n wipeDisc(): Promise;\n wipeDiscTitleInfo(): Promise;\n upload(\n title: string,\n fullWidthTitle: string,\n data: ArrayBuffer,\n format: Wireformat,\n progressCallback: (progress: { written: number; encrypted: number; total: number }) => void\n ): Promise;\n\n play(): Promise;\n pause(): Promise;\n stop(): Promise;\n next(): Promise;\n prev(): Promise;\n gotoTrack(index: number): Promise;\n getPosition(): Promise;\n}\n\nexport class NetMDUSBService implements NetMDService {\n private netmdInterface?: NetMDInterface;\n private logger?: Logger;\n private cachedContentList?: Disc;\n public mutex = new Mutex();\n public statusMonitorTimer: any;\n\n constructor({ debug = false }: { debug: boolean }) {\n if (debug) {\n // Logging a few methods that have been causing issues with some units\n const _fn = (...args: any) => {\n if (args && args[0] && args[0].method) {\n console.log(...args);\n }\n };\n this.logger = {\n debug: _fn,\n info: _fn,\n warn: _fn,\n error: _fn,\n child: () => this.logger!,\n };\n }\n }\n\n private async writeRawTitles(titleObject: { newRawTitle: string; newRawFullWidthTitle: string } | null) {\n if (titleObject === null) return;\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setDiscTitle(sanitizeHalfWidthTitle(titleObject.newRawTitle));\n await this.netmdInterface!.setDiscTitle(sanitizeFullWidthTitle(titleObject.newRawFullWidthTitle), true);\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n private async listContentUsingCache() {\n if (!this.cachedContentList) {\n console.log(\"There's no cached version of the TOC, caching\");\n this.cachedContentList = await listContent(this.netmdInterface!);\n } else {\n console.log(\"There's a cached TOC available.\");\n }\n return JSON.parse(JSON.stringify(this.cachedContentList)) as Disc;\n }\n\n private dropCachedContentList() {\n console.log('Cached TOC Dropped');\n this.cachedContentList = undefined;\n }\n\n async pair() {\n this.dropCachedContentList();\n let iface = await openNewDevice(navigator.usb, this.logger);\n if (iface === null) {\n return false;\n }\n this.netmdInterface = iface;\n return true;\n }\n\n async connect() {\n this.dropCachedContentList();\n let iface = await openPairedDevice(navigator.usb, this.logger);\n if (iface === null) {\n return false;\n }\n this.netmdInterface = iface;\n return true;\n }\n\n @asyncMutex\n async listContent() {\n this.dropCachedContentList();\n return await this.listContentUsingCache();\n }\n\n @asyncMutex\n async getDeviceStatus() {\n return await getDeviceStatus(this.netmdInterface!);\n }\n\n @asyncMutex\n async getDeviceName() {\n return await this.netmdInterface!.netMd.getDeviceName();\n }\n\n @asyncMutex\n async finalize() {\n await this.netmdInterface!.netMd.finalize();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async rewriteGroups(groups: Group[]) {\n const disc = await this.listContentUsingCache();\n disc.groups = groups;\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async renameTrack(index: number, title: string, fullWidthTitle?: string) {\n title = sanitizeHalfWidthTitle(title);\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setTrackTitle(index, title);\n if (fullWidthTitle !== undefined) {\n await this.netmdInterface!.setTrackTitle(index, sanitizeFullWidthTitle(fullWidthTitle), true);\n }\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async renameGroup(groupIndex: number, newName: string, newFullWidthName?: string) {\n const disc = await this.listContentUsingCache();\n let thisGroup = disc.groups.find(g => g.index === groupIndex);\n if (!thisGroup) {\n return;\n }\n\n thisGroup.title = newName;\n if (newFullWidthName !== undefined) {\n thisGroup.fullWidthTitle = newFullWidthName;\n }\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async addGroup(groupBegin: number, groupLength: number, title: string) {\n const disc = await this.listContentUsingCache();\n let ungrouped = disc.groups.find(n => n.title === null);\n if (!ungrouped) {\n return; // You can only group tracks that aren't already in a different group, if there's no such tracks, there's no point to continue\n }\n\n let ungroupedLengthBeforeGroup = ungrouped.tracks.length;\n\n let thisGroupTracks = ungrouped.tracks.filter(n => n.index >= groupBegin && n.index < groupBegin + groupLength);\n ungrouped.tracks = ungrouped.tracks.filter(n => !thisGroupTracks.includes(n));\n\n if (ungroupedLengthBeforeGroup - ungrouped.tracks.length !== groupLength) {\n throw new Error('A track cannot be in 2 groups!');\n }\n\n if (!isSequential(thisGroupTracks.map(n => n.index))) {\n throw new Error('Invalid sequence of tracks!');\n }\n\n disc.groups.push({\n title,\n fullWidthTitle: '',\n index: disc.groups.length,\n tracks: thisGroupTracks,\n });\n disc.groups = disc.groups.filter(g => g.tracks.length !== 0).sort((a, b) => a.tracks[0].index - b.tracks[0].index);\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async deleteGroup(index: number) {\n const disc = await this.listContentUsingCache();\n\n let groupIndex = disc.groups.findIndex(g => g.index === index);\n if (groupIndex >= 0) {\n disc.groups.splice(groupIndex, 1);\n }\n\n await this.writeRawTitles(compileDiscTitles(disc));\n }\n\n @asyncMutex\n async renameDisc(newName: string, newFullWidthName?: string) {\n // TODO: This whole function should be moved in netmd-js\n const oldName = await this.netmdInterface!.getDiscTitle();\n const oldFullWidthName = await this.netmdInterface!.getDiscTitle(true);\n const oldRawName = await this.netmdInterface!._getDiscTitle();\n const oldRawFullWidthName = await this.netmdInterface!._getDiscTitle(true);\n const hasGroups = oldRawName.indexOf('//') >= 0;\n const hasFullWidthGroups = oldRawName.indexOf('//') >= 0;\n const hasGroupsAndTitle = oldRawName.startsWith('0;');\n const hasFullWidthGroupsAndTitle = oldRawName.startsWith('0;');\n\n newName = sanitizeHalfWidthTitle(newName);\n newFullWidthName = newFullWidthName && sanitizeFullWidthTitle(newFullWidthName);\n\n if (newFullWidthName !== oldFullWidthName && newFullWidthName !== undefined) {\n let newFullWidthNameWithGroups;\n if (hasFullWidthGroups) {\n if (hasFullWidthGroupsAndTitle) {\n newFullWidthNameWithGroups = oldRawFullWidthName.replace(\n /^0;.*?///,\n newFullWidthName !== '' ? `0;${newFullWidthName}//` : ``\n );\n } else {\n newFullWidthNameWithGroups = `0;${newFullWidthName}//${oldRawFullWidthName}`; // Add the new title\n }\n } else {\n newFullWidthNameWithGroups = newFullWidthName;\n }\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setDiscTitle(newFullWidthNameWithGroups, true);\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n if (newName === oldName) {\n return;\n }\n\n let newNameWithGroups;\n\n if (hasGroups) {\n if (hasGroupsAndTitle) {\n newNameWithGroups = oldRawName.replace(/^0;.*?\\/\\//, newName !== '' ? `0;${newName}//` : ``); // Replace or delete the old title\n } else {\n newNameWithGroups = `0;${newName}//${oldRawName}`; // Add the new title\n }\n } else {\n newNameWithGroups = newName;\n }\n\n await this.netmdInterface!.cacheTOC();\n await this.netmdInterface!.setDiscTitle(newNameWithGroups);\n await this.netmdInterface!.syncTOC();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async deleteTracks(indexes: number[]) {\n indexes = indexes.sort();\n indexes.reverse();\n let content = await this.listContentUsingCache();\n for (let index of indexes) {\n content = recomputeGroupsAfterTrackMove(content, index, -1);\n await this.netmdInterface!.eraseTrack(index);\n await sleep(100);\n }\n await this.writeRawTitles(compileDiscTitles(content));\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async wipeDisc() {\n await this.netmdInterface!.eraseDisc();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async wipeDiscTitleInfo() {\n await this.writeRawTitles({\n newRawTitle: '',\n newRawFullWidthTitle: '',\n });\n }\n\n @asyncMutex\n async moveTrack(src: number, dst: number, updateGroups?: boolean) {\n await this.netmdInterface!.moveTrack(src, dst);\n\n if (updateGroups === undefined || updateGroups) {\n await this.writeRawTitles(compileDiscTitles(recomputeGroupsAfterTrackMove(await this.listContentUsingCache(), src, dst)));\n }\n this.dropCachedContentList();\n }\n\n async upload(\n title: string,\n fullWidthTitle: string,\n data: ArrayBuffer,\n format: Wireformat,\n progressCallback: (progress: { written: number; encrypted: number; total: number }) => void\n ) {\n let total = data.byteLength;\n let written = 0;\n let encrypted = 0;\n function updateProgress() {\n progressCallback({ written, encrypted, total });\n }\n\n let w = new Worker();\n\n let webWorkerAsyncPacketIterator = makeGetAsyncPacketIteratorOnWorkerThread(w, ({ encryptedBytes }) => {\n encrypted = encryptedBytes;\n updateProgress();\n });\n\n let halfWidthTitle = sanitizeHalfWidthTitle(title);\n fullWidthTitle = sanitizeFullWidthTitle(fullWidthTitle);\n let mdTrack = new MDTrack(halfWidthTitle, format, data, 0x80000, fullWidthTitle, webWorkerAsyncPacketIterator);\n\n await download(this.netmdInterface!, mdTrack, ({ writtenBytes }) => {\n written = writtenBytes;\n updateProgress();\n });\n\n w.terminate();\n this.dropCachedContentList();\n }\n\n @asyncMutex\n async play() {\n await this.netmdInterface!.play();\n }\n @asyncMutex\n async pause() {\n await this.netmdInterface!.pause();\n }\n @asyncMutex\n async stop() {\n await this.netmdInterface!.stop();\n }\n @asyncMutex\n async next() {\n await this.netmdInterface!.nextTrack();\n }\n @asyncMutex\n async prev() {\n await this.netmdInterface!.previousTrack();\n }\n\n @asyncMutex\n async gotoTrack(index: number) {\n await this.netmdInterface!.gotoTrack(index);\n }\n\n @asyncMutex\n async getPosition() {\n return await this.netmdInterface!.getPosition();\n }\n}\n","import { NetMDService } from './netmd';\nimport { AudioExportService } from './audio-export';\nimport { MediaRecorderService } from './mediarecorder';\n\ninterface ServiceRegistry {\n netmdService?: NetMDService;\n audioExportService?: AudioExportService;\n mediaRecorderService?: MediaRecorderService;\n}\n\nconst ServiceRegistry: ServiceRegistry = {};\n\nexport default ServiceRegistry;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface LoadingDialogState {\n visible: boolean;\n cancelled: boolean;\n\n writtenProgress: number;\n encryptedProgress: number;\n totalProgress: number;\n\n trackTotal: number;\n trackConverting: number;\n trackCurrent: number;\n\n titleCurrent: string;\n titleConverting: string;\n}\n\nconst initialState: LoadingDialogState = {\n visible: false,\n cancelled: false,\n\n // Current Track Upload\n writtenProgress: 0,\n encryptedProgress: 0,\n totalProgress: 1,\n\n // Tracks done\n trackTotal: 1,\n trackConverting: 0,\n trackCurrent: 0,\n titleCurrent: '',\n titleConverting: '',\n};\n\nexport const slice = createSlice({\n name: 'uploadDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setWriteProgress: (state, action: PayloadAction<{ written: number; encrypted: number; total: number }>) => {\n state.encryptedProgress = action.payload.encrypted;\n state.writtenProgress = action.payload.written;\n state.totalProgress = action.payload.total;\n },\n setCancelUpload: (state, action: PayloadAction) => {\n state.cancelled = action.payload;\n },\n setTrackProgress: (\n state,\n action: PayloadAction<{ total: number; current: number; converting: number; titleCurrent: string; titleConverting: string }>\n ) => {\n state.trackTotal = action.payload.total;\n state.trackCurrent = action.payload.current;\n state.trackConverting = action.payload.converting;\n state.titleCurrent = action.payload.titleCurrent;\n state.titleConverting = action.payload.titleConverting;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface RenameDialogState {\n visible: boolean;\n title: string;\n fullWidthTitle: string;\n index: number;\n groupIndex: number | null;\n}\n\nconst initialState: RenameDialogState = {\n visible: false,\n title: '',\n fullWidthTitle: '',\n index: -1,\n groupIndex: null,\n};\n\nexport const slice = createSlice({\n name: 'renameDialog',\n initialState,\n reducers: {\n setVisible: (state: RenameDialogState, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setCurrentName: (state: RenameDialogState, action: PayloadAction) => {\n state.title = action.payload;\n },\n setCurrentFullWidthName: (state: RenameDialogState, action: PayloadAction) => {\n state.fullWidthTitle = action.payload;\n },\n setIndex: (state: RenameDialogState, action: PayloadAction) => {\n state.index = action.payload;\n },\n setGroupIndex: (state: RenameDialogState, action: PayloadAction) => {\n state.groupIndex = action.payload;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface ErrorDialogState {\n visible: boolean;\n error: string;\n}\n\nconst initialState: ErrorDialogState = {\n visible: false,\n error: ``,\n};\n\nconst slice = createSlice({\n name: 'errorDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setErrorMessage: (state, action: PayloadAction) => {\n state.error = `${action.payload}`;\n },\n },\n});\n\nexport const { actions, reducer } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport const initialState = {\n visible: false,\n dismissed: false, // This will prevent showing the dialog during the same session\n};\n\nconst slice = createSlice({\n name: 'panicDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n dismiss: (state, action: PayloadAction) => {\n state.visible = false;\n state.dismissed = true;\n },\n },\n});\n\nexport const { actions, reducer } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\nimport { savePreference, loadPreference } from '../utils';\n\nexport type TitleFormatType = 'filename' | 'title' | 'album-title' | 'artist-title' | 'artist-album-title' | 'title-artist';\nexport type UploadFormat = 'SP' | 'LP2' | 'LP4';\n\nexport interface ConvertDialogFeature {\n visible: boolean;\n format: UploadFormat;\n titleFormat: TitleFormatType;\n}\n\nconst initialState: ConvertDialogFeature = {\n visible: false,\n format: loadPreference('uploadFormat', 'LP2') as UploadFormat,\n titleFormat: loadPreference('trackTitleFormat', 'filename') as TitleFormatType,\n};\n\nconst slice = createSlice({\n name: 'convertDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setFormat: (state, action: PayloadAction) => {\n state.format = action.payload;\n savePreference('uploadFormat', state.format);\n },\n setTitleFormat: (state, action: PayloadAction) => {\n state.titleFormat = action.payload;\n savePreference('trackTitleFormat', state.titleFormat);\n },\n },\n});\n\nexport const { actions, reducer } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface DumpDialogState {\n visible: boolean;\n inputDeviceId: string;\n}\n\nconst initialState: DumpDialogState = {\n visible: false,\n inputDeviceId: '',\n};\n\nexport const slice = createSlice({\n name: 'dumpDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setInputDeviceId: (state, action: PayloadAction) => {\n state.inputDeviceId = action.payload;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface RecordingDialogState {\n visible: boolean;\n\n trackTotal: number;\n trackDone: number;\n trackCurrent: number;\n\n titleCurrent: string;\n}\n\nconst initialState: RecordingDialogState = {\n visible: false,\n\n trackTotal: 1,\n trackDone: 0,\n trackCurrent: 0,\n\n titleCurrent: '',\n\n // visible: true,\n // trackTotal: 4,\n // trackDone: 1,\n // trackCurrent: 25,\n\n // titleCurrent: 'Seconda traccia',\n};\n\nexport const slice = createSlice({\n name: 'recordDialog',\n initialState,\n reducers: {\n setVisible: (state, action: PayloadAction) => {\n state.visible = action.payload;\n },\n setProgress: (\n state,\n action: PayloadAction<{ trackTotal: number; trackDone: number; trackCurrent: number; titleCurrent: string }>\n ) => {\n state.trackTotal = action.payload.trackTotal;\n state.trackDone = action.payload.trackDone;\n state.trackCurrent = action.payload.trackCurrent;\n state.titleCurrent = action.payload.titleCurrent;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\nimport { savePreference, loadPreference } from '../utils';\n\nexport type Views = 'WELCOME' | 'MAIN';\n\nexport interface AppState {\n mainView: Views;\n loading: boolean;\n pairingFailed: boolean;\n pairingMessage: string;\n browserSupported: boolean;\n darkMode: boolean;\n vintageMode: boolean;\n aboutDialogVisible: boolean;\n notifyWhenFinished: boolean;\n hasNotificationSupport: boolean;\n fullWidthSupport: boolean;\n}\n\nexport const buildInitialState = (): AppState => {\n return {\n mainView: 'WELCOME',\n loading: false,\n pairingFailed: false,\n pairingMessage: ``,\n browserSupported: true,\n darkMode: loadPreference('darkMode', false),\n vintageMode: loadPreference('vintageMode', false),\n aboutDialogVisible: false,\n notifyWhenFinished: loadPreference('notifyWhenFinished', false),\n hasNotificationSupport: true,\n fullWidthSupport: loadPreference('fullWidthSupport', false),\n };\n};\n\nconst initialState: AppState = buildInitialState();\n\nexport const slice = createSlice({\n name: 'app',\n initialState,\n reducers: {\n setMainView: (state, action: PayloadAction) => {\n // CAVEAT: There's a middleware that resets the state when mainView is set to WELCOME\n state.mainView = action.payload;\n },\n setLoading: (state, action: PayloadAction) => {\n state.loading = action.payload;\n },\n setPairingFailed: (state, action: PayloadAction) => {\n state.pairingFailed = action.payload;\n },\n setPairingMessage: (state, action: PayloadAction) => {\n state.pairingMessage = action.payload;\n },\n setBrowserSupported: (state, action: PayloadAction) => {\n state.browserSupported = action.payload;\n },\n setDarkMode: (state, action: PayloadAction) => {\n state.darkMode = action.payload;\n savePreference('darkMode', state.darkMode);\n },\n setNotifyWhenFinished: (state, action: PayloadAction) => {\n state.notifyWhenFinished = action.payload;\n savePreference('notifyWhenFinished', action.payload);\n },\n setNotificationSupport: (state, action: PayloadAction) => {\n state.hasNotificationSupport = action.payload;\n },\n setVintageMode: (state, action: PayloadAction) => {\n state.vintageMode = action.payload;\n savePreference('vintageMode', action.payload);\n },\n showAboutDialog: (state, action: PayloadAction) => {\n state.aboutDialogVisible = action.payload;\n },\n setFullWidthSupport: (state, action: PayloadAction) => {\n state.fullWidthSupport = action.payload;\n savePreference('fullWidthSupport', state.fullWidthSupport);\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { Disc, DeviceStatus } from 'netmd-js';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { enableBatching } from 'redux-batched-actions';\n\nexport interface MainState {\n disc: Disc | null;\n deviceName: string;\n deviceStatus: DeviceStatus | null;\n}\n\nconst initialState: MainState = {\n disc: null,\n deviceName: '',\n deviceStatus: null,\n};\n\nexport const slice = createSlice({\n name: 'main',\n initialState,\n reducers: {\n setDisc: (state, action: PayloadAction) => {\n state.disc = action.payload;\n },\n setDeviceName: (state, action: PayloadAction) => {\n state.deviceName = action.payload;\n },\n setDeviceStatus: (state, action: PayloadAction) => {\n state.deviceStatus = action.payload;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\nexport default enableBatching(reducer);\n","import { configureStore, getDefaultMiddleware, Middleware, combineReducers } from '@reduxjs/toolkit';\nimport uploadDialog from './upload-dialog-feature';\nimport renameDialog from './rename-dialog-feature';\nimport errorDialog from './error-dialog-feature';\nimport panicDialog, { actions as panicDialogActions } from './panic-dialog-feature';\nimport convertDialog from './convert-dialog-feature';\nimport dumpDialog from './dump-dialog-feature';\nimport recordDialog from './record-dialog-feature';\nimport appState, { actions as appActions, buildInitialState as buildInitialAppState } from './app-feature';\nimport main from './main-feature';\n\nconst errorCatcher: Middleware = store => next => async action => {\n try {\n await next(action);\n } catch (e) {\n console.error(e);\n next(panicDialogActions.setVisible(true));\n }\n};\n\nlet reducer = combineReducers({\n renameDialog,\n uploadDialog,\n errorDialog,\n panicDialog,\n convertDialog,\n dumpDialog,\n recordDialog,\n appState,\n main,\n});\n\nconst resetStateAction = appActions.setMainView.toString();\nconst resetStatePayoload = 'WELCOME';\nconst resetStateReducer: typeof reducer = function(...args) {\n const [state, action] = args;\n if (action.type === resetStateAction && action.payload === resetStatePayoload) {\n return {\n ...initialState,\n appState: buildInitialAppState(),\n };\n }\n return reducer(...args);\n};\n\nexport const store = configureStore({\n reducer: resetStateReducer,\n middleware: [errorCatcher, ...getDefaultMiddleware()],\n});\n\nconst initialState = Object.freeze(store.getState());\n\nexport type RootState = ReturnType;\nexport type AppDispatch = typeof store.dispatch;\n","import { batchActions } from 'redux-batched-actions';\nimport { AppDispatch, RootState } from './store';\nimport { actions as uploadDialogActions } from './upload-dialog-feature';\nimport { actions as renameDialogActions } from './rename-dialog-feature';\nimport { actions as errorDialogAction } from './error-dialog-feature';\nimport { actions as recordDialogAction } from './record-dialog-feature';\nimport { actions as appStateActions } from './app-feature';\nimport { actions as mainActions } from './main-feature';\nimport serviceRegistry from '../services/registry';\nimport { Wireformat, getTracks } from 'netmd-js';\nimport { AnyAction } from '@reduxjs/toolkit';\nimport {\n getAvailableCharsForTitle,\n framesToSec,\n sleepWithProgressCallback,\n sleep,\n askNotificationPermission,\n getGroupedTracks,\n getHalfWidthTitleLength,\n} from '../utils';\nimport * as mm from 'music-metadata-browser';\nimport { TitleFormatType, UploadFormat } from './convert-dialog-feature';\nimport NotificationCompleteIconUrl from '../images/record-complete-notification-icon.png';\nimport { assertNumber } from 'netmd-js/dist/utils';\n\nexport function control(action: 'play' | 'stop' | 'next' | 'prev' | 'goto' | 'pause', params?: unknown) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n switch (action) {\n case 'play':\n await serviceRegistry.netmdService!.play();\n break;\n case 'stop':\n await serviceRegistry.netmdService!.stop();\n break;\n case 'next':\n await serviceRegistry.netmdService!.next();\n break;\n case 'prev':\n await serviceRegistry.netmdService!.prev();\n break;\n case 'pause':\n await serviceRegistry.netmdService!.pause();\n break;\n case 'goto':\n const trackNumber = assertNumber(params, 'Invalid track number for \"goto\" command');\n await serviceRegistry.netmdService!.gotoTrack(trackNumber);\n break;\n }\n // CAVEAT: change-track might take a up to a few seconds to complete.\n // We wait 500ms and let the monitor do further updates\n await sleep(500);\n try {\n let deviceStatus = await serviceRegistry.netmdService!.getDeviceStatus();\n dispatch(mainActions.setDeviceStatus(deviceStatus));\n } catch (e) {\n console.log('control: Cannot get device status');\n }\n };\n}\n\nexport function renameGroup({ groupIndex, newName, newFullWidthName }: { groupIndex: number; newName: string; newFullWidthName?: string }) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n await serviceRegistry!.netmdService?.renameGroup(groupIndex, newName, newFullWidthName);\n listContent()(dispatch);\n };\n}\n\nexport function groupTracks(indexes: number[]) {\n return async function(dispatch: AppDispatch) {\n let begin = indexes[0];\n let length = indexes[indexes.length - 1] - begin + 1;\n const { netmdService } = serviceRegistry;\n\n netmdService!.addGroup(begin, length, '');\n listContent()(dispatch);\n };\n}\n\nexport function deleteGroup(index: number) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n netmdService!.deleteGroup(index);\n listContent()(dispatch);\n };\n}\n\nexport function dragDropTrack(sourceList: number, sourceIndex: number, targetList: number, targetIndex: number) {\n // This code is here, because it would need to be duplicated in both netmd and netmd-mock.\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n if (sourceList === targetList && sourceIndex === targetIndex) return;\n dispatch(appStateActions.setLoading(true));\n const groupedTracks = getGroupedTracks(await serviceRegistry.netmdService!.listContent());\n // Remove the moved item from its current list\n let movedItem = groupedTracks[sourceList].tracks.splice(sourceIndex, 1)[0];\n let newIndex: number;\n\n // Calculate bounds\n let boundsStartList, boundsEndList, boundsStartIndex, boundsEndIndex, offset;\n\n if (sourceList < targetList) {\n boundsStartList = sourceList;\n boundsStartIndex = sourceIndex;\n boundsEndList = targetList;\n boundsEndIndex = targetIndex;\n offset = -1;\n } else if (sourceList > targetList) {\n boundsStartList = targetList;\n boundsStartIndex = targetIndex;\n boundsEndList = sourceList;\n boundsEndIndex = sourceIndex;\n offset = 1;\n } else {\n if (sourceIndex < targetIndex) {\n boundsStartList = boundsEndList = sourceList;\n boundsStartIndex = sourceIndex;\n boundsEndIndex = targetIndex;\n offset = -1;\n } else {\n boundsStartList = boundsEndList = targetList;\n boundsStartIndex = targetIndex;\n boundsEndIndex = sourceIndex;\n offset = 1;\n }\n }\n\n // Shift indices\n for (let i = boundsStartList; i <= boundsEndList; i++) {\n let startingIndex = i === boundsStartList ? boundsStartIndex : 0;\n let endingIndex = i === boundsEndList ? boundsEndIndex : groupedTracks[i].tracks.length;\n for (let j = startingIndex; j < endingIndex; j++) {\n groupedTracks[i].tracks[j].index += offset;\n }\n }\n\n // Calculate the moved track's destination index\n if (targetList === 0) {\n newIndex = targetIndex;\n } else {\n if (targetIndex === 0) {\n let prevList = groupedTracks[targetList - 1];\n let i = 2;\n while (prevList && prevList.tracks.length === 0) {\n // Skip past all the empty lists\n prevList = groupedTracks[targetList - i++];\n }\n if (prevList) {\n // If there's a previous list, make this tracks's index previous list's last item's index + 1\n let lastIndexOfPrevList = prevList.tracks[prevList.tracks.length - 1].index;\n newIndex = lastIndexOfPrevList + 1;\n } else newIndex = 0; // Else default to index 0\n } else {\n newIndex = groupedTracks[targetList].tracks[0].index + targetIndex;\n }\n }\n\n if (movedItem.index !== newIndex) {\n await serviceRegistry!.netmdService!.moveTrack(movedItem.index, newIndex, false);\n }\n\n movedItem.index = newIndex;\n groupedTracks[targetList].tracks.splice(targetIndex, 0, movedItem);\n let ungrouped = [];\n\n // Recompile the groups and update them on the player\n let normalGroups = [];\n for (let group of groupedTracks) {\n if (group.tracks.length === 0) continue;\n if (group.index === -1) ungrouped.push(...group.tracks);\n else normalGroups.push(group);\n }\n if (ungrouped.length)\n normalGroups.unshift({\n index: 0,\n title: null,\n fullWidthTitle: null,\n tracks: ungrouped,\n });\n await serviceRegistry.netmdService!.rewriteGroups(normalGroups);\n listContent()(dispatch);\n };\n}\n\nexport function pair() {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n dispatch(appStateActions.setPairingFailed(false));\n\n await serviceRegistry.audioExportService!.init();\n\n try {\n let connected = await serviceRegistry.netmdService!.connect();\n if (connected) {\n dispatch(appStateActions.setMainView('MAIN'));\n return;\n }\n } catch (err) {\n console.error(err);\n // In case of error, just log and try to pair\n }\n\n try {\n let paired = await serviceRegistry.netmdService!.pair();\n if (paired) {\n dispatch(appStateActions.setMainView('MAIN'));\n return;\n }\n dispatch(batchActions([appStateActions.setPairingMessage(`Connection Failed`), appStateActions.setPairingFailed(true)]));\n } catch (err) {\n console.error(err);\n let message = (err as Error).message;\n dispatch(batchActions([appStateActions.setPairingMessage(message), appStateActions.setPairingFailed(true)]));\n }\n };\n}\n\nexport function listContent() {\n return async function(dispatch: AppDispatch) {\n // Issue loading\n dispatch(appStateActions.setLoading(true));\n let disc;\n try {\n disc = await serviceRegistry.netmdService!.listContent();\n } catch (err) {\n if (window.confirm(\"This disc's title seems to be corrupted, do you wish to erase it?\\nNone of the tracks will be deleted.\")) {\n await serviceRegistry.netmdService!.wipeDiscTitleInfo();\n disc = await serviceRegistry.netmdService!.listContent();\n } else throw err;\n }\n let deviceName = await serviceRegistry.netmdService!.getDeviceName();\n let deviceStatus = null;\n try {\n deviceStatus = await serviceRegistry.netmdService!.getDeviceStatus();\n } catch (e) {\n console.log('listContent: Cannot get device status');\n }\n dispatch(\n batchActions([\n mainActions.setDisc(disc),\n mainActions.setDeviceName(deviceName),\n mainActions.setDeviceStatus(deviceStatus),\n appStateActions.setLoading(false),\n ])\n );\n };\n}\n\nexport function renameTrack({ index, newName, newFullWidthName }: { index: number; newName: string; newFullWidthName?: string }) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n dispatch(renameDialogActions.setVisible(false));\n try {\n await netmdService!.renameTrack(index, newName, newFullWidthName);\n } catch (err) {\n console.error(err);\n dispatch(batchActions([errorDialogAction.setVisible(true), errorDialogAction.setErrorMessage(`Rename failed.`)]));\n }\n listContent()(dispatch);\n };\n}\n\nexport function renameDisc({ newName, newFullWidthName }: { newName: string; newFullWidthName?: string }) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n await netmdService!.renameDisc(\n newName.replace(/\\/\\//g, ' /'), // Make sure the title doesn't interfere with the groups\n newFullWidthName?.replace(////g, '/')\n );\n dispatch(renameDialogActions.setVisible(false));\n listContent()(dispatch);\n };\n}\n\nexport function deleteTracks(indexes: number[]) {\n return async function(dispatch: AppDispatch) {\n const confirmation = window.confirm(\n `Proceed with Delete Track${indexes.length !== 1 ? 's' : ''}? This operation cannot be undone.`\n );\n if (!confirmation) {\n return;\n }\n const { netmdService } = serviceRegistry;\n dispatch(appStateActions.setLoading(true));\n await netmdService!.deleteTracks(indexes);\n listContent()(dispatch);\n };\n}\n\nexport function wipeDisc() {\n return async function(dispatch: AppDispatch) {\n const confirmation = window.confirm(`Proceed with Wipe Disc? This operation cannot be undone.`);\n if (!confirmation) {\n return;\n }\n const { netmdService } = serviceRegistry;\n dispatch(appStateActions.setLoading(true));\n await netmdService!.wipeDisc();\n listContent()(dispatch);\n };\n}\n\nexport function moveTrack(srcIndex: number, destIndex: number) {\n return async function(dispatch: AppDispatch) {\n const { netmdService } = serviceRegistry;\n await netmdService!.moveTrack(srcIndex, destIndex);\n listContent()(dispatch);\n };\n}\n\nexport function recordTracks(indexes: number[], deviceId: string) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n dispatch(\n batchActions([\n recordDialogAction.setVisible(true),\n recordDialogAction.setProgress({ trackTotal: indexes.length, trackDone: 0, trackCurrent: 0, titleCurrent: '' }),\n ])\n );\n\n let disc = getState().main.disc;\n let tracks = getTracks(disc!).filter(t => indexes.indexOf(t.index) >= 0);\n\n const { netmdService, mediaRecorderService } = serviceRegistry;\n await serviceRegistry.netmdService!.stop();\n\n for (let [i, track] of tracks.entries()) {\n dispatch(\n recordDialogAction.setProgress({\n trackTotal: tracks.length,\n trackDone: i,\n trackCurrent: -1,\n titleCurrent: track.title ?? '',\n })\n );\n\n // Wait for the track to be ready to play from 0:00\n await netmdService!.gotoTrack(track.index);\n await netmdService!.play();\n console.log('Waiting for track to be ready to play');\n let position = await netmdService!.getPosition();\n let expected = [track.index, 0, 0, 1];\n while (position === null || !expected.every((_, i) => expected[i] === position![i])) {\n await sleep(250);\n position = await netmdService!.getPosition();\n }\n await netmdService!.pause();\n await netmdService?.gotoTrack(track.index);\n console.log('Track is ready to play');\n\n // Start recording and play track\n await mediaRecorderService?.initStream(deviceId);\n await mediaRecorderService?.startRecording();\n await netmdService!.play();\n\n // Wait until track is finished\n let durationInSec = framesToSec(track.duration);\n // await sleep(durationInSec * 1000);\n await sleepWithProgressCallback(durationInSec * 1000, (perc: number) => {\n dispatch(\n recordDialogAction.setProgress({\n trackTotal: tracks.length,\n trackDone: i,\n trackCurrent: perc,\n titleCurrent: track.title ?? '',\n })\n );\n });\n\n // Stop recording and download the wav\n await mediaRecorderService?.stopRecording();\n mediaRecorderService?.downloadRecorded(`${track.title}`);\n\n await mediaRecorderService?.closeStream();\n }\n\n await netmdService!.stop();\n dispatch(recordDialogAction.setVisible(false));\n };\n}\n\nexport function setNotifyWhenFinished(value: boolean) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n if (Notification.permission !== 'granted') {\n const confirmation = window.confirm(`Enable Notification on recording completed?`);\n if (!confirmation) {\n return;\n }\n const result = await askNotificationPermission();\n if (result !== 'granted') {\n dispatch(appStateActions.setNotificationSupport(false));\n dispatch(appStateActions.setNotifyWhenFinished(false));\n return;\n }\n }\n dispatch(appStateActions.setNotifyWhenFinished(value));\n };\n}\n\nexport const WireformatDict: { [k: string]: Wireformat } = {\n SP: Wireformat.pcm,\n LP2: Wireformat.lp2,\n LP105: Wireformat.l105kbps,\n LP4: Wireformat.lp4,\n};\n\nasync function getTrackNameFromMediaTags(file: File, titleFormat: TitleFormatType) {\n const fileData = await file.arrayBuffer();\n const blob = new Blob([new Uint8Array(fileData)]);\n let metadata = await mm.parseBlob(blob);\n const title = metadata.common.title ?? 'Unknown Title';\n const artist = metadata.common.artist ?? 'Unknown Artist';\n const album = metadata.common.album ?? 'Unknown Album';\n switch (titleFormat) {\n case 'title': {\n return title;\n }\n case 'artist-title': {\n return `${artist} - ${title}`;\n }\n case 'title-artist': {\n return `${title} - ${artist}`;\n }\n case 'album-title': {\n return `${album} - ${title}`;\n }\n case 'artist-album-title': {\n return `${artist} - ${album} - ${title}`;\n }\n case 'filename': {\n let title = file.name;\n // Remove file extension\n const extStartIndex = title.lastIndexOf('.');\n if (extStartIndex > 0) {\n title = title.substring(0, extStartIndex);\n }\n return title;\n }\n }\n}\n\nexport function convertAndUpload(files: File[], format: UploadFormat, titleFormat: TitleFormatType) {\n return async function(dispatch: AppDispatch, getState: () => RootState) {\n const { audioExportService, netmdService } = serviceRegistry;\n const wireformat = WireformatDict[format];\n\n await netmdService?.stop();\n dispatch(batchActions([uploadDialogActions.setVisible(true), uploadDialogActions.setCancelUpload(false)]));\n\n const updateProgressCallback = ({ written, encrypted, total }: { written: number; encrypted: number; total: number }) => {\n dispatch(uploadDialogActions.setWriteProgress({ written, encrypted, total }));\n };\n\n const hasUploadBeenCancelled = () => {\n return getState().uploadDialog.cancelled;\n };\n\n function showFinishedNotificationIfNeeded() {\n const { notifyWhenFinished, hasNotificationSupport } = getState().appState;\n if (!hasNotificationSupport || !notifyWhenFinished) {\n return;\n }\n const notification = new Notification('MiniDisc recording completed', {\n icon: NotificationCompleteIconUrl,\n });\n notification.onclick = function() {\n window.focus();\n this.close();\n };\n }\n\n let trackUpdate: {\n current: number;\n converting: number;\n total: number;\n titleCurrent: string;\n titleConverting: string;\n } = {\n current: 0,\n converting: 0,\n total: files.length,\n titleCurrent: '',\n titleConverting: '',\n };\n const updateTrack = () => {\n dispatch(uploadDialogActions.setTrackProgress(trackUpdate));\n };\n\n let conversionIterator = async function*(files: File[]) {\n let converted: Promise<{ file: File; data: ArrayBuffer }>[] = [];\n\n let i = 0;\n function convertNext() {\n if (i === files.length || hasUploadBeenCancelled()) {\n trackUpdate.converting = i;\n trackUpdate.titleConverting = ``;\n updateTrack();\n return;\n }\n\n let f = files[i];\n trackUpdate.converting = i;\n trackUpdate.titleConverting = f.name;\n updateTrack();\n i++;\n\n converted.push(\n new Promise(async (resolve, reject) => {\n let data: ArrayBuffer;\n try {\n await audioExportService!.prepare(f);\n data = await audioExportService!.export({ format });\n convertNext();\n resolve({ file: f, data: data });\n } catch (err) {\n error = err;\n errorMessage = `${f.name}: Unsupported or unrecognized format`;\n reject(err);\n }\n })\n );\n }\n convertNext();\n\n let j = 0;\n while (j < converted.length) {\n yield await converted[j];\n delete converted[j];\n j++;\n }\n };\n\n let disc = getState().main.disc;\n let useFullWidth = getState().appState.fullWidthSupport;\n let availableCharacters = getAvailableCharsForTitle(disc!);\n\n let error: any;\n let errorMessage = ``;\n let i = 1;\n for await (let item of conversionIterator(files)) {\n if (hasUploadBeenCancelled()) {\n break;\n }\n\n const { file, data } = item;\n\n let title = file.name;\n try {\n title = await getTrackNameFromMediaTags(file, titleFormat);\n } catch (err) {\n console.error(err);\n }\n\n const fixLength = (l: number) => Math.ceil(l / 7) * 7;\n let halfWidthTitle = title.substr(0, Math.min(getHalfWidthTitleLength(title), availableCharacters));\n availableCharacters -= fixLength(getHalfWidthTitleLength(halfWidthTitle));\n\n let fullWidthTitle = '';\n if (useFullWidth) {\n fullWidthTitle = title.substr(0, Math.min(title.length * 2, availableCharacters, 210 /* limit is 105 */) / 2);\n availableCharacters -= fixLength(fullWidthTitle.length * 2);\n }\n\n trackUpdate.current = i++;\n trackUpdate.titleCurrent = halfWidthTitle;\n updateTrack();\n updateProgressCallback({ written: 0, encrypted: 0, total: 100 });\n try {\n await netmdService?.upload(halfWidthTitle, fullWidthTitle, data, wireformat, updateProgressCallback);\n } catch (err) {\n error = err;\n errorMessage = `${file.name}: Error uploading to device. There might not be enough space left.`;\n break;\n }\n }\n\n let actionToDispatch: AnyAction[] = [uploadDialogActions.setVisible(false)];\n\n if (error) {\n console.error(error);\n actionToDispatch = actionToDispatch.concat([\n errorDialogAction.setVisible(true),\n errorDialogAction.setErrorMessage(errorMessage),\n ]);\n }\n\n dispatch(batchActions(actionToDispatch));\n showFinishedNotificationIfNeeded();\n listContent()(dispatch);\n };\n}\n","import { Button, Window, WindowContent, TableRow } from 'react95';\nimport styled from 'styled-components';\n\nexport const DialogOverlay = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2;\n`;\n\nexport const DialogWindow = styled(Window)`\n width: 80%;\n left: 10%;\n top: 20%;\n`;\n\nexport const DialogFooter = styled.div`\n display: flex;\n justify-content: flex-end;\n padding-top: 16px;\n width: 100%;\n`;\n\nexport const DialogWindowContent = styled(WindowContent)`\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport const FooterButton = styled(Button)`\n margin-left: 16px;\n min-width: 90px;\n`;\n\nexport const CustomTableRow = styled(TableRow)`\n cursor: default;\n &:hover {\n color: ${(styled: any) => styled.theme.canvasText};\n background-color: initial;\n }\n`;\n\nexport const WindowCloseIcon = styled.span`\n display: inline-block;\n width: 16px;\n height: 16px;\n margin-left: -1px;\n margin-top: -1px;\n transform: rotateZ(45deg);\n position: relative;\n\n &:before {\n content: '';\n position: absolute;\n height: 100%;\n width: 3px;\n left: 50%;\n transform: translateX(-50%);\n background-color: #0a0a0a;\n }\n\n &:after {\n content: '';\n position: absolute;\n height: 3px;\n width: 100%;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n background-color: #0a0a0a;\n }\n`;\n\nexport const FloatingButton = styled.button`\n width: 60px;\n height: 60px;\n position: absolute;\n bottom: 40px;\n right: 24px;\n z-index: 1;\n border-radius: 50%;\n background: rgb(185, 106, 201);\n border-width: 4px;\n border-style: solid;\n border-color: rgb(233, 128, 252) rgb(111, 45, 189) rgb(111, 45, 189) rgb(233, 128, 252);\n box-shadow: rgb(0 0 0 / 45%) 4px 4px 10px 0px;\n\n &:after {\n content: '';\n display: inline-block;\n width: 100%;\n height: 100%;\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADKgAAAyoBEJdYGAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHWSURBVHic7d3BbdYwGIDhz1wYAakXNmOGdhKY4d+MC1JH4BQurcQ1EmmE3+cZwLbkV04OjrKO45idrLWeZ+b7RcO/HMfx46Kxb/Hp7gVwLwHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAuB0DePpPx77F2umXMWutzzPzc2a+XDTF68x8PY7j90Xjf7g1M893L+IfeZqZb3Pd5r97nZnHzPy6eJ4PsWZmnyOA03Z8B+AEAcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAohzLfy8va6F+zDklO0+DNnqEfC2MY8Lp3jstPkzmwXw5sqjeYtj/287BsAJAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxfwAw2y4BcmRzJgAAAABJRU5ErkJggg==');\n background-size: 30px;\n background-repeat: no-repeat;\n filter: drop-shadow(rgb(233, 128, 252) 1px 1px 0px) drop-shadow(rgb(111, 45, 189) -1px -1px 0px);\n background-position: center center;\n }\n\n &:active {\n border-width: 4px;\n border-style: solid;\n border-color: rgb(111, 45, 189) rgb(233, 128, 252) rgb(233, 128, 252) rgb(111, 45, 189);\n box-shadow: rgb(0 0 0 / 55%) 3px 3px 5px 0px;\n }\n`;\n","import React from 'react';\nimport { Button, WindowHeader, Anchor } from 'react95';\nimport { FooterButton, DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent, WindowCloseIcon } from './common';\n\nexport const W95AboutDialog = (props: { visible: boolean; handleClose: () => void }) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n \n \n \n About Web MiniDisc\n \n \n \n Web MiniDisc uses\n
    \n
  • \n \n FFmpeg\n {' '}\n and{' '}\n \n ffmpegjs\n \n , to read your audio files (wav, mp3, ogg, mp4, etc...).\n
  • \n
  • \n \n Atracdenc\n \n , to support atrac3 encoding (lp2, lp4 audio formats).\n
  • \n
  • \n \n Emscripten\n \n , to run both FFmpeg and Atracdenc in the browser.\n
  • \n
  • \n \n netmd-js\n \n , to send commands to NetMD devices using Javascript.\n
  • \n
  • \n \n linux-minidisc\n \n , to make the netmd-js project possible.\n
  • \n
  • \n \n react85\n \n , to build the vintage user interface.\n
  • \n
  • \n \n material-ui\n \n , to build the user interface.\n
  • \n
\n \n OK\n \n
\n
\n
\n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { actions as appActions } from '../redux/app-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport Link from '@material-ui/core/Link';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95AboutDialog } from './win95/about-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const AboutDialog = (props: {}) => {\n const dispatch = useDispatch();\n\n let visible = useShallowEqualSelector(state => state.appState.aboutDialogVisible);\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n\n const handleClose = () => {\n dispatch(appActions.showAboutDialog(false));\n };\n\n if (vintageMode) {\n const p = {\n visible,\n handleClose,\n };\n return ;\n }\n\n return (\n \n About Web MiniDisc\n \n Web MiniDisc uses\n
    \n
  • \n \n FFmpeg\n {' '}\n and{' '}\n \n ffmpegjs\n \n , to read your audio files (wav, mp3, ogg, mp4, etc...).\n
  • \n
  • \n \n Atracdenc\n \n , to support atrac3 encoding (lp2, lp4 audio formats).\n
  • \n
  • \n \n Emscripten\n \n , to run both FFmpeg and Atracdenc in the browser.\n
  • \n
  • \n \n netmd-js\n \n , to send commands to NetMD devices using Javascript.\n
  • \n
  • \n \n linux-minidisc\n \n , to make the netmd-js project possible.\n
  • \n
  • \n \n react95\n \n , to build the vintage user interface.\n
  • \n
  • \n \n material-ui\n \n , to build the user interface.\n
  • \n
\n Attribution\n
    \n
  • \n MiniDisc logo from{' '}\n \n https://en.wikipedia.org/wiki/MiniDisc\n \n
  • \n
  • \n MiniDisc icon from{' '}\n \n http://fav.me/d7u3g3g\n \n
  • \n
\n
\n \n \n \n \n );\n};\n","import React from 'react';\nimport { List, ListItem, Checkbox, Divider } from 'react95';\nimport { Views } from '../../redux/app-feature';\n\nexport const W95TopMenu = (props: {\n mainView: Views;\n onClick?: () => void;\n handleWipeDisc: () => void;\n handleRefresh: () => void;\n handleRenameDisc: () => void;\n handleExit: () => void;\n handleShowAbout: () => void;\n handleVintageMode: () => void;\n}) => {\n const items = [];\n\n if (props.mainView === 'MAIN') {\n items.push(\n \n Reload TOC\n \n );\n items.push(\n \n Rename Disc\n \n );\n items.push(\n \n Wipe Disc\n \n );\n items.push(\n \n \n \n );\n\n items.push();\n items.push(\n \n Exit\n \n );\n items.push();\n }\n items.push(\n \n About...\n \n );\n items.push(\n \n \n Fork me on GitHub\n \n \n );\n return (\n \n {items}\n \n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { batchActions } from 'redux-batched-actions';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Divider from '@material-ui/core/Divider';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\n\nimport { wipeDisc, listContent } from '../redux/actions';\nimport { actions as appActions } from '../redux/app-feature';\nimport { actions as renameDialogActions } from '../redux/rename-dialog-feature';\nimport { useShallowEqualSelector } from '../utils';\nimport Link from '@material-ui/core/Link';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport EditIcon from '@material-ui/icons/Edit';\nimport GitHubIcon from '@material-ui/icons/GitHub';\nimport DeleteForeverIcon from '@material-ui/icons/DeleteForever';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport InfoIcon from '@material-ui/icons/Info';\nimport ToggleOffIcon from '@material-ui/icons/ToggleOff';\nimport ToggleOnIcon from '@material-ui/icons/ToggleOn';\nimport Win95Icon from '../images/win95/win95.png';\nimport HelpIcon from '@material-ui/icons/Help';\n\nimport { W95TopMenu } from './win95/topmenu';\n\nconst useStyles = makeStyles(theme => ({\n listItemIcon: {\n minWidth: theme.spacing(5),\n },\n toolTippedText: {\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n },\n}));\n\nexport const TopMenu = function(props: { onClick?: () => void }) {\n const classes = useStyles();\n const dispatch = useDispatch();\n\n let { mainView, darkMode, vintageMode, fullWidthSupport } = useShallowEqualSelector(state => state.appState);\n let discTitle = useShallowEqualSelector(state => state.main.disc?.title ?? ``);\n let fullWidthDiscTitle = useShallowEqualSelector(state => state.main.disc?.fullWidthTitle ?? ``);\n\n const githubLinkRef = React.useRef(null);\n const helpLinkRef = React.useRef(null);\n const [menuAnchorEl, setMenuAnchorEl] = React.useState(null);\n const menuOpen = Boolean(menuAnchorEl);\n\n const handleMenuOpen = useCallback(\n (event: React.MouseEvent) => {\n setMenuAnchorEl(event.currentTarget);\n },\n [setMenuAnchorEl]\n );\n\n const handleDarkMode = useCallback(() => {\n dispatch(appActions.setDarkMode(!darkMode));\n }, [dispatch, darkMode]);\n\n const handleVintageMode = useCallback(() => {\n dispatch(appActions.setVintageMode(!vintageMode));\n }, [dispatch, vintageMode]);\n\n const handleMenuClose = useCallback(() => {\n setMenuAnchorEl(null);\n }, [setMenuAnchorEl]);\n\n const handleWipeDisc = useCallback(() => {\n dispatch(wipeDisc());\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleAllowFullWidth = useCallback(() => {\n dispatch(appActions.setFullWidthSupport(!fullWidthSupport));\n }, [dispatch, fullWidthSupport]);\n\n const handleRefresh = useCallback(() => {\n dispatch(listContent());\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleRenameDisc = useCallback(() => {\n dispatch(\n batchActions([\n renameDialogActions.setVisible(true),\n renameDialogActions.setCurrentName(discTitle),\n renameDialogActions.setGroupIndex(null),\n renameDialogActions.setCurrentFullWidthName(fullWidthDiscTitle),\n renameDialogActions.setIndex(-1),\n ])\n );\n handleMenuClose();\n }, [dispatch, handleMenuClose, discTitle, fullWidthDiscTitle]);\n\n const handleExit = useCallback(() => {\n dispatch(appActions.setMainView('WELCOME'));\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleShowAbout = useCallback(() => {\n dispatch(appActions.showAboutDialog(true));\n handleMenuClose();\n }, [dispatch, handleMenuClose]);\n\n const handleGithubLink = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n if (event.target !== githubLinkRef.current) {\n // Prevent opening the link twice\n githubLinkRef.current?.click();\n }\n handleMenuClose();\n },\n [handleMenuClose]\n );\n\n const handleHelpLink = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n if (event.target !== helpLinkRef.current) {\n // Prevent opening the link twice\n helpLinkRef.current?.click();\n }\n handleMenuClose();\n },\n [handleMenuClose]\n );\n\n const menuItems = [];\n if (mainView === 'MAIN') {\n menuItems.push(\n \n \n \n \n Reload TOC\n \n );\n menuItems.push(\n \n \n \n \n Rename Disc\n \n );\n menuItems.push(\n \n \n \n \n Wipe Disc\n \n );\n menuItems.push(\n \n \n \n \n Exit\n \n );\n }\n if (mainView === 'MAIN') {\n menuItems.push();\n menuItems.push(\n \n \n {fullWidthSupport ? : }\n \n \n {fullWidthSupport ? `Disable ` : `Enable `}\n \n Full-Width Title Editing\n \n \n \n );\n }\n menuItems.push(\n \n \n {/* */}\n {darkMode ? : }\n \n Dark Mode\n \n );\n if (mainView === 'MAIN') {\n menuItems.push(\n \n \n \"Windows\n \n Retro Mode (beta)\n \n );\n }\n if (mainView === 'MAIN') {\n menuItems.push();\n }\n menuItems.push(\n \n \n \n \n About\n \n );\n menuItems.push(\n \n \n \n \n \n \n Support and FAQ\n \n \n \n );\n menuItems.push(\n \n \n \n \n \n \n Fork me on GitHub\n \n \n \n );\n\n if (vintageMode) {\n const p = {\n mainView,\n onClick: props.onClick,\n handleWipeDisc,\n handleRefresh,\n handleRenameDisc,\n handleExit,\n handleShowAbout,\n handleVintageMode,\n };\n return ;\n }\n return (\n \n \n \n \n \n {menuItems}\n \n \n );\n};\n","import React from 'react';\nimport { Button, WindowContent } from 'react95';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { pair } from '../../redux/actions';\nimport { Dispatch } from '@reduxjs/toolkit';\nimport { AboutDialog } from '../about-dialog';\n\nconst useStyles = makeStyles(theme => ({\n pairingMessage: {\n color: 'red',\n marginTop: theme.spacing(1),\n },\n windowContent: {\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n}));\n\nexport interface W95WelcomeProps {\n dispatch: Dispatch;\n pairingFailed: boolean;\n pairingMessage: string;\n}\n\nexport const W95Welcome = (props: W95WelcomeProps) => {\n let { dispatch, pairingFailed, pairingMessage } = props;\n const classes = useStyles();\n return (\n <>\n \n

Press the button to connect to a NetMD device

\n \n

\n {pairingMessage}\n

\n
\n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { pair } from '../redux/actions';\n\nimport { useShallowEqualSelector } from '../utils';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Box from '@material-ui/core/Box';\nimport Link from '@material-ui/core/Link';\n\nimport { AboutDialog } from './about-dialog';\nimport { TopMenu } from './topmenu';\nimport ChromeIconPath from '../images/chrome-icon.svg';\nimport { W95Welcome } from './win95/welcome';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nconst useStyles = makeStyles(theme => ({\n main: {\n position: 'relative',\n flex: '1 1 auto',\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n },\n button: {\n marginTop: theme.spacing(3),\n minWidth: 150,\n },\n spacing: {\n marginTop: theme.spacing(1),\n },\n chromeLogo: {\n marginTop: theme.spacing(1),\n width: 96,\n height: 96,\n },\n why: {\n alignSelf: 'flex-start',\n marginTop: theme.spacing(3),\n },\n headBox: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n connectContainer: {\n flex: '1 1 auto',\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n },\n supportContainer: {\n flex: '1 1 auto',\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n },\n}));\n\nexport const Welcome = (props: {}) => {\n const classes = useStyles();\n const dispatch = useDispatch();\n const { browserSupported, pairingFailed, pairingMessage, vintageMode } = useShallowEqualSelector(state => state.appState);\n if (pairingMessage.toLowerCase().match(/denied/)) {\n // show linux instructions\n }\n // Access denied.\n\n const [showWhyUnsupported, setWhyUnsupported] = useState(false);\n const handleLearnWhy = (event: React.SyntheticEvent) => {\n event.preventDefault();\n setWhyUnsupported(true);\n };\n\n if (vintageMode) {\n const p = {\n dispatch,\n pairingFailed,\n pairingMessage,\n };\n return ;\n }\n\n return (\n \n \n \n Web MiniDisc\n \n \n \n \n Brings NetMD Devices to the Web\n \n \n {browserSupported ? (\n \n
\n \n Press the button to connect to a NetMD device\n \n\n \n\n \n {pairingMessage}\n \n
\n
\n \n \n Support and FAQ{' '}\n \n \n \n
\n
\n ) : (\n \n \n This Web browser is not supported. \n \n Learn Why\n \n \n\n \n \"Chrome\n \n\n \n Try using{' '}\n \n Chrome\n {' '}\n instead\n \n\n {showWhyUnsupported ? (\n <>\n \n Web MiniDisc requires a browser that supports both{' '}\n \n WebUSB\n {' '}\n and{' '}\n \n WebAssembly\n \n .\n \n
    \n
  • WebUSB is needed to control the NetMD device via the USB connection to your computer.
  • \n
  • WebAssembly is used to convert the music to a MiniDisc compatible format
  • \n
\n \n ) : null}\n
\n )}\n
\n \n
\n );\n};\n","import React, { useCallback } from 'react';\nimport clsx from 'clsx';\n\nimport { EncodingName } from '../utils';\n\nimport { formatTimeFromFrames, Track, Group } from 'netmd-js';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableRow from '@material-ui/core/TableRow';\nimport * as BadgeImpl from '@material-ui/core/Badge/Badge';\n\nimport DragIndicator from '@material-ui/icons/DragIndicator';\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport IconButton from '@material-ui/core/IconButton';\nimport FolderIcon from '@material-ui/icons/Folder';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nimport { DraggableProvided } from 'react-beautiful-dnd';\n\nconst useStyles = makeStyles(theme => ({\n currentTrackRow: {\n color: theme.palette.primary.main,\n '& > td': {\n color: 'inherit',\n },\n },\n inGroupTrackRow: {\n '& > $indexCell': {\n transform: `translateX(${theme.spacing(3)}px)`,\n },\n '& > $titleCell': {\n transform: `translateX(${theme.spacing(3)}px)`,\n },\n },\n playButtonInTrackList: {\n display: 'none',\n },\n trackRow: {\n '&:hover': {\n '& $playButtonInTrackList': {\n display: 'inline-flex',\n },\n '& $trackIndex': {\n display: 'none',\n },\n },\n },\n controlButtonInTrackCommon: {\n width: theme.spacing(2),\n height: theme.spacing(2),\n verticalAlign: 'middle',\n marginLeft: theme.spacing(-0.5),\n },\n formatBadge: {\n ...(BadgeImpl as any).styles(theme).badge,\n ...(BadgeImpl as any).styles(theme).colorPrimary,\n position: 'static',\n display: 'inline-flex',\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n verticalAlign: 'middle',\n width: theme.spacing(4.5),\n marginRight: theme.spacing(0.5),\n },\n durationCell: {\n whiteSpace: 'nowrap',\n },\n durationCellSecondary: {\n whiteSpace: 'nowrap',\n color: theme.palette.text.secondary,\n },\n durationCellTime: {\n verticalAlign: 'middle',\n },\n titleCell: {\n overflow: 'hidden',\n maxWidth: '40ch',\n textOverflow: 'ellipsis',\n // whiteSpace: 'nowrap',\n },\n deleteGroupButton: {\n display: 'none',\n },\n indexCell: {\n whiteSpace: 'nowrap',\n paddingRight: 0,\n width: theme.spacing(4),\n },\n trackIndex: {\n display: 'inline-block',\n height: '16px',\n width: '16px',\n },\n dragHandle: {\n width: 20,\n padding: `${theme.spacing(0.5)}px 0 0 0`,\n },\n dragHandleEmpty: {\n width: 20,\n padding: `${theme.spacing(0.5)}px 0 0 0`,\n },\n groupFolderIcon: {},\n groupHeadRow: {\n '&:hover': {\n '& $deleteGroupButton': {\n display: 'inline-flex',\n },\n '& $groupFolderIcon': {\n display: 'none',\n },\n },\n },\n}));\n\ninterface TrackRowProps {\n track: Track;\n inGroup: boolean;\n isSelected: boolean;\n trackStatus: 'playing' | 'paused' | 'none';\n draggableProvided: DraggableProvided;\n onSelect: (event: React.MouseEvent, trackIdx: number) => void;\n onRename: (event: React.MouseEvent, trackIdx: number) => void;\n onTogglePlayPause: (event: React.MouseEvent, trackIdx: number) => void;\n}\n\nexport function TrackRow({\n track,\n inGroup,\n isSelected,\n draggableProvided,\n trackStatus,\n onSelect,\n onRename,\n onTogglePlayPause,\n}: TrackRowProps) {\n const classes = useStyles();\n\n const handleRename = useCallback(event => onRename(event, track.index), [track.index, onRename]);\n const handleSelect = useCallback(event => onSelect(event, track.index), [track.index, onSelect]);\n const handlePlayPause: React.MouseEventHandler = useCallback(\n event => {\n event.stopPropagation();\n onTogglePlayPause(event, track.index);\n },\n [track.index, onTogglePlayPause]\n );\n const handleDoubleClickOnPlayButton: React.MouseEventHandler = useCallback(event => event.stopPropagation(), []);\n const isPlayingOrPaused = trackStatus === 'playing' || trackStatus === 'paused';\n\n return (\n \n event.stopPropagation()}>\n \n \n \n {track.index + 1}\n \n {trackStatus === 'paused' || trackStatus === 'none' ? (\n \n ) : (\n \n )}\n \n \n \n {track.fullWidthTitle ? `${track.fullWidthTitle} / ` : ``}\n {track.title || `No Title`}\n \n \n {EncodingName[track.encoding]}\n {formatTimeFromFrames(track.duration, false)}\n \n \n );\n}\n\ninterface GroupRowProps {\n group: Group;\n onRename: (event: React.MouseEvent, groupIdx: number) => void;\n onDelete: (event: React.MouseEvent, groupIdx: number) => void;\n}\n\nexport function GroupRow({ group, onRename, onDelete }: GroupRowProps) {\n const classes = useStyles();\n\n const handleDelete = useCallback((event: React.MouseEvent) => onDelete(event, group.index), [onDelete, group]);\n const handleRename = useCallback((event: React.MouseEvent) => onRename(event, group.index), [onRename, group]);\n return (\n \n \n \n \n \n \n \n \n \n {group.fullWidthTitle ? `${group.fullWidthTitle} / ` : ``}\n {group.title || `No Name`}\n \n \n \n {formatTimeFromFrames(\n group.tracks.map(n => n.duration).reduce((a, b) => a + b),\n false\n )}\n \n \n \n );\n}\n","import React from 'react';\nimport { WindowHeader, WindowContent, TextField } from 'react95';\nimport { DialogOverlay, DialogFooter, DialogWindow, FooterButton } from './common';\n\nexport const W95RenameDialog = (props: {\n renameDialogVisible: boolean;\n renameDialogTitle: string;\n renameDialogIndex: number;\n what: string;\n handleCancelRename: () => void;\n handleDoRename: () => void;\n handleChange: (event: React.ChangeEvent) => void;\n}) => {\n if (!props.renameDialogVisible) {\n return null;\n }\n\n return (\n \n \n \n Rename {props.what}\n \n \n

{props.what} Name:

\n {\n event.key === `Enter` && props.handleDoRename();\n }}\n fullWidth\n />\n \n OK\n Cancel\n \n
\n
\n
\n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\nimport { actions as renameDialogActions } from '../redux/rename-dialog-feature';\nimport { renameTrack, renameDisc, renameGroup } from '../redux/actions';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TextField from '@material-ui/core/TextField';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95RenameDialog } from './win95/rename-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nconst useStyles = makeStyles(theme => ({\n marginUpDown: {\n marginTop: theme.spacing(3),\n marginBottom: theme.spacing(3),\n },\n}));\n\nexport const RenameDialog = (props: {}) => {\n let dispatch = useDispatch();\n let classes = useStyles();\n\n let renameDialogVisible = useShallowEqualSelector(state => state.renameDialog.visible);\n let renameDialogTitle = useShallowEqualSelector(state => state.renameDialog.title);\n let renameDialogFullWidthTitle = useShallowEqualSelector(state => state.renameDialog.fullWidthTitle);\n let renameDialogIndex = useShallowEqualSelector(state => state.renameDialog.index);\n let renameDialogGroupIndex = useShallowEqualSelector(state => state.renameDialog.groupIndex);\n let allowFullWidth = useShallowEqualSelector(state => state.appState.fullWidthSupport);\n\n const what = renameDialogGroupIndex !== null ? `Group` : renameDialogIndex < 0 ? `Disc` : `Track`;\n\n const handleCancelRename = useCallback(() => {\n dispatch(renameDialogActions.setVisible(false));\n }, [dispatch]);\n\n const handleDoRename = useCallback(() => {\n if (renameDialogGroupIndex !== null) {\n // Just rename the group with this range\n dispatch(\n renameGroup({\n newName: renameDialogTitle,\n newFullWidthName: renameDialogFullWidthTitle,\n groupIndex: renameDialogGroupIndex,\n })\n );\n } else if (renameDialogIndex < 0) {\n dispatch(\n renameDisc({\n newName: renameDialogTitle,\n newFullWidthName: renameDialogFullWidthTitle,\n })\n );\n } else {\n dispatch(\n renameTrack({\n index: renameDialogIndex,\n newName: renameDialogTitle,\n newFullWidthName: renameDialogFullWidthTitle,\n })\n );\n }\n handleCancelRename(); // Close the dialog\n }, [dispatch, handleCancelRename, renameDialogFullWidthTitle, renameDialogGroupIndex, renameDialogIndex, renameDialogTitle]);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent) => {\n dispatch(renameDialogActions.setCurrentName(event.target.value.substring(0, 120))); // MAX title length\n },\n [dispatch]\n );\n\n const handleFullWidthChange = useCallback(\n (event: React.ChangeEvent) => {\n dispatch(renameDialogActions.setCurrentFullWidthName(event.target.value.substring(0, 105)));\n },\n [dispatch]\n );\n\n const handleEnterKeyEvent = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === `Enter`) {\n event.stopPropagation();\n event.preventDefault();\n handleDoRename();\n }\n },\n [handleDoRename]\n );\n\n const { vintageMode } = useShallowEqualSelector(state => state.appState);\n if (vintageMode) {\n const p = {\n renameDialogVisible,\n renameDialogTitle,\n renameDialogIndex,\n what,\n handleCancelRename,\n handleDoRename,\n handleChange,\n };\n return ;\n }\n\n return (\n \n Rename {what}\n \n \n {allowFullWidth && (\n \n )}\n \n \n \n \n \n \n );\n};\n","import React from 'react';\nimport { WindowHeader, Button, Progress, Checkbox } from 'react95';\nimport { DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent } from './common';\n\nexport const W95UploadDialog = (props: {\n visible: boolean;\n cancelled: boolean;\n writtenProgress: number;\n encryptedProgress: number;\n totalProgress: number;\n trackTotal: number;\n trackCurrent: number;\n trackConverting: number;\n titleCurrent: string;\n titleConverting: string;\n handleCancelUpload: () => void;\n progressValue: number;\n bufferValue: number;\n convertedValue: number;\n notifyWhenFinished: boolean;\n hasNotificationSupport: boolean;\n handleNotifyWhenFinishedChanged: () => void;\n}) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n \n \n \n Recording...\n \n \n
\n {props.convertedValue === 100 && props.trackConverting === props.trackTotal\n ? `Conversion completed`\n : `Converting ${props.trackConverting + 1} of ${props.trackTotal}: ${props.titleConverting}`}\n
\n \n\n
\n Uploading {props.trackCurrent} of {props.trackTotal}: {props.titleCurrent}\n
\n \n\n \n {props.hasNotificationSupport ? (\n \n ) : null}\n
\n \n
\n
\n
\n
\n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { actions as uploadDialogActions } from '../redux/upload-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Box from '@material-ui/core/Box';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { Button } from '@material-ui/core';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport { W95UploadDialog } from './win95/upload-dialog';\nimport { setNotifyWhenFinished } from '../redux/actions';\n\nconst useStyles = makeStyles(theme => ({\n progressPerc: {\n marginTop: theme.spacing(1),\n },\n progressBar: {\n marginTop: theme.spacing(3),\n },\n uploadLabel: {\n marginTop: theme.spacing(3),\n },\n spacer: {\n flex: '1 1 auto',\n },\n checkBox: {\n marginLeft: 0,\n },\n}));\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const UploadDialog = (props: {}) => {\n const classes = useStyles();\n const dispatch = useDispatch();\n\n let {\n visible,\n cancelled,\n writtenProgress,\n encryptedProgress,\n totalProgress,\n\n trackTotal,\n trackCurrent,\n trackConverting,\n titleCurrent,\n titleConverting,\n } = useShallowEqualSelector(state => state.uploadDialog);\n const { vintageMode, notifyWhenFinished, hasNotificationSupport } = useShallowEqualSelector(state => state.appState);\n\n const handleCancelUpload = useCallback(() => {\n dispatch(uploadDialogActions.setCancelUpload(true));\n }, [dispatch]);\n\n const handleNotifyWhenFinishedChanged = useCallback(() => {\n dispatch(setNotifyWhenFinished(!notifyWhenFinished));\n }, [dispatch, notifyWhenFinished]);\n\n let progressValue = Math.floor((writtenProgress / totalProgress) * 100);\n let bufferValue = Math.floor((encryptedProgress / totalProgress) * 100);\n let convertedValue = Math.floor((trackConverting / trackTotal) * 100);\n\n if (vintageMode) {\n const p = {\n visible,\n cancelled,\n writtenProgress,\n encryptedProgress,\n totalProgress,\n\n trackTotal,\n trackCurrent,\n trackConverting,\n titleCurrent,\n titleConverting,\n\n handleCancelUpload,\n progressValue,\n bufferValue,\n convertedValue,\n notifyWhenFinished,\n hasNotificationSupport,\n handleNotifyWhenFinishedChanged,\n };\n return ;\n }\n return (\n \n Recording...\n \n \n {convertedValue === 100 && trackConverting === trackTotal\n ? `Conversion completed`\n : `Converting ${trackConverting + 1} of ${trackTotal}: ${titleConverting}`}\n \n \n {convertedValue}%\n\n \n Uploading {trackCurrent} of {trackTotal}: {titleCurrent}\n \n \n {progressValue}%\n \n \n {hasNotificationSupport ? (\n }\n label=\"Notify when completed\"\n />\n ) : null}\n
\n \n
\n \n );\n};\n","import React from 'react';\nimport { WindowHeader, Progress } from 'react95';\nimport { DialogOverlay, DialogWindow, DialogWindowContent } from './common';\n\nexport const W95RecordDialog = (props: {\n visible: boolean;\n trackTotal: number;\n trackDone: number;\n trackCurrent: number;\n titleCurrent: string;\n progressValue: number;\n}) => {\n if (!props.visible) {\n return null;\n }\n return (\n \n \n \n Recording...\n \n \n

{`Recording track ${props.trackDone + 1} of ${props.trackTotal}: ${\n props.titleCurrent\n }`}

\n \n
\n
\n
\n );\n};\n","import React from 'react';\nimport { useShallowEqualSelector } from '../utils';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Box from '@material-ui/core/Box';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95RecordDialog } from './win95/record-dialog';\n\nconst useStyles = makeStyles(theme => ({\n progressPerc: {\n marginTop: theme.spacing(1),\n },\n progressBar: {\n marginTop: theme.spacing(3),\n },\n}));\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const RecordDialog = (props: {}) => {\n const classes = useStyles();\n\n let { visible, trackTotal, trackDone, trackCurrent, titleCurrent } = useShallowEqualSelector(state => state.recordDialog);\n\n let progressValue = Math.round(trackCurrent);\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n if (vintageMode) {\n const p = {\n visible,\n trackTotal,\n trackDone,\n trackCurrent,\n titleCurrent,\n progressValue,\n };\n return ;\n }\n\n return (\n \n Recording...\n \n \n {`Recording track ${trackDone + 1} of ${trackTotal}: ${titleCurrent}`}\n \n = 0 ? 'determinate' : 'indeterminate'}\n color=\"primary\"\n value={progressValue}\n />\n {progressValue >= 0 ? `${progressValue}%` : ``}\n \n \n \n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { actions as errorDialogActions } from '../redux/error-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { TransitionProps } from '@material-ui/core/transitions';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const ErrorDialog = (props: {}) => {\n const dispatch = useDispatch();\n\n let { visible, error } = useShallowEqualSelector(state => state.errorDialog);\n\n const handleClose = useCallback(() => {\n dispatch(errorDialogActions.setVisible(false));\n }, [dispatch]);\n\n return (\n \n Error\n \n {error}\n \n \n \n \n \n );\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\nimport { actions as panicDialogActions } from '../redux/panic-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { Typography } from '@material-ui/core';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nexport const PanicDialog = (props: {}) => {\n const dispatch = useDispatch();\n\n let { visible, dismissed } = useShallowEqualSelector(state => state.panicDialog);\n\n const handleReloadApp = useCallback(() => {\n window.location.reload();\n }, []);\n\n const handleIgnore = useCallback(() => {\n dispatch(panicDialogActions.dismiss());\n }, [dispatch]);\n\n return (\n \n Oops… Something unexpected happened.\n \n \n Try to restart the app. If the error persists, try the followings:\n
    \n
  1. Use your browser in incognito mode.
  2. \n
  3. Use a blank MiniDisc.
  4. \n
  5. Try to use Web MiniDisc on another computer.
  6. \n
\n If this does not solve the error, your unit might not be supported yet or you have encountered a bug. The full error is\n reported in the JS console.\n
\n
\n \n \n \n \n \n );\n};\n","import React, { useCallback, useContext } from 'react';\nimport { Button, WindowHeader, Fieldset, Select, Table, TableBody, TableDataCell, Divider, Toolbar } from 'react95';\nimport { DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent, WindowCloseIcon, FooterButton, CustomTableRow } from './common';\nimport { TitleFormatType, UploadFormat } from '../../redux/convert-dialog-feature';\nimport { DropzoneInputProps, DropzoneRootProps } from 'react-dropzone';\nimport { ThemeContext } from 'styled-components';\nimport ArrowUpIconUrl from '../../images/win95/arrowup.png';\nimport ArrowDownIconUrl from '../../images/win95/arrowdown.png';\nimport DeleteIconUrl from '../../images/win95/delete.png';\n\nconst trackTitleOptions = [\n { value: 'filename', label: 'Filename' },\n { value: 'title', label: 'Title' },\n { value: 'album-title', label: 'Album - Title' },\n { value: 'artist-title', label: 'Artist - Title' },\n { value: 'title-artist', label: 'Title - Artist' },\n { value: 'artist-album-title', label: 'Artist - Album - Title' },\n];\n\nconst recordModeOptions = [\n { value: 'SP', label: 'SP' },\n { value: 'LP2', label: 'LP2' },\n { value: 'LP4', label: 'LP4' },\n];\n\nexport const W95ConvertDialog = (props: {\n visible: boolean;\n format: UploadFormat;\n titleFormat: TitleFormatType;\n files: File[];\n setFiles: React.Dispatch>;\n selectedTrackIndex: number;\n setSelectedTrack: React.Dispatch>;\n moveFileUp: () => void;\n moveFileDown: () => void;\n handleClose: () => void;\n handleChangeFormat: (ev: any, newFormat: any) => void;\n handleChangeTitleFormat: (\n event: React.ChangeEvent<{\n value: any;\n }>\n ) => void;\n handleConvert: () => void;\n tracksOrderVisible: boolean;\n setTracksOrderVisible: React.Dispatch>;\n handleToggleTracksOrder: () => void;\n selectedTrackRef: React.MutableRefObject;\n getRootProps: (props?: DropzoneRootProps | undefined) => DropzoneRootProps;\n getInputProps: (props?: DropzoneInputProps | undefined) => DropzoneInputProps;\n isDragActive: boolean;\n open: () => void;\n disableRemove: boolean;\n handleRemoveSelectedTrack: () => void;\n dialogVisible: boolean;\n}) => {\n const themeContext = useContext(ThemeContext);\n\n const renderTracks = useCallback(() => {\n return props.files.map((file, i) => {\n const isSelected = props.selectedTrackIndex === i;\n const ref = isSelected ? props.selectedTrackRef : null;\n return (\n props.setSelectedTrack(i)}\n ref={ref}\n style={isSelected ? themeContext.selectedTableRow : {}}\n >\n {file.name}\n \n );\n });\n }, [props, themeContext]);\n\n if (!props.dialogVisible) {\n return null;\n }\n\n return (\n \n \n \n Upload Settings\n \n \n \n
\n
\n props.handleChangeFormat(ev, format.value)}\n />\n
\n
\n \n
\n
\n {props.tracksOrderVisible ? (\n
\n \n \n \n \n
\n \n \n
\n
\n \n {renderTracks()}\n
\n
\n \n
\n ) : null}\n\n \n \n
\n OK\n Cancel\n
\n
\n
\n
\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { belowDesktop, useShallowEqualSelector } from '../utils';\n\nimport { actions as convertDialogActions } from '../redux/convert-dialog-feature';\nimport { convertAndUpload } from '../redux/actions';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport FormControl from '@material-ui/core/FormControl';\nimport ToggleButton from '@material-ui/lab/ToggleButton';\nimport ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { Typography } from '@material-ui/core';\nimport Select from '@material-ui/core/Select';\nimport Input from '@material-ui/core/Input';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport AddIcon from '@material-ui/icons/Add';\nimport RemoveIcon from '@material-ui/icons/Remove';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport IconButton from '@material-ui/core/IconButton';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport { lighten } from '@material-ui/core/styles';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport Radio from '@material-ui/core/Radio';\nimport { useDropzone } from 'react-dropzone';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport { W95ConvertDialog } from './win95/convert-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flexDirection: 'row',\n },\n formControl: {\n minWidth: 60,\n },\n toggleButton: {\n minWidth: 40,\n },\n dialogContent: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'stretch',\n },\n formatAndTitle: {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n },\n rightBlock: {\n display: 'flex',\n flexDirection: 'column',\n },\n titleFormControl: {\n minWidth: 170,\n marginTop: 4,\n [belowDesktop(theme)]: {\n width: 114,\n minWidth: 0,\n },\n },\n spacer: {\n display: 'flex',\n flex: '1 1 auto',\n },\n showTracksOrderBtn: {\n marginLeft: theme.spacing(1),\n },\n tracksOrderAccordion: {\n '&:before': {\n opacity: 0,\n },\n },\n tracksOrderAccordionDetail: {\n maxHeight: '40vh',\n overflow: 'auto',\n },\n toolbarHighlight:\n theme.palette.type === 'light'\n ? {\n color: theme.palette.secondary.main,\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\n }\n : {\n color: theme.palette.text.primary,\n backgroundColor: theme.palette.secondary.dark,\n },\n trackList: {\n flex: '1 1 auto',\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff',\n },\n}));\n\nexport const ConvertDialog = (props: { files: File[] }) => {\n const dispatch = useDispatch();\n const classes = useStyles();\n\n let { visible, format, titleFormat } = useShallowEqualSelector(state => state.convertDialog);\n\n // Track reodering\n const [files, setFiles] = useState(props.files);\n const [selectedTrackIndex, setSelectedTrack] = useState(-1);\n\n const moveFile = useCallback(\n (offset: number) => {\n const targetIndex = selectedTrackIndex + offset;\n if (targetIndex >= files.length || targetIndex < 0) {\n return; // This should not be allowed by the UI\n }\n\n const newFileArray = files.slice();\n\n // Swap trakcs\n let tmp = newFileArray[selectedTrackIndex];\n newFileArray[selectedTrackIndex] = newFileArray[targetIndex];\n newFileArray[targetIndex] = tmp;\n\n setFiles(newFileArray);\n setSelectedTrack(targetIndex);\n },\n [files, selectedTrackIndex]\n );\n\n const moveFileUp = useCallback(() => {\n moveFile(-1);\n }, [moveFile]);\n\n const moveFileDown = useCallback(() => {\n moveFile(1);\n }, [moveFile]);\n\n const handleClose = useCallback(() => {\n dispatch(convertDialogActions.setVisible(false));\n }, [dispatch]);\n\n const handleChangeFormat = useCallback(\n (ev, newFormat) => {\n if (newFormat === null) {\n return;\n }\n dispatch(convertDialogActions.setFormat(newFormat));\n },\n [dispatch]\n );\n\n const handleChangeTitleFormat = useCallback(\n (event: React.ChangeEvent<{ value: any }>) => {\n dispatch(convertDialogActions.setTitleFormat(event.target.value));\n },\n [dispatch]\n );\n\n const handleConvert = useCallback(() => {\n handleClose();\n dispatch(convertAndUpload(files, format, titleFormat));\n }, [dispatch, files, format, titleFormat, handleClose]);\n\n const [tracksOrderVisible, setTracksOrderVisible] = useState(false);\n const handleToggleTracksOrder = useCallback(() => {\n setTracksOrderVisible(!tracksOrderVisible);\n }, [tracksOrderVisible, setTracksOrderVisible]);\n\n // Dialog init on new files\n useEffect(() => {\n const newFiles = Array.from(props.files);\n setFiles(newFiles);\n setSelectedTrack(-1);\n setTracksOrderVisible(false);\n }, [props.files, setSelectedTrack, setTracksOrderVisible]);\n\n // scroll selected track into view\n const selectedTrackRef = useRef(null);\n useEffect(() => {\n selectedTrackRef.current?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, [selectedTrackRef, selectedTrackIndex]);\n\n const renderTracks = useCallback(() => {\n return files.map((file, i) => {\n const isSelected = selectedTrackIndex === i;\n const ref = isSelected ? selectedTrackRef : null;\n return (\n setSelectedTrack(i)} ref={ref} button>\n \n \n \n \n \n );\n });\n }, [files, selectedTrackIndex, setSelectedTrack, selectedTrackRef]);\n\n // Add/Remove tracks\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: File[]) => {\n const newFileArray = files.slice().concat(acceptedFiles);\n setFiles(newFileArray);\n },\n [files, setFiles]\n );\n const { getRootProps, getInputProps, isDragActive, open } = useDropzone({\n onDrop,\n accept: [`audio/*`, `video/mp4`],\n noClick: true,\n });\n const disableRemove = selectedTrackIndex < 0 || selectedTrackIndex >= files.length;\n const handleRemoveSelectedTrack = useCallback(() => {\n const newFileArray = files.filter((f, i) => i !== selectedTrackIndex);\n setFiles(newFileArray);\n if (selectedTrackIndex >= newFileArray.length) {\n setSelectedTrack(newFileArray.length - 1);\n }\n }, [selectedTrackIndex, files, setFiles]);\n\n const dialogVisible = useShallowEqualSelector(state => state.convertDialog.visible);\n useEffect(() => {\n if (dialogVisible && files.length === 0) {\n handleClose();\n }\n }, [files, dialogVisible, handleClose]);\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n if (vintageMode) {\n const p = {\n visible,\n format,\n titleFormat,\n\n files,\n setFiles,\n selectedTrackIndex,\n setSelectedTrack,\n\n moveFileUp,\n moveFileDown,\n\n handleClose,\n handleChangeFormat,\n handleChangeTitleFormat,\n handleConvert,\n\n tracksOrderVisible,\n setTracksOrderVisible,\n handleToggleTracksOrder,\n selectedTrackRef,\n\n getRootProps,\n getInputProps,\n isDragActive,\n open,\n\n disableRemove,\n handleRemoveSelectedTrack,\n dialogVisible,\n };\n return ;\n }\n\n return (\n \n Upload Settings\n \n
\n \n \n Recording Mode\n \n \n \n SP\n \n \n LP2\n \n \n LP4\n \n \n \n
\n \n \n Track title\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 {renderTracks()}\n \n \n \n Drop your Music to add it to the queue\n \n \n
\n
\n
\n \n \n
\n \n \n
\n \n );\n};\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M53.259 20.337c6.582-5.574 6.582-5.574 14.753-12.436C62.599 6.72 56.322 6 49.946 6c-6.485 0-12.82.747-18.303 1.966 6.675 5.894 7.084 6.191 14.006 12.252 3.48-.293 3.97-.293 7.61.12zM36.927 24.504c.992-1.544 2.25-2.448 5.124-3.474-5.486-4.744-7.34-6.324-14.003-12.173-11.485 3.264-19.33 9.02-20.049 15.647h28.928zM61.159 24.504c14.02 0 20.615 0 30.732-.004-.789-6.629-8.72-12.468-20.269-15.706-2.061 1.766-11.14 9.316-14.827 12.484 1.793.813 3.226 1.35 4.364 3.226zM40.996 30.602c-2.045-.884-3.476-1.935-4.042-3.102-1.056 0-26.431 0-28.782.039C9.53 33.6 16.924 38.847 27.455 41.964c4.236-3.528 8.255-6.948 13.541-11.362zM49.946 45c6.284 0 12.247-.64 17.6-1.79-4.721-4.135-7.729-6.721-13.454-11.689-3.681.692-6.213.59-9.6.068-4.888 4.125-10.974 9.218-13.473 11.324C36.707 44.248 43.137 45 49.946 45zM57.47 30.45c4.38 3.707 9.262 8.068 13.687 11.884 11.265-3.066 19.178-8.5 20.57-14.83H61.18c-.667.999-1.516 1.917-3.71 2.946z\"\n}));\n\nconst SvgMd0 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd0, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md0.a7574f83.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M36.927 24.504c.992-1.544 2.25-2.448 5.124-3.474-5.486-4.744-7.34-6.324-14.003-12.173-11.485 3.264-19.33 9.02-20.049 15.647h28.928zM57.47 30.45c4.38 3.707 9.262 8.068 13.687 11.884 11.265-3.066 19.178-8.5 20.57-14.83H61.18c-.667.999-1.516 1.917-3.71 2.946z\"\n}));\n\nconst SvgMd1 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd1, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md1.1ffb5f6c.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M53.259 20.337c6.582-5.574 6.582-5.574 14.753-12.436C62.599 6.72 56.322 6 49.946 6c-6.485 0-12.82.747-18.303 1.966 6.675 5.894 7.084 6.191 14.006 12.252 3.48-.293 3.97-.293 7.61.12zM49.946 45c6.284 0 12.247-.64 17.6-1.79-4.721-4.135-7.729-6.721-13.454-11.689-3.681.692-6.213.59-9.6.068-4.888 4.125-10.974 9.218-13.473 11.324C36.707 44.248 43.137 45 49.946 45z\"\n}));\n\nconst SvgMd2 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd2, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md2.33dd03b3.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport React from \"react\";\n\nvar _ref =\n/*#__PURE__*/\nReact.createElement(\"g\", {\n fill: \"#000\",\n fillRule: \"evenodd\"\n}, React.createElement(\"g\", {\n fillRule: \"nonzero\"\n}, React.createElement(\"path\", {\n d: \"M5.756 14.036l2.101 2.14c-2.173 2.135-3.623 4.401-4.303 6.721l-.101.367-2.906-.748c.776-3.013 2.552-5.872 5.209-8.48zM23.576 4.241l.902 2.861c-5.329 1.682-9.916 3.879-13.464 6.436l-.438.322-1.796-2.403c3.894-2.91 8.94-5.368 14.796-7.216zM47.825.5l.054 3c-6.79.122-13.336.962-19.288 2.445l-.846.216-.76-2.902C33.395 1.581 40.477.632 47.825.5zM92.67 14.036l-2.101 2.14c2.173 2.135 3.624 4.401 4.303 6.721l.101.367 2.906-.748c-.776-3.013-2.552-5.872-5.209-8.48zM74.85 4.241l-.902 2.861c5.329 1.682 9.916 3.879 13.464 6.436l.438.322 1.796-2.403c-3.893-2.91-8.94-5.368-14.796-7.216zM50.601.5l-.054 3c6.79.122 13.336.962 19.288 2.445l.846.216.76-2.902C65.031 1.581 57.95.632 50.601.5zM5.756 37.964l2.101-2.14c-2.173-2.135-3.623-4.401-4.303-6.721l-.101-.367-2.906.748c.776 3.013 2.552 5.872 5.209 8.48zM23.576 47.759l.902-2.861c-5.329-1.682-9.916-3.879-13.464-6.436l-.438-.322-1.796 2.403c3.894 2.91 8.94 5.368 14.796 7.216zM47.825 51.5l.054-3c-6.79-.122-13.336-.962-19.288-2.445l-.846-.216-.76 2.902c6.41 1.678 13.492 2.627 20.84 2.759zM92.67 37.964l-2.101-2.14c2.173-2.135 3.624-4.401 4.303-6.721l.101-.367 2.906.748c-.776 3.013-2.552 5.872-5.209 8.48zM74.85 47.759l-.902-2.861c5.329-1.682 9.916-3.879 13.464-6.436l.438-.322 1.796 2.403c-3.893 2.91-8.94 5.368-14.796 7.216zM50.601 51.5l-.054-3c6.79-.122 13.336-.962 19.288-2.445l.846-.216.76 2.902c-6.41 1.678-13.492 2.627-20.84 2.759z\"\n})), React.createElement(\"path\", {\n d: \"M61.159 24.504c14.02 0 20.615 0 30.732-.004-.789-6.629-8.72-12.468-20.269-15.706-2.061 1.766-11.14 9.316-14.827 12.484 1.793.813 3.226 1.35 4.364 3.226zM40.996 30.602c-2.045-.884-3.476-1.935-4.042-3.102-1.056 0-26.431 0-28.782.039C9.53 33.6 16.924 38.847 27.455 41.964c4.236-3.528 8.255-6.948 13.541-11.362z\"\n}));\n\nconst SvgMd3 = ({\n svgRef,\n title,\n ...props\n}) => React.createElement(\"svg\", _extends({\n width: 98,\n height: 52,\n viewBox: \"0 0 98 52\",\n ref: svgRef\n}, props), title ? React.createElement(\"title\", null, title) : null, _ref);\n\nconst ForwardRef = React.forwardRef((props, ref) => React.createElement(SvgMd3, _extends({\n svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/md3.80f42826.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react';\nimport { Button, Panel } from 'react95';\nimport { belowDesktop } from '../../utils';\n\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport StopIcon from '@material-ui/icons/Stop';\nimport SkipNextIcon from '@material-ui/icons/SkipNext';\nimport SkipPreviousIcon from '@material-ui/icons/SkipPrevious';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flex: '1 1 auto',\n alignItems: 'center',\n [belowDesktop(theme)]: {\n flexWrap: 'wrap',\n },\n },\n lcd: {\n backgroundColor: 'black !important',\n flex: '1 1 auto',\n margin: '0 80px 0 0px',\n minWidth: 150,\n height: 48,\n color: 'white !important',\n fontFamily: 'LCDDot',\n },\n}));\n\nexport const W95Controls = (props: {\n handlePrev: () => void;\n handlePlay: () => void;\n handleStop: () => void;\n handlePause: () => void;\n handleNext: () => void;\n message: string;\n discPresent: boolean;\n classes: any;\n lcdScroll: number;\n lcdRef: React.RefObject;\n lcdScrollDuration: number;\n}) => {\n const classes = useStyles();\n return (\n
\n \n \n \n \n \n\n \n
\n 0\n ? {\n animationDuration: `${props.lcdScrollDuration}s`,\n transform: `translate(-${props.lcdScroll}%)`,\n top: 12,\n }\n : { top: 12 }\n }\n >\n {props.message}\n \n
\n
\n
\n );\n};\n","import React, { useCallback, useRef, useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport StopIcon from '@material-ui/icons/Stop';\nimport SkipNextIcon from '@material-ui/icons/SkipNext';\nimport SkipPreviousIcon from '@material-ui/icons/SkipPrevious';\nimport PauseIcon from '@material-ui/icons/Pause';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Box from '@material-ui/core/Box';\n\nimport { makeStyles } from '@material-ui/core';\nimport { belowDesktop, getSortedTracks, useShallowEqualSelector } from '../utils';\nimport { control } from '../redux/actions';\nimport { useDispatch } from 'react-redux';\n\nimport { ReactComponent as MDIcon0 } from '../images/md0.svg';\nimport { ReactComponent as MDIcon1 } from '../images/md1.svg';\nimport { ReactComponent as MDIcon2 } from '../images/md2.svg';\nimport { ReactComponent as MDIcon3 } from '../images/md3.svg';\nimport { W95Controls } from './win95/controls';\n\nconst frames = [MDIcon0, MDIcon1, MDIcon2, MDIcon3];\n\nconst useStyles = makeStyles(theme => ({\n '@keyframes scrollLeft': {\n from: {\n transform: `translateX(0%)`,\n },\n to: {},\n },\n '@keyframes blink': {\n '50%': {\n visibility: 'hidden',\n },\n },\n container: {\n display: 'flex',\n flex: '1 1 auto',\n [belowDesktop(theme)]: {\n flexWrap: 'wrap',\n },\n },\n lcd: {\n flex: '1 1 auto',\n position: 'relative',\n marginLeft: theme.spacing(1.5),\n marginRight: theme.spacing(1.5),\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n borderRadius: theme.spacing(3),\n backgroundColor: theme.palette.background.default,\n minWidth: 150,\n height: 48,\n [belowDesktop(theme)]: {\n marginLeft: 0,\n marginRight: theme.spacing(2),\n },\n },\n lcdText: {\n overflow: 'hidden',\n position: 'relative',\n width: 'calc(100% - 40px)',\n left: 40,\n height: '100%',\n fontFamily: 'LCDDot',\n },\n lcdDisc: {\n position: 'absolute',\n top: 0,\n left: 20,\n },\n lcdDiscIcon: {\n width: 28,\n height: 48,\n '& g': {\n fill: theme.palette.action.active,\n },\n },\n scrollingStatusMessage: {\n position: 'absolute',\n width: '100%',\n whiteSpace: 'nowrap',\n animationName: '$scrollLeft',\n animationTimingFunction: 'linear',\n animationIterationCount: '1',\n top: 15,\n left: 1,\n },\n statusMessage: {\n position: 'absolute',\n width: '100%',\n whiteSpace: 'nowrap',\n top: 15,\n left: 1,\n },\n lcdBlink: {\n animationName: '$blink',\n animationTimingFunction: 'step-end',\n animationDuration: '1s',\n animationIterationCount: 'infinite',\n },\n button: {\n // padding: 8,\n },\n}));\n\nexport const Controls = () => {\n const dispatch = useDispatch();\n // TODO: The shallow equality won't work for these 2 states\n const deviceStatus = useShallowEqualSelector(state => state.main.deviceStatus);\n const disc = useShallowEqualSelector(state => state.main.disc);\n\n const classes = useStyles();\n const handlePrev = useCallback(() => {\n dispatch(control('prev'));\n }, [dispatch]);\n const handlePlay = useCallback(() => {\n dispatch(control('play'));\n }, [dispatch]);\n const handleStop = useCallback(() => {\n dispatch(control('stop'));\n }, [dispatch]);\n const handleNext = useCallback(() => {\n dispatch(control('next'));\n }, [dispatch]);\n const handlePause = useCallback(() => {\n dispatch(control('pause'));\n }, [dispatch]);\n\n let message = ``;\n let trackIndex = deviceStatus?.track ?? null;\n let deviceState = deviceStatus?.state ?? null;\n let discPresent = deviceStatus?.discPresent ?? false;\n let paused = deviceStatus?.state === 'paused';\n const tracks = getSortedTracks(disc);\n if (!discPresent) {\n message = ``;\n } else if (deviceState === 'readingTOC') {\n message = 'READING TOC';\n } else if (tracks.length === 0) {\n message = `BLANKDISC`;\n } else if (deviceStatus && deviceStatus.track !== null && tracks[deviceStatus.track]) {\n let title = tracks[deviceStatus.track].fullWidthTitle || tracks[deviceStatus.track].title;\n message =\n (deviceStatus.track + 1).toString().padStart(3, '0') +\n (title ? ' - ' + title : '');\n }\n\n const [lcdScroll, setLcdScroll] = useState(0);\n const [lcdScrollDuration, setLcdScrollDuration] = useState(0);\n const [lcdIconFrame, setLcdIconFrame] = useState(0);\n\n // LCD Text scrolling\n const animationDelayInMS = 2000;\n const scrollTimerRef = useRef(null);\n const lcdRef = useRef(null);\n useEffect(() => {\n const updateLCDScroll = () => {\n const domEl = lcdRef.current;\n const textWidth = domEl?.scrollWidth ?? 0;\n const lcdWidth = domEl?.parentElement?.offsetWidth ?? 0;\n const scrollPerc = textWidth > lcdWidth ? (textWidth * 100) / lcdWidth : 0;\n const scrollDurationInSec = textWidth > lcdWidth ? textWidth / 20 : 0; // Compute duration to achieve constant speed\n setLcdScroll(scrollPerc);\n setLcdScrollDuration(scrollDurationInSec);\n if (scrollDurationInSec > 0) {\n scrollTimerRef.current = setTimeout(() => {\n setLcdScroll(0);\n }, scrollDurationInSec * 1000 + 500); // stop animation timer\n }\n };\n\n clearTimeout(scrollTimerRef.current);\n setLcdScroll(0);\n scrollTimerRef.current = setTimeout(() => {\n updateLCDScroll();\n }, animationDelayInMS); // start animation timer\n\n return () => {\n clearTimeout(scrollTimerRef.current); // clear all the timers on unmount\n };\n }, [trackIndex, deviceState, message]);\n\n // Disc animation\n const lcdIconAnimationTimer = useRef(null);\n useEffect(() => {\n clearInterval(lcdIconAnimationTimer.current);\n if (deviceState === 'playing' || deviceState === 'readingTOC') {\n lcdIconAnimationTimer.current = setInterval(() => {\n setLcdIconFrame(1 + (lcdIconFrame % (frames.length - 1)));\n }, 600);\n } else {\n setLcdIconFrame(0);\n }\n return () => {\n clearInterval(lcdIconAnimationTimer.current);\n };\n }, [deviceState, lcdIconFrame]);\n\n const DiscFrame = frames[lcdIconFrame];\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n if (vintageMode) {\n const p = {\n handlePrev,\n handlePlay,\n handleStop,\n handlePause,\n handleNext,\n\n message,\n discPresent,\n lcdScroll,\n lcdRef,\n lcdScrollDuration,\n\n classes,\n };\n return ;\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n 0\n ? { animationDuration: `${lcdScrollDuration}s`, transform: `translate(-${lcdScroll}%)` }\n : {}\n }\n >\n {message}\n \n
\n
\n {discPresent && }\n
\n
\n
\n );\n};\n","import React from 'react';\nimport { Button, WindowHeader, Fieldset, Select } from 'react95';\nimport { Controls } from '../controls';\nimport { DialogOverlay, DialogWindow, DialogFooter, DialogWindowContent, WindowCloseIcon, FooterButton } from './common';\n\nexport const W95DumpDialog = (props: {\n handleClose: () => void;\n handleChange: (\n ev: React.ChangeEvent<{\n value: unknown;\n }>\n ) => void;\n handleStartTransfer: () => void;\n visible: boolean;\n devices: {\n deviceId: string;\n label: string;\n }[];\n inputDeviceId: string;\n}) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n \n \n \n Record Selected Tracks\n \n \n \n
\n

1. Connect your MD Player line-out to your PC audio line-in.

\n

2. Use the controls at the bottom right to play some tracks.

\n

3. Select the input source. You should hear the tracks playing on your PC.

\n

4. Adjust the input gain and the line-out volume of your device.

\n
\n ({ value: deviceId, label }))}\n onChange={props.handleChange}\n width={200}\n />\n
\n \n
\n \n
\n Cancel\n \n Start Record\n \n
\n
\n
\n
\n );\n};\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useShallowEqualSelector } from '../utils';\n\nimport { recordTracks } from '../redux/actions';\nimport { actions as dumpDialogActions } from '../redux/dump-dialog-feature';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Slide from '@material-ui/core/Slide';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport { Controls } from './controls';\nimport Box from '@material-ui/core/Box';\nimport serviceRegistry from '../services/registry';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport { W95DumpDialog } from './win95/dump-dialog';\n\nconst Transition = React.forwardRef(function Transition(\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref\n) {\n return ;\n});\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-end',\n justifyContent: 'space-between',\n marginRight: -theme.spacing(2),\n flexFlow: 'wrap',\n },\n formControl: {\n minWidth: 120,\n },\n selectEmpty: {\n marginTop: theme.spacing(2),\n },\n head: {\n textShadow: '0px 0px 12px rgba(150, 150, 150, 1)',\n fontSize: theme.typography.h2.fontSize,\n textAlign: 'center',\n marginBottom: theme.spacing(2),\n },\n}));\n\nexport const DumpDialog = ({ trackIndexes }: { trackIndexes: number[] }) => {\n const dispatch = useDispatch();\n const classes = useStyles();\n\n const [devices, setDevices] = useState<{ deviceId: string; label: string }[]>([]);\n const [inputDeviceId, setInputDeviceId] = useState('');\n\n let { visible } = useShallowEqualSelector(state => state.dumpDialog);\n\n const handleClose = useCallback(() => {\n setInputDeviceId('');\n serviceRegistry.mediaRecorderService?.stopTestInput();\n dispatch(dumpDialogActions.setVisible(false));\n }, [dispatch]);\n\n const handleChange = useCallback(\n (ev: React.ChangeEvent<{ value: unknown }>) => {\n const deviceId = ev.target.value as string;\n setInputDeviceId(deviceId);\n serviceRegistry.mediaRecorderService?.stopTestInput();\n serviceRegistry.mediaRecorderService?.playTestInput(deviceId);\n },\n [setInputDeviceId]\n );\n\n const handleStartTransfer = useCallback(() => {\n dispatch(recordTracks(trackIndexes, inputDeviceId));\n handleClose();\n }, [trackIndexes, inputDeviceId, dispatch, handleClose]);\n\n useEffect(() => {\n async function updateDeviceList() {\n await navigator.mediaDevices.getUserMedia({ audio: true });\n let devices = await navigator.mediaDevices.enumerateDevices();\n let inputDevices = devices\n .filter(device => device.kind === 'audioinput')\n .map(device => ({ deviceId: device.deviceId, label: device.label }));\n setDevices(inputDevices);\n }\n if (visible) {\n updateDeviceList();\n }\n }, [visible, setDevices]);\n\n const vintageMode = useShallowEqualSelector(state => state.appState.vintageMode);\n\n if (vintageMode) {\n const p = {\n handleClose,\n handleChange,\n handleStartTransfer,\n visible,\n devices,\n inputDeviceId,\n };\n return ;\n }\n\n return (\n \n Record Selected Tracks\n \n \n {`💻 ⬅ 💽`}\n \n \n 1. Connect your MD Player line-out to your PC audio line-in.\n \n \n 2. Use the controls at the bottom right to play some tracks.\n \n \n 3. Select the input source. You should hear the tracks playing on your PC.\n \n \n 4. Adjust the input gain and the line-out volume of your device.\n \n \n \n \n Input Source\n \n \n \n \n \n \n \n \n \n );\n};\n","import React, { useContext } from 'react';\nimport {\n Table,\n TableHead,\n TableRow,\n TableHeadCell,\n TableBody,\n TableDataCell,\n Divider,\n Toolbar,\n Bar,\n Button,\n WindowContent,\n Tooltip,\n List,\n ListItem,\n} from 'react95';\nimport { Disc, formatTimeFromFrames } from 'netmd-js';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { DropzoneRootProps, DropzoneInputProps } from 'react-dropzone';\nimport { ThemeContext } from 'styled-components';\nimport { Controls } from '../controls';\nimport { useShallowEqualSelector } from '../../utils';\n\nimport DeleteIconUrl from '../../images/win95/delete.png';\nimport MicIconUrl from '../../images/win95/mic.png';\nimport MoveIconUrl from '../../images/win95/move.png';\nimport RenameIconUrl from '../../images/win95/rename.png';\nimport DeviceIconUrl from '../../images/win95/device.png';\nimport { RenameDialog } from '../rename-dialog';\nimport { AboutDialog } from '../about-dialog';\n\nimport MDIconUrl from '../../images/win95/minidisc32.png';\nimport { FloatingButton, CustomTableRow } from './common';\nimport { ConvertDialog } from '../convert-dialog';\nimport { UploadDialog } from '../upload-dialog';\nimport { ErrorDialog } from '../error-dialog';\nimport { RecordDialog } from '../record-dialog';\nimport { DumpDialog } from '../dump-dialog';\nimport { PanicDialog } from '../panic-dialog';\n\nconst useStyles = makeStyles((theme: any) => ({\n container: {\n width: '100%',\n flex: '1 1 auto',\n display: 'flex',\n minHeight: 0,\n '& > div': {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n },\n },\n table: {\n height: '100%',\n width: '100%',\n display: 'flex !important',\n flexDirection: 'column',\n },\n windowContent: {\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 0,\n },\n controlsContainer: {\n width: '100%',\n marginTop: 16,\n },\n toolbarIcon: {\n marginRight: 4,\n },\n toolbarItem: {\n padding: '6px 10px',\n },\n}));\n\nexport const W95Main = (props: {\n disc: Disc | null;\n deviceName: string;\n selected: number[];\n setSelected: React.Dispatch>;\n selectedCount: number;\n tracks: {\n index: number;\n title: string;\n fullWidthTitle: string;\n group: string | null;\n duration: string;\n encoding: string;\n }[];\n uploadedFiles: File[];\n setUploadedFiles: React.Dispatch>;\n onDrop: (acceptedFiles: File[], rejectedFiles: File[]) => void;\n getRootProps: (props?: DropzoneRootProps | undefined) => DropzoneRootProps;\n getInputProps: (props?: DropzoneInputProps | undefined) => DropzoneInputProps;\n isDragActive: boolean;\n open: () => void;\n moveMenuAnchorEl: HTMLElement | null;\n setMoveMenuAnchorEl: React.Dispatch>;\n handleShowMoveMenu: (event: React.MouseEvent) => void;\n handleCloseMoveMenu: () => void;\n handleMoveSelectedTrack: (destIndex: number) => void;\n handleShowDumpDialog: () => void;\n handleDeleteSelected: (event: React.MouseEvent) => void;\n handleRenameActionClick: (event: React.MouseEvent) => void;\n handleRenameTrack: (event: React.MouseEvent, item: number) => void;\n handleSelectAllClick: (event: React.ChangeEvent) => void;\n handleSelectTrackClick: (event: React.MouseEvent, item: number) => void;\n}) => {\n const classes = useStyles();\n const themeContext = useContext(ThemeContext);\n const { mainView } = useShallowEqualSelector(state => state.appState);\n\n return (\n <>\n \n \n {props.selectedCount === 0 ? (\n <>\n \"device\"\n
\n {`${props.deviceName}: (` || `Loading...`}\n {props.disc?.fullWidthTitle && `${props.disc?.fullWidthTitle} / `}\n {props.disc?.title || `Untitled Disc`}\n {`)`}\n
\n \n \"minidisc\"\n {props.disc !== null ? (\n \n
{`${formatTimeFromFrames(\n props.disc.left,\n false\n )} left of ${formatTimeFromFrames(props.disc.total, false)} `}
\n \n ) : null}\n \n ) : null}\n\n {props.selectedCount > 0 ? (\n <>\n \n \n \n \n {!!props.moveMenuAnchorEl ? (\n \n {Array(props.tracks.length)\n .fill(null)\n .map((_, i) => {\n return (\n props.handleMoveSelectedTrack(i)}>\n {i + 1}\n \n );\n })}\n \n ) : null}\n \n ) : null}\n \n
\n \n \n
\n \n \n \n \n #\n Title\n Duration\n \n \n \n {props.tracks.map(track => (\n props.handleRenameTrack(event, track.index)}\n onClick={(event: React.MouseEvent) => props.handleSelectTrackClick(event, track.index)}\n >\n {track.index + 1}\n \n
\n {track.fullWidthTitle && `${track.fullWidthTitle} / `}\n {track.title || `No Title`}\n
\n
\n \n {track.encoding}\n  \n {track.duration}\n \n \n ))}\n
\n
\n
\n
{mainView === 'MAIN' ? : null}
\n
\n \n\n \n \n \n \n \n \n \n \n \n );\n};\n","import React, { useEffect, useCallback, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport clsx from 'clsx';\nimport { useDropzone } from 'react-dropzone';\nimport {\n DragDropContext,\n Draggable,\n DraggableProvided,\n DropResult,\n ResponderProvided,\n Droppable,\n DroppableProvided,\n DroppableStateSnapshot,\n} from 'react-beautiful-dnd';\nimport { listContent, deleteTracks, moveTrack, groupTracks, deleteGroup, dragDropTrack } from '../redux/actions';\nimport { actions as renameDialogActions } from '../redux/rename-dialog-feature';\nimport { actions as convertDialogActions } from '../redux/convert-dialog-feature';\nimport { actions as dumpDialogActions } from '../redux/dump-dialog-feature';\n\nimport { DeviceStatus, formatTimeFromFrames, Track } from 'netmd-js';\nimport { control } from '../redux/actions';\n\nimport { belowDesktop, forAnyDesktop, getGroupedTracks, getSortedTracks, isSequential, useShallowEqualSelector } from '../utils';\n\nimport { lighten, makeStyles } from '@material-ui/core/styles';\nimport { alpha } from '@material-ui/core/styles/colorManipulator';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Fab from '@material-ui/core/Fab';\nimport AddIcon from '@material-ui/icons/Add';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport CreateNewFolderIcon from '@material-ui/icons/CreateNewFolder';\n\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { batchActions } from 'redux-batched-actions';\n\nimport { GroupRow, TrackRow } from './main-rows';\nimport { RenameDialog } from './rename-dialog';\nimport { UploadDialog } from './upload-dialog';\nimport { RecordDialog } from './record-dialog';\nimport { ErrorDialog } from './error-dialog';\nimport { PanicDialog } from './panic-dialog';\nimport { ConvertDialog } from './convert-dialog';\nimport { AboutDialog } from './about-dialog';\nimport { DumpDialog } from './dump-dialog';\nimport { TopMenu } from './topmenu';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Button from '@material-ui/core/Button';\nimport { W95Main } from './win95/main';\nimport { useMemo } from 'react';\n\nconst useStyles = makeStyles(theme => ({\n add: {\n position: 'absolute',\n bottom: theme.spacing(3),\n right: theme.spacing(3),\n [belowDesktop(theme)]: {\n bottom: theme.spacing(2),\n },\n },\n main: {\n overflowY: 'auto',\n flex: '1 1 auto',\n marginBottom: theme.spacing(3),\n outline: 'none',\n marginLeft: theme.spacing(-1),\n marginRight: theme.spacing(-1),\n [forAnyDesktop(theme)]: {\n marginLeft: theme.spacing(-2),\n marginRight: theme.spacing(-2),\n },\n },\n toolbar: {\n marginTop: theme.spacing(3),\n marginLeft: theme.spacing(-2),\n marginRight: theme.spacing(-2),\n [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: {\n marginLeft: theme.spacing(-3),\n marginRight: theme.spacing(-3),\n },\n },\n toolbarLabel: {\n flex: '1 1 100%',\n },\n toolbarHighlight:\n theme.palette.type === 'light'\n ? {\n color: theme.palette.secondary.main,\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\n }\n : {\n color: theme.palette.text.primary,\n backgroundColor: theme.palette.secondary.dark,\n },\n headBox: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n spacing: {\n marginTop: theme.spacing(1),\n },\n indexCell: {\n whiteSpace: 'nowrap',\n paddingRight: 0,\n width: theme.spacing(4),\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff',\n },\n remainingTimeTooltip: {\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n },\n hoveringOverGroup: {\n backgroundColor: `${alpha(theme.palette.secondary.dark, 0.4)}`,\n },\n dragHandleEmpty: {\n width: 20,\n padding: `${theme.spacing(0.5)}px 0 0 0`,\n },\n}));\n\nfunction getTrackStatus(track: Track, deviceStatus: DeviceStatus | null): 'playing' | 'paused' | 'none' {\n if (!deviceStatus || track.index !== deviceStatus.track) {\n return 'none';\n }\n\n if (deviceStatus.state === 'playing') {\n return 'playing';\n } else if (deviceStatus.state === 'paused') {\n return 'paused';\n } else {\n return 'none';\n }\n}\n\nexport const Main = (props: {}) => {\n let dispatch = useDispatch();\n const disc = useShallowEqualSelector(state => state.main.disc);\n const deviceName = useShallowEqualSelector(state => state.main.deviceName);\n const deviceStatus = useShallowEqualSelector(state => state.main.deviceStatus);\n const { vintageMode } = useShallowEqualSelector(state => state.appState);\n\n const [selected, setSelected] = React.useState([]);\n const [uploadedFiles, setUploadedFiles] = React.useState([]);\n const [lastClicked, setLastClicked] = useState(-1);\n const [moveMenuAnchorEl, setMoveMenuAnchorEl] = React.useState(null);\n\n const handleShowMoveMenu = useCallback(\n (event: React.MouseEvent) => {\n setMoveMenuAnchorEl(event.currentTarget);\n },\n [setMoveMenuAnchorEl]\n );\n const handleCloseMoveMenu = useCallback(() => {\n setMoveMenuAnchorEl(null);\n }, [setMoveMenuAnchorEl]);\n\n const handleMoveSelectedTrack = useCallback(\n (destIndex: number) => {\n dispatch(moveTrack(selected[0], destIndex));\n handleCloseMoveMenu();\n },\n [dispatch, selected, handleCloseMoveMenu]\n );\n\n const handleDrop = useCallback(\n (result: DropResult, provided: ResponderProvided) => {\n if (!result.destination) return;\n let sourceList = parseInt(result.source.droppableId),\n sourceIndex = result.source.index,\n targetList = parseInt(result.destination.droppableId),\n targetIndex = result.destination.index;\n dispatch(dragDropTrack(sourceList, sourceIndex, targetList, targetIndex));\n },\n [dispatch]\n );\n\n const handleShowDumpDialog = useCallback(() => {\n dispatch(dumpDialogActions.setVisible(true));\n }, [dispatch]);\n\n useEffect(() => {\n dispatch(listContent());\n }, [dispatch]);\n\n useEffect(() => {\n setSelected([]); // Reset selection if disc changes\n }, [disc]);\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: File[]) => {\n setUploadedFiles(acceptedFiles);\n dispatch(convertDialogActions.setVisible(true));\n },\n [dispatch]\n );\n\n const { getRootProps, getInputProps, isDragActive, open } = useDropzone({\n onDrop,\n accept: [`audio/*`, `video/mp4`],\n noClick: true,\n });\n\n const classes = useStyles();\n const tracks = useMemo(() => getSortedTracks(disc), [disc]);\n const groupedTracks = useMemo(() => getGroupedTracks(disc), [disc]);\n\n // Action Handlers\n const handleSelectTrackClick = useCallback(\n (event: React.MouseEvent, item: number) => {\n if (event.shiftKey && selected.length && lastClicked !== -1) {\n let rangeBegin = Math.min(lastClicked + 1, item),\n rangeEnd = Math.max(lastClicked - 1, item);\n let copy = [...selected];\n for (let i = rangeBegin; i <= rangeEnd; i++) {\n let index = copy.indexOf(i);\n if (index === -1) copy.push(i);\n else copy.splice(index, 1);\n }\n if (!copy.includes(item)) copy.push(item);\n setSelected(copy);\n } else if (selected.includes(item)) {\n setSelected(selected.filter(i => i !== item));\n } else {\n setSelected([...selected, item]);\n }\n setLastClicked(item);\n },\n [selected, setSelected, lastClicked, setLastClicked]\n );\n\n const handleSelectAllClick = useCallback(\n (event: React.ChangeEvent) => {\n if (selected.length < tracks.length) {\n setSelected(tracks.map(t => t.index));\n } else {\n setSelected([]);\n }\n },\n [selected, tracks]\n );\n\n const handleRenameTrack = useCallback(\n (event: React.MouseEvent, index: number) => {\n let track = tracks.find(t => t.index === index);\n if (!track) {\n return;\n }\n\n dispatch(\n batchActions([\n renameDialogActions.setVisible(true),\n renameDialogActions.setGroupIndex(null),\n renameDialogActions.setCurrentName(track.title),\n renameDialogActions.setCurrentFullWidthName(track.fullWidthTitle),\n renameDialogActions.setIndex(track.index),\n ])\n );\n },\n [dispatch, tracks]\n );\n\n const handleRenameGroup = useCallback(\n (event: React.MouseEvent, index: number) => {\n let group = groupedTracks.find(g => g.index === index);\n if (!group) {\n return;\n }\n\n dispatch(\n batchActions([\n renameDialogActions.setVisible(true),\n renameDialogActions.setGroupIndex(index),\n renameDialogActions.setCurrentName(group.title ?? ''),\n renameDialogActions.setCurrentFullWidthName(group.fullWidthTitle ?? ''),\n renameDialogActions.setIndex(-1),\n ])\n );\n },\n [dispatch, groupedTracks]\n );\n\n const handleRenameActionClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.detail !== 1) return; //Event retriggering when hitting enter in the dialog\n handleRenameTrack(event, selected[0]);\n },\n [handleRenameTrack, selected]\n );\n\n const handleDeleteSelected = useCallback(\n (event: React.MouseEvent) => {\n dispatch(deleteTracks(selected));\n },\n [dispatch, selected]\n );\n\n const handleGroupTracks = useCallback(\n (event: React.MouseEvent) => {\n dispatch(groupTracks(selected));\n },\n [dispatch, selected]\n );\n\n const handleDeleteGroup = useCallback(\n (event: React.MouseEvent, index: number) => {\n dispatch(deleteGroup(index));\n },\n [dispatch]\n );\n\n const handleTogglePlayPauseTrack = useCallback(\n (event: React.MouseEvent, track: number) => {\n if (!deviceStatus) {\n return;\n }\n if (deviceStatus.track !== track) {\n dispatch(control('goto', track));\n if (deviceStatus.state !== 'playing') {\n dispatch(control('play'));\n }\n } else if (deviceStatus.state === 'playing') {\n dispatch(control('pause'));\n }\n },\n [dispatch, deviceStatus]\n );\n\n const canGroup = useMemo(() => {\n return (\n tracks.filter(n => n.group === null && selected.includes(n.index)).length === selected.length &&\n isSequential(selected.sort((a, b) => a - b))\n );\n }, [tracks, selected]);\n const selectedCount = selected.length;\n\n if (vintageMode) {\n const p = {\n disc,\n deviceName,\n\n selected,\n setSelected,\n selectedCount,\n\n tracks,\n uploadedFiles,\n setUploadedFiles,\n\n onDrop,\n getRootProps,\n getInputProps,\n isDragActive,\n open,\n\n moveMenuAnchorEl,\n setMoveMenuAnchorEl,\n\n handleShowMoveMenu,\n handleCloseMoveMenu,\n handleMoveSelectedTrack,\n handleShowDumpDialog,\n handleDeleteSelected,\n handleRenameActionClick,\n handleRenameTrack,\n handleSelectAllClick,\n handleSelectTrackClick,\n };\n return ;\n }\n\n return (\n \n \n \n {deviceName || `Loading...`}\n \n \n \n \n {disc !== null ? (\n \n {`${formatTimeFromFrames(disc.left, false)} left of ${formatTimeFromFrames(disc.total, false)} `}\n \n {`${formatTimeFromFrames(disc.left * 2, false)} left in LP2 Mode`}\n
\n {`${formatTimeFromFrames(disc.left * 4, false)} left in LP4 Mode`}\n
\n }\n arrow\n >\n SP Mode\n \n
\n ) : (\n `Loading...`\n )}\n \n 0,\n })}\n >\n {selectedCount > 0 ? (\n 0 && selectedCount < tracks.length}\n checked={selectedCount > 0}\n onChange={handleSelectAllClick}\n inputProps={{ 'aria-label': 'select all tracks' }}\n />\n ) : null}\n {selectedCount > 0 ? (\n \n {selectedCount} selected\n \n ) : (\n \n {disc?.fullWidthTitle && `${disc.fullWidthTitle} / `}\n {disc?.title || `Untitled Disc`}\n \n )}\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n\n {selectedCount > 0 ? (\n \n \n \n \n \n ) : null}\n \n \n \n \n \n \n \n #\n Title\n Duration\n \n \n \n \n {groupedTracks.map((group, index) => (\n \n \n
\n \n {(provided: DroppableProvided, snapshot: DroppableStateSnapshot) => (\n \n {group.title !== null && (\n \n )}\n {group.title === null && group.tracks.length === 0 && (\n \n )}\n {group.tracks.map((t, tidx) => (\n \n {(provided: DraggableProvided) => (\n \n )}\n \n ))}\n {provided.placeholder}\n \n )}\n \n
\n \n \n ))}\n \n \n \n {isDragActive ? (\n \n Drop your Music to Upload\n \n ) : null}\n
\n \n \n \n\n \n \n \n \n \n \n \n \n \n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { forAnyDesktop, forWideDesktop, useShallowEqualSelector } from '../../utils';\n\nimport { Welcome } from '../welcome';\nimport { Main } from '../main';\nimport { actions as appActions } from '../../redux/app-feature';\n\nimport { Window, WindowHeader, Button, Toolbar, Panel, Hourglass, styleReset, Anchor } from 'react95';\nimport { createGlobalStyle, ThemeProvider as StyledThemeProvider } from 'styled-components';\nimport original from 'react95/dist/themes/original';\nimport { TopMenu } from '../topmenu';\nimport { useDispatch } from 'react-redux';\n\nimport CDPlayerIconUrl from '../../images/win95/cdplayer.png';\nimport { WindowCloseIcon } from './common';\n\nconst GlobalStyles = createGlobalStyle`\n${styleReset}\nbody {\n font-family: 'ms_sans_serif';\n}\nimg {\n image-rendering: pixelated;\n}\n`;\n\nconst useStyles = makeStyles(theme => ({\n desktop: {\n width: '100%',\n height: '100%',\n backgroundColor: 'teal',\n display: 'flex',\n justifyContent: 'center',\n },\n window: {\n display: 'flex !important', // This is needed to override the styledComponent prop :(\n flexDirection: 'column',\n width: 'auto',\n height: '100%',\n [forAnyDesktop(theme)]: {\n width: 600,\n marginLeft: 'auto',\n marginRight: 'auto',\n height: 600,\n marginTop: theme.spacing(2),\n },\n [forWideDesktop(theme)]: {\n width: 700,\n height: 700,\n marginTop: theme.spacing(2),\n },\n },\n loading: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n}));\n\nexport const W95App = () => {\n const classes = useStyles();\n const dispatch = useDispatch();\n const { mainView, loading } = useShallowEqualSelector(state => state.appState);\n const [isMenuOpen, setMenuOpen] = useState(false);\n\n const handleExit = useCallback(() => {\n dispatch(appActions.setMainView('WELCOME'));\n }, [dispatch]);\n\n const closeMenu = useCallback(() => {\n setMenuOpen(false);\n }, [setMenuOpen]);\n\n const toggleMenu = useCallback(() => {\n setMenuOpen(!isMenuOpen);\n }, [isMenuOpen, setMenuOpen]);\n\n const handleHelpClick = useCallback(() => {\n window.open('https://github.com/cybercase/webminidisc/wiki/Support-and-FAQ', '_blank');\n }, []);\n\n const currentTheme = original;\n const theme = {\n ...currentTheme,\n selectedTableRow: {\n background: currentTheme.hoverBackground,\n color: currentTheme.canvasTextInvert,\n },\n };\n\n return (\n
\n \n \n \n \n \"CD\n Web MiniDisc\n {mainView === 'MAIN' ? (\n \n ) : null}\n \n \n \n \n {isMenuOpen ? : null}\n \n <>\n {mainView === 'WELCOME' ? : null}\n {mainView === 'MAIN' ?
: null}\n \n \n  \n {' (c) '}\n \n Stefano Brilli\n {' '}\n {new Date().getFullYear()}\n {'.'}\n \n {loading ? (\n
\n \n
\n ) : null}\n \n \n
\n );\n};\n","import React from 'react';\nimport { belowDesktop, forAnyDesktop, forWideDesktop, useShallowEqualSelector } from '../utils';\n\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport { makeStyles, createTheme, ThemeProvider } from '@material-ui/core/styles';\n\nimport { Welcome } from './welcome';\nimport { Main } from './main';\nimport { Controls } from './controls';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport Link from '@material-ui/core/Link';\nimport Box from '@material-ui/core/Box';\nimport { W95App } from './win95/app';\n\nconst useStyles = makeStyles(theme => ({\n layout: {\n width: 'auto',\n height: '100%',\n [forAnyDesktop(theme)]: {\n width: 600,\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n [forWideDesktop(theme)]: {\n width: 700,\n },\n },\n\n paper: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(2),\n height: 'calc(100% - 20px)',\n [forAnyDesktop(theme)]: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(1),\n padding: theme.spacing(3),\n height: 600,\n },\n [forWideDesktop(theme)]: {\n height: 700,\n },\n },\n bottomBar: {\n display: 'flex',\n alignItems: 'center',\n [belowDesktop(theme)]: {\n flexWrap: 'wrap',\n },\n marginLeft: -theme.spacing(2),\n },\n copyrightTypography: {\n textAlign: 'center',\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff',\n },\n minidiscLogo: {\n width: 48,\n },\n controlsContainer: {\n flex: '0 0 auto',\n width: '100%',\n paddingRight: theme.spacing(8),\n [belowDesktop(theme)]: {\n paddingLeft: 0,\n },\n },\n}));\n\nconst darkTheme = createTheme({\n palette: {\n type: 'dark',\n primary: {\n light: '#6ec6ff',\n main: '#2196f3',\n dark: '#0069c0',\n contrastText: '#fff',\n },\n },\n});\n\nconst lightTheme = createTheme({\n palette: {\n type: 'light',\n },\n});\n\nconst App = () => {\n const classes = useStyles();\n const { mainView, loading, darkMode, vintageMode } = useShallowEqualSelector(state => state.appState);\n\n if (vintageMode) {\n return ;\n }\n\n return (\n \n \n \n\n
\n \n {mainView === 'WELCOME' ? : null}\n {mainView === 'MAIN' ?
: null}\n\n {mainView === 'MAIN' ? : null}\n \n \n {'© '}\n \n Stefano Brilli\n {' '}\n {new Date().getFullYear()}\n {'.'}\n \n
\n\n {loading ? (\n \n \n \n ) : null}\n \n \n );\n};\n\nexport default App;\n","/* eslint no-restricted-globals: 0 */\nimport { getPublicPathFor } from '../utils';\nexport class AtracdencProcess {\n private messageCallback?: (ev: MessageEvent) => void;\n\n constructor(public worker: Worker) {\n worker.onmessage = this.handleMessage.bind(this);\n }\n\n async init() {\n await new Promise(resolve => {\n this.messageCallback = resolve;\n this.worker.postMessage({ action: 'init' });\n });\n }\n\n async encode(data: ArrayBuffer, bitrate: string) {\n let eventData = await new Promise(resolve => {\n this.messageCallback = resolve;\n this.worker.postMessage({ action: 'encode', bitrate, data }, [data]);\n });\n return eventData.data.result as Uint8Array;\n }\n\n terminate() {\n this.worker.terminate();\n }\n\n handleMessage(ev: MessageEvent) {\n this.messageCallback!(ev);\n this.messageCallback = undefined;\n }\n}\n\nif (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n // Worker\n let Module: any;\n onmessage = async (ev: MessageEvent) => {\n const { action, ...others } = ev.data;\n if (action === 'init') {\n self.importScripts(getPublicPathFor(`atracdenc.js`));\n (self as any).Module().then((m: any) => {\n Module = m;\n self.postMessage({ action: 'init' });\n Module.setLogger && Module.setLogger((msg: string, stream: string) => console.log(`${stream}: ${msg}`));\n });\n } else if (action === 'encode') {\n const { bitrate, data } = others;\n const inWavFile = `inWavFile.wav`;\n const outAt3File = `outAt3File.aea`;\n const dataArray = new Uint8Array(data);\n Module.FS.writeFile(`${inWavFile}`, dataArray);\n Module.callMain([`-e`, `atrac3`, `-i`, inWavFile, `-o`, outAt3File, `--bitrate`, bitrate]);\n\n // Read file and trim header (96 bytes)\n let fileStat = Module.FS.stat(outAt3File);\n let size = fileStat.size;\n let tmp = new Uint8Array(size - 96);\n let outAt3FileStream = Module.FS.open(outAt3File, 'r');\n Module.FS.read(outAt3FileStream, tmp, 0, tmp.length, 96);\n Module.FS.close(outAt3FileStream);\n\n let result = tmp.buffer;\n\n self.postMessage(\n {\n action: 'encode',\n result,\n },\n [result]\n );\n }\n };\n} else {\n // Main\n}\n","import { createWorker, setLogging } from '@ffmpeg/ffmpeg';\nimport { AtracdencProcess } from './atracdenc-worker';\nimport { getPublicPathFor } from '../utils';\nconst AtracdencWorker = require('worker-loader!./atracdenc-worker'); // eslint-disable-line import/no-webpack-loader-syntax\n\ninterface LogPayload {\n message: string;\n action: string;\n}\n\nexport interface AudioExportService {\n init(): Promise;\n export(params: { format: string }): Promise;\n info(): Promise<{ format: string | null; input: string | null }>;\n prepare(file: File): Promise;\n}\n\nexport class FFMpegAudioExportService implements AudioExportService {\n public ffmpegProcess: any;\n public atracdencProcess?: AtracdencProcess;\n public loglines: { action: string; message: string }[] = [];\n public inFileName: string = ``;\n public outFileNameNoExt: string = ``;\n\n async init() {\n setLogging(true);\n }\n\n async prepare(file: File) {\n this.loglines = [];\n this.ffmpegProcess = createWorker({\n logger: (payload: LogPayload) => {\n this.loglines.push(payload);\n console.log(payload.action, payload.message);\n },\n corePath: getPublicPathFor('ffmpeg-core.js'),\n workerPath: getPublicPathFor('worker.min.js'),\n });\n await this.ffmpegProcess.load();\n\n this.atracdencProcess = new AtracdencProcess(new AtracdencWorker());\n await this.atracdencProcess.init();\n\n let ext = file.name.split('.').slice(-1);\n if (ext.length === 0) {\n throw new Error(`Unrecognized file format: ${file.name}`);\n }\n\n this.inFileName = `inAudioFile.${ext[0]}`;\n this.outFileNameNoExt = `outAudioFile`;\n\n await this.ffmpegProcess.write(this.inFileName, file);\n }\n\n async info() {\n await this.ffmpegProcess.transcode(this.inFileName, `${this.outFileNameNoExt}.metadata`, `-f ffmetadata`);\n\n let audioFormatRegex = /Audio:\\s(.*?),/; // Actual content\n let inputFormatRegex = /Input #0,\\s(.*?),/; // Container\n let format: string | null = null;\n let input: string | null = null;\n\n for (let line of this.loglines) {\n let match = line.message.match(audioFormatRegex);\n if (match !== null) {\n format = match[1];\n continue;\n }\n match = line.message.match(inputFormatRegex);\n if (match !== null) {\n input = match[1];\n continue;\n }\n if (format !== null && input !== null) {\n break;\n }\n }\n\n return { format, input };\n }\n\n async export({ format }: { format: string }) {\n let result: ArrayBuffer;\n if (format === `SP`) {\n const outFileName = `${this.outFileNameNoExt}.raw`;\n await this.ffmpegProcess.transcode(this.inFileName, outFileName, '-ac 2 -ar 44100 -f s16be');\n let { data } = await this.ffmpegProcess.read(outFileName);\n result = data.buffer;\n } else {\n const outFileName = `${this.outFileNameNoExt}.wav`;\n await this.ffmpegProcess.transcode(this.inFileName, outFileName, '-f wav -ar 44100 -ac 2');\n let { data } = await this.ffmpegProcess.read(outFileName);\n let bitrate: string = `0`;\n switch (format) {\n case `LP2`:\n bitrate = `128`;\n break;\n case `LP105`:\n bitrate = `102`;\n break;\n case `LP4`:\n bitrate = `64`;\n break;\n }\n result = await this.atracdencProcess!.encode(data.buffer, bitrate);\n }\n this.ffmpegProcess.worker.terminate();\n this.atracdencProcess!.terminate();\n return result;\n }\n}\n","/* eslint no-restricted-globals: 0 */\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport * as serviceWorker from './serviceWorker';\nimport { NetMDUSBService } from './services/netmd';\nimport { NetMDMockService } from './services/netmd-mock';\nimport serviceRegistry from './services/registry';\n\nimport { store } from './redux/store';\nimport { actions as appActions } from './redux/app-feature';\nimport { actions as mainActions } from './redux/main-feature';\n\nimport App from './components/app';\n\nimport './index.css';\nimport './fonts/fonts.css';\n\nimport { FFMpegAudioExportService } from './services/audio-export';\nimport { MediaRecorderService } from './services/mediarecorder';\n\nserviceRegistry.netmdService = new NetMDUSBService({ debug: true });\n// serviceRegistry.netmdService = new NetMDMockService(); // Uncomment to work without a device attached\nserviceRegistry.audioExportService = new FFMpegAudioExportService();\nserviceRegistry.mediaRecorderService = new MediaRecorderService();\n\n(function setupEventHandlers() {\n window.addEventListener('beforeunload', ev => {\n let isUploading = store.getState().uploadDialog.visible;\n if (!isUploading) {\n return;\n }\n ev.preventDefault();\n ev.returnValue = `Warning! Recording will be interrupted`;\n });\n\n if (navigator && navigator.usb) {\n navigator.usb.ondisconnect = function() {\n store.dispatch(appActions.setMainView('WELCOME'));\n };\n } else {\n store.dispatch(appActions.setBrowserSupported(false));\n }\n\n if (!('Notification' in window) || Notification.permission === 'denied') {\n store.dispatch(appActions.setNotificationSupport(false));\n store.dispatch(appActions.setNotifyWhenFinished(false));\n }\n\n // eslint-disable-next-line\n let deferredPrompt: any;\n window.addEventListener('beforeinstallprompt', (e: any) => {\n e.preventDefault();\n deferredPrompt = e;\n });\n})();\n\n(function statusMonitorManager() {\n // Polls the device for its state while playing tracks\n let statusMonitorInterval: ReturnType | null = null;\n let exceptionOccurred: boolean = false;\n\n function shouldMonitorBeRunning(state: ReturnType): boolean {\n return (\n !exceptionOccurred &&\n // App ready\n state.appState.mainView === 'MAIN' &&\n state.appState.loading === false &&\n // Disc playing\n state.main.deviceStatus?.state === 'playing' &&\n // No operational dialogs running\n state.convertDialog.visible === false &&\n state.uploadDialog.visible === false &&\n state.recordDialog.visible === false &&\n state.panicDialog.visible === false &&\n state.errorDialog.visible === false &&\n state.dumpDialog.visible === false\n );\n }\n\n store.subscribe(function() {\n const state = store.getState();\n if (shouldMonitorBeRunning(state) === true && statusMonitorInterval === null) {\n // start monitor\n statusMonitorInterval = setInterval(async () => {\n try {\n const deviceStatus = await serviceRegistry.netmdService!.getDeviceStatus();\n store.dispatch(mainActions.setDeviceStatus(deviceStatus));\n } catch (e) {\n console.error(e);\n exceptionOccurred = true; // Stop monitor on exception\n }\n }, 5000);\n } else if (shouldMonitorBeRunning(state) === false && statusMonitorInterval !== null) {\n // stop monitor\n clearInterval(statusMonitorInterval);\n statusMonitorInterval = null;\n }\n });\n})();\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\nif (process.env.REACT_APP_NO_GA_RELEASE !== 'true') {\n serviceWorker.register();\n // serviceWorker.unregister();\n\n try {\n (function() {\n let head = document.getElementsByTagName('head')[0];\n let uascript = document.createElement('script');\n uascript.type = 'text/javascript';\n uascript.src = 'https://www.googletagmanager.com/gtag/js?id=UA-60498490-1';\n head.appendChild(uascript);\n\n let pvscript = document.createElement('script');\n pvscript.type = 'text/javascript';\n pvscript.text = `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', 'UA-60498490-1');\n `;\n head.appendChild(pvscript);\n })();\n } catch (err) {}\n}\n","import { sanitizeTitle, getPublicPathFor } from '../utils';\nimport Recorder from 'recorderjs';\n\nexport class MediaRecorderService {\n public recorder: any;\n public stream?: MediaStream;\n public audioContext?: AudioContext;\n public analyserNode?: AnalyserNode;\n public gainNode?: GainNode;\n\n playTestInput(deviceId: string) {\n this.audioContext = new AudioContext();\n this.gainNode = this.audioContext.createGain();\n this.analyserNode = this.audioContext.createAnalyser();\n\n this.initStream(deviceId).then(() => {\n const source = this.audioContext!.createMediaStreamSource(this.stream!);\n source.connect(this.gainNode!);\n this.gainNode!.connect(this.analyserNode!);\n this.analyserNode!.connect(this.audioContext!.destination);\n });\n }\n\n stopTestInput() {\n if (!this.audioContext) {\n return;\n }\n this.audioContext?.close();\n delete this.audioContext;\n this.closeStream();\n }\n\n async initStream(deviceId: string) {\n const recordConstraints = {\n // Try to set the best recording params for ripping the audio tracks\n autoGainControl: false,\n channelCount: 2,\n deviceId: deviceId,\n echoCancellation: false,\n noiseSuppression: false,\n sampleRate: 44100,\n highpassFilter: false,\n };\n this.stream = await navigator.mediaDevices.getUserMedia({ audio: recordConstraints });\n\n // Dump recording settings\n const audioTracks = this.stream.getAudioTracks();\n if (audioTracks.length > 0) {\n console.log('Record Setings:', audioTracks[0].getSettings());\n }\n }\n\n async startRecording() {\n this.audioContext = new AudioContext();\n const input = this.audioContext.createMediaStreamSource(this.stream!);\n this.recorder = new Recorder(input, { workerPath: getPublicPathFor(`recorderWorker.js`) });\n this.recorder.record();\n }\n\n async stopRecording() {\n this.recorder.stop();\n }\n\n async closeStream() {\n this.stream?.getTracks().forEach(track => track.stop());\n }\n\n downloadRecorded(title: string) {\n this.recorder.exportWAV((buffer: Blob) => {\n let url = URL.createObjectURL(buffer);\n let a = document.createElement('a');\n document.body.appendChild(a);\n a.style.display = 'none';\n a.href = url;\n a.download = `${sanitizeTitle(title)}.wav`;\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n });\n }\n}\n"],"sourceRoot":""} \ No newline at end of file