AI di perangkat — profesional dan privat.

Alat Base64 Decoder Online

Base64 ke teks atau berkas asli — tidak ada yang diunggah, gratis.

  • Berjalan di perangkat Anda
  • Membaca 7 format Base64
  • Menunjuk karakter yang salah

Letakkan berkas berisi Base64

Satu berkas .txt, .b64, .pem, .asc, atau .jwt sekali jalan pada paket gratis.

Mendekode saat mengetik hingga 256 KB; di atas itu, tekan Dekode.

Opsi dekode
Format masukan
Format masukan

Auto mengenali muatan polos, data URI, blok PEM atau PGP, dan JWT tanpa perlu diberi tahu.

Mati, spasi dibuang dan padding yang hilang ditambahkan. Nyala, keduanya jadi galat — begitu pula kelompok akhir yang bit sisanya bukan nol, hal yang diterima diam-diam oleh setiap decoder lain.

Pisah masukan
Pisah masukan

Auto memisah JWT pada titik-titiknya dan membiarkan yang lain utuh.

Tampilkan hasil sebagai
Tampilkan hasil sebagai

Auto menampilkan teks untuk muatan teks dan dump heksadesimal untuk yang lain.

Set karakter

Base64 tidak membawa pengodean. Auto membaca tanda urutan byte, lalu set yang dideklarasikan, lalu menguji apakah UTF-8 valid.

Batas

Gratis mendekode hingga 25.0 MB Base64, satu masukan sekali jalan. Semua format, set karakter, dan tampilan termasuk.

Cara mendekode string Base64

  1. 1

    Tempel Base64

    Letakkan string di kotak masukan. Pergantian baris, padding yang hilang, dan karakter base64url semuanya ditangani, dan data URI, blok PEM, atau JWT bisa ditempel utuh — pembungkusnya dideteksi dan dilepas untuk Anda.

  2. 2

    Baca hasilnya

    Hasil muncul saat Anda mengetik hingga 256 KB; masukan yang lebih besar didekode saat menekan Dekode. Panel menyebutkan format yang ditemukan, jenis berkas yang dikenali dari byte-nya, dan set karakter yang dipakai untuk menampilkan teks.

  3. 3

    Sesuaikan bila tebakannya meleset

    Ganti tampilan antara teks, heksadesimal, dan ASCII tercetak, pilih set karakter tertentu bila deteksi otomatis menghasilkan karakter pengganti, atau nyalakan mode ketat agar masukan cacat ditolak alih-alih diperbaiki.

  4. 4

    Salin atau unduh

    Salin teksnya, atau unduh muatannya dengan ekstensi yang dibenarkan oleh byte-nya sendiri — PNG hasil dekode tersimpan sebagai .png, bukan .bin. Semuanya diproses di perangkat Anda dan tidak ada yang diunggah.

Apa yang dilakukan tiap kontrol

Lima pengaturan, dan tiap satunya ada karena sebuah muatan nyata membutuhkannya. Tidak ada yang dikunci di balik paket berbayar — decoder yang menahan proses dekode bukan dibatasi, melainkan rusak.

Format masukan

Biarkan pada Auto dan tempel apa saja. Alat ini memeriksa, berurutan, awalan data URI, blok armor OpenPGP, header PEM, dan JWT tiga bagian, lalu memperlakukan masukan sebagai muatan polos bila tidak ada yang cocok. Memilih format secara eksplisit mengubahnya jadi pernyataan: jika Anda memilih PEM dan masukan tidak punya baris BEGIN, Anda diberi tahu, bukan diberi hasil dekode sesuatu yang lain. Memilih Standar atau Aman-URL sekaligus mengunci alfabetnya, sehingga dengan mode ketat menyala, muatan yang memakai alfabet lainnya ditolak persis di karakter tempat ia menyimpang.

Mode ketat

Mati secara bawaan, karena tugas sehari-hari adalah membaca string yang dikirim seseorang, dan menolaknya gara-gara satu = yang hilang tidak menolong siapa pun. Dinyalakan, empat hal berubah dari perbaikan jadi galat: spasi di luar format berbaris, padding hilang atau salah, alfabet tercampur, dan kelompok akhir yang bit tak terpakainya bukan nol. Yang terakhir layak diketahui — ia punya bagian tersendiri di bawah, dan tak ada decoder lain di web yang melaporkannya.

