├── .gitignore ├── icon.png ├── .vscodeignore ├── screenshots ├── animated.gif ├── on-time.png ├── status-bar.png └── 5-min-before.png ├── .vscode └── lauch.json ├── LICENSE.md ├── README.md ├── CHANGELOG.md ├── src ├── cities.js └── extension.js ├── package.json └── dist └── extension.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.vsix -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakuapik/vscode-waktusholat/HEAD/icon.png -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | *.vsix 2 | .gitignore 3 | .vscode/ 4 | CHANGELOG.md 5 | node_modules/ 6 | screenshots/ 7 | src/ -------------------------------------------------------------------------------- /screenshots/animated.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakuapik/vscode-waktusholat/HEAD/screenshots/animated.gif -------------------------------------------------------------------------------- /screenshots/on-time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakuapik/vscode-waktusholat/HEAD/screenshots/on-time.png -------------------------------------------------------------------------------- /screenshots/status-bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakuapik/vscode-waktusholat/HEAD/screenshots/status-bar.png -------------------------------------------------------------------------------- /screenshots/5-min-before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakuapik/vscode-waktusholat/HEAD/screenshots/5-min-before.png -------------------------------------------------------------------------------- /.vscode/lauch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Run Extension", 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "runtimeExecutable": "${execPath}", 9 | "args": [ 10 | "--extensionDevelopmentPath=${workspaceFolder}" 11 | ] 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright © 2021 David Adi Nugroho <> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Waktu Sholat 2 | 3 | [![visual studio marketplace](https://img.shields.io/badge/visual%20studio%20marketplace-v2.0.1-blue)](https://marketplace.visualstudio.com/items?itemName=lakuapik.waktusholat) 4 | [![Downloads](https://img.shields.io/visual-studio-marketplace/d/lakuapik.waktusholat)](https://marketplace.visualstudio.com/items?itemName=lakuapik.waktusholat) 5 | [![Rating](https://img.shields.io/visual-studio-marketplace/stars/lakuapik.waktusholat)](https://marketplace.visualstudio.com/items?itemName=lakuapik.waktusholat) 6 | 7 | Ekstensi Visual Studio Code (vscode) untuk menampilkan dan mengingatkan waktu sholat. 8 | 9 | ![](https://cdn.statically.io/gh/lakuapik/vscode-waktusholat/v2.x/screenshots/animated.gif) 10 | 11 | Data waktu sholat diambil dari [jadwalsholat.org](https://github.com/lakuapik/jadwalsholatorg/tree/master/adzan). 12 | 13 | ## Fitur 14 | 15 | ### Status Bar 16 | 17 | ![status bar](https://cdn.statically.io/gh/lakuapik/vscode-waktusholat/v2.x/screenshots/status-bar.png) 18 | 19 | ### Notifikasi 5 menit sebelum 20 | 21 | ![](https://cdn.statically.io/gh/lakuapik/vscode-waktusholat/v2.x/screenshots/5-min-before.png) 22 | 23 | ### Notifikasi waktu tiba 24 | 25 | ![](https://cdn.statically.io/gh/lakuapik/vscode-waktusholat/v2.x/screenshots/on-time.png) 26 | 27 | ### Suara Adzan 28 | 29 | Ekstensi ini menggunakan perkakas [`play-sound`](https://www.npmjs.com/package/play-sound) untuk memutar suara adzan. 30 | 31 | Apabila suara adzan tidak terdengar, silahkan pasang aplikasi berikut ini: 32 | 33 | * Windows dengan `mpg123` 34 | ```bat 35 | choco install mpg123 36 | ``` 37 | * Ubuntu GNU/Linux dengan `mpg123` 38 | ```bash 39 | sudo apt install mpg123 40 | ``` 41 | * MacOS dengan `afplay` 42 | ```bash 43 | # sudah terpasang bawaan pabrik 44 | ``` 45 | 46 | ## Pengaturan 47 | 48 | * `waktusholat.kota` 49 | Jadwal waktu sholat mengikuti kota yang dipilih. 50 | 51 | * `waktusholat.suara-adzan-aktif` 52 | Aktif/Non-aktifkan suara kumandang azdan. 53 | 54 | ## Perintah 55 | 56 | * **Waktu Sholat : Perbarui Jadwal** 57 | Memperbarui data jadwal waktu sholat. 58 | 59 | * **Waktu Sholat : Pilih Kota** 60 | Jadwal waktu sholat mengikuti kota yang dipilih. 61 | 62 | ## Atribusi 63 | * Ikon oleh [Freepik](https://www.flaticon.com/authors/freepik) diunduh di [www.flaticon.com](https://www.flaticon.com/free-icon/muslim-man-praying_84628). 64 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [2.0.1] - 2022-12-23 4 | 5 | ### Fixed 6 | - Gagal ketika pertama kali dibuka di windows (masalah mkdir) ([#15](https://github.com/lakuapik/vscode-waktusholat/pull/15)) 7 | 8 | ## [2.0.0] - 2021-09-08 9 | 10 | Dirombak, dibuat lebih sederhana dan *maintainable*. 11 | 12 | ### Added 13 | - Popup pilih kota saat pertama kali pasang ekstensi 14 | - Popup aktifkan suara adzan saat pertama kali pasang ekstensi 15 | - Opsi aktif/non-aktifkan suara adzan bisa diatur lewat konfigurasi 16 | - Tambah pustaka `esbuild` sebagai ganti `webpack` untuk bundle javascript 17 | - Tambah pustaka `underscorejs` sebagai ganti `lodash` 18 | - Tambah pustaka `node-fetch` sebagai ganti `request` dan `request-promise` 19 | - Tambah lisensi [MIT](./LICENSE.md) 20 | 21 | ### Fixed 22 | - Hanya perbarui jadwal ketika perubahan konfigurasi kota 23 | - Pembaruan kode dan penyederhanaan logic ([#12](https://github.com/lakuapik/vscode-waktusholat/issues/12)) 24 | - Freeze ketika perbarui jadwal ([#9](https://github.com/lakuapik/vscode-waktusholat/issues/9)) 25 | - Kumandangkan suara adzan saat `shubuh|dzuhur|ashr|magrib|isya` saja ([#8](https://github.com/lakuapik/vscode-waktusholat/issues/8)) 26 | - Suara adzan bentrok ketika membuka lebih dari 1 vscode secara bersamaan ([#7](https://github.com/lakuapik/vscode-waktusholat/issues/7)) 27 | 28 | ### Removed 29 | - Hapus pustaka yang tidak diperlukan 30 | 31 | ## [1.1.0] - 2020-09-19 32 | 33 | ### Added 34 | - Download berkas adzan mp3 dari internet 35 | 36 | ### Fixed 37 | - Suara adzan tidak berputar 38 | 39 | ### Removed 40 | - Hapus berkas adzan mp3, folder `sounds` 41 | 42 | ## [1.0.6] - 2020-04-21 43 | 44 | ### Added 45 | - Memutar suara adzan ketika waktu sholat tiba 46 | 47 | ## [1.0.5] - 2019-11-08 48 | 49 | ### Added 50 | - Screenshoot tampilan 51 | 52 | ## [1.0.4] - 2019-11-08 53 | 54 | ### Fixed 55 | - Waktu undefined setelah isya 56 | 57 | ## [1.0.3] - 2019-11-06 58 | 59 | ### Added 60 | - Notifikasi 5 menit sebelum waktu sholat tiba 61 | - Alert untuk memilih kota saat pertama menjalankan ekstensi 62 | 63 | ### Fixed 64 | - Status bar 65 | - Refactor kode 66 | 67 | ## [1.0.2] - 2019-11-04 68 | 69 | ### Added 70 | - Fungsi ketika status bar di klik 71 | 72 | ### Fixed 73 | - Ganti style penulisan js 74 | - Update data waktu sholat 75 | 76 | ## [1.0.1] - 2019-11-02 77 | 78 | ### Added 79 | - Ikon 80 | - Perintah untuk memilih kota dengan `QuickPick` 81 | 82 | ### Fixed 83 | - Ganti librari `request` ke `request-promise` 84 | - Letak file json diubah dari `tmp` ke `globalStoragePath` 85 | 86 | ## [1.0.0] - 2019-11-01 87 | 88 | ### Added 89 | - Notifikasi ketika waktu sholat tiba 90 | - Pengaturan kota (mempengaruhi waktu sholat) 91 | - Status Bar waktu sholat selanjutnya dan muncul tooltip ketika di hover -------------------------------------------------------------------------------- /src/cities.js: -------------------------------------------------------------------------------- 1 | export default cities = ["ambarawa", "ambon", "amlapura", "amuntai", "argamakmur", "atambua", "babo", "bagansiapiapi", "bahaurkalteng", "bajawa", "balige", "balikpapan", "bandaaceh", "bandarlampung", "bandung", "bangkalan", "bangkinang", "bangko", "bangli", "banjar", "banjarbaru", "banjarmasin", "banjarnegara", "bantaeng", "banten", "bantul", "banyuwangi", "barabai", "barito", "barru", "batam", "batang", "batu", "baturaja", "batusangkar", "baubau", "bekasi", "bengkalis", "bengkulu", "benteng", "biak", "bima", "binjai", "bireuen", "bitung", "blitar", "blora", "bogor", "bojonegoro", "bondowoso", "bontang", "boyolali", "brebes", "bukittinggi", "bulasbtmaluku", "bulukumba", "buntok", "cepu", "ciamis", "cianjur", "cibinong", "cilacap", "cilegon", "cimahi", "cirebon", "curup", "demak", "denpasar", "depok", "dili", "dompu", "donggala", "dumai", "ende", "enggano", "enrekang", "fakfak", "garut", "gianyar", "gombong", "gorontalo", "gresik", "gunungsitoli", "indramayu", "jakartabarat", "jakartapusat", "jakartaselatan", "jakartatimur", "jakartautara", "jambi", "jayapura", "jember", "jeneponto", "jepara", "jombang", "kabanjahe", "kalabahi", "kalianda", "kandangan", "karanganyar", "karawang", "kasungan", "kayuagung", "kebumen", "kediri", "kefamenanu", "kendal", "kendari", "kertosono", "ketapang", "kisaran", "klaten", "kolaka", "kotabarupulaulaut", "kotabumi", "kotajantho", "kotamobagu", "kualakapuas", "kualakurun", "kualapembuang", "kualatungkal", "kudus", "kuningan", "kupang", "kutacane", "kutoarjo", "labuhan", "lahat", "lamongan", "langsa", "larantuka", "lawang", "lhoseumawe", "limboto", "lubukbasung", "lubuklinggau", "lubukpakam", "lubuksikaping", "lumajang", "luwuk", "madiun", "magelang", "magetan", "majalengka", "majene", "makale", "makassar", "malang", "mamuju", "manna", "manokwari", "marabahan", "maros", "martapurakalsel", "masambasulsel", "masohi", "mataram", "maumere", "medan", "mempawah", "menado", "mentok", "merauke", "metro", "meulaboh", "mojokerto", "muarabulian", "muarabungo", "muaraenim", "muarateweh", "muarosijunjung", "muntilan", "nabire", "negara", "nganjuk", "ngawi", "nunukan", "pacitan", "padang", "padangpanjang", "padangsidempuan", "pagaralam", "painan", "palangkaraya", "palembang", "palopo", "palu", "pamekasan", "pandeglang", "pangka_", "pangkajenesidenreng", "pangkalanbun", "pangkalpinang", "panyabungan", "par_", "parepare", "pariaman", "pasuruan", "pati", "payakumbuh", "pekalongan", "pekanbaru", "pemalang", "pematangsiantar", "pendopo", "pinrang", "pleihari", "polewali", "pondokgede", "ponorogo", "pontianak", "poso", "prabumulih", "praya", "probolinggo", "purbalingga", "purukcahu", "purwakarta", "purwodadigrobogan", "purwokerto", "purworejo", "putussibau", "raha", "rangkasbitung", "rantau", "rantauprapat", "rantepao", "rembang", "rengat", "ruteng", "sabang", "salatiga", "samarinda", "sambaskalbar", "sampang", "sampit", "sanggau", "sawahlunto", "sekayu", "selong", "semarang", "sengkang", "serang", "serui", "sibolga", "sidikalang", "sidoarjo", "sigli", "singaparna", "singaraja", "singkawang", "sinjai", "sintang", "situbondo", "slawi", "sleman", "soasiu", "soe", "solo", "solok", "soreang", "sorong", "sragen", "stabat", "subang", "sukabumi", "sukoharjo", "sumbawabesar", "sumedang", "sumenep", "sungailiat", "sungaipenuh", "sungguminasa", "surabaya", "surakarta", "tabanan", "tahuna", "takalar", "takengon", "tamianglayang", "tanahgrogot", "tangerang", "tanjungbalai", "tanjungenim", "tanjungpandan", "tanjungpinang", "tanjungredep", "tanjungselor", "tapaktuan", "tarakan", "tarutung", "tasikmalaya", "tebingtinggi", "tegal", "temanggung", "tembilahan", "tenggarong", "ternate", "tolitoli", "tondano", "trenggalek", "tual", "tuban", "tulungagung", "ujungberung", "ungaran", "waikabubak", "waingapu", "wamena", "watampone", "watansoppeng", "wates", "wonogiri", "wonosari", "wonosobo", "yogyakarta"] 2 | -------------------------------------------------------------------------------- /src/extension.js: -------------------------------------------------------------------------------- 1 | import cities from './cities'; 2 | import fetch from 'node-fetch'; 3 | import { chain, map } from 'underscore'; 4 | import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; 5 | 6 | const vscode = require('vscode'); 7 | const player = require('play-sound')({}) 8 | 9 | /** MAIN FUNCTION */ 10 | 11 | const baseUrl = 'https://raw.githubusercontent.com' 12 | + '/lakuapik/jadwalsholatorg/master'; 13 | 14 | const audios = [ 15 | 'sheikh_abdul_karim_omar_fatani_al_makki_adzan.mp3', 16 | 'sheikh_abdul_karim_omar_fatani_al_makki_adzan_fajr.mp3', 17 | ]; 18 | 19 | const today_UK = new Date().toLocaleDateString('UK'); 20 | const year = today_UK.substr(6, 4); 21 | const month = today_UK.substr(3, 2); 22 | const day = today_UK.substr(0, 2); 23 | const today = `${year}-${month}-${day}`; 24 | 25 | let globalState, storagePath, summaryStatusBar, 26 | audioPlayer, audioPlayerStatusBar; 27 | 28 | const city = () => config('kota'); 29 | 30 | async function selectCity() { 31 | const placeHolder = `Kota terpilih: ${city()}. 32 | Jadwal waktu sholat mengikuti kota yang dipilih.`; 33 | return vscode.window.showQuickPick(cities, { placeHolder: placeHolder }) 34 | .then((value) => { 35 | if (value === undefined) return; 36 | config('kota', value); 37 | updateSchedule(); 38 | }); 39 | } 40 | 41 | function getScheduleFilePath() { 42 | return `${storagePath}/schedules/${city()}-${year}-${month}.json`; 43 | } 44 | 45 | function getSchedule() { 46 | try { 47 | return JSON.parse(readFileSync(getScheduleFilePath()).toString()); 48 | } catch (error) { 49 | vscode.window.showInformationMessage( 50 | `== Ekstensi Waktu Sholat == 51 | \njadwal sholat bulan ini tidak ada, lakukan pembaruan? 52 | \n*pembaruan memerlukan koneksi internet. 53 | \nkota terpilih saat ini: ${city()}`, 54 | { modal: true }, 55 | { title: 'Update', action: 1 }, 56 | ).then(button => { 57 | if (button === undefined) return; 58 | if (button.action == 1) updateSchedule(); 59 | }); 60 | } 61 | } 62 | 63 | function getTodaySchedule() { 64 | return chain(getSchedule()) 65 | .findWhere({ tanggal: today }) 66 | .omit('tanggal') 67 | .map((time, adzan) => ({ 68 | time: time, 69 | adzan: adzan, 70 | timestamp: new Date(`${today} ${time}`).getTime(), 71 | })) 72 | .sortBy('timestamp') 73 | .value(); 74 | } 75 | 76 | function updateSchedule() { 77 | vscode.window.withProgress({ 78 | cancellable: true, 79 | location: vscode.ProgressLocation.Notification, 80 | title: `Waktu Sholat: pembaruan jadwal kota ${city()}...`, 81 | }, async () => { 82 | const url = `${baseUrl}/adzan/${city()}/${year}/${month}.json`; 83 | return fetch(url).then(res => res.text()).then(content => { 84 | writeFileSync(getScheduleFilePath(), content); 85 | updateSummaryStatusBar(); 86 | }); 87 | }); 88 | } 89 | 90 | function setSummaryStatusBar(text, tooltip) { 91 | summaryStatusBar.text = text; 92 | summaryStatusBar.tooltip = tooltip; 93 | summaryStatusBar.show(); 94 | } 95 | 96 | function updateSummaryStatusBar() { 97 | const schedule = getTodaySchedule(); 98 | 99 | // no schedule 100 | if (schedule === undefined) { 101 | setSummaryStatusBar('🕌', `Jadwal kosong, silahkan lakukan pembaruan.`); 102 | return; 103 | } 104 | 105 | currentAdzan = chain(schedule) 106 | .filter(sch => { 107 | const fiveMinute = (5 * 60 * 1000); 108 | return sch.timestamp > now() - fiveMinute && sch.timestamp <= now(); 109 | }).first().value(); 110 | 111 | nextAdzan = chain(schedule) 112 | .filter(sch => sch.timestamp >= now()) 113 | .first().value(); 114 | 115 | // its time for current adzan 116 | if (currentAdzan !== undefined) { 117 | setSummaryStatusBar( 118 | `🕌 WAKTUNYA ${(currentAdzan.adzan).toUpperCase()}`, 119 | `Selamat menunaikan ${capitalize(currentAdzan.adzan)}` 120 | ); 121 | 122 | if (diffNowInMinutes(currentAdzan.timestamp) === 0) { 123 | vscode.window.showInformationMessage(` 124 | Waktu ${capitalize(currentAdzan.adzan)} 125 | pukul ${currentAdzan.time} telah tiba! 126 | `); 127 | } 128 | 129 | const playableAdzans = ['shubuh', 'dzuhur', 'ashr', 'magrib', 'isya']; 130 | if (playableAdzans.includes(currentAdzan.adzan)) { 131 | playAudio(currentAdzan.adzan); 132 | } 133 | 134 | return; 135 | } 136 | 137 | // no more next adzan 138 | if (nextAdzan === undefined) { 139 | setSummaryStatusBar('🕌 Isya', 'Sudah isya belum? lengkapi 5 waktumu'); 140 | return; 141 | } 142 | 143 | // normal, there are next adzan 144 | setSummaryStatusBar( 145 | `🕌 ${capitalize(nextAdzan.adzan)} ${nextAdzan.time}`, 146 | `${capitalize(nextAdzan.adzan)} ${diffNowForHumans(nextAdzan.timestamp)}` 147 | ); 148 | 149 | // next adzan in 5 minute 150 | if (diffNowInMinutes(nextAdzan.timestamp) === 5) { 151 | vscode.window.showInformationMessage(` 152 | PERHATIAN: ${capitalize(nextAdzan.adzan)} 153 | ${diffNowForHumans(nextAdzan.timestamp)} 154 | `); 155 | } 156 | } 157 | 158 | function showSummaryStatusBarInfo() { 159 | vscode.window.showInformationMessage(summaryStatusBar._tooltip); 160 | } 161 | 162 | async function downloadAudio() { 163 | const promises = map(audios, (path) => { 164 | const url = `${baseUrl}/adzan-mp3/${path}`; 165 | const storePath = `${storagePath}/audios/${path}`; 166 | 167 | if (existsSync(storePath)) return; 168 | 169 | return vscode.window.withProgress({ 170 | location: vscode.ProgressLocation.Notification, 171 | title: `Waktu Sholat: mengunduh audio ${path}...`, 172 | }, async () => { 173 | return fetch(url).then(res => res.buffer()).then((buffer) => { 174 | writeFileSync(storePath, buffer); 175 | }); 176 | }); 177 | }).values(); 178 | 179 | return Promise.all(promises); 180 | } 181 | 182 | async function playAudio(adzan, isFajr = false) { 183 | if (! config('suara-adzan-aktif')) return; 184 | 185 | const playKey = `waktusholat.${today}.${adzan}.play-audio`; 186 | 187 | if (globalState.get(playKey) === true) return; 188 | 189 | const path = isFajr ? audios[1] : audios[0]; 190 | const file = `${storagePath}/audios/${path}`; 191 | 192 | if (!existsSync(file)) { await downloadAudio() }; 193 | 194 | audioPlayer = player.play(file, (err, opts, next) => { 195 | next = stopAudioPlayer(); 196 | }); 197 | 198 | globalState.update(playKey, true); 199 | 200 | audioPlayerStatusBar = vscode.window.createStatusBarItem( 201 | vscode.StatusBarAlignment.Left, -9999 202 | ); 203 | audioPlayerStatusBar.text = 'Adzan berkumandang...'; 204 | audioPlayerStatusBar.tooltip = '[x] Hentikan suara adzan.'; 205 | audioPlayerStatusBar.command = 'waktusholat.stopAudioPlayer'; 206 | audioPlayerStatusBar.show(); 207 | } 208 | 209 | const stopAudioPlayer = () => { 210 | audioPlayer && audioPlayer.kill(); 211 | audioPlayerStatusBar && audioPlayerStatusBar.dispose(); 212 | } 213 | 214 | /** /MAIN FUNCTION */ 215 | 216 | /** HELPER FUNCTION */ 217 | 218 | function config(key, val = null) { 219 | const config = vscode.workspace.getConfiguration('waktusholat'); 220 | return val === null ? config.get(key) : config.update(key, val, 1); 221 | } 222 | 223 | function capitalize(str) { 224 | return str.charAt(0).toUpperCase() + str.slice(1); 225 | } 226 | 227 | function now() { 228 | return new Date().getTime(); 229 | } 230 | 231 | function diffNowInMinutes(timestamp) { 232 | return Math.ceil((timestamp - now()) / (60 * 1000)); 233 | } 234 | 235 | function diffNowInHours(timestamp) { 236 | return Math.floor((timestamp - now()) / (60 * 60 * 1000)); 237 | } 238 | 239 | function diffNowForHumans(timestamp) { 240 | let result = ''; 241 | const hours = diffNowInHours(timestamp); 242 | const minutes = diffNowInMinutes(timestamp) % 60; 243 | if (hours > 0) result += `${hours} jam `; 244 | if (minutes > 0) result += `${minutes} menit lagi`; 245 | if (minutes <= 0) result = 'sekarang!'; 246 | 247 | return result; 248 | } 249 | 250 | /** /HELPER FUNCTION */ 251 | 252 | 253 | /** EXTENSION FUNCTION */ 254 | 255 | /** 256 | * @param {vscode.ExtensionContext} context 257 | */ 258 | async function activate(context) { 259 | 260 | // make context variable to be global 261 | globalState = context.globalState; 262 | storagePath = context.globalStorageUri.path; 263 | 264 | if (process.platform == 'win32') { 265 | storagePath = storagePath.slice(1); 266 | } 267 | 268 | // create storage path if not exists 269 | [storagePath, `${storagePath}/schedules`, `${storagePath}/audios`] 270 | .forEach(path => { 271 | if (!existsSync(path)) mkdirSync(path); 272 | }); 273 | 274 | // display welcome message for first open 275 | if (globalState.get('waktusholat.first-open') !== 'DONE') { 276 | const infoSelectCity = await vscode.window.showInformationMessage( 277 | `Terima kasih telah memasang ekstensi Waktu Sholat! 278 | \nKota saat ini: ${city()}`, 279 | { modal: true }, 280 | { title: 'Pilih Kota', action: 1 } 281 | ); 282 | 283 | if (infoSelectCity?.action === 1) { await selectCity() }; 284 | 285 | const infoDownloadAudio = await vscode.window.showInformationMessage( 286 | `Apakah Anda ingin mengaktifkan suara adzan? 287 | \n*akan mengunduh berkas audio sebesar 1.5MB`, 288 | { modal: true }, 289 | { title: 'Okay', action: 1 } 290 | ); 291 | 292 | if (infoDownloadAudio?.action === 1) { 293 | config('suara-adzan-aktif', true); 294 | await downloadAudio(); 295 | }; 296 | 297 | context.globalState.update('waktusholat.first-open', 'DONE'); 298 | } 299 | 300 | // download schedule if file not exists 301 | if (!existsSync(getScheduleFilePath())) { 302 | updateSchedule(); 303 | } 304 | 305 | // summary status bar 306 | summaryStatusBar = vscode.window.createStatusBarItem( 307 | vscode.StatusBarAlignment.Right, 1 308 | ); 309 | summaryStatusBar.command = 'waktusholat.showSummaryStatusBarInfo'; 310 | updateSummaryStatusBar(); 311 | 312 | // update summary status bar every 30 seconds 313 | setInterval(updateSummaryStatusBar, 1000 * 30); 314 | 315 | // register subscriptions 316 | context.subscriptions.push( 317 | vscode.commands.registerCommand( 318 | 'waktusholat.updateSchedule', updateSchedule 319 | ), 320 | vscode.commands.registerCommand( 321 | 'waktusholat.selectCity', selectCity 322 | ), 323 | vscode.commands.registerCommand( 324 | 'waktusholat.showSummaryStatusBarInfo', showSummaryStatusBarInfo 325 | ), 326 | vscode.commands.registerCommand( 327 | 'waktusholat.stopAudioPlayer', stopAudioPlayer 328 | ), 329 | ); 330 | 331 | // listen configuration changes 332 | vscode.workspace.onDidChangeConfiguration(() => { 333 | if (! existsSync(getScheduleFilePath())) updateSchedule(); 334 | }); 335 | } 336 | 337 | function deactivate() { 338 | // 339 | } 340 | 341 | module.exports = { 342 | activate, 343 | deactivate 344 | } 345 | 346 | /** /EXTENSION FUNCTION */ -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "waktusholat", 3 | "displayName": "Waktu Sholat", 4 | "description": "Ekstensi Visual Studio Code (vscode) untuk menampilkan dan mengingatkan waktu sholat.", 5 | "version": "2.0.1", 6 | "publisher": "lakuapik", 7 | "engines": { 8 | "vscode": "^1.39.0" 9 | }, 10 | "homepage": "https://github.com/lakuapik/vscode-waktusholat", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/lakuapik/vscode-waktusholat.git" 14 | }, 15 | "categories": [ 16 | "Other" 17 | ], 18 | "activationEvents": [ 19 | "*" 20 | ], 21 | "icon": "icon.png", 22 | "main": "./dist/extension.js", 23 | "scripts": { 24 | "build": "esbuild --bundle src/extension.js --outdir=dist --external:vscode --format=cjs --platform=node --minify", 25 | "dev": "npm run -S build -- --watch", 26 | "package": "vsce package" 27 | }, 28 | "dependencies": { 29 | "node-fetch": "^3.0.0", 30 | "play-sound": "^1.1.3", 31 | "underscore": "^1.13.1" 32 | }, 33 | "devDependencies": { 34 | "esbuild": "^0.12.25" 35 | }, 36 | "contributes": { 37 | "commands": [ 38 | { 39 | "command": "waktusholat.updateSchedule", 40 | "title": "Waktu Sholat: Perbarui Jadwal" 41 | }, 42 | { 43 | "command": "waktusholat.selectCity", 44 | "title": "Waktu Sholat: Pilih Kota" 45 | } 46 | ], 47 | "configuration": { 48 | "title": "Waktu Sholat", 49 | "properties": { 50 | "waktusholat.kota": { 51 | "description": "Jadwal waktu sholat mengikuti kota yang dipilih.", 52 | "type": "string", 53 | "default": "semarang", 54 | "enum": [ 55 | "ambarawa", 56 | "ambon", 57 | "amlapura", 58 | "amuntai", 59 | "argamakmur", 60 | "atambua", 61 | "babo", 62 | "bagansiapiapi", 63 | "bahaurkalteng", 64 | "bajawa", 65 | "balige", 66 | "balikpapan", 67 | "bandaaceh", 68 | "bandarlampung", 69 | "bandung", 70 | "bangkalan", 71 | "bangkinang", 72 | "bangko", 73 | "bangli", 74 | "banjar", 75 | "banjarbaru", 76 | "banjarmasin", 77 | "banjarnegara", 78 | "bantaeng", 79 | "banten", 80 | "bantul", 81 | "banyuwangi", 82 | "barabai", 83 | "barito", 84 | "barru", 85 | "batam", 86 | "batang", 87 | "batu", 88 | "baturaja", 89 | "batusangkar", 90 | "baubau", 91 | "bekasi", 92 | "bengkalis", 93 | "bengkulu", 94 | "benteng", 95 | "biak", 96 | "bima", 97 | "binjai", 98 | "bireuen", 99 | "bitung", 100 | "blitar", 101 | "blora", 102 | "bogor", 103 | "bojonegoro", 104 | "bondowoso", 105 | "bontang", 106 | "boyolali", 107 | "brebes", 108 | "bukittinggi", 109 | "bulasbtmaluku", 110 | "bulukumba", 111 | "buntok", 112 | "cepu", 113 | "ciamis", 114 | "cianjur", 115 | "cibinong", 116 | "cilacap", 117 | "cilegon", 118 | "cimahi", 119 | "cirebon", 120 | "curup", 121 | "demak", 122 | "denpasar", 123 | "depok", 124 | "dili", 125 | "dompu", 126 | "donggala", 127 | "dumai", 128 | "ende", 129 | "enggano", 130 | "enrekang", 131 | "fakfak", 132 | "garut", 133 | "gianyar", 134 | "gombong", 135 | "gorontalo", 136 | "gresik", 137 | "gunungsitoli", 138 | "indramayu", 139 | "jakartabarat", 140 | "jakartapusat", 141 | "jakartaselatan", 142 | "jakartatimur", 143 | "jakartautara", 144 | "jambi", 145 | "jayapura", 146 | "jember", 147 | "jeneponto", 148 | "jepara", 149 | "jombang", 150 | "kabanjahe", 151 | "kalabahi", 152 | "kalianda", 153 | "kandangan", 154 | "karanganyar", 155 | "karawang", 156 | "kasungan", 157 | "kayuagung", 158 | "kebumen", 159 | "kediri", 160 | "kefamenanu", 161 | "kendal", 162 | "kendari", 163 | "kertosono", 164 | "ketapang", 165 | "kisaran", 166 | "klaten", 167 | "kolaka", 168 | "kotabarupulaulaut", 169 | "kotabumi", 170 | "kotajantho", 171 | "kotamobagu", 172 | "kualakapuas", 173 | "kualakurun", 174 | "kualapembuang", 175 | "kualatungkal", 176 | "kudus", 177 | "kuningan", 178 | "kupang", 179 | "kutacane", 180 | "kutoarjo", 181 | "labuhan", 182 | "lahat", 183 | "lamongan", 184 | "langsa", 185 | "larantuka", 186 | "lawang", 187 | "lhoseumawe", 188 | "limboto", 189 | "lubukbasung", 190 | "lubuklinggau", 191 | "lubukpakam", 192 | "lubuksikaping", 193 | "lumajang", 194 | "luwuk", 195 | "madiun", 196 | "magelang", 197 | "magetan", 198 | "majalengka", 199 | "majene", 200 | "makale", 201 | "makassar", 202 | "malang", 203 | "mamuju", 204 | "manna", 205 | "manokwari", 206 | "marabahan", 207 | "maros", 208 | "martapurakalsel", 209 | "masambasulsel", 210 | "masohi", 211 | "mataram", 212 | "maumere", 213 | "medan", 214 | "mempawah", 215 | "menado", 216 | "mentok", 217 | "merauke", 218 | "metro", 219 | "meulaboh", 220 | "mojokerto", 221 | "muarabulian", 222 | "muarabungo", 223 | "muaraenim", 224 | "muarateweh", 225 | "muarosijunjung", 226 | "muntilan", 227 | "nabire", 228 | "negara", 229 | "nganjuk", 230 | "ngawi", 231 | "nunukan", 232 | "pacitan", 233 | "padang", 234 | "padangpanjang", 235 | "padangsidempuan", 236 | "pagaralam", 237 | "painan", 238 | "palangkaraya", 239 | "palembang", 240 | "palopo", 241 | "palu", 242 | "pamekasan", 243 | "pandeglang", 244 | "pangka_", 245 | "pangkajenesidenreng", 246 | "pangkalanbun", 247 | "pangkalpinang", 248 | "panyabungan", 249 | "par_", 250 | "parepare", 251 | "pariaman", 252 | "pasuruan", 253 | "pati", 254 | "payakumbuh", 255 | "pekalongan", 256 | "pekanbaru", 257 | "pemalang", 258 | "pematangsiantar", 259 | "pendopo", 260 | "pinrang", 261 | "pleihari", 262 | "polewali", 263 | "pondokgede", 264 | "ponorogo", 265 | "pontianak", 266 | "poso", 267 | "prabumulih", 268 | "praya", 269 | "probolinggo", 270 | "purbalingga", 271 | "purukcahu", 272 | "purwakarta", 273 | "purwodadigrobogan", 274 | "purwokerto", 275 | "purworejo", 276 | "putussibau", 277 | "raha", 278 | "rangkasbitung", 279 | "rantau", 280 | "rantauprapat", 281 | "rantepao", 282 | "rembang", 283 | "rengat", 284 | "ruteng", 285 | "sabang", 286 | "salatiga", 287 | "samarinda", 288 | "sambaskalbar", 289 | "sampang", 290 | "sampit", 291 | "sanggau", 292 | "sawahlunto", 293 | "sekayu", 294 | "selong", 295 | "semarang", 296 | "sengkang", 297 | "serang", 298 | "serui", 299 | "sibolga", 300 | "sidikalang", 301 | "sidoarjo", 302 | "sigli", 303 | "singaparna", 304 | "singaraja", 305 | "singkawang", 306 | "sinjai", 307 | "sintang", 308 | "situbondo", 309 | "slawi", 310 | "sleman", 311 | "soasiu", 312 | "soe", 313 | "solo", 314 | "solok", 315 | "soreang", 316 | "sorong", 317 | "sragen", 318 | "stabat", 319 | "subang", 320 | "sukabumi", 321 | "sukoharjo", 322 | "sumbawabesar", 323 | "sumedang", 324 | "sumenep", 325 | "sungailiat", 326 | "sungaipenuh", 327 | "sungguminasa", 328 | "surabaya", 329 | "surakarta", 330 | "tabanan", 331 | "tahuna", 332 | "takalar", 333 | "takengon", 334 | "tamianglayang", 335 | "tanahgrogot", 336 | "tangerang", 337 | "tanjungbalai", 338 | "tanjungenim", 339 | "tanjungpandan", 340 | "tanjungpinang", 341 | "tanjungredep", 342 | "tanjungselor", 343 | "tapaktuan", 344 | "tarakan", 345 | "tarutung", 346 | "tasikmalaya", 347 | "tebingtinggi", 348 | "tegal", 349 | "temanggung", 350 | "tembilahan", 351 | "tenggarong", 352 | "ternate", 353 | "tolitoli", 354 | "tondano", 355 | "trenggalek", 356 | "tual", 357 | "tuban", 358 | "tulungagung", 359 | "ujungberung", 360 | "ungaran", 361 | "waikabubak", 362 | "waingapu", 363 | "wamena", 364 | "watampone", 365 | "watansoppeng", 366 | "wates", 367 | "wonogiri", 368 | "wonosari", 369 | "wonosobo", 370 | "yogyakarta" 371 | ] 372 | }, 373 | "waktusholat.suara-adzan-aktif": { 374 | "description": "Aktif/Non-aktifkan suara kumandang azdan.", 375 | "type": "boolean", 376 | "default": "true" 377 | } 378 | } 379 | } 380 | } 381 | } 382 | -------------------------------------------------------------------------------- /dist/extension.js: -------------------------------------------------------------------------------- 1 | var Nl=Object.create;var Bn=Object.defineProperty;var jl=Object.getOwnPropertyDescriptor;var Ul=Object.getOwnPropertyNames;var xl=Object.getPrototypeOf,Hl=Object.prototype.hasOwnProperty;var Vl=t=>Bn(t,"__esModule",{value:!0});var ot=(t,r)=>()=>(r||t((r={exports:{}}).exports,r),r.exports);var Ql=(t,r,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of Ul(r))!Hl.call(t,o)&&o!=="default"&&Bn(t,o,{get:()=>r[o],enumerable:!(a=jl(r,o))||a.enumerable});return t},x=t=>Ql(Vl(Bn(t!=null?Nl(xl(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var ro=ot((Qf,to)=>{"use strict";function Yl(t){if(!/^data:/i.test(t))throw new TypeError('`uri` does not appear to be a Data URI (must begin with "data:")');t=t.replace(/\r?\n/g,"");let r=t.indexOf(",");if(r===-1||r<=4)throw new TypeError("malformed data: URI");let a=t.substring(5,r).split(";"),o="",s=!1,u=a[0]||"text/plain",c=u;for(let k=1;k{(function(t,r){typeof Sr=="object"&&typeof no!="undefined"?r(Sr):typeof define=="function"&&define.amd?define(["exports"],r):(t=typeof globalThis!="undefined"?globalThis:t||self,r(t.WebStreamsPolyfill={}))})(Sr,function(t){"use strict";let r=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Symbol:e=>`Symbol(${e})`;function a(){}function o(){if(typeof self!="undefined")return self;if(typeof window!="undefined")return window;if(typeof global!="undefined")return global}let s=o();function u(e){return typeof e=="object"&&e!==null||typeof e=="function"}let c=a,h=Promise,y=Promise.prototype.then,S=Promise.resolve.bind(h),k=Promise.reject.bind(h);function C(e){return new h(e)}function v(e){return S(e)}function g(e){return k(e)}function B(e,n,i){return y.call(e,n,i)}function E(e,n,i){B(B(e,n,i),void 0,c)}function X(e,n){E(e,n)}function le(e,n){E(e,void 0,n)}function pe(e,n,i){return B(e,n,i)}function be(e){B(e,void 0,c)}let re=(()=>{let e=s&&s.queueMicrotask;if(typeof e=="function")return e;let n=v(void 0);return i=>B(n,i)})();function ge(e,n,i){if(typeof e!="function")throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,n,i)}function De(e,n,i){try{return v(ge(e,n,i))}catch(l){return g(l)}}let La=16384;class ne{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(n){let i=this._back,l=i;i._elements.length===La-1&&(l={_elements:[],_next:void 0}),i._elements.push(n),l!==i&&(this._back=l,i._next=l),++this._size}shift(){let n=this._front,i=n,l=this._cursor,f=l+1,p=n._elements,b=p[l];return f===La&&(i=n._next,f=0),--this._size,this._cursor=f,n!==i&&(this._front=i),p[l]=void 0,b}forEach(n){let i=this._cursor,l=this._front,f=l._elements;for(;(i!==f.length||l._next!==void 0)&&!(i===f.length&&(l=l._next,f=l._elements,i=0,f.length===0));)n(f[i]),++i}peek(){let n=this._front,i=this._cursor;return n._elements[i]}}function Da(e,n){e._ownerReadableStream=n,n._reader=e,n._state==="readable"?Zr(e):n._state==="closed"?bu(e):Ma(e,n._storedError)}function Kr(e,n){let i=e._ownerReadableStream;return oe(i,n)}function ye(e){e._ownerReadableStream._state==="readable"?Jr(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):gu(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),e._ownerReadableStream._reader=void 0,e._ownerReadableStream=void 0}function Je(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function Zr(e){e._closedPromise=C((n,i)=>{e._closedPromise_resolve=n,e._closedPromise_reject=i})}function Ma(e,n){Zr(e),Jr(e,n)}function bu(e){Zr(e),Na(e)}function Jr(e,n){e._closedPromise_reject!==void 0&&(be(e._closedPromise),e._closedPromise_reject(n),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function gu(e,n){Ma(e,n)}function Na(e){e._closedPromise_resolve!==void 0&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}let ja=r("[[AbortSteps]]"),Ua=r("[[ErrorSteps]]"),Xr=r("[[CancelSteps]]"),en=r("[[PullSteps]]"),xa=Number.isFinite||function(e){return typeof e=="number"&&isFinite(e)},yu=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function _u(e){return typeof e=="object"||typeof e=="function"}function _e(e,n){if(e!==void 0&&!_u(e))throw new TypeError(`${n} is not an object.`)}function ae(e,n){if(typeof e!="function")throw new TypeError(`${n} is not a function.`)}function Su(e){return typeof e=="object"&&e!==null||typeof e=="function"}function Ha(e,n){if(!Su(e))throw new TypeError(`${n} is not an object.`)}function Se(e,n,i){if(e===void 0)throw new TypeError(`Parameter ${n} is required in '${i}'.`)}function tn(e,n,i){if(e===void 0)throw new TypeError(`${n} is required in '${i}'.`)}function rn(e){return Number(e)}function Va(e){return e===0?0:e}function wu(e){return Va(yu(e))}function Qa(e,n){let i=0,l=Number.MAX_SAFE_INTEGER,f=Number(e);if(f=Va(f),!xa(f))throw new TypeError(`${n} is not a finite number`);if(f=wu(f),fl)throw new TypeError(`${n} is outside the accepted range of ${i} to ${l}, inclusive`);return!xa(f)||f===0?0:f}function nn(e,n){if(!Ae(e))throw new TypeError(`${n} is not a ReadableStream.`)}function Xe(e){return new ht(e)}function Ya(e,n){e._reader._readRequests.push(n)}function an(e,n,i){let f=e._reader._readRequests.shift();i?f._closeSteps():f._chunkSteps(n)}function Ut(e){return e._reader._readRequests.length}function Ga(e){let n=e._reader;return!(n===void 0||!Re(n))}class ht{constructor(n){if(Se(n,1,"ReadableStreamDefaultReader"),nn(n,"First parameter"),Pe(n))throw new TypeError("This stream has already been locked for exclusive reading by another reader");Da(this,n),this._readRequests=new ne}get closed(){return Re(this)?this._closedPromise:g(xt("closed"))}cancel(n=void 0){return Re(this)?this._ownerReadableStream===void 0?g(Je("cancel")):Kr(this,n):g(xt("cancel"))}read(){if(!Re(this))return g(xt("read"));if(this._ownerReadableStream===void 0)return g(Je("read from"));let n,i,l=C((p,b)=>{n=p,i=b});return mt(this,{_chunkSteps:p=>n({value:p,done:!1}),_closeSteps:()=>n({value:void 0,done:!0}),_errorSteps:p=>i(p)}),l}releaseLock(){if(!Re(this))throw xt("releaseLock");if(this._ownerReadableStream!==void 0){if(this._readRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");ye(this)}}}Object.defineProperties(ht.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(ht.prototype,r.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});function Re(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_readRequests")?!1:e instanceof ht}function mt(e,n){let i=e._ownerReadableStream;i._disturbed=!0,i._state==="closed"?n._closeSteps():i._state==="errored"?n._errorSteps(i._storedError):i._readableStreamController[en](n)}function xt(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}let Ka=Object.getPrototypeOf(Object.getPrototypeOf(async function*(){}).prototype);class Za{constructor(n,i){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=n,this._preventCancel=i}next(){let n=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?pe(this._ongoingPromise,n,n):n(),this._ongoingPromise}return(n){let i=()=>this._returnSteps(n);return this._ongoingPromise?pe(this._ongoingPromise,i,i):i()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});let n=this._reader;if(n._ownerReadableStream===void 0)return g(Je("iterate"));let i,l,f=C((b,_)=>{i=b,l=_});return mt(n,{_chunkSteps:b=>{this._ongoingPromise=void 0,re(()=>i({value:b,done:!1}))},_closeSteps:()=>{this._ongoingPromise=void 0,this._isFinished=!0,ye(n),i({value:void 0,done:!0})},_errorSteps:b=>{this._ongoingPromise=void 0,this._isFinished=!0,ye(n),l(b)}}),f}_returnSteps(n){if(this._isFinished)return Promise.resolve({value:n,done:!0});this._isFinished=!0;let i=this._reader;if(i._ownerReadableStream===void 0)return g(Je("finish iterating"));if(!this._preventCancel){let l=Kr(i,n);return ye(i),pe(l,()=>({value:n,done:!0}))}return ye(i),v({value:n,done:!0})}}let Ja={next(){return Xa(this)?this._asyncIteratorImpl.next():g(ei("next"))},return(e){return Xa(this)?this._asyncIteratorImpl.return(e):g(ei("return"))}};Ka!==void 0&&Object.setPrototypeOf(Ja,Ka);function vu(e,n){let i=Xe(e),l=new Za(i,n),f=Object.create(Ja);return f._asyncIteratorImpl=l,f}function Xa(e){if(!u(e)||!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof Za}catch(n){return!1}}function ei(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}let ti=Number.isNaN||function(e){return e!==e};function pt(e){return e.slice()}function ri(e,n,i,l,f){new Uint8Array(e).set(new Uint8Array(i,l,f),n)}function bt(e){return e}function Ht(e){return!1}function ni(e,n,i){if(e.slice)return e.slice(n,i);let l=i-n,f=new ArrayBuffer(l);return ri(f,0,e,n,l),f}function Ru(e){return!(typeof e!="number"||ti(e)||e<0)}function ai(e){let n=ni(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(n)}function on(e){let n=e._queue.shift();return e._queueTotalSize-=n.size,e._queueTotalSize<0&&(e._queueTotalSize=0),n.value}function sn(e,n,i){if(!Ru(i)||i===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");e._queue.push({value:n,size:i}),e._queueTotalSize+=i}function Cu(e){return e._queue.peek().value}function Ce(e){e._queue=new ne,e._queueTotalSize=0}class gt{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!un(this))throw hn("view");return this._view}respond(n){if(!un(this))throw hn("respond");if(Se(n,1,"respond"),n=Qa(n,"First parameter"),this._associatedReadableByteStreamController===void 0)throw new TypeError("This BYOB request has been invalidated");Ht(this._view.buffer),Gt(this._associatedReadableByteStreamController,n)}respondWithNewView(n){if(!un(this))throw hn("respondWithNewView");if(Se(n,1,"respondWithNewView"),!ArrayBuffer.isView(n))throw new TypeError("You can only respond with array buffer views");if(this._associatedReadableByteStreamController===void 0)throw new TypeError("This BYOB request has been invalidated");Ht(n.buffer),Kt(this._associatedReadableByteStreamController,n)}}Object.defineProperties(gt.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(gt.prototype,r.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class et{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!Me(this))throw _t("byobRequest");return dn(this)}get desiredSize(){if(!Me(this))throw _t("desiredSize");return di(this)}close(){if(!Me(this))throw _t("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");let n=this._controlledReadableByteStream._state;if(n!=="readable")throw new TypeError(`The stream (in ${n} state) is not in the readable state and cannot be closed`);yt(this)}enqueue(n){if(!Me(this))throw _t("enqueue");if(Se(n,1,"enqueue"),!ArrayBuffer.isView(n))throw new TypeError("chunk must be an array buffer view");if(n.byteLength===0)throw new TypeError("chunk must have non-zero byteLength");if(n.buffer.byteLength===0)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");let i=this._controlledReadableByteStream._state;if(i!=="readable")throw new TypeError(`The stream (in ${i} state) is not in the readable state and cannot be enqueued to`);Yt(this,n)}error(n=void 0){if(!Me(this))throw _t("error");ie(this,n)}[Xr](n){ii(this),Ce(this);let i=this._cancelAlgorithm(n);return Qt(this),i}[en](n){let i=this._controlledReadableByteStream;if(this._queueTotalSize>0){let f=this._queue.shift();this._queueTotalSize-=f.byteLength,li(this);let p=new Uint8Array(f.buffer,f.byteOffset,f.byteLength);n._chunkSteps(p);return}let l=this._autoAllocateChunkSize;if(l!==void 0){let f;try{f=new ArrayBuffer(l)}catch(b){n._errorSteps(b);return}let p={buffer:f,bufferByteLength:l,byteOffset:0,byteLength:l,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(p)}Ya(i,n),Ne(this)}}Object.defineProperties(et.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(et.prototype,r.toStringTag,{value:"ReadableByteStreamController",configurable:!0});function Me(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")?!1:e instanceof et}function un(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")?!1:e instanceof gt}function Ne(e){if(!Pu(e))return;if(e._pulling){e._pullAgain=!0;return}e._pulling=!0;let i=e._pullAlgorithm();E(i,()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,Ne(e))},l=>{ie(e,l)})}function ii(e){fn(e),e._pendingPullIntos=new ne}function ln(e,n){let i=!1;e._state==="closed"&&(i=!0);let l=oi(n);n.readerType==="default"?an(e,l,i):Wu(e,l,i)}function oi(e){let n=e.bytesFilled,i=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,n/i)}function Vt(e,n,i,l){e._queue.push({buffer:n,byteOffset:i,byteLength:l}),e._queueTotalSize+=l}function si(e,n){let i=n.elementSize,l=n.bytesFilled-n.bytesFilled%i,f=Math.min(e._queueTotalSize,n.byteLength-n.bytesFilled),p=n.bytesFilled+f,b=p-p%i,_=f,w=!1;b>l&&(_=b-n.bytesFilled,w=!0);let T=e._queue;for(;_>0;){let q=T.peek(),W=Math.min(_,q.byteLength),$=n.byteOffset+n.bytesFilled;ri(n.buffer,$,q.buffer,q.byteOffset,W),q.byteLength===W?T.shift():(q.byteOffset+=W,q.byteLength-=W),e._queueTotalSize-=W,ui(e,W,n),_-=W}return w}function ui(e,n,i){i.bytesFilled+=n}function li(e){e._queueTotalSize===0&&e._closeRequested?(Qt(e),At(e._controlledReadableByteStream)):Ne(e)}function fn(e){e._byobRequest!==null&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function fi(e){for(;e._pendingPullIntos.length>0;){if(e._queueTotalSize===0)return;let n=e._pendingPullIntos.peek();si(e,n)&&(cn(e),ln(e._controlledReadableByteStream,n))}}function ku(e,n,i){let l=e._controlledReadableByteStream,f=1;n.constructor!==DataView&&(f=n.constructor.BYTES_PER_ELEMENT);let p=n.constructor,b=bt(n.buffer),_={buffer:b,bufferByteLength:b.byteLength,byteOffset:n.byteOffset,byteLength:n.byteLength,bytesFilled:0,elementSize:f,viewConstructor:p,readerType:"byob"};if(e._pendingPullIntos.length>0){e._pendingPullIntos.push(_),pi(l,i);return}if(l._state==="closed"){let w=new p(_.buffer,_.byteOffset,0);i._closeSteps(w);return}if(e._queueTotalSize>0){if(si(e,_)){let w=oi(_);li(e),i._chunkSteps(w);return}if(e._closeRequested){let w=new TypeError("Insufficient bytes to fill elements in the given buffer");ie(e,w),i._errorSteps(w);return}}e._pendingPullIntos.push(_),pi(l,i),Ne(e)}function Tu(e,n){let i=e._controlledReadableByteStream;if(mn(i))for(;bi(i)>0;){let l=cn(e);ln(i,l)}}function Au(e,n,i){if(ui(e,n,i),i.bytesFilled0){let f=i.byteOffset+i.bytesFilled,p=ni(i.buffer,f-l,f);Vt(e,p,0,p.byteLength)}i.bytesFilled-=l,ln(e._controlledReadableByteStream,i),fi(e)}function ci(e,n){let i=e._pendingPullIntos.peek();fn(e),e._controlledReadableByteStream._state==="closed"?Tu(e):Au(e,n,i),Ne(e)}function cn(e){return e._pendingPullIntos.shift()}function Pu(e){let n=e._controlledReadableByteStream;return n._state!=="readable"||e._closeRequested||!e._started?!1:!!(Ga(n)&&Ut(n)>0||mn(n)&&bi(n)>0||di(e)>0)}function Qt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function yt(e){let n=e._controlledReadableByteStream;if(!(e._closeRequested||n._state!=="readable")){if(e._queueTotalSize>0){e._closeRequested=!0;return}if(e._pendingPullIntos.length>0&&e._pendingPullIntos.peek().bytesFilled>0){let l=new TypeError("Insufficient bytes to fill elements in the given buffer");throw ie(e,l),l}Qt(e),At(n)}}function Yt(e,n){let i=e._controlledReadableByteStream;if(e._closeRequested||i._state!=="readable")return;let l=n.buffer,f=n.byteOffset,p=n.byteLength,b=bt(l);if(e._pendingPullIntos.length>0){let _=e._pendingPullIntos.peek();Ht(_.buffer),_.buffer=bt(_.buffer)}if(fn(e),Ga(i))if(Ut(i)===0)Vt(e,b,f,p);else{let _=new Uint8Array(b,f,p);an(i,_,!1)}else mn(i)?(Vt(e,b,f,p),fi(e)):Vt(e,b,f,p);Ne(e)}function ie(e,n){let i=e._controlledReadableByteStream;i._state==="readable"&&(ii(e),Ce(e),Qt(e),Mi(i,n))}function dn(e){if(e._byobRequest===null&&e._pendingPullIntos.length>0){let n=e._pendingPullIntos.peek(),i=new Uint8Array(n.buffer,n.byteOffset+n.bytesFilled,n.byteLength-n.bytesFilled),l=Object.create(gt.prototype);Bu(l,e,i),e._byobRequest=l}return e._byobRequest}function di(e){let n=e._controlledReadableByteStream._state;return n==="errored"?null:n==="closed"?0:e._strategyHWM-e._queueTotalSize}function Gt(e,n){let i=e._pendingPullIntos.peek();if(e._controlledReadableByteStream._state==="closed"){if(n!==0)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(n===0)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(i.bytesFilled+n>i.byteLength)throw new RangeError("bytesWritten out of range")}i.buffer=bt(i.buffer),ci(e,n)}function Kt(e,n){let i=e._pendingPullIntos.peek();if(e._controlledReadableByteStream._state==="closed"){if(n.byteLength!==0)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(n.byteLength===0)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(i.byteOffset+i.bytesFilled!==n.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(i.bufferByteLength!==n.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(i.bytesFilled+n.byteLength>i.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");i.buffer=bt(n.buffer),ci(e,n.byteLength)}function hi(e,n,i,l,f,p,b){n._controlledReadableByteStream=e,n._pullAgain=!1,n._pulling=!1,n._byobRequest=null,n._queue=n._queueTotalSize=void 0,Ce(n),n._closeRequested=!1,n._started=!1,n._strategyHWM=p,n._pullAlgorithm=l,n._cancelAlgorithm=f,n._autoAllocateChunkSize=b,n._pendingPullIntos=new ne,e._readableStreamController=n;let _=i();E(v(_),()=>{n._started=!0,Ne(n)},w=>{ie(n,w)})}function Eu(e,n,i){let l=Object.create(et.prototype),f=()=>{},p=()=>v(void 0),b=()=>v(void 0);n.start!==void 0&&(f=()=>n.start(l)),n.pull!==void 0&&(p=()=>n.pull(l)),n.cancel!==void 0&&(b=w=>n.cancel(w));let _=n.autoAllocateChunkSize;if(_===0)throw new TypeError("autoAllocateChunkSize must be greater than 0");hi(e,l,f,p,b,i,_)}function Bu(e,n,i){e._associatedReadableByteStreamController=n,e._view=i}function hn(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function _t(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function mi(e){return new St(e)}function pi(e,n){e._reader._readIntoRequests.push(n)}function Wu(e,n,i){let f=e._reader._readIntoRequests.shift();i?f._closeSteps(n):f._chunkSteps(n)}function bi(e){return e._reader._readIntoRequests.length}function mn(e){let n=e._reader;return!(n===void 0||!je(n))}class St{constructor(n){if(Se(n,1,"ReadableStreamBYOBReader"),nn(n,"First parameter"),Pe(n))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!Me(n._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");Da(this,n),this._readIntoRequests=new ne}get closed(){return je(this)?this._closedPromise:g(Zt("closed"))}cancel(n=void 0){return je(this)?this._ownerReadableStream===void 0?g(Je("cancel")):Kr(this,n):g(Zt("cancel"))}read(n){if(!je(this))return g(Zt("read"));if(!ArrayBuffer.isView(n))return g(new TypeError("view must be an array buffer view"));if(n.byteLength===0)return g(new TypeError("view must have non-zero byteLength"));if(n.buffer.byteLength===0)return g(new TypeError("view's buffer must have non-zero byteLength"));if(Ht(n.buffer),this._ownerReadableStream===void 0)return g(Je("read from"));let i,l,f=C((b,_)=>{i=b,l=_});return gi(this,n,{_chunkSteps:b=>i({value:b,done:!1}),_closeSteps:b=>i({value:b,done:!0}),_errorSteps:b=>l(b)}),f}releaseLock(){if(!je(this))throw Zt("releaseLock");if(this._ownerReadableStream!==void 0){if(this._readIntoRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");ye(this)}}}Object.defineProperties(St.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(St.prototype,r.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});function je(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")?!1:e instanceof St}function gi(e,n,i){let l=e._ownerReadableStream;l._disturbed=!0,l._state==="errored"?i._errorSteps(l._storedError):ku(l._readableStreamController,n,i)}function Zt(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function wt(e,n){let{highWaterMark:i}=e;if(i===void 0)return n;if(ti(i)||i<0)throw new RangeError("Invalid highWaterMark");return i}function Jt(e){let{size:n}=e;return n||(()=>1)}function Xt(e,n){_e(e,n);let i=e==null?void 0:e.highWaterMark,l=e==null?void 0:e.size;return{highWaterMark:i===void 0?void 0:rn(i),size:l===void 0?void 0:Ou(l,`${n} has member 'size' that`)}}function Ou(e,n){return ae(e,n),i=>rn(e(i))}function qu(e,n){_e(e,n);let i=e==null?void 0:e.abort,l=e==null?void 0:e.close,f=e==null?void 0:e.start,p=e==null?void 0:e.type,b=e==null?void 0:e.write;return{abort:i===void 0?void 0:zu(i,e,`${n} has member 'abort' that`),close:l===void 0?void 0:Iu(l,e,`${n} has member 'close' that`),start:f===void 0?void 0:$u(f,e,`${n} has member 'start' that`),write:b===void 0?void 0:Fu(b,e,`${n} has member 'write' that`),type:p}}function zu(e,n,i){return ae(e,i),l=>De(e,n,[l])}function Iu(e,n,i){return ae(e,i),()=>De(e,n,[])}function $u(e,n,i){return ae(e,i),l=>ge(e,n,[l])}function Fu(e,n,i){return ae(e,i),(l,f)=>De(e,n,[l,f])}function yi(e,n){if(!tt(e))throw new TypeError(`${n} is not a WritableStream.`)}function Lu(e){if(typeof e!="object"||e===null)return!1;try{return typeof e.aborted=="boolean"}catch(n){return!1}}let Du=typeof AbortController=="function";function Mu(){if(Du)return new AbortController}class vt{constructor(n={},i={}){n===void 0?n=null:Ha(n,"First parameter");let l=Xt(i,"Second parameter"),f=qu(n,"First parameter");if(Si(this),f.type!==void 0)throw new RangeError("Invalid type is specified");let b=Jt(l),_=wt(l,1);el(this,f,_,b)}get locked(){if(!tt(this))throw ar("locked");return rt(this)}abort(n=void 0){return tt(this)?rt(this)?g(new TypeError("Cannot abort a stream that already has a writer")):er(this,n):g(ar("abort"))}close(){return tt(this)?rt(this)?g(new TypeError("Cannot close a stream that already has a writer")):fe(this)?g(new TypeError("Cannot close an already-closing stream")):wi(this):g(ar("close"))}getWriter(){if(!tt(this))throw ar("getWriter");return _i(this)}}Object.defineProperties(vt.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(vt.prototype,r.toStringTag,{value:"WritableStream",configurable:!0});function _i(e){return new Rt(e)}function Nu(e,n,i,l,f=1,p=()=>1){let b=Object.create(vt.prototype);Si(b);let _=Object.create(nt.prototype);return Ai(b,_,e,n,i,l,f,p),b}function Si(e){e._state="writable",e._storedError=void 0,e._writer=void 0,e._writableStreamController=void 0,e._writeRequests=new ne,e._inFlightWriteRequest=void 0,e._closeRequest=void 0,e._inFlightCloseRequest=void 0,e._pendingAbortRequest=void 0,e._backpressure=!1}function tt(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")?!1:e instanceof vt}function rt(e){return e._writer!==void 0}function er(e,n){var i;if(e._state==="closed"||e._state==="errored")return v(void 0);e._writableStreamController._abortReason=n,(i=e._writableStreamController._abortController)===null||i===void 0||i.abort();let l=e._state;if(l==="closed"||l==="errored")return v(void 0);if(e._pendingAbortRequest!==void 0)return e._pendingAbortRequest._promise;let f=!1;l==="erroring"&&(f=!0,n=void 0);let p=C((b,_)=>{e._pendingAbortRequest={_promise:void 0,_resolve:b,_reject:_,_reason:n,_wasAlreadyErroring:f}});return e._pendingAbortRequest._promise=p,f||bn(e,n),p}function wi(e){let n=e._state;if(n==="closed"||n==="errored")return g(new TypeError(`The stream (in ${n} state) is not in the writable state and cannot be closed`));let i=C((f,p)=>{let b={_resolve:f,_reject:p};e._closeRequest=b}),l=e._writer;return l!==void 0&&e._backpressure&&n==="writable"&&kn(l),tl(e._writableStreamController),i}function ju(e){return C((i,l)=>{let f={_resolve:i,_reject:l};e._writeRequests.push(f)})}function pn(e,n){if(e._state==="writable"){bn(e,n);return}gn(e)}function bn(e,n){let i=e._writableStreamController;e._state="erroring",e._storedError=n;let l=e._writer;l!==void 0&&Ri(l,n),!Qu(e)&&i._started&&gn(e)}function gn(e){e._state="errored",e._writableStreamController[Ua]();let n=e._storedError;if(e._writeRequests.forEach(f=>{f._reject(n)}),e._writeRequests=new ne,e._pendingAbortRequest===void 0){tr(e);return}let i=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,i._wasAlreadyErroring){i._reject(n),tr(e);return}let l=e._writableStreamController[ja](i._reason);E(l,()=>{i._resolve(),tr(e)},f=>{i._reject(f),tr(e)})}function Uu(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}function xu(e,n){e._inFlightWriteRequest._reject(n),e._inFlightWriteRequest=void 0,pn(e,n)}function Hu(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,e._state==="erroring"&&(e._storedError=void 0,e._pendingAbortRequest!==void 0&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";let i=e._writer;i!==void 0&&Wi(i)}function Vu(e,n){e._inFlightCloseRequest._reject(n),e._inFlightCloseRequest=void 0,e._pendingAbortRequest!==void 0&&(e._pendingAbortRequest._reject(n),e._pendingAbortRequest=void 0),pn(e,n)}function fe(e){return!(e._closeRequest===void 0&&e._inFlightCloseRequest===void 0)}function Qu(e){return!(e._inFlightWriteRequest===void 0&&e._inFlightCloseRequest===void 0)}function Yu(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0}function Gu(e){e._inFlightWriteRequest=e._writeRequests.shift()}function tr(e){e._closeRequest!==void 0&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);let n=e._writer;n!==void 0&&Rn(n,e._storedError)}function yn(e,n){let i=e._writer;i!==void 0&&n!==e._backpressure&&(n?ul(i):kn(i)),e._backpressure=n}class Rt{constructor(n){if(Se(n,1,"WritableStreamDefaultWriter"),yi(n,"First parameter"),rt(n))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=n,n._writer=this;let i=n._state;if(i==="writable")!fe(n)&&n._backpressure?or(this):Oi(this),ir(this);else if(i==="erroring")Cn(this,n._storedError),ir(this);else if(i==="closed")Oi(this),ol(this);else{let l=n._storedError;Cn(this,l),Bi(this,l)}}get closed(){return Ue(this)?this._closedPromise:g(xe("closed"))}get desiredSize(){if(!Ue(this))throw xe("desiredSize");if(this._ownerWritableStream===void 0)throw Ct("desiredSize");return Xu(this)}get ready(){return Ue(this)?this._readyPromise:g(xe("ready"))}abort(n=void 0){return Ue(this)?this._ownerWritableStream===void 0?g(Ct("abort")):Ku(this,n):g(xe("abort"))}close(){if(!Ue(this))return g(xe("close"));let n=this._ownerWritableStream;return n===void 0?g(Ct("close")):fe(n)?g(new TypeError("Cannot close an already-closing stream")):vi(this)}releaseLock(){if(!Ue(this))throw xe("releaseLock");this._ownerWritableStream!==void 0&&Ci(this)}write(n=void 0){return Ue(this)?this._ownerWritableStream===void 0?g(Ct("write to")):ki(this,n):g(xe("write"))}}Object.defineProperties(Rt.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(Rt.prototype,r.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});function Ue(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")?!1:e instanceof Rt}function Ku(e,n){let i=e._ownerWritableStream;return er(i,n)}function vi(e){let n=e._ownerWritableStream;return wi(n)}function Zu(e){let n=e._ownerWritableStream,i=n._state;return fe(n)||i==="closed"?v(void 0):i==="errored"?g(n._storedError):vi(e)}function Ju(e,n){e._closedPromiseState==="pending"?Rn(e,n):sl(e,n)}function Ri(e,n){e._readyPromiseState==="pending"?qi(e,n):ll(e,n)}function Xu(e){let n=e._ownerWritableStream,i=n._state;return i==="errored"||i==="erroring"?null:i==="closed"?0:Pi(n._writableStreamController)}function Ci(e){let n=e._ownerWritableStream,i=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");Ri(e,i),Ju(e,i),n._writer=void 0,e._ownerWritableStream=void 0}function ki(e,n){let i=e._ownerWritableStream,l=i._writableStreamController,f=rl(l,n);if(i!==e._ownerWritableStream)return g(Ct("write to"));let p=i._state;if(p==="errored")return g(i._storedError);if(fe(i)||p==="closed")return g(new TypeError("The stream is closing or closed and cannot be written to"));if(p==="erroring")return g(i._storedError);let b=ju(i);return nl(l,n,f),b}let Ti={};class nt{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!_n(this))throw vn("abortReason");return this._abortReason}get signal(){if(!_n(this))throw vn("signal");if(this._abortController===void 0)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(n=void 0){if(!_n(this))throw vn("error");this._controlledWritableStream._state==="writable"&&Ei(this,n)}[ja](n){let i=this._abortAlgorithm(n);return rr(this),i}[Ua](){Ce(this)}}Object.defineProperties(nt.prototype,{error:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(nt.prototype,r.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});function _n(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")?!1:e instanceof nt}function Ai(e,n,i,l,f,p,b,_){n._controlledWritableStream=e,e._writableStreamController=n,n._queue=void 0,n._queueTotalSize=void 0,Ce(n),n._abortReason=void 0,n._abortController=Mu(),n._started=!1,n._strategySizeAlgorithm=_,n._strategyHWM=b,n._writeAlgorithm=l,n._closeAlgorithm=f,n._abortAlgorithm=p;let w=wn(n);yn(e,w);let T=i(),q=v(T);E(q,()=>{n._started=!0,nr(n)},W=>{n._started=!0,pn(e,W)})}function el(e,n,i,l){let f=Object.create(nt.prototype),p=()=>{},b=()=>v(void 0),_=()=>v(void 0),w=()=>v(void 0);n.start!==void 0&&(p=()=>n.start(f)),n.write!==void 0&&(b=T=>n.write(T,f)),n.close!==void 0&&(_=()=>n.close()),n.abort!==void 0&&(w=T=>n.abort(T)),Ai(e,f,p,b,_,w,i,l)}function rr(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function tl(e){sn(e,Ti,0),nr(e)}function rl(e,n){try{return e._strategySizeAlgorithm(n)}catch(i){return Sn(e,i),1}}function Pi(e){return e._strategyHWM-e._queueTotalSize}function nl(e,n,i){try{sn(e,n,i)}catch(f){Sn(e,f);return}let l=e._controlledWritableStream;if(!fe(l)&&l._state==="writable"){let f=wn(e);yn(l,f)}nr(e)}function nr(e){let n=e._controlledWritableStream;if(!e._started||n._inFlightWriteRequest!==void 0)return;if(n._state==="erroring"){gn(n);return}if(e._queue.length===0)return;let l=Cu(e);l===Ti?al(e):il(e,l)}function Sn(e,n){e._controlledWritableStream._state==="writable"&&Ei(e,n)}function al(e){let n=e._controlledWritableStream;Yu(n),on(e);let i=e._closeAlgorithm();rr(e),E(i,()=>{Hu(n)},l=>{Vu(n,l)})}function il(e,n){let i=e._controlledWritableStream;Gu(i);let l=e._writeAlgorithm(n);E(l,()=>{Uu(i);let f=i._state;if(on(e),!fe(i)&&f==="writable"){let p=wn(e);yn(i,p)}nr(e)},f=>{i._state==="writable"&&rr(e),xu(i,f)})}function wn(e){return Pi(e)<=0}function Ei(e,n){let i=e._controlledWritableStream;rr(e),bn(i,n)}function ar(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function vn(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function xe(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function Ct(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function ir(e){e._closedPromise=C((n,i)=>{e._closedPromise_resolve=n,e._closedPromise_reject=i,e._closedPromiseState="pending"})}function Bi(e,n){ir(e),Rn(e,n)}function ol(e){ir(e),Wi(e)}function Rn(e,n){e._closedPromise_reject!==void 0&&(be(e._closedPromise),e._closedPromise_reject(n),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function sl(e,n){Bi(e,n)}function Wi(e){e._closedPromise_resolve!==void 0&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function or(e){e._readyPromise=C((n,i)=>{e._readyPromise_resolve=n,e._readyPromise_reject=i}),e._readyPromiseState="pending"}function Cn(e,n){or(e),qi(e,n)}function Oi(e){or(e),kn(e)}function qi(e,n){e._readyPromise_reject!==void 0&&(be(e._readyPromise),e._readyPromise_reject(n),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function ul(e){or(e)}function ll(e,n){Cn(e,n)}function kn(e){e._readyPromise_resolve!==void 0&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}let zi=typeof DOMException!="undefined"?DOMException:void 0;function fl(e){if(!(typeof e=="function"||typeof e=="object"))return!1;try{return new e,!0}catch(n){return!1}}function cl(){let e=function(i,l){this.message=i||"",this.name=l||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}let dl=fl(zi)?zi:cl();function Ii(e,n,i,l,f,p){let b=Xe(e),_=_i(n);e._disturbed=!0;let w=!1,T=v(void 0);return C((q,W)=>{let $;if(p!==void 0){if($=()=>{let R=new dl("Aborted","AbortError"),P=[];l||P.push(()=>n._state==="writable"?er(n,R):v(void 0)),f||P.push(()=>e._state==="readable"?oe(e,R):v(void 0)),U(()=>Promise.all(P.map(F=>F())),!0,R)},p.aborted){$();return}p.addEventListener("abort",$)}function Ee(){return C((R,P)=>{function F(se){se?R():B(Et(),F,P)}F(!1)})}function Et(){return w?v(!0):B(_._readyPromise,()=>C((R,P)=>{mt(b,{_chunkSteps:F=>{T=B(ki(_,F),void 0,a),R(!1)},_closeSteps:()=>R(!0),_errorSteps:P})}))}if(j(e,b._closedPromise,R=>{l?O(!0,R):U(()=>er(n,R),!0,R)}),j(n,_._closedPromise,R=>{f?O(!0,R):U(()=>oe(e,R),!0,R)}),ce(e,b._closedPromise,()=>{i?O():U(()=>Zu(_))}),fe(n)||n._state==="closed"){let R=new TypeError("the destination writable stream closed before all data could be piped to it");f?O(!0,R):U(()=>oe(e,R),!0,R)}be(Ee());function Be(){let R=T;return B(T,()=>R!==T?Be():void 0)}function j(R,P,F){R._state==="errored"?F(R._storedError):le(P,F)}function ce(R,P,F){R._state==="closed"?F():X(P,F)}function U(R,P,F){if(w)return;w=!0,n._state==="writable"&&!fe(n)?X(Be(),se):se();function se(){E(R(),()=>z(P,F),We=>z(!0,We))}}function O(R,P){w||(w=!0,n._state==="writable"&&!fe(n)?X(Be(),()=>z(R,P)):z(R,P))}function z(R,P){Ci(_),ye(b),p!==void 0&&p.removeEventListener("abort",$),R?W(P):q(void 0)}})}class at{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!sr(this))throw fr("desiredSize");return Tn(this)}close(){if(!sr(this))throw fr("close");if(!it(this))throw new TypeError("The stream is not in a state that permits close");Tt(this)}enqueue(n=void 0){if(!sr(this))throw fr("enqueue");if(!it(this))throw new TypeError("The stream is not in a state that permits enqueue");return lr(this,n)}error(n=void 0){if(!sr(this))throw fr("error");ke(this,n)}[Xr](n){Ce(this);let i=this._cancelAlgorithm(n);return ur(this),i}[en](n){let i=this._controlledReadableStream;if(this._queue.length>0){let l=on(this);this._closeRequested&&this._queue.length===0?(ur(this),At(i)):kt(this),n._chunkSteps(l)}else Ya(i,n),kt(this)}}Object.defineProperties(at.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(at.prototype,r.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});function sr(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")?!1:e instanceof at}function kt(e){if(!$i(e))return;if(e._pulling){e._pullAgain=!0;return}e._pulling=!0;let i=e._pullAlgorithm();E(i,()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,kt(e))},l=>{ke(e,l)})}function $i(e){let n=e._controlledReadableStream;return!it(e)||!e._started?!1:!!(Pe(n)&&Ut(n)>0||Tn(e)>0)}function ur(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Tt(e){if(!it(e))return;let n=e._controlledReadableStream;e._closeRequested=!0,e._queue.length===0&&(ur(e),At(n))}function lr(e,n){if(!it(e))return;let i=e._controlledReadableStream;if(Pe(i)&&Ut(i)>0)an(i,n,!1);else{let l;try{l=e._strategySizeAlgorithm(n)}catch(f){throw ke(e,f),f}try{sn(e,n,l)}catch(f){throw ke(e,f),f}}kt(e)}function ke(e,n){let i=e._controlledReadableStream;i._state==="readable"&&(Ce(e),ur(e),Mi(i,n))}function Tn(e){let n=e._controlledReadableStream._state;return n==="errored"?null:n==="closed"?0:e._strategyHWM-e._queueTotalSize}function hl(e){return!$i(e)}function it(e){let n=e._controlledReadableStream._state;return!e._closeRequested&&n==="readable"}function Fi(e,n,i,l,f,p,b){n._controlledReadableStream=e,n._queue=void 0,n._queueTotalSize=void 0,Ce(n),n._started=!1,n._closeRequested=!1,n._pullAgain=!1,n._pulling=!1,n._strategySizeAlgorithm=b,n._strategyHWM=p,n._pullAlgorithm=l,n._cancelAlgorithm=f,e._readableStreamController=n;let _=i();E(v(_),()=>{n._started=!0,kt(n)},w=>{ke(n,w)})}function ml(e,n,i,l){let f=Object.create(at.prototype),p=()=>{},b=()=>v(void 0),_=()=>v(void 0);n.start!==void 0&&(p=()=>n.start(f)),n.pull!==void 0&&(b=()=>n.pull(f)),n.cancel!==void 0&&(_=w=>n.cancel(w)),Fi(e,f,p,b,_,i,l)}function fr(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function pl(e,n){return Me(e._readableStreamController)?gl(e):bl(e)}function bl(e,n){let i=Xe(e),l=!1,f=!1,p=!1,b,_,w,T,q,W=C(j=>{q=j});function $(){return l||(l=!0,mt(i,{_chunkSteps:ce=>{re(()=>{l=!1;let U=ce,O=ce;f||lr(w._readableStreamController,U),p||lr(T._readableStreamController,O)})},_closeSteps:()=>{l=!1,f||Tt(w._readableStreamController),p||Tt(T._readableStreamController),(!f||!p)&&q(void 0)},_errorSteps:()=>{l=!1}})),v(void 0)}function Ee(j){if(f=!0,b=j,p){let ce=pt([b,_]),U=oe(e,ce);q(U)}return W}function Et(j){if(p=!0,_=j,f){let ce=pt([b,_]),U=oe(e,ce);q(U)}return W}function Be(){}return w=An(Be,$,Ee),T=An(Be,$,Et),le(i._closedPromise,j=>{ke(w._readableStreamController,j),ke(T._readableStreamController,j),(!f||!p)&&q(void 0)}),[w,T]}function gl(e){let n=Xe(e),i=!1,l=!1,f=!1,p,b,_,w,T,q=C(O=>{T=O});function W(O){le(O._closedPromise,z=>{O===n&&(ie(_._readableStreamController,z),ie(w._readableStreamController,z),(!l||!f)&&T(void 0))})}function $(){je(n)&&(ye(n),n=Xe(e),W(n)),mt(n,{_chunkSteps:z=>{re(()=>{i=!1;let R=z,P=z;if(!l&&!f)try{P=ai(z)}catch(F){ie(_._readableStreamController,F),ie(w._readableStreamController,F),T(oe(e,F));return}l||Yt(_._readableStreamController,R),f||Yt(w._readableStreamController,P)})},_closeSteps:()=>{i=!1,l||yt(_._readableStreamController),f||yt(w._readableStreamController),_._readableStreamController._pendingPullIntos.length>0&&Gt(_._readableStreamController,0),w._readableStreamController._pendingPullIntos.length>0&&Gt(w._readableStreamController,0),(!l||!f)&&T(void 0)},_errorSteps:()=>{i=!1}})}function Ee(O,z){Re(n)&&(ye(n),n=mi(e),W(n));let R=z?w:_,P=z?_:w;gi(n,O,{_chunkSteps:se=>{re(()=>{i=!1;let We=z?f:l;if(z?l:f)We||Kt(R._readableStreamController,se);else{let Xi;try{Xi=ai(se)}catch(En){ie(R._readableStreamController,En),ie(P._readableStreamController,En),T(oe(e,En));return}We||Kt(R._readableStreamController,se),Yt(P._readableStreamController,Xi)}})},_closeSteps:se=>{i=!1;let We=z?f:l,_r=z?l:f;We||yt(R._readableStreamController),_r||yt(P._readableStreamController),se!==void 0&&(We||Kt(R._readableStreamController,se),!_r&&P._readableStreamController._pendingPullIntos.length>0&&Gt(P._readableStreamController,0)),(!We||!_r)&&T(void 0)},_errorSteps:()=>{i=!1}})}function Et(){if(i)return v(void 0);i=!0;let O=dn(_._readableStreamController);return O===null?$():Ee(O._view,!1),v(void 0)}function Be(){if(i)return v(void 0);i=!0;let O=dn(w._readableStreamController);return O===null?$():Ee(O._view,!0),v(void 0)}function j(O){if(l=!0,p=O,f){let z=pt([p,b]),R=oe(e,z);T(R)}return q}function ce(O){if(f=!0,b=O,l){let z=pt([p,b]),R=oe(e,z);T(R)}return q}function U(){}return _=Di(U,Et,j),w=Di(U,Be,ce),W(n),[_,w]}function yl(e,n){_e(e,n);let i=e,l=i==null?void 0:i.autoAllocateChunkSize,f=i==null?void 0:i.cancel,p=i==null?void 0:i.pull,b=i==null?void 0:i.start,_=i==null?void 0:i.type;return{autoAllocateChunkSize:l===void 0?void 0:Qa(l,`${n} has member 'autoAllocateChunkSize' that`),cancel:f===void 0?void 0:_l(f,i,`${n} has member 'cancel' that`),pull:p===void 0?void 0:Sl(p,i,`${n} has member 'pull' that`),start:b===void 0?void 0:wl(b,i,`${n} has member 'start' that`),type:_===void 0?void 0:vl(_,`${n} has member 'type' that`)}}function _l(e,n,i){return ae(e,i),l=>De(e,n,[l])}function Sl(e,n,i){return ae(e,i),l=>De(e,n,[l])}function wl(e,n,i){return ae(e,i),l=>ge(e,n,[l])}function vl(e,n){if(e=`${e}`,e!=="bytes")throw new TypeError(`${n} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function Rl(e,n){_e(e,n);let i=e==null?void 0:e.mode;return{mode:i===void 0?void 0:Cl(i,`${n} has member 'mode' that`)}}function Cl(e,n){if(e=`${e}`,e!=="byob")throw new TypeError(`${n} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function kl(e,n){_e(e,n);let i=e==null?void 0:e.preventCancel;return{preventCancel:Boolean(i)}}function Li(e,n){_e(e,n);let i=e==null?void 0:e.preventAbort,l=e==null?void 0:e.preventCancel,f=e==null?void 0:e.preventClose,p=e==null?void 0:e.signal;return p!==void 0&&Tl(p,`${n} has member 'signal' that`),{preventAbort:Boolean(i),preventCancel:Boolean(l),preventClose:Boolean(f),signal:p}}function Tl(e,n){if(!Lu(e))throw new TypeError(`${n} is not an AbortSignal.`)}function Al(e,n){_e(e,n);let i=e==null?void 0:e.readable;tn(i,"readable","ReadableWritablePair"),nn(i,`${n} has member 'readable' that`);let l=e==null?void 0:e.writable;return tn(l,"writable","ReadableWritablePair"),yi(l,`${n} has member 'writable' that`),{readable:i,writable:l}}class Te{constructor(n={},i={}){n===void 0?n=null:Ha(n,"First parameter");let l=Xt(i,"Second parameter"),f=yl(n,"First parameter");if(Pn(this),f.type==="bytes"){if(l.size!==void 0)throw new RangeError("The strategy for a byte stream cannot have a size function");let p=wt(l,0);Eu(this,f,p)}else{let p=Jt(l),b=wt(l,1);ml(this,f,b,p)}}get locked(){if(!Ae(this))throw He("locked");return Pe(this)}cancel(n=void 0){return Ae(this)?Pe(this)?g(new TypeError("Cannot cancel a stream that already has a reader")):oe(this,n):g(He("cancel"))}getReader(n=void 0){if(!Ae(this))throw He("getReader");return Rl(n,"First parameter").mode===void 0?Xe(this):mi(this)}pipeThrough(n,i={}){if(!Ae(this))throw He("pipeThrough");Se(n,1,"pipeThrough");let l=Al(n,"First parameter"),f=Li(i,"Second parameter");if(Pe(this))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(rt(l.writable))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");let p=Ii(this,l.writable,f.preventClose,f.preventAbort,f.preventCancel,f.signal);return be(p),l.readable}pipeTo(n,i={}){if(!Ae(this))return g(He("pipeTo"));if(n===void 0)return g("Parameter 1 is required in 'pipeTo'.");if(!tt(n))return g(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let l;try{l=Li(i,"Second parameter")}catch(f){return g(f)}return Pe(this)?g(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):rt(n)?g(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):Ii(this,n,l.preventClose,l.preventAbort,l.preventCancel,l.signal)}tee(){if(!Ae(this))throw He("tee");let n=pl(this);return pt(n)}values(n=void 0){if(!Ae(this))throw He("values");let i=kl(n,"First parameter");return vu(this,i.preventCancel)}}Object.defineProperties(Te.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(Te.prototype,r.toStringTag,{value:"ReadableStream",configurable:!0}),typeof r.asyncIterator=="symbol"&&Object.defineProperty(Te.prototype,r.asyncIterator,{value:Te.prototype.values,writable:!0,configurable:!0});function An(e,n,i,l=1,f=()=>1){let p=Object.create(Te.prototype);Pn(p);let b=Object.create(at.prototype);return Fi(p,b,e,n,i,l,f),p}function Di(e,n,i){let l=Object.create(Te.prototype);Pn(l);let f=Object.create(et.prototype);return hi(l,f,e,n,i,0,void 0),l}function Pn(e){e._state="readable",e._reader=void 0,e._storedError=void 0,e._disturbed=!1}function Ae(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")?!1:e instanceof Te}function Pe(e){return e._reader!==void 0}function oe(e,n){if(e._disturbed=!0,e._state==="closed")return v(void 0);if(e._state==="errored")return g(e._storedError);At(e);let i=e._reader;i!==void 0&&je(i)&&(i._readIntoRequests.forEach(f=>{f._closeSteps(void 0)}),i._readIntoRequests=new ne);let l=e._readableStreamController[Xr](n);return pe(l,a)}function At(e){e._state="closed";let n=e._reader;n!==void 0&&(Na(n),Re(n)&&(n._readRequests.forEach(i=>{i._closeSteps()}),n._readRequests=new ne))}function Mi(e,n){e._state="errored",e._storedError=n;let i=e._reader;i!==void 0&&(Jr(i,n),Re(i)?(i._readRequests.forEach(l=>{l._errorSteps(n)}),i._readRequests=new ne):(i._readIntoRequests.forEach(l=>{l._errorSteps(n)}),i._readIntoRequests=new ne))}function He(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function Ni(e,n){_e(e,n);let i=e==null?void 0:e.highWaterMark;return tn(i,"highWaterMark","QueuingStrategyInit"),{highWaterMark:rn(i)}}let ji=e=>e.byteLength;Object.defineProperty(ji,"name",{value:"size",configurable:!0});class cr{constructor(n){Se(n,1,"ByteLengthQueuingStrategy"),n=Ni(n,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=n.highWaterMark}get highWaterMark(){if(!xi(this))throw Ui("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!xi(this))throw Ui("size");return ji}}Object.defineProperties(cr.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(cr.prototype,r.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});function Ui(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function xi(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")?!1:e instanceof cr}let Hi=()=>1;Object.defineProperty(Hi,"name",{value:"size",configurable:!0});class dr{constructor(n){Se(n,1,"CountQueuingStrategy"),n=Ni(n,"First parameter"),this._countQueuingStrategyHighWaterMark=n.highWaterMark}get highWaterMark(){if(!Qi(this))throw Vi("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!Qi(this))throw Vi("size");return Hi}}Object.defineProperties(dr.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(dr.prototype,r.toStringTag,{value:"CountQueuingStrategy",configurable:!0});function Vi(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function Qi(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")?!1:e instanceof dr}function Pl(e,n){_e(e,n);let i=e==null?void 0:e.flush,l=e==null?void 0:e.readableType,f=e==null?void 0:e.start,p=e==null?void 0:e.transform,b=e==null?void 0:e.writableType;return{flush:i===void 0?void 0:El(i,e,`${n} has member 'flush' that`),readableType:l,start:f===void 0?void 0:Bl(f,e,`${n} has member 'start' that`),transform:p===void 0?void 0:Wl(p,e,`${n} has member 'transform' that`),writableType:b}}function El(e,n,i){return ae(e,i),l=>De(e,n,[l])}function Bl(e,n,i){return ae(e,i),l=>ge(e,n,[l])}function Wl(e,n,i){return ae(e,i),(l,f)=>De(e,n,[l,f])}class hr{constructor(n={},i={},l={}){n===void 0&&(n=null);let f=Xt(i,"Second parameter"),p=Xt(l,"Third parameter"),b=Pl(n,"First parameter");if(b.readableType!==void 0)throw new RangeError("Invalid readableType specified");if(b.writableType!==void 0)throw new RangeError("Invalid writableType specified");let _=wt(p,0),w=Jt(p),T=wt(f,1),q=Jt(f),W,$=C(Ee=>{W=Ee});Ol(this,$,T,q,_,w),zl(this,b),b.start!==void 0?W(b.start(this._transformStreamController)):W(void 0)}get readable(){if(!Yi(this))throw Ji("readable");return this._readable}get writable(){if(!Yi(this))throw Ji("writable");return this._writable}}Object.defineProperties(hr.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(hr.prototype,r.toStringTag,{value:"TransformStream",configurable:!0});function Ol(e,n,i,l,f,p){function b(){return n}function _($){return Fl(e,$)}function w($){return Ll(e,$)}function T(){return Dl(e)}e._writable=Nu(b,_,T,w,i,l);function q(){return Ml(e)}function W($){return pr(e,$),v(void 0)}e._readable=An(b,q,W,f,p),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,br(e,!0),e._transformStreamController=void 0}function Yi(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")?!1:e instanceof hr}function mr(e,n){ke(e._readable._readableStreamController,n),pr(e,n)}function pr(e,n){Gi(e._transformStreamController),Sn(e._writable._writableStreamController,n),e._backpressure&&br(e,!1)}function br(e,n){e._backpressureChangePromise!==void 0&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=C(i=>{e._backpressureChangePromise_resolve=i}),e._backpressure=n}class Pt{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!gr(this))throw yr("desiredSize");let n=this._controlledTransformStream._readable._readableStreamController;return Tn(n)}enqueue(n=void 0){if(!gr(this))throw yr("enqueue");Ki(this,n)}error(n=void 0){if(!gr(this))throw yr("error");Il(this,n)}terminate(){if(!gr(this))throw yr("terminate");$l(this)}}Object.defineProperties(Pt.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),typeof r.toStringTag=="symbol"&&Object.defineProperty(Pt.prototype,r.toStringTag,{value:"TransformStreamDefaultController",configurable:!0});function gr(e){return!u(e)||!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")?!1:e instanceof Pt}function ql(e,n,i,l){n._controlledTransformStream=e,e._transformStreamController=n,n._transformAlgorithm=i,n._flushAlgorithm=l}function zl(e,n){let i=Object.create(Pt.prototype),l=p=>{try{return Ki(i,p),v(void 0)}catch(b){return g(b)}},f=()=>v(void 0);n.transform!==void 0&&(l=p=>n.transform(p,i)),n.flush!==void 0&&(f=()=>n.flush(i)),ql(e,i,l,f)}function Gi(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function Ki(e,n){let i=e._controlledTransformStream,l=i._readable._readableStreamController;if(!it(l))throw new TypeError("Readable side is not in a state that permits enqueue");try{lr(l,n)}catch(p){throw pr(i,p),i._readable._storedError}hl(l)!==i._backpressure&&br(i,!0)}function Il(e,n){mr(e._controlledTransformStream,n)}function Zi(e,n){let i=e._transformAlgorithm(n);return pe(i,void 0,l=>{throw mr(e._controlledTransformStream,l),l})}function $l(e){let n=e._controlledTransformStream,i=n._readable._readableStreamController;Tt(i);let l=new TypeError("TransformStream terminated");pr(n,l)}function Fl(e,n){let i=e._transformStreamController;if(e._backpressure){let l=e._backpressureChangePromise;return pe(l,()=>{let f=e._writable;if(f._state==="erroring")throw f._storedError;return Zi(i,n)})}return Zi(i,n)}function Ll(e,n){return mr(e,n),v(void 0)}function Dl(e){let n=e._readable,i=e._transformStreamController,l=i._flushAlgorithm();return Gi(i),pe(l,()=>{if(n._state==="errored")throw n._storedError;Tt(n._readableStreamController)},f=>{throw mr(e,f),n._storedError})}function Ml(e){return br(e,!1),e._backpressureChangePromise}function yr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function Ji(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}t.ByteLengthQueuingStrategy=cr,t.CountQueuingStrategy=dr,t.ReadableByteStreamController=et,t.ReadableStream=Te,t.ReadableStreamBYOBReader=St,t.ReadableStreamBYOBRequest=gt,t.ReadableStreamDefaultController=at,t.ReadableStreamDefaultReader=ht,t.TransformStream=hr,t.TransformStreamDefaultController=Pt,t.WritableStream=vt,t.WritableStreamDefaultController=nt,t.WritableStreamDefaultWriter=Rt,Object.defineProperty(t,"__esModule",{value:!0})})});var io=ot(()=>{var Gl=65536;if(!globalThis.ReadableStream)try{Object.assign(globalThis,require("stream/web"))}catch(t){Object.assign(globalThis,ao())}try{let{Blob:t}=require("buffer");t&&!t.prototype.stream&&(t.prototype.stream=function(a){let o=0,s=this;return new ReadableStream({type:"bytes",async pull(u){let h=await s.slice(o,Math.min(s.size,o+Gl)).arrayBuffer();o+=h.byteLength,u.enqueue(new Uint8Array(h)),o===s.size&&u.close()}})})}catch(t){}});var ou=ot(m=>{Object.defineProperty(m,"__esModule",{value:!0});var Dn="1.13.1",To=typeof self=="object"&&self.self===self&&self||typeof global=="object"&&global.global===global&&global||Function("return this")()||{},Pr=Array.prototype,Mn=Object.prototype,Ao=typeof Symbol!="undefined"?Symbol.prototype:null,tf=Pr.push,qt=Pr.slice,zt=Mn.toString,rf=Mn.hasOwnProperty,Po=typeof ArrayBuffer!="undefined",nf=typeof DataView!="undefined",af=Array.isArray,Eo=Object.keys,Bo=Object.create,Wo=Po&&ArrayBuffer.isView,of=isNaN,sf=isFinite,Oo=!{toString:null}.propertyIsEnumerable("toString"),qo=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],uf=Math.pow(2,53)-1;function N(t,r){return r=r==null?t.length-1:+r,function(){for(var a=Math.max(arguments.length-r,0),o=Array(a),s=0;s=0&&a<=uf}}function xo(t){return function(r){return r==null?void 0:r[t]}}var Wr=xo("byteLength"),df=Uo(Wr),hf=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function mf(t){return Wo?Wo(t)&&!It(t):df(t)&&hf.test(zt.call(t))}var Kn=Po?mf:Gn(!1),V=xo("length");function pf(t){for(var r={},a=t.length,o=0;o":">",'"':""","'":"'","`":"`"},ps=hs(ms),_f=ra(ms),bs=hs(_f),gs=A.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},ca=/(.)^/,Sf={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},wf=/\\|'|\r|\n|\u2028|\u2029/g;function vf(t){return"\\"+Sf[t]}var Rf=/^\s*(\w|\$)+\s*$/;function ys(t,r,a){!r&&a&&(r=a),r=ia({},r,A.templateSettings);var o=RegExp([(r.escape||ca).source,(r.interpolate||ca).source,(r.evaluate||ca).source].join("|")+"|$","g"),s=0,u="__p+='";t.replace(o,function(S,k,C,v,g){return u+=t.slice(s,g).replace(wf,vf),s=g+S.length,k?u+=`'+ 2 | ((__t=(`+k+`))==null?'':_.escape(__t))+ 3 | '`:C?u+=`'+ 4 | ((__t=(`+C+`))==null?'':__t)+ 5 | '`:v&&(u+=`'; 6 | `+v+` 7 | __p+='`),S}),u+=`'; 8 | `;var c=r.variable;if(c){if(!Rf.test(c))throw new Error("variable is not a bare identifier: "+c)}else u=`with(obj||{}){ 9 | `+u+`} 10 | `,c="obj";u=`var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');}; 11 | `+u+`return __p; 12 | `;var h;try{h=new Function(c,"_",u)}catch(S){throw S.source=u,S}var y=function(S){return h.call(this,S,A)};return y.source="function("+c+`){ 13 | `+u+"}",y}function _s(t,r,a){r=Ft(r);var o=r.length;if(!o)return M(a)?a.call(t):a;for(var s=0;s1)Ge(h,r-1,a,o),s=o.length;else for(var y=0,S=h.length;yr?(o&&(clearTimeout(o),o=null),h=k,c=t.apply(s,u),o||(s=u=null)):!o&&a.trailing!==!1&&(o=setTimeout(y,C)),c};return S.cancel=function(){clearTimeout(o),h=0,o=s=u=null},S}function As(t,r,a){var o,s,u,c,h,y=function(){var k=ft()-s;r>k?o=setTimeout(y,r-k):(o=null,a||(c=t.apply(h,u)),o||(u=h=null))},S=N(function(k){return h=this,u=k,s=ft(),o||(o=setTimeout(y,r),a&&(c=t.apply(h,u))),c});return S.cancel=function(){clearTimeout(o),o=u=h=null},S}function Ps(t,r){return Ye(r,t)}function Fr(t){return function(){return!t.apply(this,arguments)}}function Es(){var t=arguments,r=t.length-1;return function(){for(var a=r,o=t[r].apply(this,arguments);a--;)o=t[a].call(this,o);return o}}function Bs(t,r){return function(){if(--t<1)return r.apply(this,arguments)}}function ma(t,r){var a;return function(){return--t>0&&(a=r.apply(this,arguments)),t<=1&&(r=null),a}}var Ws=Ye(ma,2);function pa(t,r,a){r=Q(r,a);for(var o=L(t),s,u=0,c=o.length;u0?0:s-1;u>=0&&u0?c=u>=0?u:Math.max(u+h,c):h=u>=0?Math.min(u+1,h):u+h+1;else if(a&&u&&h)return u=a(o,s),o[u]===s?u:-1;if(s!==s)return u=r(qt.call(o,c,h),Yn),u>=0?u+c:-1;for(u=t>0?c:h-1;u>=0&&u0?0:h-1;for(u||(s=a[c?c[y]:y],y+=t);y>=0&&y=3;return r(a,Lt(o,u,4),s,c)}}var Mr=$s(1),_a=$s(-1);function Ke(t,r,a){var o=[];return r=Q(r,a),he(t,function(s,u,c){r(s,u,c)&&o.push(s)}),o}function Fs(t,r,a){return Ke(t,Fr(Q(r)),a)}function Sa(t,r,a){r=Q(r,a);for(var o=!Y(t)&&L(t),s=(o||t).length,u=0;u=0}var Ls=N(function(t,r,a){var o,s;return M(r)?s=r:(r=Ft(r),o=r.slice(0,-1),r=r[r.length-1]),Le(t,function(u){var c=s;if(!c){if(o&&o.length&&(u=ua(u,o)),u==null)return;c=u[r]}return c==null?c:c.apply(u,a)})});function Nr(t,r){return Le(t,zr(r))}function Ds(t,r){return Ke(t,lt(r))}function va(t,r,a){var o=-1/0,s=-1/0,u,c;if(r==null||typeof r=="number"&&typeof t[0]!="object"&&t!=null){t=Y(t)?t:Fe(t);for(var h=0,y=t.length;ho&&(o=u)}else r=Q(r,a),he(t,function(S,k,C){c=r(S,k,C),(c>s||c===-1/0&&o===-1/0)&&(o=S,s=c)});return o}function Ms(t,r,a){var o=1/0,s=1/0,u,c;if(r==null||typeof r=="number"&&typeof t[0]!="object"&&t!=null){t=Y(t)?t:Fe(t);for(var h=0,y=t.length;hh||c===void 0)return 1;if(c1&&(o=Lt(o,r[1])),r=ut(t)):(o=Tf,r=Ge(r,!1,!1),t=Object(t));for(var s=0,u=r.length;s1&&(o=r[1])):(r=Le(Ge(r,!1,!1),String),a=function(s,u){return!me(r,u)}),Ca(t,a,o)});function ka(t,r,a){return qt.call(t,0,Math.max(0,t.length-(r==null||a?1:r)))}function Ur(t,r,a){return t==null||t.length<1?r==null||a?void 0:[]:r==null||a?t[0]:ka(t,t.length-r)}function Dt(t,r,a){return qt.call(t,r==null||a?1:r)}function Ks(t,r,a){return t==null||t.length<1?r==null||a?void 0:[]:r==null||a?t[t.length-1]:Dt(t,Math.max(0,t.length-r))}function Zs(t){return Ke(t,Boolean)}function Js(t,r){return Ge(t,r,!1)}var Ta=N(function(t,r){return r=Ge(r,!0,!0),Ke(t,function(a){return!me(r,a)})}),Xs=N(function(t,r){return Ta(t,r)});function xr(t,r,a,o){jn(r)||(o=a,a=r,r=!1),a!=null&&(a=Q(a,o));for(var s=[],u=[],c=0,h=V(t);c{var Pf=require("child_process").execSync,Ef=require("os").platform();su.exports=function(){var t=Array.isArray(arguments[0])?arguments[0]:Array.prototype.slice.apply(arguments),r=null;return t.some(function(a){if(Bf(Wf(a)))return r=a,!0}),r};function Bf(t){try{return Pf(t),!0}catch(r){return!1}}function Wf(t){return/^win/.test(Ef)?"where "+t:"command -v "+t}});var fu=ot(($c,lu)=>{var Ic=require("fs"),Of=uu(),qf=require("child_process").spawn,zf=["mplayer","afplay","mpg123","mpg321","play","omxplayer","aplay","cmdmp3"];function If(t){t=t||{},this.players=t.players||zf,this.player=t.player||Of(this.players),this.urlRegex=/^(https?|ftp):\/\/[^\s\/$.?#].[^\s]*$/i,this.play=function(r,a,o){o=o||function(){},o=typeof a=="function"?a:o,a=typeof a=="object"?a:{},a.stdio="ignore";var s=this.player=="mplayer"&&this.urlRegex.test(r);if(!r)return o(new Error("No audio file specified"));if(!this.player)return o(new Error("Couldn't find a suitable audio player"));var u=Array.isArray(a[this.player])?a[this.player].concat(r):[r],c=qf(this.player,u,a);return c?(c.on("close",function(h){o(h&&!h.killed?h:null)}),c):(o(new Error("Unable to spawn process with "+this.player)),null)},this.test=function(r){this.play("./assets/test.mp3",r)}}lu.exports=function(t){return new If(t)}});var eo=cities=["ambarawa","ambon","amlapura","amuntai","argamakmur","atambua","babo","bagansiapiapi","bahaurkalteng","bajawa","balige","balikpapan","bandaaceh","bandarlampung","bandung","bangkalan","bangkinang","bangko","bangli","banjar","banjarbaru","banjarmasin","banjarnegara","bantaeng","banten","bantul","banyuwangi","barabai","barito","barru","batam","batang","batu","baturaja","batusangkar","baubau","bekasi","bengkalis","bengkulu","benteng","biak","bima","binjai","bireuen","bitung","blitar","blora","bogor","bojonegoro","bondowoso","bontang","boyolali","brebes","bukittinggi","bulasbtmaluku","bulukumba","buntok","cepu","ciamis","cianjur","cibinong","cilacap","cilegon","cimahi","cirebon","curup","demak","denpasar","depok","dili","dompu","donggala","dumai","ende","enggano","enrekang","fakfak","garut","gianyar","gombong","gorontalo","gresik","gunungsitoli","indramayu","jakartabarat","jakartapusat","jakartaselatan","jakartatimur","jakartautara","jambi","jayapura","jember","jeneponto","jepara","jombang","kabanjahe","kalabahi","kalianda","kandangan","karanganyar","karawang","kasungan","kayuagung","kebumen","kediri","kefamenanu","kendal","kendari","kertosono","ketapang","kisaran","klaten","kolaka","kotabarupulaulaut","kotabumi","kotajantho","kotamobagu","kualakapuas","kualakurun","kualapembuang","kualatungkal","kudus","kuningan","kupang","kutacane","kutoarjo","labuhan","lahat","lamongan","langsa","larantuka","lawang","lhoseumawe","limboto","lubukbasung","lubuklinggau","lubukpakam","lubuksikaping","lumajang","luwuk","madiun","magelang","magetan","majalengka","majene","makale","makassar","malang","mamuju","manna","manokwari","marabahan","maros","martapurakalsel","masambasulsel","masohi","mataram","maumere","medan","mempawah","menado","mentok","merauke","metro","meulaboh","mojokerto","muarabulian","muarabungo","muaraenim","muarateweh","muarosijunjung","muntilan","nabire","negara","nganjuk","ngawi","nunukan","pacitan","padang","padangpanjang","padangsidempuan","pagaralam","painan","palangkaraya","palembang","palopo","palu","pamekasan","pandeglang","pangka_","pangkajenesidenreng","pangkalanbun","pangkalpinang","panyabungan","par_","parepare","pariaman","pasuruan","pati","payakumbuh","pekalongan","pekanbaru","pemalang","pematangsiantar","pendopo","pinrang","pleihari","polewali","pondokgede","ponorogo","pontianak","poso","prabumulih","praya","probolinggo","purbalingga","purukcahu","purwakarta","purwodadigrobogan","purwokerto","purworejo","putussibau","raha","rangkasbitung","rantau","rantauprapat","rantepao","rembang","rengat","ruteng","sabang","salatiga","samarinda","sambaskalbar","sampang","sampit","sanggau","sawahlunto","sekayu","selong","semarang","sengkang","serang","serui","sibolga","sidikalang","sidoarjo","sigli","singaparna","singaraja","singkawang","sinjai","sintang","situbondo","slawi","sleman","soasiu","soe","solo","solok","soreang","sorong","sragen","stabat","subang","sukabumi","sukoharjo","sumbawabesar","sumedang","sumenep","sungailiat","sungaipenuh","sungguminasa","surabaya","surakarta","tabanan","tahuna","takalar","takengon","tamianglayang","tanahgrogot","tangerang","tanjungbalai","tanjungenim","tanjungpandan","tanjungpinang","tanjungredep","tanjungselor","tapaktuan","tarakan","tarutung","tasikmalaya","tebingtinggi","tegal","temanggung","tembilahan","tenggarong","ternate","tolitoli","tondano","trenggalek","tual","tuban","tulungagung","ujungberung","ungaran","waikabubak","waingapu","wamena","watampone","watansoppeng","wates","wonogiri","wonosari","wonosobo","yogyakarta"];var Ro=x(require("http")),Co=x(require("https")),Qe=x(require("zlib")),Z=x(require("stream")),ko=x(ro());var te=x(require("stream")),In=x(require("util"));var Kf=x(io()),oo=65536;async function*Wn(t,r=!0){for(let a of t)if("stream"in a)yield*a.stream();else if(ArrayBuffer.isView(a))if(r){let o=a.byteOffset,s=a.byteOffset+a.byteLength;for(;o!==s;){let u=Math.min(s-o,oo),c=a.buffer.slice(o,o+u);o+=c.byteLength,yield new Uint8Array(c)}}else yield a;else{let o=0;for(;o!==a.size;){let u=await a.slice(o,Math.min(a.size,o+oo)).arrayBuffer();o+=u.byteLength,yield new Uint8Array(u)}}}var so=class On{#e=[];#r="";#t=0;constructor(r=[],a={}){let o=0,s=r.map(c=>{let h;return ArrayBuffer.isView(c)?h=new Uint8Array(c.buffer.slice(c.byteOffset,c.byteOffset+c.byteLength)):c instanceof ArrayBuffer?h=new Uint8Array(c.slice(0)):c instanceof On?h=c:h=new TextEncoder().encode(c),o+=ArrayBuffer.isView(h)?h.byteLength:h.size,h}),u=a.type===void 0?"":String(a.type);this.#r=/[^\u0020-\u007E]/.test(u)?"":u,this.#t=o,this.#e=s}get size(){return this.#t}get type(){return this.#r}async text(){let r=new TextDecoder,a="";for await(let o of Wn(this.#e,!1))a+=r.decode(o,{stream:!0});return a+=r.decode(),a}async arrayBuffer(){let r=new Uint8Array(this.size),a=0;for await(let o of Wn(this.#e,!1))r.set(o,a),a+=o.length;return r.buffer}stream(){let r=Wn(this.#e,!0);return new ReadableStream({type:"bytes",async pull(a){let o=await r.next();o.done?a.close():a.enqueue(o.value)}})}slice(r=0,a=this.size,o=""){let{size:s}=this,u=r<0?Math.max(s+r,0):Math.min(r,s),c=a<0?Math.max(s+a,0):Math.min(a,s),h=Math.max(c-u,0),y=this.#e,S=[],k=0;for(let v of y){if(k>=h)break;let g=ArrayBuffer.isView(v)?v.byteLength:v.size;if(u&&g<=u)u-=g,c-=g;else{let B;ArrayBuffer.isView(v)?(B=v.subarray(u,Math.min(g,c)),k+=B.byteLength):(B=v.slice(u,Math.min(g,c)),k+=B.size),S.push(B),u=0}}let C=new On([],{type:String(o).toLowerCase()});return C.#t=h,C.#e=S,C}get[Symbol.toStringTag](){return"Blob"}static[Symbol.hasInstance](r){return r&&typeof r=="object"&&typeof r.constructor=="function"&&(typeof r.stream=="function"||typeof r.arrayBuffer=="function")&&/^(Blob|File)$/.test(r[Symbol.toStringTag])}};Object.defineProperties(so.prototype,{size:{enumerable:!0},type:{enumerable:!0},slice:{enumerable:!0}});var Kl=so,uo=Kl;var Oe=class extends Error{constructor(r,a){super(r);Error.captureStackTrace(this,this.constructor),this.type=a}get name(){return this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}};var ee=class extends Oe{constructor(r,a,o){super(r,a);o&&(this.code=this.errno=o.code,this.erroredSysCall=o.syscall)}};var fo=x(require("crypto"));var Bt=Symbol.toStringTag,qn=t=>typeof t=="object"&&typeof t.append=="function"&&typeof t.delete=="function"&&typeof t.get=="function"&&typeof t.getAll=="function"&&typeof t.has=="function"&&typeof t.set=="function"&&typeof t.sort=="function"&&t[Bt]==="URLSearchParams",de=t=>typeof t=="object"&&typeof t.arrayBuffer=="function"&&typeof t.type=="string"&&typeof t.stream=="function"&&typeof t.constructor=="function"&&/^(Blob|File)$/.test(t[Bt]);function wr(t){return typeof t=="object"&&typeof t.append=="function"&&typeof t.set=="function"&&typeof t.get=="function"&&typeof t.getAll=="function"&&typeof t.delete=="function"&&typeof t.keys=="function"&&typeof t.values=="function"&&typeof t.entries=="function"&&typeof t.constructor=="function"&&t[Bt]==="FormData"}var lo=t=>typeof t=="object"&&(t[Bt]==="AbortSignal"||t[Bt]==="EventTarget");var st=`\r 14 | `,zn="-".repeat(2),Zl=Buffer.byteLength(st),co=t=>`${zn}${t}${zn}${st.repeat(2)}`;function ho(t,r,a){let o="";return o+=`${zn}${t}${st}`,o+=`Content-Disposition: form-data; name="${r}"`,de(a)&&(o+=`; filename="${a.name}"${st}`,o+=`Content-Type: ${a.type||"application/octet-stream"}`),`${o}${st.repeat(2)}`}var mo=()=>(0,fo.randomBytes)(8).toString("hex");async function*po(t,r){for(let[a,o]of t)yield ho(r,a,o),de(o)?yield*o.stream():yield o,yield st;yield co(r)}function bo(t,r){let a=0;for(let[o,s]of t)a+=Buffer.byteLength(ho(r,o,s)),a+=de(s)?s.size:Buffer.byteLength(String(s)),a+=Zl;return a+=Buffer.byteLength(co(r)),a}var G=Symbol("Body internals"),Ve=class{constructor(r,{size:a=0}={}){let o=null;r===null?r=null:qn(r)?r=Buffer.from(r.toString()):de(r)||Buffer.isBuffer(r)||(In.types.isAnyArrayBuffer(r)?r=Buffer.from(r):ArrayBuffer.isView(r)?r=Buffer.from(r.buffer,r.byteOffset,r.byteLength):r instanceof te.default||(wr(r)?(o=`NodeFetchFormDataBoundary${mo()}`,r=te.default.Readable.from(po(r,o))):r=Buffer.from(String(r)))),this[G]={body:r,boundary:o,disturbed:!1,error:null},this.size=a,r instanceof te.default&&r.on("error",s=>{let u=s instanceof Oe?s:new ee(`Invalid response body while trying to fetch ${this.url}: ${s.message}`,"system",s);this[G].error=u})}get body(){return this[G].body}get bodyUsed(){return this[G].disturbed}async arrayBuffer(){let{buffer:r,byteOffset:a,byteLength:o}=await vr(this);return r.slice(a,a+o)}async blob(){let r=this.headers&&this.headers.get("content-type")||this[G].body&&this[G].body.type||"",a=await this.buffer();return new uo([a],{type:r})}async json(){let r=await vr(this);return JSON.parse(r.toString())}async text(){return(await vr(this)).toString()}buffer(){return vr(this)}};Object.defineProperties(Ve.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0}});async function vr(t){if(t[G].disturbed)throw new TypeError(`body used already for: ${t.url}`);if(t[G].disturbed=!0,t[G].error)throw t[G].error;let{body:r}=t;if(r===null)return Buffer.alloc(0);if(de(r)&&(r=te.default.Readable.from(r.stream())),Buffer.isBuffer(r))return r;if(!(r instanceof te.default))return Buffer.alloc(0);let a=[],o=0;try{for await(let s of r){if(t.size>0&&o+s.length>t.size){let u=new ee(`content size at ${t.url} over limit: ${t.size}`,"max-size");throw r.destroy(u),u}o+=s.length,a.push(s)}}catch(s){throw s instanceof Oe?s:new ee(`Invalid response body while trying to fetch ${t.url}: ${s.message}`,"system",s)}if(r.readableEnded===!0||r._readableState.ended===!0)try{return a.every(s=>typeof s=="string")?Buffer.from(a.join("")):Buffer.concat(a,o)}catch(s){throw new ee(`Could not create Buffer from response body for ${t.url}: ${s.message}`,"system",s)}else throw new ee(`Premature close of server response while trying to fetch ${t.url}`)}var Rr=(t,r)=>{let a,o,{body:s}=t;if(t.bodyUsed)throw new Error("cannot clone body after it is used");return s instanceof te.default&&typeof s.getBoundary!="function"&&(a=new te.PassThrough({highWaterMark:r}),o=new te.PassThrough({highWaterMark:r}),s.pipe(a),s.pipe(o),t[G].body=a,s=o),s},Cr=(t,r)=>t===null?null:typeof t=="string"?"text/plain;charset=UTF-8":qn(t)?"application/x-www-form-urlencoded;charset=UTF-8":de(t)?t.type||null:Buffer.isBuffer(t)||In.types.isAnyArrayBuffer(t)||ArrayBuffer.isView(t)?null:t&&typeof t.getBoundary=="function"?`multipart/form-data;boundary=${t.getBoundary()}`:wr(t)?`multipart/form-data; boundary=${r[G].boundary}`:t instanceof te.default?null:"text/plain;charset=UTF-8",go=t=>{let{body:r}=t;return r===null?0:de(r)?r.size:Buffer.isBuffer(r)?r.length:r&&typeof r.getLengthSync=="function"?r.hasKnownLength&&r.hasKnownLength()?r.getLengthSync():null:wr(r)?bo(t[G].boundary):null},yo=(t,{body:r})=>{r===null?t.end():de(r)?te.default.Readable.from(r.stream()).pipe(t):Buffer.isBuffer(r)?(t.write(r),t.end()):r.pipe(t)};var $n=x(require("util")),Wt=x(require("http")),kr=typeof Wt.default.validateHeaderName=="function"?Wt.default.validateHeaderName:t=>{if(!/^[\^`\-\w!#$%&'*+.|~]+$/.test(t)){let r=new TypeError(`Header name must be a valid HTTP token [${t}]`);throw Object.defineProperty(r,"code",{value:"ERR_INVALID_HTTP_TOKEN"}),r}},Fn=typeof Wt.default.validateHeaderValue=="function"?Wt.default.validateHeaderValue:(t,r)=>{if(/[^\t\u0020-\u007E\u0080-\u00FF]/.test(r)){let a=new TypeError(`Invalid character in header content ["${t}"]`);throw Object.defineProperty(a,"code",{value:"ERR_INVALID_CHAR"}),a}},K=class extends URLSearchParams{constructor(r){let a=[];if(r instanceof K){let o=r.raw();for(let[s,u]of Object.entries(o))a.push(...u.map(c=>[s,c]))}else if(r!=null)if(typeof r=="object"&&!$n.types.isBoxedPrimitive(r)){let o=r[Symbol.iterator];if(o==null)a.push(...Object.entries(r));else{if(typeof o!="function")throw new TypeError("Header pairs must be iterable");a=[...r].map(s=>{if(typeof s!="object"||$n.types.isBoxedPrimitive(s))throw new TypeError("Each header pair must be an iterable object");return[...s]}).map(s=>{if(s.length!==2)throw new TypeError("Each header pair must be a name/value tuple");return[...s]})}}else throw new TypeError("Failed to construct 'Headers': The provided value is not of type '(sequence> or record)");a=a.length>0?a.map(([o,s])=>(kr(o),Fn(o,String(s)),[String(o).toLowerCase(),String(s)])):void 0;super(a);return new Proxy(this,{get(o,s,u){switch(s){case"append":case"set":return(c,h)=>(kr(c),Fn(c,String(h)),URLSearchParams.prototype[s].call(o,String(c).toLowerCase(),String(h)));case"delete":case"has":case"getAll":return c=>(kr(c),URLSearchParams.prototype[s].call(o,String(c).toLowerCase()));case"keys":return()=>(o.sort(),new Set(URLSearchParams.prototype.keys.call(o)).keys());default:return Reflect.get(o,s,u)}}})}get[Symbol.toStringTag](){return this.constructor.name}toString(){return Object.prototype.toString.call(this)}get(r){let a=this.getAll(r);if(a.length===0)return null;let o=a.join(", ");return/^content-encoding$/i.test(r)&&(o=o.toLowerCase()),o}forEach(r,a=void 0){for(let o of this.keys())Reflect.apply(r,a,[this.get(o),o,this])}*values(){for(let r of this.keys())yield this.get(r)}*entries(){for(let r of this.keys())yield[r,this.get(r)]}[Symbol.iterator](){return this.entries()}raw(){return[...this.keys()].reduce((r,a)=>(r[a]=this.getAll(a),r),{})}[Symbol.for("nodejs.util.inspect.custom")](){return[...this.keys()].reduce((r,a)=>{let o=this.getAll(a);return a==="host"?r[a]=o[0]:r[a]=o.length>1?o:o[0],r},{})}};Object.defineProperties(K.prototype,["get","entries","forEach","values"].reduce((t,r)=>(t[r]={enumerable:!0},t),{}));function _o(t=[]){return new K(t.reduce((r,a,o,s)=>(o%2==0&&r.push(s.slice(o,o+2)),r),[]).filter(([r,a])=>{try{return kr(r),Fn(r,String(a)),!0}catch{return!1}}))}var Jl=new Set([301,302,303,307,308]),Tr=t=>Jl.has(t);var ue=Symbol("Response internals"),H=class extends Ve{constructor(r=null,a={}){super(r,a);let o=a.status!=null?a.status:200,s=new K(a.headers);if(r!==null&&!s.has("Content-Type")){let u=Cr(r);u&&s.append("Content-Type",u)}this[ue]={type:"default",url:a.url,status:o,statusText:a.statusText||"",headers:s,counter:a.counter,highWaterMark:a.highWaterMark}}get type(){return this[ue].type}get url(){return this[ue].url||""}get status(){return this[ue].status}get ok(){return this[ue].status>=200&&this[ue].status<300}get redirected(){return this[ue].counter>0}get statusText(){return this[ue].statusText}get headers(){return this[ue].headers}get highWaterMark(){return this[ue].highWaterMark}clone(){return new H(Rr(this,this.highWaterMark),{type:this.type,url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected,size:this.size})}static redirect(r,a=302){if(!Tr(a))throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');return new H(null,{headers:{location:new URL(r).toString()},status:a})}static error(){let r=new H(null,{status:0,statusText:""});return r[ue].type="error",r}get[Symbol.toStringTag](){return"Response"}};Object.defineProperties(H.prototype,{type:{enumerable:!0},url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}});var wo=x(require("url"));var So=t=>{if(t.search)return t.search;let r=t.href.length-1,a=t.hash||(t.href[r]==="#"?"#":"");return t.href[r-a.length]==="?"?"?":""};var we=Symbol("Request internals"),Ar=t=>typeof t=="object"&&typeof t[we]=="object",qe=class extends Ve{constructor(r,a={}){let o;Ar(r)?o=new URL(r.url):(o=new URL(r),r={});let s=a.method||r.method||"GET";if(s=s.toUpperCase(),(a.body!=null||Ar(r))&&r.body!==null&&(s==="GET"||s==="HEAD"))throw new TypeError("Request with GET/HEAD method cannot have body");let u=a.body?a.body:Ar(r)&&r.body!==null?Rr(r):null;super(u,{size:a.size||r.size||0});let c=new K(a.headers||r.headers||{});if(u!==null&&!c.has("Content-Type")){let y=Cr(u,this);y&&c.append("Content-Type",y)}let h=Ar(r)?r.signal:null;if("signal"in a&&(h=a.signal),h!=null&&!lo(h))throw new TypeError("Expected signal to be an instanceof AbortSignal or EventTarget");this[we]={method:s,redirect:a.redirect||r.redirect||"follow",headers:c,parsedURL:o,signal:h},this.follow=a.follow===void 0?r.follow===void 0?20:r.follow:a.follow,this.compress=a.compress===void 0?r.compress===void 0?!0:r.compress:a.compress,this.counter=a.counter||r.counter||0,this.agent=a.agent||r.agent,this.highWaterMark=a.highWaterMark||r.highWaterMark||16384,this.insecureHTTPParser=a.insecureHTTPParser||r.insecureHTTPParser||!1}get method(){return this[we].method}get url(){return(0,wo.format)(this[we].parsedURL)}get headers(){return this[we].headers}get redirect(){return this[we].redirect}get signal(){return this[we].signal}clone(){return new qe(this)}get[Symbol.toStringTag](){return"Request"}};Object.defineProperties(qe.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0}});var vo=t=>{let{parsedURL:r}=t[we],a=new K(t[we].headers);a.has("Accept")||a.set("Accept","*/*");let o=null;if(t.body===null&&/^(post|put)$/i.test(t.method)&&(o="0"),t.body!==null){let h=go(t);typeof h=="number"&&!Number.isNaN(h)&&(o=String(h))}o&&a.set("Content-Length",o),a.has("User-Agent")||a.set("User-Agent","node-fetch"),t.compress&&!a.has("Accept-Encoding")&&a.set("Accept-Encoding","gzip,deflate,br");let{agent:s}=t;typeof s=="function"&&(s=s(r)),!a.has("Connection")&&!s&&a.set("Connection","close");let u=So(r);return{path:r.pathname+u,pathname:r.pathname,hostname:r.hostname,protocol:r.protocol,port:r.port,hash:r.hash,search:r.search,query:r.query,href:r.href,method:t.method,headers:a[Symbol.for("nodejs.util.inspect.custom")](),insecureHTTPParser:t.insecureHTTPParser,agent:s}};var Ln=class extends Oe{constructor(r,a="aborted"){super(r,a)}};var Xl=new Set(["data:","http:","https:"]);async function Ot(t,r){return new Promise((a,o)=>{let s=new qe(t,r),u=vo(s);if(!Xl.has(u.protocol))throw new TypeError(`node-fetch cannot load ${t}. URL scheme "${u.protocol.replace(/:$/,"")}" is not supported.`);if(u.protocol==="data:"){let g=(0,ko.default)(s.url),B=new H(g,{headers:{"Content-Type":g.typeFull}});a(B);return}let c=(u.protocol==="https:"?Co.default:Ro.default).request,{signal:h}=s,y=null,S=()=>{let g=new Ln("The operation was aborted.");o(g),s.body&&s.body instanceof Z.default.Readable&&s.body.destroy(g),!(!y||!y.body)&&y.body.emit("error",g)};if(h&&h.aborted){S();return}let k=()=>{S(),v()},C=c(u);h&&h.addEventListener("abort",k);let v=()=>{C.abort(),h&&h.removeEventListener("abort",k)};C.on("error",g=>{o(new ee(`request to ${s.url} failed, reason: ${g.message}`,"system",g)),v()}),ef(C,g=>{y.body.destroy(g)}),process.version<"v14"&&C.on("socket",g=>{let B;g.prependListener("end",()=>{B=g._eventsCount}),g.prependListener("close",E=>{if(y&&B{C.setTimeout(0);let B=_o(g.rawHeaders);if(Tr(g.statusCode)){let be=B.get("Location"),re=be===null?null:new URL(be,s.url);switch(s.redirect){case"error":o(new ee(`uri requested responds with a redirect, redirect mode is set to error: ${s.url}`,"no-redirect")),v();return;case"manual":re!==null&&B.set("Location",re);break;case"follow":{if(re===null)break;if(s.counter>=s.follow){o(new ee(`maximum redirect reached at: ${s.url}`,"max-redirect")),v();return}let ge={headers:new K(s.headers),follow:s.follow,counter:s.counter+1,agent:s.agent,compress:s.compress,method:s.method,body:s.body,signal:s.signal,size:s.size};if(g.statusCode!==303&&s.body&&r.body instanceof Z.default.Readable){o(new ee("Cannot follow redirect with body being a readable stream","unsupported-redirect")),v();return}(g.statusCode===303||(g.statusCode===301||g.statusCode===302)&&s.method==="POST")&&(ge.method="GET",ge.body=void 0,ge.headers.delete("content-length")),a(Ot(new qe(re,ge))),v();return}default:return o(new TypeError(`Redirect option '${s.redirect}' is not a valid value of RequestRedirect`))}}h&&g.once("end",()=>{h.removeEventListener("abort",k)});let E=(0,Z.pipeline)(g,new Z.PassThrough,o);process.version<"v12.10"&&g.on("aborted",k);let X={url:s.url,status:g.statusCode,statusText:g.statusMessage,headers:B,size:s.size,counter:s.counter,highWaterMark:s.highWaterMark},le=B.get("Content-Encoding");if(!s.compress||s.method==="HEAD"||le===null||g.statusCode===204||g.statusCode===304){y=new H(E,X),a(y);return}let pe={flush:Qe.default.Z_SYNC_FLUSH,finishFlush:Qe.default.Z_SYNC_FLUSH};if(le==="gzip"||le==="x-gzip"){E=(0,Z.pipeline)(E,Qe.default.createGunzip(pe),o),y=new H(E,X),a(y);return}if(le==="deflate"||le==="x-deflate"){(0,Z.pipeline)(g,new Z.PassThrough,o).once("data",re=>{E=(re[0]&15)==8?(0,Z.pipeline)(E,Qe.default.createInflate(),o):(0,Z.pipeline)(E,Qe.default.createInflateRaw(),o),y=new H(E,X),a(y)});return}if(le==="br"){E=(0,Z.pipeline)(E,Qe.default.createBrotliDecompress(),o),y=new H(E,X),a(y);return}y=new H(E,X),a(y)}),yo(C,s)})}function ef(t,r){let a=Buffer.from(`0\r 15 | \r 16 | `),o=!1,s=!1,u;t.on("response",c=>{let{headers:h}=c;o=h["transfer-encoding"]==="chunked"&&!h["content-length"]}),t.on("socket",c=>{let h=()=>{if(o&&!s){let y=new Error("Premature close");y.code="ERR_STREAM_PREMATURE_CLOSE",r(y)}};c.prependListener("close",h),t.on("abort",()=>{c.removeListener("close",h)}),c.on("data",y=>{s=Buffer.compare(y.slice(-5),a)===0,!s&&u&&(s=Buffer.compare(u.slice(-3),a.slice(0,3))===0&&Buffer.compare(y.slice(-2),a.slice(3))===0),u=y})})}var d=x(ou());var J=x(require("fs")),I=require("vscode"),$f=fu()({}),cu="https://raw.githubusercontent.com/lakuapik/jadwalsholatorg/master",Ba=["sheikh_abdul_karim_omar_fatani_al_makki_adzan.mp3","sheikh_abdul_karim_omar_fatani_al_makki_adzan_fajr.mp3"],Wa=new Date().toLocaleDateString("UK"),Oa=Wa.substr(6,4),qa=Wa.substr(3,2),Ff=Wa.substr(0,2),za=`${Oa}-${qa}-${Ff}`,Vr,ve,ct,Ia,Ze,dt=()=>Gr("kota");async function du(){let t=`Kota terpilih: ${dt()}. 17 | Jadwal waktu sholat mengikuti kota yang dipilih.`;return I.window.showQuickPick(eo,{placeHolder:t}).then(r=>{r!==void 0&&(Gr("kota",r),Mt())})}function Qr(){return`${ve}/schedules/${dt()}-${Oa}-${qa}.json`}function Lf(){try{return JSON.parse((0,J.readFileSync)(Qr()).toString())}catch(t){I.window.showInformationMessage(`== Ekstensi Waktu Sholat == 18 | 19 | jadwal sholat bulan ini tidak ada, lakukan pembaruan? 20 | 21 | *pembaruan memerlukan koneksi internet. 22 | 23 | kota terpilih saat ini: ${dt()}`,{modal:!0},{title:"Update",action:1}).then(r=>{r!==void 0&&r.action==1&&Mt()})}}function Df(){return(0,d.chain)(Lf()).findWhere({tanggal:za}).omit("tanggal").map((t,r)=>({time:t,adzan:r,timestamp:new Date(`${za} ${t}`).getTime()})).sortBy("timestamp").value()}function Mt(){I.window.withProgress({cancellable:!0,location:I.ProgressLocation.Notification,title:`Waktu Sholat: pembaruan jadwal kota ${dt()}...`},async()=>{let t=`${cu}/adzan/${dt()}/${Oa}/${qa}.json`;return Ot(t).then(r=>r.text()).then(r=>{(0,J.writeFileSync)(Qr(),r),$a()})})}function Yr(t,r){ct.text=t,ct.tooltip=r,ct.show()}function $a(){let t=Df();if(t===void 0){Yr("\u{1F54C}","Jadwal kosong, silahkan lakukan pembaruan.");return}if(currentAdzan=(0,d.chain)(t).filter(r=>{let a=5*60*1e3;return r.timestamp>jt()-a&&r.timestamp<=jt()}).first().value(),nextAdzan=(0,d.chain)(t).filter(r=>r.timestamp>=jt()).first().value(),currentAdzan!==void 0){Yr(`\u{1F54C} WAKTUNYA ${currentAdzan.adzan.toUpperCase()}`,`Selamat menunaikan ${Nt(currentAdzan.adzan)}`),Fa(currentAdzan.timestamp)===0&&I.window.showInformationMessage(` 24 | Waktu ${Nt(currentAdzan.adzan)} 25 | pukul ${currentAdzan.time} telah tiba! 26 | `),["shubuh","dzuhur","ashr","magrib","isya"].includes(currentAdzan.adzan)&&Nf(currentAdzan.adzan);return}if(nextAdzan===void 0){Yr("\u{1F54C} Isya","Sudah isya belum? lengkapi 5 waktumu");return}Yr(`\u{1F54C} ${Nt(nextAdzan.adzan)} ${nextAdzan.time}`,`${Nt(nextAdzan.adzan)} ${pu(nextAdzan.timestamp)}`),Fa(nextAdzan.timestamp)===5&&I.window.showInformationMessage(` 27 | PERHATIAN: ${Nt(nextAdzan.adzan)} 28 | ${pu(nextAdzan.timestamp)} 29 | `)}function Mf(){I.window.showInformationMessage(ct._tooltip)}async function hu(){let t=(0,d.map)(Ba,r=>{let a=`${cu}/adzan-mp3/${r}`,o=`${ve}/audios/${r}`;if(!(0,J.existsSync)(o))return I.window.withProgress({location:I.ProgressLocation.Notification,title:`Waktu Sholat: mengunduh audio ${r}...`},async()=>Ot(a).then(s=>s.buffer()).then(s=>{(0,J.writeFileSync)(o,s)}))}).values();return Promise.all(t)}async function Nf(t,r=!1){if(!Gr("suara-adzan-aktif"))return;let a=`waktusholat.${za}.${t}.play-audio`;if(Vr.get(a)===!0)return;let o=r?Ba[1]:Ba[0],s=`${ve}/audios/${o}`;(0,J.existsSync)(s)||await hu(),Ia=$f.play(s,(u,c,h)=>{h=mu()}),Vr.update(a,!0),Ze=I.window.createStatusBarItem(I.StatusBarAlignment.Left,-9999),Ze.text="Adzan berkumandang...",Ze.tooltip="[x] Hentikan suara adzan.",Ze.command="waktusholat.stopAudioPlayer",Ze.show()}var mu=()=>{Ia&&Ia.kill(),Ze&&Ze.dispose()};function Gr(t,r=null){let a=I.workspace.getConfiguration("waktusholat");return r===null?a.get(t):a.update(t,r,1)}function Nt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function jt(){return new Date().getTime()}function Fa(t){return Math.ceil((t-jt())/(60*1e3))}function jf(t){return Math.floor((t-jt())/(60*60*1e3))}function pu(t){let r="",a=jf(t),o=Fa(t)%60;return a>0&&(r+=`${a} jam `),o>0&&(r+=`${o} menit lagi`),o<=0&&(r="sekarang!"),r}async function Uf(t){Vr=t.globalState,ve=t.globalStorageUri.path,process.platform=="win32"&&(ve=ve.slice(1)),[ve,`${ve}/schedules`,`${ve}/audios`].forEach(r=>{(0,J.existsSync)(r)||(0,J.mkdirSync)(r)}),Vr.get("waktusholat.first-open")!=="DONE"&&((await I.window.showInformationMessage(`Terima kasih telah memasang ekstensi Waktu Sholat! 30 | 31 | Kota saat ini: ${dt()}`,{modal:!0},{title:"Pilih Kota",action:1}))?.action===1&&await du(),(await I.window.showInformationMessage(`Apakah Anda ingin mengaktifkan suara adzan? 32 | 33 | *akan mengunduh berkas audio sebesar 1.5MB`,{modal:!0},{title:"Okay",action:1}))?.action===1&&(Gr("suara-adzan-aktif",!0),await hu()),t.globalState.update("waktusholat.first-open","DONE")),(0,J.existsSync)(Qr())||Mt(),ct=I.window.createStatusBarItem(I.StatusBarAlignment.Right,1),ct.command="waktusholat.showSummaryStatusBarInfo",$a(),setInterval($a,1e3*30),t.subscriptions.push(I.commands.registerCommand("waktusholat.updateSchedule",Mt),I.commands.registerCommand("waktusholat.selectCity",du),I.commands.registerCommand("waktusholat.showSummaryStatusBarInfo",Mf),I.commands.registerCommand("waktusholat.stopAudioPlayer",mu)),I.workspace.onDidChangeConfiguration(()=>{(0,J.existsSync)(Qr())||Mt()})}function xf(){}module.exports={activate:Uf,deactivate:xf}; 34 | --------------------------------------------------------------------------------