diff --git a/public/assets/js/chat.js b/public/assets/js/chat.js deleted file mode 100644 index 6c789dd..0000000 --- a/public/assets/js/chat.js +++ /dev/null @@ -1,466 +0,0 @@ - - import { - relayInit, - generatePrivateKey, - getPublicKey, - getEventHash, - signEvent, - nip19, - nip04 - } from 'nostr-tools'; - - // CONFIGURATION - Only need CS team's pubkey! - const CONFIG = { - relays: [ - 'wss://relay.damus.io', - 'wss://relay.primal.net', - 'wss://nos.lol', - 'wss://relay.btcforplebs.com', - 'wss://haven.btcforplebs.com' - ], - csPubkey: '75462f4dece4fbde54a535cfa09eb0d329bda090a9c2f9ed6b5f9d1d2fb6c15b' // Replace with actual pubkey - }; - - // State - let state = { - isOpen: false, - messages: [], - inputMessage: '', - myPrivKey: null, - myPubKey: null, - relays: [], - connected: false, - sessionId: null - }; - - // Generate or retrieve session key from localStorage - function getSessionKey() { - const stored = localStorage.getItem('nostr_chat_session'); - if (stored) { - try { - const session = JSON.parse(stored); - // Reuse if less than 24 hours old - if (Date.now() - session.created < 24 * 60 * 60 * 1000) { - return session.privKey; - } - } catch (e) {} - } - - // Generate new ephemeral key - const privKey = generatePrivateKey(); - localStorage.setItem('nostr_chat_session', JSON.stringify({ - privKey, - created: Date.now() - })); - return privKey; - } - - // Initialize - async function init() { - // Get or create session key - state.myPrivKey = getSessionKey(); - state.myPubKey = getPublicKey(state.myPrivKey); - state.sessionId = state.myPubKey.substring(0, 8); - - console.log('🔑 Session Identity:', nip19.npubEncode(state.myPubKey)); - - // Connect to relays - const relayPromises = CONFIG.relays.map(async (url) => { - try { - const relay = relayInit(url); - - relay.on('connect', () => { - console.log(`✓ Connected to ${url}`); - checkConnection(); - }); - - relay.on('disconnect', () => { - console.log(`✗ Disconnected from ${url}`); - }); - - await relay.connect(); - return relay; - } catch (error) { - console.error(`Failed: ${url}:`, error); - return null; - } - }); - - state.relays = (await Promise.all(relayPromises)).filter(r => r !== null); - - if (state.relays.length === 0) { - addMessage('system', '⚠️ Failed to connect to any relays'); - return; - } - - console.log(`✓ Connected to ${state.relays.length}/${CONFIG.relays.length} relays`); - - // Subscribe to replies from CS team - subscribeToReplies(); - - // Load any previous messages from this session - loadPreviousMessages(); - - state.connected = true; - render(); - } - - function checkConnection() { - const connected = state.relays.some(r => r.status === 1); // 1 = connected - state.connected = connected; - render(); - } - - // Subscribe to DMs from CS team - function subscribeToReplies() { - const filters = [{ - kinds: [4], - '#p': [state.myPubKey], - authors: [CONFIG.csPubkey], - since: Math.floor(Date.now() / 1000) - 86400 // Last 24 hours - }]; - - console.log('🔔 Subscribing to CS team replies...'); - - state.relays.forEach(relay => { - const sub = relay.sub(filters); - - sub.on('event', (event) => { - handleIncomingMessage(event); - }); - - sub.on('eose', () => { - console.log(`✓ Subscribed: ${relay.url}`); - }); - }); - } - - // Load previous messages from localStorage - function loadPreviousMessages() { - const stored = localStorage.getItem(`nostr_chat_messages_${state.sessionId}`); - if (stored) { - try { - const messages = JSON.parse(stored); - messages.forEach(msg => state.messages.push(msg)); - render(); - } catch (e) {} - } - } - - // Save messages to localStorage - function saveMessages() { - localStorage.setItem(`nostr_chat_messages_${state.sessionId}`, JSON.stringify(state.messages)); - } - - // Handle incoming DM from CS team - async function handleIncomingMessage(event) { - try { - // Check for duplicates - if (state.messages.find(m => m.id === event.id)) { - return; - } - - console.log('📨 Received message from CS team'); - - // Decrypt - const decryptedText = await nip04.decrypt( - state.myPrivKey, - event.pubkey, - event.content - ); - - const message = { - id: event.id, - text: decryptedText, - sender: 'cs', - timestamp: new Date(event.created_at * 1000).toISOString() - }; - - addMessage('cs', decryptedText, message); - - // Notification - if (!document.hasFocus()) { - document.title = '💬 New message!'; - setTimeout(() => { - document.title = 'Nostr Support Chat'; - }, 3000); - } - } catch (error) { - console.error('Error decrypting message:', error); - } - } - - // Send message to CS team - async function sendMessage() { - if (!state.inputMessage.trim()) return; - - const messageText = state.inputMessage; - - try { - console.log('🔐 Encrypting and sending...'); - - // Encrypt - const encrypted = await nip04.encrypt( - state.myPrivKey, - CONFIG.csPubkey, - messageText - ); - - // Create event - let event = { - kind: 4, - created_at: Math.floor(Date.now() / 1000), - tags: [['p', CONFIG.csPubkey]], - content: encrypted, - pubkey: state.myPubKey - }; - - event.id = getEventHash(event); - event.sig = signEvent(event, state.myPrivKey); - - // Publish to all relays - let published = 0; - for (const relay of state.relays) { - try { - await relay.publish(event); - published++; - console.log(`✓ Published to ${relay.url}`); - } catch (err) { - console.error(`✗ Failed: ${relay.url}:`, err); - } - } - - if (published === 0) { - addMessage('system', '⚠️ Failed to send - no relay connections'); - return; - } - - console.log(`✓ Published to ${published}/${state.relays.length} relays`); - - // Add to local messages - const message = { - id: event.id, - text: messageText, - sender: 'user', - timestamp: new Date().toISOString() - }; - - addMessage('user', messageText, message); - state.inputMessage = ''; - render(); - - } catch (error) { - console.error('Error sending:', error); - addMessage('system', '⚠️ Failed to send message'); - } - } - - function addMessage(sender, text, fullMessage = null) { - const msg = fullMessage || { - id: Date.now().toString(), - text, - sender, - timestamp: new Date().toISOString() - }; - - state.messages.push(msg); - saveMessages(); - render(); - scrollToBottom(); - } - - function scrollToBottom() { - setTimeout(() => { - const container = document.getElementById('messages'); - if (container) { - container.scrollTop = container.scrollHeight; - } - }, 100); - } - - function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; - } - - function formatTime(timestamp) { - const date = new Date(timestamp); - return date.toLocaleTimeString('en-US', { - hour: 'numeric', - minute: '2-digit', - hour12: true - }); - } - -// Render function with mobile responsiveness -function render() { - const container = document.getElementById('chat-widget-root'); - - if (!container) return; - - if (!state.isOpen) { - container.innerHTML = ` -
Start a conversation
-Start a conversation
+h?l[c][f]=s+1:n.charAt(c-1)===i.charAt(f-1)?l[c][f]=l[c-1][f-1]:l[c][f]=Math.min(l[c-1][f-1]+1,Math.min(l[c][f-1]+1,l[c-1][f]+1)),l[c][f] Start a conversation h?l[c][f]=s+1:n.charAt(c-1)===i.charAt(f-1)?l[c][f]=l[c-1][f-1]:l[c][f]=Math.min(l[c-1][f-1]+1,Math.min(l[c][f-1]+1,l[c-1][f]+1)),l[c][f] Welcome, brave soul! You've stumbled upon the nostr relay section of BTCforPlebs. Here we keep the gossip, memes, and news flowing faster than a Bitcoin transaction on a sunny Tuesday. By visiting this page you automatically consent to the following: By using our relay you consent to the following: Feel free to contact us if you're confused. We may not laugh at your puns, but we will keep your keys as safe as we can. Feel free to start a chat with us if you're confused. We may not laugh at your puns, but we will keep your notes as safe as we can.{u();function Xg(r,e){var t=r.type,i=r.value,n,s;return e&&(s=e(r))!==void 0?s:t==="word"||t==="space"?i:t==="string"?(n=r.quote||"",n+i+(r.unclosed?"":n)):t==="comment"?"/*"+i+(r.unclosed?"":"*/"):t==="div"?(r.before||"")+i+(r.after||""):Array.isArray(r.nodes)?(n=Zg(r.nodes,e),t!=="function"?n:i+"("+(r.before||"")+n+(r.after||"")+(r.unclosed?"":")")):i}function Zg(r,e){var t,i;if(Array.isArray(r)){for(t="",i=r.length-1;~i;i-=1)t=Xg(r[i],e)+t;return t}return Xg(r,e)}Jg.exports=Zg});var ry=x((lq,ty)=>{u();var Cs="-".charCodeAt(0),_s="+".charCodeAt(0),Fl=".".charCodeAt(0),j2="e".charCodeAt(0),z2="E".charCodeAt(0);function U2(r){var e=r.charCodeAt(0),t;if(e===_s||e===Cs){if(t=r.charCodeAt(1),t>=48&&t<=57)return!0;var i=r.charCodeAt(2);return t===Fl&&i>=48&&i<=57}return e===Fl?(t=r.charCodeAt(1),t>=48&&t<=57):e>=48&&e<=57}ty.exports=function(r){var e=0,t=r.length,i,n,s;if(t===0||!U2(r))return!1;for(i=r.charCodeAt(e),(i===_s||i===Cs)&&e++;e{u();function Gy(r,e){var t=r.type,i=r.value,n,s;return e&&(s=e(r))!==void 0?s:t==="word"||t==="space"?i:t==="string"?(n=r.quote||"",n+i+(r.unclosed?"":n)):t==="comment"?"/*"+i+(r.unclosed?"":"*/"):t==="div"?(r.before||"")+i+(r.after||""):Array.isArray(r.nodes)?(n=Qy(r.nodes,e),t!=="function"?n:i+"("+(r.before||"")+n+(r.after||"")+(r.unclosed?"":")")):i}function Qy(r,e){var t,i;if(Array.isArray(r)){for(t="",i=r.length-1;~i;i-=1)t=Gy(r[i],e)+t;return t}return Gy(r,e)}Yy.exports=Qy});var Zy=x((o$,Xy)=>{u();var $s="-".charCodeAt(0),Ls="+".charCodeAt(0),su=".".charCodeAt(0),vO="e".charCodeAt(0),xO="E".charCodeAt(0);function kO(r){var e=r.charCodeAt(0),t;if(e===Ls||e===$s){if(t=r.charCodeAt(1),t>=48&&t<=57)return!0;var i=r.charCodeAt(2);return t===su&&i>=48&&i<=57}return e===su?(t=r.charCodeAt(1),t>=48&&t<=57):e>=48&&e<=57}Xy.exports=function(r){var e=0,t=r.length,i,n,s;if(t===0||!kO(r))return!1;for(i=r.charCodeAt(e),(i===Ls||i===$s)&&e++;e
-
-
-
-
-
-
+
+
+ COLOR OPTIONS WITH:
+
+
+
+
+
+
+
+
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+(function() {
+ 'use strict';
+
+ // Get configuration from script tag
+ const scriptTag = document.currentScript;
+ const csPubkey = scriptTag.getAttribute('data-nostr-pubkey') || 'PUBKEY_TO_RECEICE_MESSAGES';
+ const brandName = scriptTag.getAttribute('data-brand-name') || 'Support Team';
+ const primaryColor = scriptTag.getAttribute('data-color') || '#fdad01';
+ const secondaryColor = scriptTag.getAttribute('data-color-secondary') || '#ff8c00';
+
+ // Default relay configuration
+ const DEFAULT_RELAYS = [
+ 'wss://relay.damus.io',
+ 'wss://relay.primal.net',
+ 'wss://nos.lol',
+ 'wss://relay.btcforplebs.com',
+ 'wss://relay.logemedia.com'
+ ];
+
+ // Inject Tailwind CSS
+ const tailwindLink = document.createElement('link');
+ tailwindLink.href = 'https://cdn.tailwindcss.com';
+ tailwindLink.rel = 'stylesheet';
+ document.head.appendChild(tailwindLink);
+
+ // Inject custom styles
+ const style = document.createElement('style');
+ style.textContent = `
+ .safe-area-bottom {
+ padding-bottom: env(safe-area-inset-bottom);
+ }
+ #nostr-chat-widget-root > div {
+ pointer-events: auto !important;
+ z-index: 99999 !important;
+ }
+ `;
+ document.head.appendChild(style);
+
+ // Create widget container
+ const widgetRoot = document.createElement('div');
+ widgetRoot.id = 'nostr-chat-widget-root';
+ document.body.appendChild(widgetRoot);
+
+ // Import map for nostr-tools
+ const importMap = document.createElement('script');
+ importMap.type = 'importmap';
+ importMap.textContent = JSON.stringify({
+ imports: {
+ 'nostr-tools': 'https://esm.sh/nostr-tools@1.17.0'
+ }
+ });
+ document.head.appendChild(importMap);
+
+ // Main widget script
+ const widgetScript = document.createElement('script');
+ widgetScript.type = 'module';
+ widgetScript.textContent = `
+ import {
+ relayInit,
+ generatePrivateKey,
+ getPublicKey,
+ getEventHash,
+ signEvent,
+ nip19,
+ nip04
+ } from 'nostr-tools';
+
+ const CONFIG = {
+ relays: ${JSON.stringify(DEFAULT_RELAYS)},
+ csPubkey: '${csPubkey}',
+ brandName: '${brandName}',
+ primaryColor: '${primaryColor}',
+ secondaryColor: '${secondaryColor}'
+ };
+
+ let state = {
+ isOpen: false,
+ messages: [],
+ inputMessage: '',
+ myPrivKey: null,
+ myPubKey: null,
+ relays: [],
+ connected: false,
+ sessionId: null
+ };
+
+ function getSessionKey() {
+ const stored = localStorage.getItem('nostr_chat_session');
+ if (stored) {
+ try {
+ const session = JSON.parse(stored);
+ if (Date.now() - session.created < 24 * 60 * 60 * 1000) {
+ return session.privKey;
+ }
+ } catch (e) {}
+ }
+
+ const privKey = generatePrivateKey();
+ localStorage.setItem('nostr_chat_session', JSON.stringify({
+ privKey,
+ created: Date.now()
+ }));
+ return privKey;
+ }
+
+ async function init() {
+ state.myPrivKey = getSessionKey();
+ state.myPubKey = getPublicKey(state.myPrivKey);
+ state.sessionId = state.myPubKey.substring(0, 8);
+
+ console.log('🔑 Session Identity:', nip19.npubEncode(state.myPubKey));
+
+ const relayPromises = CONFIG.relays.map(async (url) => {
+ try {
+ const relay = relayInit(url);
+
+ relay.on('connect', () => {
+ console.log(\`✓ Connected to \${url}\`);
+ checkConnection();
+ });
+
+ relay.on('disconnect', () => {
+ console.log(\`✗ Disconnected from \${url}\`);
+ });
+
+ await relay.connect();
+ return relay;
+ } catch (error) {
+ console.error(\`Failed: \${url}:\`, error);
+ return null;
+ }
+ });
+
+ state.relays = (await Promise.all(relayPromises)).filter(r => r !== null);
+
+ if (state.relays.length === 0) {
+ addMessage('system', '⚠️ Failed to connect to any relays');
+ return;
+ }
+
+ console.log(\`✓ Connected to \${state.relays.length}/\${CONFIG.relays.length} relays\`);
+
+ subscribeToReplies();
+ loadPreviousMessages();
+
+ state.connected = true;
+ render();
+ }
+
+ function checkConnection() {
+ const connected = state.relays.some(r => r.status === 1);
+ state.connected = connected;
+ render();
+ }
+
+ function subscribeToReplies() {
+ const filters = [{
+ kinds: [4],
+ '#p': [state.myPubKey],
+ authors: [CONFIG.csPubkey],
+ since: Math.floor(Date.now() / 1000) - 86400
+ }];
+
+ console.log('🔔 Subscribing to replies...');
+
+ state.relays.forEach(relay => {
+ const sub = relay.sub(filters);
+
+ sub.on('event', (event) => {
+ handleIncomingMessage(event);
+ });
+
+ sub.on('eose', () => {
+ console.log(\`✓ Subscribed: \${relay.url}\`);
+ });
+ });
+ }
+
+ function loadPreviousMessages() {
+ const stored = localStorage.getItem(\`nostr_chat_messages_\${state.sessionId}\`);
+ if (stored) {
+ try {
+ const messages = JSON.parse(stored);
+ messages.forEach(msg => state.messages.push(msg));
+ render();
+ } catch (e) {}
+ }
+ }
+
+ function saveMessages() {
+ localStorage.setItem(\`nostr_chat_messages_\${state.sessionId}\`, JSON.stringify(state.messages));
+ }
+
+ async function handleIncomingMessage(event) {
+ try {
+ if (state.messages.find(m => m.id === event.id)) {
+ return;
+ }
+
+ console.log('📨 Received message');
+
+ const decryptedText = await nip04.decrypt(
+ state.myPrivKey,
+ event.pubkey,
+ event.content
+ );
+
+ const message = {
+ id: event.id,
+ text: decryptedText,
+ sender: 'cs',
+ timestamp: new Date(event.created_at * 1000).toISOString()
+ };
+
+ addMessage('cs', decryptedText, message);
+
+ if (!document.hasFocus()) {
+ const originalTitle = document.title;
+ document.title = '💬 New message!';
+ setTimeout(() => {
+ document.title = originalTitle;
+ }, 3000);
+ }
+ } catch (error) {
+ console.error('Error decrypting message:', error);
+ }
+ }
+
+ async function sendMessage() {
+ if (!state.inputMessage.trim()) return;
+
+ const messageText = state.inputMessage;
+
+ try {
+ console.log('🔐 Encrypting and sending...');
+
+ const encrypted = await nip04.encrypt(
+ state.myPrivKey,
+ CONFIG.csPubkey,
+ messageText
+ );
+
+ let event = {
+ kind: 4,
+ created_at: Math.floor(Date.now() / 1000),
+ tags: [['p', CONFIG.csPubkey]],
+ content: encrypted,
+ pubkey: state.myPubKey
+ };
+
+ event.id = getEventHash(event);
+ event.sig = signEvent(event, state.myPrivKey);
+
+ let published = 0;
+ for (const relay of state.relays) {
+ try {
+ await relay.publish(event);
+ published++;
+ console.log(\`✓ Published to \${relay.url}\`);
+ } catch (err) {
+ console.error(\`✗ Failed: \${relay.url}:\`, err);
+ }
+ }
+
+ if (published === 0) {
+ addMessage('system', '⚠️ Failed to send - no relay connections');
+ return;
+ }
+
+ console.log(\`✓ Published to \${published}/\${state.relays.length} relays\`);
+
+ const message = {
+ id: event.id,
+ text: messageText,
+ sender: 'user',
+ timestamp: new Date().toISOString()
+ };
+
+ addMessage('user', messageText, message);
+ state.inputMessage = '';
+ render();
+
+ } catch (error) {
+ console.error('Error sending:', error);
+ addMessage('system', '⚠️ Failed to send message');
+ }
+ }
+
+ function addMessage(sender, text, fullMessage = null) {
+ const msg = fullMessage || {
+ id: Date.now().toString(),
+ text,
+ sender,
+ timestamp: new Date().toISOString()
+ };
+
+ state.messages.push(msg);
+ saveMessages();
+ render();
+ scrollToBottom();
+ }
+
+ function scrollToBottom() {
+ setTimeout(() => {
+ const container = document.getElementById('nostr-messages');
+ if (container) {
+ container.scrollTop = container.scrollHeight;
+ }
+ }, 100);
+ }
+
+ function escapeHtml(text) {
+ const div = document.createElement('div');
+ div.textContent = text;
+ return div.innerHTML;
+ }
+
+ function formatTime(timestamp) {
+ const date = new Date(timestamp);
+ return date.toLocaleTimeString('en-US', {
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: true
+ });
+ }
+
+ function render() {
+ const container = document.getElementById('nostr-chat-widget-root');
+
+ if (!container) return;
+
+ if (!state.isOpen) {
+ container.innerHTML = \`
+ \${CONFIG.brandName}
+ 0&&e.nodes[t].type==="comment";)t-=1;let i=this.raw(e,"semicolon");for(let n=0;ntypeof l=="object"&&l.toJSON?l.toJSON(null,t):l);else if(typeof o=="object"&&o.toJSON)i[a]=o.toJSON(null,t);else if(a==="source"){let l=t.get(o.input);l==null&&(l=s,t.set(o.input,s),s++),i[a]={end:o.end,inputId:l,start:o.start}}else i[a]=o}return n&&(i.inputs=[...t.keys()].map(a=>a.toJSON())),i}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=Ax){e.stringify&&(e=e.stringify);let t="";return e(this,i=>{t+=i}),t}warn(e,t,i){let n={node:this};for(let s in i)n[s]=i[s];return e.warn(t,n)}get proxyOf(){return this}};mc.exports=un;un.default=un});var Qr=x((C3,gc)=>{u();"use strict";var _x=Gr(),fn=class extends _x{constructor(e){super(e);this.type="comment"}};gc.exports=fn;fn.default=fn});var Yr=x((_3,yc)=>{u();"use strict";var Ex=Gr(),cn=class extends Ex{constructor(e){e&&typeof e.value!="undefined"&&typeof e.value!="string"&&(e={...e,value:String(e.value)});super(e);this.type="decl"}get variable(){return this.prop.startsWith("--")||this.prop[0]==="$"}};yc.exports=cn;cn.default=cn});var Et=x((E3,_c)=>{u();"use strict";var bc=Qr(),wc=Yr(),Ox=Gr(),{isClean:vc,my:xc}=ln(),ha,kc,Sc,ma;function Ac(r){return r.map(e=>(e.nodes&&(e.nodes=Ac(e.nodes)),delete e.source,e))}function Cc(r){if(r[vc]=!1,r.proxyOf.nodes)for(let e of r.proxyOf.nodes)Cc(e)}var Fe=class extends Ox{append(...e){for(let t of e){let i=this.normalize(t,this.last);for(let n of i)this.proxyOf.nodes.push(n)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t=this.getIterator(),i,n;for(;this.indexes[t](n[xc]||Fe.rebuild(n),n=n.proxyOf,n.parent&&n.parent.removeChild(n),n[vc]&&Cc(n),n.raws||(n.raws={}),typeof n.raws.before=="undefined"&&t&&typeof t.raws.before!="undefined"&&(n.raws.before=t.raws.before.replace(/\S/g,"")),n.parent=this.proxyOf,n))}prepend(...e){e=e.reverse();for(let t of e){let i=this.normalize(t,this.first,"prepend").reverse();for(let n of i)this.proxyOf.nodes.unshift(n);for(let n in this.indexes)this.indexes[n]=this.indexes[n]+i.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);let t;for(let i in this.indexes)t=this.indexes[i],t>=e&&(this.indexes[i]=t-1);return this.markDirty(),this}replaceValues(e,t,i){return i||(i=t,t={}),this.walkDecls(n=>{t.props&&!t.props.includes(n.prop)||t.fast&&!n.value.includes(t.fast)||(n.value=n.value.replace(e,i))}),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each((t,i)=>{let n;try{n=e(t,i)}catch(s){throw t.addToError(s)}return n!==!1&&t.walk&&(n=t.walk(e)),n})}walkAtRules(e,t){return t?e instanceof RegExp?this.walk((i,n)=>{if(i.type==="atrule"&&e.test(i.name))return t(i,n)}):this.walk((i,n)=>{if(i.type==="atrule"&&i.name===e)return t(i,n)}):(t=e,this.walk((i,n)=>{if(i.type==="atrule")return t(i,n)}))}walkComments(e){return this.walk((t,i)=>{if(t.type==="comment")return e(t,i)})}walkDecls(e,t){return t?e instanceof RegExp?this.walk((i,n)=>{if(i.type==="decl"&&e.test(i.prop))return t(i,n)}):this.walk((i,n)=>{if(i.type==="decl"&&i.prop===e)return t(i,n)}):(t=e,this.walk((i,n)=>{if(i.type==="decl")return t(i,n)}))}walkRules(e,t){return t?e instanceof RegExp?this.walk((i,n)=>{if(i.type==="rule"&&e.test(i.selector))return t(i,n)}):this.walk((i,n)=>{if(i.type==="rule"&&i.selector===e)return t(i,n)}):(t=e,this.walk((i,n)=>{if(i.type==="rule")return t(i,n)}))}get first(){if(!!this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(!!this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}};Fe.registerParse=r=>{kc=r};Fe.registerRule=r=>{ma=r};Fe.registerAtRule=r=>{ha=r};Fe.registerRoot=r=>{Sc=r};_c.exports=Fe;Fe.default=Fe;Fe.rebuild=r=>{r.type==="atrule"?Object.setPrototypeOf(r,ha.prototype):r.type==="rule"?Object.setPrototypeOf(r,ma.prototype):r.type==="decl"?Object.setPrototypeOf(r,wc.prototype):r.type==="comment"?Object.setPrototypeOf(r,bc.prototype):r.type==="root"&&Object.setPrototypeOf(r,Sc.prototype),r[xc]=!0,r.nodes&&r.nodes.forEach(e=>{Fe.rebuild(e)})}});var pn=x((O3,Oc)=>{u();"use strict";var Ec=Et(),Kr=class extends Ec{constructor(e){super(e);this.type="atrule"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}};Oc.exports=Kr;Kr.default=Kr;Ec.registerAtRule(Kr)});var dn=x((T3,Pc)=>{u();"use strict";var Tx=Et(),Tc,Rc,er=class extends Tx{constructor(e){super({type:"document",...e});this.nodes||(this.nodes=[])}toResult(e={}){return new Tc(new Rc,this,e).stringify()}};er.registerLazyResult=r=>{Tc=r};er.registerProcessor=r=>{Rc=r};Pc.exports=er;er.default=er});var Dc=x((R3,Ic)=>{u();var Rx="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",Px=(r,e=21)=>(t=e)=>{let i="",n=t;for(;n--;)i+=r[Math.random()*r.length|0];return i},Ix=(r=21)=>{let e="",t=r;for(;t--;)e+=Rx[Math.random()*64|0];return e};Ic.exports={nanoid:Ix,customAlphabet:Px}});var qc=x(()=>{u()});var ga=x((D3,$c)=>{u();$c.exports={}});var mn=x((q3,Bc)=>{u();"use strict";var{nanoid:Dx}=Dc(),{isAbsolute:ya,resolve:ba}=(et(),Ur),{SourceMapConsumer:qx,SourceMapGenerator:$x}=qc(),{fileURLToPath:Lc,pathToFileURL:hn}=(la(),lc),Mc=an(),Lx=ga(),wa=ua(),va=Symbol("fromOffsetCache"),Mx=Boolean(qx&&$x),Nc=Boolean(ba&&ya),Xr=class{constructor(e,t={}){if(e===null||typeof e=="undefined"||typeof e=="object"&&!e.toString)throw new Error(`PostCSS received ${e} instead of CSS string`);if(this.css=e.toString(),this.css[0]==="\uFEFF"||this.css[0]==="\uFFFE"?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!Nc||/^\w+:\/\//.test(t.from)||ya(t.from)?this.file=t.from:this.file=ba(t.from)),Nc&&Mx){let i=new Lx(this.css,t);if(i.text){this.map=i;let n=i.consumer().file;!this.file&&n&&(this.file=this.mapResolve(n))}}this.file||(this.id=""),this.map&&(this.map.file=this.from)}error(e,t,i,n={}){let s,a,o;if(t&&typeof t=="object"){let c=t,f=i;if(typeof c.offset=="number"){let d=this.fromOffset(c.offset);t=d.line,i=d.col}else t=c.line,i=c.column;if(typeof f.offset=="number"){let d=this.fromOffset(f.offset);a=d.line,s=d.col}else a=f.line,s=f.column}else if(!i){let c=this.fromOffset(t);t=c.line,i=c.col}let l=this.origin(t,i,a,s);return l?o=new Mc(e,l.endLine===void 0?l.line:{column:l.column,line:l.line},l.endLine===void 0?l.column:{column:l.endColumn,line:l.endLine},l.source,l.file,n.plugin):o=new Mc(e,a===void 0?t:{column:i,line:t},a===void 0?i:{column:s,line:a},this.css,this.file,n.plugin),o.input={column:i,endColumn:s,endLine:a,line:t,source:this.css},this.file&&(hn&&(o.input.url=hn(this.file).toString()),o.input.file=this.file),o}fromOffset(e){let t,i;if(this[va])i=this[va];else{let s=this.css.split(`
+`);i=new Array(s.length);let a=0;for(let o=0,l=s.length;o>1),e=i[a+1])n=a+1;else{n=a;break}}return{col:e-i[n]+1,line:n+1}}mapResolve(e){return/^\w+:\/\//.test(e)?e:ba(this.map.consumer().sourceRoot||this.map.root||".",e)}origin(e,t,i,n){if(!this.map)return!1;let s=this.map.consumer(),a=s.originalPositionFor({column:t,line:e});if(!a.source)return!1;let o;typeof i=="number"&&(o=s.originalPositionFor({column:n,line:i}));let l;ya(a.source)?l=hn(a.source):l=new URL(a.source,this.map.consumer().sourceRoot||hn(this.map.mapFile));let c={column:a.column,endColumn:o&&o.column,endLine:o&&o.line,line:a.line,url:l.toString()};if(l.protocol==="file:")if(Lc)c.file=Lc(l);else throw new Error("file: protocol is not available in this PostCSS build");let f=s.sourceContentFor(a.source);return f&&(c.source=f),c}toJSON(){let e={};for(let t of["hasBOM","css","file","id"])this[t]!=null&&(e[t]=this[t]);return this.map&&(e.map={...this.map},e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}};Bc.exports=Xr;Xr.default=Xr;wa&&wa.registerInput&&wa.registerInput(Xr)});var tr=x(($3,Uc)=>{u();"use strict";var Fc=Et(),jc,zc,Ut=class extends Fc{constructor(e){super(e);this.type="root",this.nodes||(this.nodes=[])}normalize(e,t,i){let n=super.normalize(e);if(t){if(i==="prepend")this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let s of n)s.raws.before=t.raws.before}return n}removeChild(e,t){let i=this.index(e);return!t&&i===0&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[i].raws.before),super.removeChild(e)}toResult(e={}){return new jc(new zc,this,e).stringify()}};Ut.registerLazyResult=r=>{jc=r};Ut.registerProcessor=r=>{zc=r};Uc.exports=Ut;Ut.default=Ut;Fc.registerRoot(Ut)});var xa=x((L3,Vc)=>{u();"use strict";var Zr={comma(r){return Zr.split(r,[","],!0)},space(r){let e=[" ",`
+`," "];return Zr.split(r,e)},split(r,e,t){let i=[],n="",s=!1,a=0,o=!1,l="",c=!1;for(let f of r)c?c=!1:f==="\\"?c=!0:o?f===l&&(o=!1):f==='"'||f==="'"?(o=!0,l=f):f==="("?a+=1:f===")"?a>0&&(a-=1):a===0&&e.includes(f)&&(s=!0),s?(n!==""&&i.push(n.trim()),n="",s=!1):n+=f;return(t||n!=="")&&i.push(n.trim()),i}};Vc.exports=Zr;Zr.default=Zr});var gn=x((M3,Wc)=>{u();"use strict";var Hc=Et(),Nx=xa(),Jr=class extends Hc{constructor(e){super(e);this.type="rule",this.nodes||(this.nodes=[])}get selectors(){return Nx.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\s*/):null,i=t?t[0]:","+this.raw("between","beforeOpen");this.selector=e.join(i)}};Wc.exports=Jr;Jr.default=Jr;Hc.registerRule(Jr)});var Qc=x((N3,Gc)=>{u();"use strict";var Bx=pn(),Fx=Qr(),jx=Yr(),zx=mn(),Ux=ga(),Vx=tr(),Hx=gn();function ei(r,e){if(Array.isArray(r))return r.map(n=>ei(n));let{inputs:t,...i}=r;if(t){e=[];for(let n of t){let s={...n,__proto__:zx.prototype};s.map&&(s.map={...s.map,__proto__:Ux.prototype}),e.push(s)}}if(i.nodes&&(i.nodes=r.nodes.map(n=>ei(n,e))),i.source){let{inputId:n,...s}=i.source;i.source=s,n!=null&&(i.source.input=e[n])}if(i.type==="root")return new Vx(i);if(i.type==="decl")return new jx(i);if(i.type==="rule")return new Hx(i);if(i.type==="comment")return new Fx(i);if(i.type==="atrule")return new Bx(i);throw new Error("Unknown node type: "+r.type)}Gc.exports=ei;ei.default=ei});var ka=x((B3,Yc)=>{u();Yc.exports=function(r,e){return{generate:()=>{let t="";return r(e,i=>{t+=i}),[t]}}}});var ep=x((F3,Jc)=>{u();"use strict";var Sa="'".charCodeAt(0),Kc='"'.charCodeAt(0),yn="\\".charCodeAt(0),Xc="/".charCodeAt(0),bn=`
+`.charCodeAt(0),ti=" ".charCodeAt(0),wn="\f".charCodeAt(0),vn=" ".charCodeAt(0),xn="\r".charCodeAt(0),Wx="[".charCodeAt(0),Gx="]".charCodeAt(0),Qx="(".charCodeAt(0),Yx=")".charCodeAt(0),Kx="{".charCodeAt(0),Xx="}".charCodeAt(0),Zx=";".charCodeAt(0),Jx="*".charCodeAt(0),e1=":".charCodeAt(0),t1="@".charCodeAt(0),kn=/[\t\n\f\r "#'()/;[\\\]{}]/g,Sn=/[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g,r1=/.[\r\n"'(/\\]/,Zc=/[\da-f]/i;Jc.exports=function(e,t={}){let i=e.css.valueOf(),n=t.ignoreErrors,s,a,o,l,c,f,d,p,h,b,v=i.length,y=0,w=[],k=[];function S(){return y}function E(R){throw e.error("Unclosed "+R,y)}function T(){return k.length===0&&y>=v}function B(R){if(k.length)return k.pop();if(y>=v)return;let F=R?R.ignoreUnclosed:!1;switch(s=i.charCodeAt(y),s){case bn:case ti:case vn:case xn:case wn:{l=y;do l+=1,s=i.charCodeAt(l);while(s===ti||s===bn||s===vn||s===xn||s===wn);f=["space",i.slice(y,l)],y=l-1;break}case Wx:case Gx:case Kx:case Xx:case e1:case Zx:case Yx:{let Y=String.fromCharCode(s);f=[Y,Y,y];break}case Qx:{if(b=w.length?w.pop()[1]:"",h=i.charCodeAt(y+1),b==="url"&&h!==Sa&&h!==Kc&&h!==ti&&h!==bn&&h!==vn&&h!==wn&&h!==xn){l=y;do{if(d=!1,l=i.indexOf(")",l+1),l===-1)if(n||F){l=y;break}else E("bracket");for(p=l;i.charCodeAt(p-1)===yn;)p-=1,d=!d}while(d);f=["brackets",i.slice(y,l+1),y,l],y=l}else l=i.indexOf(")",y+1),a=i.slice(y,l+1),l===-1||r1.test(a)?f=["(","(",y]:(f=["brackets",a,y,l],y=l);break}case Sa:case Kc:{c=s===Sa?"'":'"',l=y;do{if(d=!1,l=i.indexOf(c,l+1),l===-1)if(n||F){l=y+1;break}else E("string");for(p=l;i.charCodeAt(p-1)===yn;)p-=1,d=!d}while(d);f=["string",i.slice(y,l+1),y,l],y=l;break}case t1:{kn.lastIndex=y+1,kn.test(i),kn.lastIndex===0?l=i.length-1:l=kn.lastIndex-2,f=["at-word",i.slice(y,l+1),y,l],y=l;break}case yn:{for(l=y,o=!0;i.charCodeAt(l+1)===yn;)l+=1,o=!o;if(s=i.charCodeAt(l+1),o&&s!==Xc&&s!==ti&&s!==bn&&s!==vn&&s!==xn&&s!==wn&&(l+=1,Zc.test(i.charAt(l)))){for(;Zc.test(i.charAt(l+1));)l+=1;i.charCodeAt(l+1)===ti&&(l+=1)}f=["word",i.slice(y,l+1),y,l],y=l;break}default:{s===Xc&&i.charCodeAt(y+1)===Jx?(l=i.indexOf("*/",y+2)+1,l===0&&(n||F?l=i.length:E("comment")),f=["comment",i.slice(y,l+1),y,l],y=l):(Sn.lastIndex=y+1,Sn.test(i),Sn.lastIndex===0?l=i.length-1:l=Sn.lastIndex-2,f=["word",i.slice(y,l+1),y,l],w.push(f),y=l);break}}return y++,f}function N(R){k.push(R)}return{back:N,endOfFile:T,nextToken:B,position:S}}});var sp=x((j3,np)=>{u();"use strict";var i1=pn(),n1=Qr(),s1=Yr(),a1=tr(),tp=gn(),o1=ep(),rp={empty:!0,space:!0};function l1(r){for(let e=r.length-1;e>=0;e--){let t=r[e],i=t[3]||t[2];if(i)return i}}var ip=class{constructor(e){this.input=e,this.root=new a1,this.current=this.root,this.spaces="",this.semicolon=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t=new i1;t.name=e[1].slice(1),t.name===""&&this.unnamedAtrule(t,e),this.init(t,e[2]);let i,n,s,a=!1,o=!1,l=[],c=[];for(;!this.tokenizer.endOfFile();){if(e=this.tokenizer.nextToken(),i=e[0],i==="("||i==="["?c.push(i==="("?")":"]"):i==="{"&&c.length>0?c.push("}"):i===c[c.length-1]&&c.pop(),c.length===0)if(i===";"){t.source.end=this.getPosition(e[2]),t.source.end.offset++,this.semicolon=!0;break}else if(i==="{"){o=!0;break}else if(i==="}"){if(l.length>0){for(s=l.length-1,n=l[s];n&&n[0]==="space";)n=l[--s];n&&(t.source.end=this.getPosition(n[3]||n[2]),t.source.end.offset++)}this.end(e);break}else l.push(e);else l.push(e);if(this.tokenizer.endOfFile()){a=!0;break}}t.raws.between=this.spacesAndCommentsFromEnd(l),l.length?(t.raws.afterName=this.spacesAndCommentsFromStart(l),this.raw(t,"params",l),a&&(e=l[l.length-1],t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++,this.spaces=t.raws.between,t.raws.between="")):(t.raws.afterName="",t.params=""),o&&(t.nodes=[],this.current=t)}checkMissedSemicolon(e){let t=this.colon(e);if(t===!1)return;let i=0,n;for(let s=t-1;s>=0&&(n=e[s],!(n[0]!=="space"&&(i+=1,i===2)));s--);throw this.input.error("Missed semicolon",n[0]==="word"?n[3]+1:n[2])}colon(e){let t=0,i,n,s;for(let[a,o]of e.entries()){if(n=o,s=n[0],s==="("&&(t+=1),s===")"&&(t-=1),t===0&&s===":")if(!i)this.doubleColon(n);else{if(i[0]==="word"&&i[1]==="progid")continue;return a}i=n}return!1}comment(e){let t=new n1;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let i=e[1].slice(2,-2);if(/^\s*$/.test(i))t.text="",t.raws.left=i,t.raws.right="";else{let n=i.match(/^(\s*)([^]*\S)(\s*)$/);t.text=n[2],t.raws.left=n[1],t.raws.right=n[3]}}createTokenizer(){this.tokenizer=o1(this.input)}decl(e,t){let i=new s1;this.init(i,e[0][2]);let n=e[e.length-1];for(n[0]===";"&&(this.semicolon=!0,e.pop()),i.source.end=this.getPosition(n[3]||n[2]||l1(e)),i.source.end.offset++;e[0][0]!=="word";)e.length===1&&this.unknownWord(e),i.raws.before+=e.shift()[1];for(i.source.start=this.getPosition(e[0][2]),i.prop="";e.length;){let c=e[0][0];if(c===":"||c==="space"||c==="comment")break;i.prop+=e.shift()[1]}i.raws.between="";let s;for(;e.length;)if(s=e.shift(),s[0]===":"){i.raws.between+=s[1];break}else s[0]==="word"&&/\w/.test(s[1])&&this.unknownWord([s]),i.raws.between+=s[1];(i.prop[0]==="_"||i.prop[0]==="*")&&(i.raws.before+=i.prop[0],i.prop=i.prop.slice(1));let a=[],o;for(;e.length&&(o=e[0][0],!(o!=="space"&&o!=="comment"));)a.push(e.shift());this.precheckMissedSemicolon(e);for(let c=e.length-1;c>=0;c--){if(s=e[c],s[1].toLowerCase()==="!important"){i.important=!0;let f=this.stringFrom(e,c);f=this.spacesFromEnd(e)+f,f!==" !important"&&(i.raws.important=f);break}else if(s[1].toLowerCase()==="important"){let f=e.slice(0),d="";for(let p=c;p>0;p--){let h=f[p][0];if(d.trim().startsWith("!")&&h!=="space")break;d=f.pop()[1]+d}d.trim().startsWith("!")&&(i.important=!0,i.raws.important=d,e=f)}if(s[0]!=="space"&&s[0]!=="comment")break}e.some(c=>c[0]!=="space"&&c[0]!=="comment")&&(i.raws.between+=a.map(c=>c[1]).join(""),a=[]),this.raw(i,"value",a.concat(e),t),i.value.includes(":")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error("Double colon",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new tp;this.init(t,e[2]),t.selector="",t.raws.between="",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.spaces="",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let t=this.current.nodes[this.current.nodes.length-1];t&&t.type==="rule"&&!t.raws.ownSemicolon&&(t.raws.ownSemicolon=this.spaces,this.spaces="")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces="",e.type!=="comment"&&(this.semicolon=!1)}other(e){let t=!1,i=null,n=!1,s=null,a=[],o=e[1].startsWith("--"),l=[],c=e;for(;c;){if(i=c[0],l.push(c),i==="("||i==="[")s||(s=c),a.push(i==="("?")":"]");else if(o&&n&&i==="{")s||(s=c),a.push("}");else if(a.length===0)if(i===";")if(n){this.decl(l,o);return}else break;else if(i==="{"){this.rule(l);return}else if(i==="}"){this.tokenizer.back(l.pop()),t=!0;break}else i===":"&&(n=!0);else i===a[a.length-1]&&(a.pop(),a.length===0&&(s=null));c=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),a.length>0&&this.unclosedBracket(s),t&&n){if(!o)for(;l.length&&(c=l[l.length-1][0],!(c!=="space"&&c!=="comment"));)this.tokenizer.back(l.pop());this.decl(l,o)}else this.unknownWord(l)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case"space":this.spaces+=e[1];break;case";":this.freeSemicolon(e);break;case"}":this.end(e);break;case"comment":this.comment(e);break;case"at-word":this.atrule(e);break;case"{":this.emptyRule(e);break;default:this.other(e);break}this.endFile()}precheckMissedSemicolon(){}raw(e,t,i,n){let s,a,o=i.length,l="",c=!0,f,d;for(let p=0;p{u();function Xg(r,e){var t=r.type,i=r.value,n,s;return e&&(s=e(r))!==void 0?s:t==="word"||t==="space"?i:t==="string"?(n=r.quote||"",n+i+(r.unclosed?"":n)):t==="comment"?"/*"+i+(r.unclosed?"":"*/"):t==="div"?(r.before||"")+i+(r.after||""):Array.isArray(r.nodes)?(n=Zg(r.nodes,e),t!=="function"?n:i+"("+(r.before||"")+n+(r.after||"")+(r.unclosed?"":")")):i}function Zg(r,e){var t,i;if(Array.isArray(r)){for(t="",i=r.length-1;~i;i-=1)t=Xg(r[i],e)+t;return t}return Xg(r,e)}Jg.exports=Zg});var ry=x((lq,ty)=>{u();var Cs="-".charCodeAt(0),_s="+".charCodeAt(0),Fl=".".charCodeAt(0),j2="e".charCodeAt(0),z2="E".charCodeAt(0);function U2(r){var e=r.charCodeAt(0),t;if(e===_s||e===Cs){if(t=r.charCodeAt(1),t>=48&&t<=57)return!0;var i=r.charCodeAt(2);return t===Fl&&i>=48&&i<=57}return e===Fl?(t=r.charCodeAt(1),t>=48&&t<=57):e>=48&&e<=57}ty.exports=function(r){var e=0,t=r.length,i,n,s;if(t===0||!U2(r))return!1;for(i=r.charCodeAt(e),(i===_s||i===Cs)&&e++;e{u();function Gy(r,e){var t=r.type,i=r.value,n,s;return e&&(s=e(r))!==void 0?s:t==="word"||t==="space"?i:t==="string"?(n=r.quote||"",n+i+(r.unclosed?"":n)):t==="comment"?"/*"+i+(r.unclosed?"":"*/"):t==="div"?(r.before||"")+i+(r.after||""):Array.isArray(r.nodes)?(n=Qy(r.nodes,e),t!=="function"?n:i+"("+(r.before||"")+n+(r.after||"")+(r.unclosed?"":")")):i}function Qy(r,e){var t,i;if(Array.isArray(r)){for(t="",i=r.length-1;~i;i-=1)t=Gy(r[i],e)+t;return t}return Gy(r,e)}Yy.exports=Qy});var Zy=x((o$,Xy)=>{u();var $s="-".charCodeAt(0),Ls="+".charCodeAt(0),su=".".charCodeAt(0),vO="e".charCodeAt(0),xO="E".charCodeAt(0);function kO(r){var e=r.charCodeAt(0),t;if(e===Ls||e===$s){if(t=r.charCodeAt(1),t>=48&&t<=57)return!0;var i=r.charCodeAt(2);return t===su&&i>=48&&i<=57}return e===su?(t=r.charCodeAt(1),t>=48&&t<=57):e>=48&&e<=57}Xy.exports=function(r){var e=0,t=r.length,i,n,s;if(t===0||!kO(r))return!1;for(i=r.charCodeAt(e),(i===Ls||i===$s)&&e++;eQuick Links
-
Join the party! Enter this as a relay to all your favorite nostr clients.
A client that has it all! Like a swiss army knife for nostr; Nostrudel is a client that you can use for everything TOS? Because We're Kind of Legit
-
- Stay Updated
-
+
+
+
+
+
+
+
+