Pisah masukan

Satu mekanisme, dua kegunaan. «Tiap baris» mendekode daftar muatan yang saling bebas secara terpisah dan menampilkannya sebagai hasil terpisah, persis yang Anda inginkan saat berkas log atau kolom basis data berisi satu nilai Base64 per baris. «Segmen JWT» memisah pada titik-titiknya, sehingga header dan payload sebuah token masing-masing terdekode sendiri dan tanda tangan yang bukan teks terbaca tidak merusak sisanya. Auto memilih yang kedua bila masukannya JWT dan membiarkan sisanya.

Tampilkan hasil sebagai

Auto menampilkan teks untuk muatan teks dan dump heksadesimal untuk yang lain, berdasarkan byte-nya sebenarnya apa, bukan berdasarkan apakah sebuah decoder teks menghasilkan sesuatu. Anda bisa menimpanya: heksadesimal adalah tampilan yang tepat untuk muatan biner yang sedang Anda periksa, ASCII tercetak berguna untuk menemukan string tertanam di dalam biner, dan memaksa Teks adalah cara memeriksa muatan yang salah dikenali detektor. Berganti tampilan seketika karena ia hanya menampilkan ulang byte yang sudah terdekode.

Set karakter

Auto membaca tanda urutan byte lebih dulu, lalu set apa pun yang dideklarasikan data URI, lalu menguji apakah byte-nya UTF-8 yang valid, dan jatuh ke Windows-1252 sebagai tebakan yang dinyatakan. Bila hasilnya mengandung karakter pengganti, panel menyebut berapa banyak, dan memilih set yang benar dari daftar memperbaikinya tanpa mendekode ulang Base64-nya.

Format Base64 yang dibaca decoder ini

Base64 adalah satu pengodean, tetapi ia datang terbungkus dalam setidaknya tujuh hal berbeda. Decoder yang hanya menerima muatan polos menolak sebagian besar dari apa yang sebenarnya ada di papan klip orang.

  • Standar — alfabet RFC 4648 — A–Z, a–z, 0–9, + dan /, dengan padding =. Keluaran sebagian besar encoder.
  • Aman-URL (base64url) — sama, dengan - dan _ sebagai ganti + dan /, agar string bertahan di dalam URL atau nama berkas. Biasanya tanpa padding. Dideteksi dan didekode tanpa pengaturan.
  • MIME — Base64 standar yang dipatah pada 76 kolom, seperti pada badan surel. Pergantian barisnya dibuang; dalam mode ketat itulah satu-satunya spasi yang tetap sah, karena format ini justru didefinisikan olehnya.
  • PEM — muatan di antara baris -----BEGIN X----- dan -----END X-----, seperti pada sertifikat, kunci privat, dan CSR. Labelnya harus cocok di kedua ujung, dan blok yang BEGIN dan END-nya berbeda dilaporkan rusak alih-alih didekode diam-diam.
  • ASCII-Armor OpenPGP — sepupu PEM, dengan header armor opsional dan baris checksum =CRC24. Checksum-nya diverifikasi — itulah satu-satunya pemeriksaan integritas yang dibawa varian Base64 mana pun, dan alat yang membuangnya tanpa melihat telah membuang satu-satunya bukti yang ditawarkan format ini.
  • Data URI — data:image/png;base64,…, yaitu yang Anda dapat saat menyalin gambar tertanam dari CSS atau alat pengembang. Awalannya dilepas, dan tipe media serta set karakter yang dideklarasikannya dipakai, bukan ditebak.
  • JWT — tiga segmen base64url dipisahkan titik. Dipisah pada titik-titiknya agar header dan payload masing-masing terdekode sebagai JSON sebagaimana adanya — termasuk token dengan segmen tanda tangan kosong, yang dihasilkan alg:none dan akan ditolak oleh pemisahan yang lebih ketat.

Mencari tahu byte hasil dekode itu apa

Inilah bagian yang dilewati sebagian besar decoder Base64, dan melewatinya adalah alasan begitu banyak dari mereka menyerahkan layar penuh tanda tanya kepada Anda. Base64 tidak berkata apa pun tentang isinya. Namun begitu byte-nya ada, biasanya mereka berkata sendiri: hampir setiap format biner diawali sebuah tanda tangan, dan membacanya murah.

Sekitar empat puluh tanda tangan diperiksa, mencakup gambar (PNG, JPEG, GIF, WebP, BMP, ICO, TIFF, AVIF, HEIC), dokumen (PDF, RTF), arsip (ZIP, gzip, bzip2, xz, zstd, 7z, RAR), audio dan video (MP3, FLAC, Ogg, WAV, MP4, WebM, AVI), fon (TTF, OTF, WOFF, WOFF2), dan berkas eksekusi. Format berbasis ZIP disaring selangkah lebih jauh dengan membaca nama entri pertama di dalam arsip, sehingga .docx hasil dekode ditawarkan sebagai .docx dan bukan .zip, dan berkas OpenDocument dikenali dari tipe media yang dibawa entri mimetype-nya sendiri. Bila tidak ada yang cocok, byte-nya diuji apakah teks sama sekali — byte NUL adalah pertandanya, dengan pengecualian untuk UTF-16 yang memang separuhnya byte NUL — dan teks yang diawali kurung kurawal hanya diberi label JSON bila benar-benar bisa diurai.

Dua hal mengikuti dari ini dan terlihat di antarmuka. Tombol unduh menawarkan berkas dengan ekstensi yang dibenarkan byte-nya sendiri, sehingga PNG hasil dekode tersimpan sebagai .png dan terbuka dengan klik ganda. Dan muatan biner tidak pernah dilewatkan ke decoder teks untuk menghasilkan satu halaman karakter pengganti U+FFFD: ia langsung ke tampilan heksadesimal, dan panelnya menyebutkan apa yang ditemukan.

Mengapa Base64 tidak tahu teks Anda dalam set karakter apa

Inilah alasan paling umum sebuah dekode «terlihat salah», dan itu bukan kutu pada decoder. Base64 mengodekan byte. Ia tidak punya bidang untuk pengodean, tidak punya header, dan tidak punya konvensi untuk itu. Alat mana pun yang menunjukkan teks kepada Anda telah memilih sebuah pengodean atas nama Anda, dan sebagian besar tidak memberi tahu yang mana.

  • Tanda urutan byte adalah sebuah pernyataan — bila byte hasil dekode diawali BOM, pembuatnya telah menyatakan pengodeannya, dan itulah yang dipakai. UTF-8, UTF-16 dalam kedua urutan, dan UTF-32 dalam keduanya dikenali.
  • Data URI bisa mendeklarasikan satu — data:text/plain;charset=windows-1251;base64,… menyebut set karakternya sendiri, dan itu dihormati — tetapi peringkatnya di bawah BOM, karena BOM ada di dalam datanya sedangkan parameter hanyalah klaim tentangnya.
  • UTF-8 yang valid nyaris sebuah bukti — UTF-8 punya cukup struktur sehingga dokumen sepanjang apa pun sangat kecil kemungkinannya valid secara kebetulan. Bila byte-nya terdekode ketat sebagai UTF-8, itulah wujudnya.
  • ASCII murni tidak membuktikan apa pun — ASCII adalah UTF-8 yang valid dan valid di setiap set satu-byte, jadi pertanyaannya tidak punya jawaban. Alat ini berkata «ambigu» alih-alih mengklaim deteksi yakin yang tidak didukung datanya.
  • Selebihnya adalah tebakan, dan diberi label demikian — muatan yang bukan UTF-8 valid berada dalam suatu pengodean satu-byte, dan byte-nya tidak bisa memberi tahu yang mana. Windows-1252 paling umum dengan selisih jauh, jadi itulah cadangannya — ditampilkan sebagai tebakan, dengan daftar lengkap sejauh satu klik.

Tiga puluh satu set karakter ditawarkan, dan daftarnya dibangun dengan menanyai peramban mana saja yang benar-benar didukungnya, bukan dengan mendaftar yang seharusnya didukung. UTF-32 adalah pengecualian: tidak ada peramban yang menerapkannya di decoder teksnya, jadi di sini ia didekode langsung — itulah sebabnya ia muncul di daftar sama sekali.

Dua string cacat yang diterima setiap decoder lain

Base64 mengemas tiga byte ke dalam empat karakter. Ketika panjang masukan bukan kelipatan tiga, kelompok akhirnya pendek — dan sebagian bit pada karakter terakhirnya tidak menjadi milik byte mana pun.

Pada kelompok akhir dua karakter, empat bit terakhir tersisa. Pada kelompok tiga, dua bit terakhir. Encoder yang patuh menulis nol di sana. Tak ada yang mewajibkan decoder untuk melihat, dan praktis tak satu pun melakukannya: QQ== dan QR== keduanya terdekode jadi satu byte 0x41, diam-diam, di setiap peramban, di setiap alat baris perintah, dan di setiap situs yang kami uji. Salah satu string itu berasal dari encoder dan yang lain rusak atau disunting manual, dan tak ada alat yang membedakannya.

Mode ketat memeriksanya. Dilaporkan sebagai galat saat mode ketat menyala dan sebagai peringatan saat mati, jadi byte-nya tetap ada untuk dilihat — intinya bukan menolak datanya, melainkan agar Anda tahu string itu tidak dibuat seperti yang diakuinya. Hal yang sama berlaku untuk muatan yang mencampur dua alfabet: - dan _ tidak pernah bentrok dengan + dan /, jadi ia terdekode tanpa ambiguitas, tetapi salah satunya salah tempat dan mungkin seseorang perlu tahu.

Apa arti tiap galat

Setiap penolakan menyebut indeks karakter, baris, dan kolom masalahnya, serta karakter apa itu. Tak satu pun dari dua fungsi Base64 milik peramban melaporkan posisi, begitu pula tak ada alat pesaing — pada muatan empat megabyte dengan satu karakter nyasar, «tidak valid» bukanlah diagnosis.

  • Bukan Base64 yang valid — karakter di luar alfabet. Dalam mode longgar ini hanya dilaporkan untuk karakter yang benar-benar asing — spasi dan pergantian baris dibuang lebih dulu. Spasi tanpa-putus, yang kerap dihasilkan saat menyalin dari halaman web terender, dihitung asing, dan posisinya memberi tahu persis di mana ia mendarat.
  • Terpotong — muatannya punya kelompok akhir satu karakter, yang tidak bisa dihasilkan masukan apa pun. Inilah satu-satunya pertanda tegas «string ini terpotong» yang dimiliki Base64.
  • Data setelah padding — ada karakter setelah tanda =. Hampir selalu dua string Base64 yang tersambung, yang akan dengan senang hati diubah decoder longgar mana pun jadi sampah yang meyakinkan.
  • Padding hilang atau tak terduga — hanya pada mode ketat. Karakter = tidak ada, terlalu banyak, atau panjangnya bukan yang dituntut panjang muatannya sendiri.
  • Spasi tidak diizinkan — hanya pada mode ketat, dan hanya di luar format berbaris. Pergantian baris di dalam MIME, PEM, dan PGP adalah bagian format tersebut dan tetap sah.
  • Alfabet salah atau tercampur — hanya pada mode ketat. Muatan memakai karakter dari alfabet yang tidak Anda pilih, atau dari keduanya.

Mendekode data yang bukan Anda buat

Base64 adalah pengodean, bukan enkripsi dan bukan batas keamanan. Ia dipakai memindahkan byte lewat kanal yang hanya menerima teks, dan byte di ujung sana adalah apa pun yang ditaruh seseorang di sana.

  • Keluaran hasil dekode adalah masukan tak tepercaya — sebuah muatan bisa terdekode jadi skrip, berkas eksekusi, atau markup yang dirancang berjalan di tempat lain. Pernah menjadi Base64 tidak membuatnya aman, dan justru karena ia datang terkodekan itulah kadang tujuannya.
  • Jangan tempel rahasia yang tak akan Anda tempel di tempat lain — halaman ini berjalan sepenuhnya di perangkat Anda dan tidak mengirim apa pun, yang bisa Anda verifikasi dengan alat jaringan peramban — tetapi kebiasaan menempel kredensial ke formulir web sebaiknya tidak dibangun, karena sebagian besar halaman yang tampak seperti ini memang mengunggah.
  • Payload JWT tidak diverifikasi — memisah token dan mendekode segmennya menunjukkan apa yang diklaimnya. Itu tidak memeriksa tanda tangannya, dan siapa pun bisa membuat token yang mengatakan apa saja. Bacalah sebagai klaim, jangan pernah sebagai fakta.
  • Checksum armor bukan tanda tangan — CRC-24 pada blok PGP menangkap kerusakan tak sengaja. Ia bukan pemeriksaan kriptografis dan tidak memberi tahu siapa yang membuat blok itu.

Berkas, kumpulan, dan batas

Base64 tidak hanya datang lewat papan klip. Ia disimpan ke berkas .txt dan .b64, ke sertifikat .pem dan blok armor .asc, dan tertanam di dokumen .json, .xml, dan .eml — semuanya bisa diletakkan ke halaman ini.

Apa yang termasuk dalam paket gratis

Hingga 25 MB Base64, satu masukan sekali jalan, dan seluruh kemampuan alat ini: ketujuh format masukan, ketiga puluh satu set karakter, mode ketat, tampilan heksadesimal dan ASCII, deteksi jenis berkas, unduhan bertipe, dan mode pemisahan. Batasnya soal skala, tidak pernah soal apakah alatnya bekerja — 25 MB Base64 kira-kira 18,75 MB data hasil dekode, muatan besar menurut ukuran normal mana pun.

Apa yang ditambahkan Pro

Hingga dua puluh masukan sekaligus, semuanya bisa diunduh sebagai satu arsip, dan batas ukuran diganti oleh apa yang benar-benar sanggup ditangani perangkat Anda, bukan sekadar angka tetap yang lebih besar. Kompresi di dalam arsip dipilih per berkas menurut ternyata muatannya apa, sehingga sekumpulan gambar hasil dekode disimpan apa adanya alih-alih dikompresi ulang sia-sia, sementara sekumpulan JSON hasil dekode tetap dikompresi.

Ketika yang Anda punya bukan Base64

Beberapa pengodean cukup mirip Base64 sehingga tertukar dengannya, dan decoder yang tetap menerimanya menghasilkan omong kosong yang meyakinkan. Bila keluarannya sampah dan set karakter bukan masalahnya, periksa apakah masukannya salah satu dari ini.

  • Pengodean persen — %20 dan %E2%9C%93 adalah pengodean URL, bukan Base64. Gunakan encoder dan decoder URL sebagai gantinya.
  • Heksadesimal — string yang hanya berisi 0–9 dan a–f, dengan panjang genap, jauh lebih mungkin heksadesimal daripada Base64 — dan heksadesimal juga Base64 yang valid, persis karena itulah kekeliruan ini menghasilkan dekode alih-alih galat.
  • Base32 — huruf besar A–Z dan 2–7, dengan padding =. Ia berbagi karakter padding dan tidak ada yang lain.
  • Sebuah hash — ringkasan MD5, SHA-1, atau SHA-256 bukan data terkodekan dan tidak bisa didekode kembali menjadi apa pun. Ia sidik jari satu arah; gunakan generator hash untuk membuatnya.
  • Teks yang sudah terdekode — kata-kata biasa tersusun dari karakter Base64, jadi kalimat yang ditempel ke decoder akan «terdekode» jadi byte. Bila hasilnya biner dan masukannya terbaca, masukannya memang tidak terkodekan.

Kapan memakai ini alih-alih encoder

Pakailah decoder saat Anda sudah punya string Base64 dan butuh isinya. Gunakan encoder untuk arah sebaliknya.

  • Memeriksa bidang Base64 pada respons API, badan webhook, atau baris log.
  • Membaca header dan payload JWT untuk melihat apa yang diklaim sebuah token.
  • Mengeluarkan gambar atau fon dari data URI yang tertanam di CSS, HTML, atau SVG.
  • Memeriksa isi sebenarnya dari sertifikat PEM atau blok armor PGP.
  • Memulihkan teks yang tersimpan sebagai Base64 di kolom basis data atau berkas .env.
  • Memastikan lewat mode ketat bahwa sebuah encoder menghasilkan keluaran yang patuh.
  • Mengubah muatan Base64 kembali menjadi berkas asli yang bisa dibuka dengan ekstensi yang benar.

Keterbatasan dan kompatibilitas

Decoder memakai jalur Base64 mana pun yang disediakan peramban Anda — peramban terbaru punya jalur bawaan, yang lebih lama jatuh ke jalur yang ada di mana-mana dan menghasilkan keluaran identik byte demi byte. Tidak ada yang perlu dikonfigurasi maupun dipasang. Set karakter berasal dari peramban, jadi daftar persisnya sedikit berbeda antar mesin; alat ini menampilkan yang benar-benar didukung milik Anda, bukan yang seharusnya.

Dekode berjalan di luar utas utama, di perangkat Anda, memakai jalur Base64 tercepat yang disediakan peramban Anda. Diukur pada mesin desktop, muatan 25 MB terdekode dalam sekitar 170 milidetik dari ujung ke ujung, termasuk mencari tahu byte-nya itu apa.

Pertanyaan yang sering diajukan

Apa itu dekode Base64 dan bagaimana alat ini bekerja?

Mendekode adalah kebalikan dari mengodekan: mengubah string Base64 yang aman-ASCII kembali menjadi byte aslinya. Tempel muatannya dan hasilnya muncul seketika di perangkat Anda, siap disalin. Byte-nya juga diperiksa untuk mengetahui apa isinya, sehingga gambar, PDF, atau arsip hasil dekode dikenali sebagaimana adanya, bukan ditampilkan sebagai dinding karakter pengganti.

Apakah data saya privat dan aman?

Ya. Dekode berlangsung sepenuhnya di perangkat Anda, string Base64 Anda tidak pernah diunggah, disimpan, atau dicatat, dan alat ini bekerja luring setelah dimuat. Tetap perlakukan Base64 asing sebagai masukan tak tepercaya: muatan hasil dekode bisa berisi skrip atau perangkat perusak.

Bagaimana jika string Base64 saya tidak valid?

Anda mendapat indeks karakter, baris, dan kolom persis dari karakter tidak valid pertama, plus karakter apa itu — bukan sekadar kata «tidak valid». Pada muatan panjang, itulah beda antara memperbaiki dan menebak. Dalam mode longgar bawaan, spasi dibuang dan padding yang hilang ditambahkan, sehingga sebagian besar kerusakan salin-tempel tetap terdekode.

Apakah mendukung Base64 aman-URL?

Ya, otomatis. String yang memakai - dan _ sebagai ganti + dan / dikenali dan didekode tanpa pengaturan apa pun, dengan atau tanpa padding. Anda juga bisa memaksa alfabetnya: memilih Standar atau Aman-URL lalu menyalakan mode ketat akan menolak muatan yang memakai alfabet lainnya, berguna saat memeriksa apakah sebuah encoder benar-benar menghasilkan yang diklaimnya.

Bisakah mendekode data URI, sertifikat PEM, atau JWT?

Bisa. Tempel semuanya. Awalan data:...;base64, dilepas dan tipe media serta set karakter yang dideklarasikannya dipakai; blok PEM atau ASCII-Armor dilepas kepala, header armor, dan baris checksum-nya, dan CRC-24 OpenPGP diverifikasi; JWT dipisah pada titik-titiknya dan tiap segmen didekode terpisah. Tidak satu pun perlu mengubah pengaturan.

Mengapa teks hasil dekode saya tampak kacau?

Hampir selalu karena byte-nya bukan teks, atau bukan dalam set karakter yang diasumsikan. Base64 sama sekali tidak membawa informasi pengodean, jadi alat mana pun yang menampilkan hasilnya sebagai teks sedang menebak. Yang ini memberi tahu set mana yang dipilihnya dan mengapa, menghitung karakter pengganti yang dihasilkan tebakan itu, dan membiarkan Anda memilih yang lain — dan jika byte-nya PNG atau ZIP, ia mengatakannya alih-alih berpura-pura itu teks.

Apakah gratis, dan bekerja di ponsel serta luring?

Ya. Semua format, semua set karakter, mode ketat, tampilan heksadesimal dan ASCII, serta unduhan bertipe semuanya gratis, di peramban modern mana pun di desktop atau ponsel. Karena seluruh pemrosesan lokal, alat ini tetap bekerja luring setelah halaman dimuat dan tidak pernah mengirim string Anda ke mana pun.

Apa kegunaan umum dekode Base64?

Memeriksa bidang Base64 dari API atau webhook, memulihkan teks yang tersimpan di basis data atau berkas .env, membaca header dan payload JWT, mengeluarkan gambar dari data URI di CSS atau HTML, memeriksa isi blok PEM, dan menelusuri muatan yang disalin dari dokumentasi.

4.8dari 5

dari 756 penilaian

Beri nilai alat ini

Ketuk bintang — hanya sebentar