Snippets Collections
// router의 동작을 컨트롤 하기 위한 code injection.
// 아래의 함수를 WebView 컴포넌트의
// injectedJavaScript, injectedJavaScriptBeforeContentLoaded
// props에 넘겨주어야 합니다.

const injectedJavaScript = `
  (function() {
    const overrideRouterPush = function() {
      window.isNativeApp = true;
      
      const originalPush = window.next.router.push;
      
      window.next.router.push = function(url, as, options) {
        const shouldInterceptPush = ['/buy', '/artwork'].some(pattern => 
          url?.includes(pattern)
        );

        if (shouldInterceptPush) {
          window.ReactNativeWebView.postMessage(
            JSON.stringify({
              event: 'routerPush',
              data: {
                url: url,
              },
            })
          );
          return;
        }

        originalPush.call(this, url, as, options);
      };
    };

    window.onload = overrideRouterPush;
  })();
`;
const fullReload = queryParams.fullReload === 'true';

if (fullReload) {
  // fullReload가 true인 경우: 전체 페이지 리로드 
  window.location.href = path; 
} else {
  // 그 외의 경우: router.push 사용 
  router.push(path);
};
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":mirror_ball: :dancing:Don't Stop Believin'..... Our Retro Rewind End of Year Celebration is almost here!:dancing: :mirror_ball:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":music: Sweet dreams are made of this, Melbourne :music: We're just *one* sleep until we step back in time for our End of Year Celebration at Greenfields, Albert Park.\n\n*Tomorrow*, we're firing up the time machine to celebrate 2025 in true throwback style! \n\n*Here’s what you need to know:*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:admission_tickets: Access to the event:*\nFor seamless entry, please have your *e-ticket* (sent via email) ready on your phone! \n\nThe unique QR code will be scanned at the entrance. \n\n:bulb:*Tip:* Ensure your screen is bright for a fast check-in."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":connect: *Chill out and connection zones:* Whether you're up for dancing all night or prefer a quieter area to catch up with friends, we've planned a few different spaces so you can enjoy the event your way."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":disco_dance:*Dressing up:*\nSmart casual is the vibe, but please no Xero tees or lanyards.  If you’re feeling inspired, why not bring a decade to life? Think *disco 70s*, *neon 80s*, *grungy 90s*, or *sparkling 00s!* Every little retro touch adds to the fun.(Totally optional, of course!) :sparkles:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":vape: *Smoking/Vaping:*\n[Insert local smoking/vaping info here — e.g., “A designated area will be available outside near the main entrance.”]"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":fireworks-star: *What’s in store?*\nEach location is bringing Retro Rewind to life in its own unique way. Expect great tunes, delicious food & drinks, and a few surprises along the way!\n Not only do we have a DJ but a live band to get our Melbourne Xeros Booging on *DOWN*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "We are so excited to rewind, connect, and celebrate with you! :partying_face:\n\nIf you’ve got any questions, check out the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|FAQs> or post in the Slack channel.\n\nLove,\n\nWX :party-wx:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xeros-connect: Boost Days - What's on this week! :xeros-connect:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Morning Ahuriri :wave: *It's Xero Connect Week*:xeros-connect: \n let's get ready to dive into another week with our Xeros Connect Boost Day programme! See below for what's in store :eyes:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-19: Wednesday, 19th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: *Café Partnership*: Enjoy coffee and café-style beverages from our cafe partner, *Adoro*, located in our office building *8:00AM - 11:30AM*.\n:breakfast: *Breakfast*: Provided by *Roam* from *9:30AM-10:30AM* in the Kitchen.\n :gah-update: *Nobvember Global All Hands:* Streaming in Clearview from *11AM -12PM*."
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-20: Thursday, 20th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: *Café Partnership*: Enjoy coffee and café-style beverages from our cafe partner, *Adoro*, located in our office building *8:00AM - 11:30AM*.\n:wrap: *Lunch*: Provided by *Design Cuisine* from *12:30PM-1:30PM* in the Kitchen.\n :xero-hackathon: *Hackathon Social:* Join your fellow Xeros from *4pm-5:30pm* in Clearview for refreshments and beverages, celebrating our *Hackathon winners*."
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*What else?* \n :feedback: Feedback on our Boost offerings? We want to hear it. Let us know what you love by filling our our form <https://docs.google.com/forms/d/e/1FAIpQLScGOSeS5zUI8WXEl0K4WGoQUkmpIHzAjLlEKWBob4sMPhDXmA/viewform|here>.\n\n Stay tuned to this channel for more details, check out the <https://calendar.google.com/calendar/u/0?cid=eGVyby5jb21fbXRhc2ZucThjaTl1b3BpY284dXN0OWlhdDRAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ|*Hawkes Bay Social Calendar*>, and get ready to Boost your workdays!\n\nWX Team :party-wx:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":sunshine: :x-connect: Boost Days: What's on this week :x-connect: :sunshine:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Good morning Melbourne and hope you all had a fab weekend! :sunshine: \n\n Please see below for what's on this week! :yay: "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-19: Wednesday, 19th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: :muffin: *Xero Café* – Banana Muffins, cookies & Vanilla Crown Danishes.\n :coffee: *Barista Special* –  \n\n :hands: The Australian All Hands at 9.00am in the Wominjeka Breakout Space on Level 3. :Lunch::flag-us: Join us at *12.00pm* for *An American Themed Lunch* in the Wominjeka Breakout Space on Level 3."
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-20: Thursday, 20th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Cafe*: Banana Muffins, cookies & Vanilla Crown Danishes.\n :coffee: *Barista Special* –Iced Matcha Latte \n :Breakfast: Join us at *8.30am -10.30am* for a *Breakfast Buffet* in the Wominjeka Breakout Space on Level 3 . "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " What else? :heart: \n\n:disco::discodancer: As 2025 comes to a close, get ready to rewind, connect, and celebrate with a blast through the decades at our *End of Year Event*! Register for the End of Year Celebration.\n\nPlease click <https://xero-wx.jomablue.com/reg/store/eoy_mel_2025|*HERE*>! Make sure you RSVP by *Thursday, 27 November.*"
			}
		}
	]
}
Simple 'Jarvis' voice assistant starter.

Features:
- Wake word ("jarvis")
- Speech recognition (microphone -> text)
- Text-to-speech replies
- Commands: time, date, wikipedia summary, open website, google search, play youtube (if pywhatkit installed),
  take a quick note, tell a joke, and simple system commands (commented / require permission).
- Expand by adding custom command handlers in `handle_command`.
"""

import speech_recognition as sr
import pyttsx3
import datetime
import webbrowser
import wikipedia
import os
import sys

# Optional imports (wrapped so code still runs if they're missing)
try:
    import pyjokes
except Exception:
    pyjokes = None

try:
    import pywhatkit
except Exception:
    pywhatkit = None

WAKE_WORD = "jarvis"  # you can change this

# initialize TTS
tts = pyttsx3.init()
voices = tts.getProperty("voices")
# choose voice (0 or 1 usually)
if len(voices) > 0:
    tts.setProperty("voice", voices[0].id)
tts.setProperty("rate", 170)


def speak(text: str):
    """Speak the provided text and print it."""
    print("Jarvis:", text)
    tts.say(text)
    tts.runAndWait()


# initialize recognizer
recognizer = sr.Recognizer()
recognizer.energy_threshold = 400  # may need tuning
recognizer.pause_threshold = 0.6


def listen(timeout=None, phrase_time_limit=8):
    """Listen from microphone and return recognized text, or None."""
    with sr.Microphone() as mic:
        print("Listening...")
        try:
            audio = recognizer.listen(mic, timeout=timeout, phrase_time_limit=phrase_time_limit)
            text = recognizer.recognize_google(audio)
            print("You:", text)
            return text.lower()
        except sr.WaitTimeoutError:
            return None
        except sr.UnknownValueError:
            return None
        except sr.RequestError:
            speak("Sorry, I couldn't reach the speech recognition service.")
            return None


def get_time():
    now = datetime.datetime.now()
    return now.strftime("%I:%M %p")


def get_date():
    now = datetime.datetime.now()
    return now.strftime("%A, %B %d, %Y")


# simple note-taking (appends to a file)
NOTES_FILE = "jarvis_notes.txt"


def save_note(text):
    with open(NOTES_FILE, "a", encoding="utf-8") as f:
        f.write(f"{datetime.datetime.now().isoformat()} - {text}\n")
    speak("I've saved that note.")


def handle_command(command: str):
    """Parse and handle a recognized command (without the wake word)."""
    if command is None:
        return

    # small normalization
    cmd = command.strip().lower()

    # Greetings
    if any(p in cmd for p in ("hello", "hi", "hey")):
        speak("Hello. How can I help you?")

    # Time & Date
    elif "time" in cmd:
        speak(f"The time is {get_time()}.")
    elif "date" in cmd or "day" in cmd:
        speak(f"Today is {get_date()}.")

    # Wikipedia quick summary: "wikipedia <topic>" or "tell me about <topic>"
    elif cmd.startswith("wikipedia ") or cmd.startswith("tell me about "):
        # extract topic
        topic = cmd.replace("wikipedia ", "").replace("tell me about ", "").strip()
        if topic:
            speak(f"Searching Wikipedia for {topic}")
            try:
                summary = wikipedia.summary(topic, sentences=2, auto_suggest=True, redirect=True)
                speak(summary)
            except Exception as e:
                speak("Sorry, I couldn't find anything on Wikipedia for that topic.")
        else:
            speak("What should I search on Wikipedia?")

    # Open website / search
    elif cmd.startswith("open "):
        site = cmd.replace("open ", "").strip()
        if not site.startswith("http"):
            # allow simple domain names or "youtube" -> open youtube
            if "." not in site:
                site = "https://www." + site + ".com"
            else:
                site = "https://" + site
        speak(f"Opening {site}")
        webbrowser.open(site)

    elif "search for" in cmd or cmd.startswith("google "):
        # google <query> or search for <query>
        q = cmd.replace("search for", "").replace("google", "").strip()
        if q:
            url = "https://www.google.com/search?q=" + webbrowser.quote(q)
            speak(f"Searching Google for {q}")
            webbrowser.open(url)
        else:
            speak("What would you like me to search for?")

    # Play YouTube (pywhatkit)
    elif "play" in cmd and "youtube" in cmd or cmd.startswith("play "):
        # attempt to extract title after "play"
        q = cmd.replace("play", "").replace("on youtube", "").replace("youtube", "").strip()
        if q:
            if pywhatkit:
                speak(f"Playing {q} on YouTube")
                pywhatkit.playonyt(q)
            else:
                speak("pywhatkit is not installed. I'll open YouTube search instead.")
                webbrowser.open("https://www.youtube.com/results?search_query=" + webbrowser.quote(q))
        else:
            speak("What do you want me to play?")

    # Jokes
    elif "joke" in cmd:
        if pyjokes:
            speak(pyjokes.get_joke())
        else:
            speak("I don't have jokes installed, but here's one: Why did the programmer quit his job? Because he didn't get arrays.")

    # Note saving: "remember" or "note"
    elif cmd.startswith("remember ") or cmd.startswith("note "):
        note_text = cmd.replace("remember ", "").replace("note ", "").strip()
        if note_text:
            save_note(note_text)
        else:
            speak("What would you like me to remember?")

    # Read notes
    elif "read my notes" in cmd or "read notes" in cmd:
        if os.path.exists(NOTES_FILE):
            with open(NOTES_FILE, "r", encoding="utf-8") as f:
                notes = f.read().strip()
            if notes:
                speak("Here are your notes.")
                print(notes)
                speak("I have printed them to the console as well.")
            else:
                speak("You have no notes.")
        else:
            speak("You have no notes yet.")

    # Basic exit
    elif any(p in cmd for p in ("exit", "quit", "goodbye", "shutdown jarvis")):
        speak("Goodbye.")
        sys.exit(0)

    # Fallback
    else:
        # if nothing matched, suggest searching the web
        speak("I didn't quite catch a specific command. Would you like me to search the web for that?")
        # naive behavior: open google search
        webbrowser.open("https://www.google.com/search?q=" + webbrowser.quote(cmd))


def main_loop():
    speak("Jarvis online. Say 'Jarvis' to wake me.")
    while True:
        text = listen(timeout=5, phrase_time_limit=4)
        if text is None:
            continue

        # if wake word present, listen for a command
        if WAKE_WORD in text:
            # optional feedback
            speak("Yes?")
            # listen for the actual command now (give a longer phrase limit)
            command = listen(timeout=6, phrase_time_limit=10)
            # if recognition failed, try quick text fallback (re-ask)
            if command is None:
                speak("I didn't catch that. Please say it again.")
                command = listen(timeout=6, phrase_time_limit=10)
            handle_command(command)
        else:
            # ignore background speech
            print("(wake word not detected)")

if __name__ == "__main__":
    try:
        main_loop()
    except KeyboardInterrupt:
        speak("Shutting down. Bye.")
#!/bin/bash

# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Función para imprimir mensajes
print_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# -- Verificar si es ejecutado como root
if [[ $EUID -eq 0 ]]; then
    print_error "No ejecutes este script como root/sudo. Ejecútalo como usuario normal."
    exit 1
fi

# -- Función para instalar paquetes según la distribución
install_package() {
    local package=$1
    print_info "Instalando $package..."
    
    if command -v apt &> /dev/null; then
        sudo apt install -y "$package" 2>/dev/null || sudo apt-get install -y "$package"
    elif command -v dnf &> /dev/null; then
        sudo dnf install -y "$package"
    elif command -v yum &> /dev/null; then
        sudo yum install -y "$package"
    elif command -v pacman &> /dev/null; then
        sudo pacman -S --noconfirm "$package"
    else
        print_error "Gestor de paquetes no soportado"
        return 1
    fi
    
    return $?
}

# -- PASO 1: Actualizar el sistema
print_info "Actualizando sistema..."
sudo apt update && sudo apt upgrade -y

# -- PASO 2: Instalar dependencias básicas
print_info "Instalando dependencias básicas..."
sudo apt install -y wget curl gpg gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release

# -- PASO 3: Instalar git
print_info "Instalando Git..."
install_package "git"

# -- PASO 4: Instalar vscode
print_info "Instalando VS Code..."
if ! command -v code &> /dev/null; then
    # Crear directorio para claves
    sudo mkdir -p /etc/apt/keyrings
    
    # Agregar clave GPG de Microsoft
    curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/keyrings/packages.microsoft.gpg
    
    # Agregar repositorio de VS Code
    echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
    
    # Actualizar lista de paquetes e instalar VS Code
    sudo apt update
    install_package "code"
else
    print_info "VS Code ya está instalado"
fi

# -- PASO 5: Instalar google chrome
print_info "Instalando Google Chrome..."
if ! command -v google-chrome-stable &> /dev/null && ! command -v google-chrome &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg
    echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
    sudo apt update
    install_package "google-chrome-stable"
else
    print_info "Google Chrome ya está instalado"
fi

# -- PASO 6: Instalar php
print_info "Instalando PHP..."
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# -- PASO 7: Instalar python
print_info "Instalando Python..."
install_package "python3"
install_package "python3-pip"
install_package "python3-venv"
install_package "build-essential"

# -- PASO 8: Instalar PHP 7.4 y extensiones comunes
print_info "Instalando PHP 7.4..."
install_package "php7.4"
install_package "php7.4-pgsql"
install_package "php7.4-cli"
install_package "php7.4-fpm"
install_package "php7.4-mysql"
install_package "php7.4-zip"
install_package "php7.4-gd"
install_package "php7.4-mbstring"
install_package "php7.4-curl"
install_package "php7.4-xml"
install_package "php7.4-bcmath"

# -- PASO 9: Instalar PHP 8.4 y extensiones
print_info "Instalando PHP 8.4..."
install_package "php8.4"
install_package "php8.4-pgsql"
install_package "php8.4-cli"
install_package "php8.4-fpm"
install_package "php8.4-mysql"
install_package "php8.4-zip"
install_package "php8.4-gd"
install_package "php8.4-mbstring"
install_package "php8.4-curl"
install_package "php8.4-xml"
install_package "php8.4-bcmath"

# -- PASO 10: Configurar PHP por defecto
print_info "Configurando PHP 8.4 como versión por defecto..."
sudo update-alternatives --set php /usr/bin/php8.4 2>/dev/null || true

# -- PASO 11: Instalar composer
print_info "Instalando Composer..."
if ! command -v composer &> /dev/null; then
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php composer-setup.php --install-dir=/usr/local/bin --filename=composer
    php -r "unlink('composer-setup.php');"
else
    print_info "Composer ya está instalado"
fi

# -- PASO 12: Instalar apache2
print_info "Instalando Apache2..."
install_package "apache2"

# -- PASO 13: Instalar postgres
print_info "Instalando PostgreSQL..."
if ! command -v psql &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsS https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
    echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
    sudo apt update
    install_package "postgresql"
    install_package "postgresql-contrib"
else
    print_info "PostgreSQL ya está instalado"
fi

# -- PASO 14: Instalar pgadmin4
print_info "Instalando pgAdmin4..."
if ! command -v pgadmin4 &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /etc/apt/keyrings/pgadmin-keyring.gpg
    echo "deb [signed-by=/etc/apt/keyrings/pgadmin-keyring.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" | sudo tee /etc/apt/sources.list.d/pgadmin4.list
    sudo apt update
    install_package "pgadmin4-desktop"
else
    print_info "pgAdmin4 ya está instalado"
fi

# -- PASO 15: Instalar yakuake
print_info "Instalando Yakuake..."
install_package "yakuake"

# -- PASO 16: VERIFICAR E INSTALAR ZSH AUTOMÁTICAMENTE (MEJORA SOLICITADA)
print_info "Verificando e instalando Zsh..."
if ! command -v zsh &> /dev/null; then
    print_warning "Zsh no está instalado. Instalando automáticamente..."
    
    if install_package "zsh"; then
        if command -v zsh &> /dev/null; then
            print_success "Zsh instalado correctamente: $(zsh --version | head -n1)"
        else
            print_error "Zsh no se instaló correctamente"
            exit 1
        fi
    else
        print_error "No se pudo instalar Zsh automáticamente"
        print_info "Por favor, instala Zsh manualmente:"
        echo "  sudo apt install zsh"
        exit 1
    fi
else
    print_info "Zsh ya está instalado: $(zsh --version | head -n1)"
fi

# Verificar Git (necesario para plugins)
if ! command -v git &> /dev/null; then
    print_warning "Git no está instalado. Instalando..."
    if ! install_package "git"; then
        print_error "No se pudo instalar Git"
        exit 1
    fi
fi

# Verificar curl o wget (necesario para Oh My Zsh)
if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
    print_warning "Ni curl ni wget están instalados. Instalando curl..."
    if ! install_package "curl"; then
        print_warning "No se pudo instalar curl, intentando con wget..."
        if ! install_package "wget"; then
            print_error "No se pudo instalar curl ni wget"
            exit 1
        fi
    fi
fi

print_success "Dependencias de Zsh verificadas e instaladas correctamente"

# -- PASO 17: Instalar oh my zsh (VERSIÓN MEJORADA)
print_info "Instalando Oh My Zsh..."

# Asegurar que .zshrc exista
if [ ! -f ~/.zshrc ]; then
    cat > ~/.zshrc << 'EOF'
# Path to Oh My Zsh installation
export ZSH="$HOME/.oh-my-zsh"

# Default theme
ZSH_THEME="robbyrussell"

# Default plugins
plugins=(git)

# Source Oh My Zsh
if [ -f "$ZSH/oh-my-zsh.sh" ]; then
    source $ZSH/oh-my-zsh.sh
fi
EOF
fi

# Instalar Oh My Zsh si no está
if [ ! -d "$HOME/.oh-my-zsh" ]; then
    # Usar RUNZSH=no para evitar cambiar de shell automáticamente
    export RUNZSH=no
    export CHSH=no
    
    if command -v curl &> /dev/null; then
        sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
    elif command -v wget &> /dev/null; then
        sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" "" --unattended
    else
        print_error "Ni curl ni wget disponibles para instalar Oh My Zsh"
        exit 1
    fi
    
    if [ ! -d "$HOME/.oh-my-zsh" ]; then
        print_error "Oh My Zsh no se instaló correctamente"
        exit 1
    fi
    print_success "Oh My Zsh instalado correctamente"
else
    print_info "Oh My Zsh ya está instalado"
fi

# -- PASO 18: Instalar powerlevel10k (VERSIÓN CORREGIDA)
print_info "Instalando Powerlevel10k..."

# Crear directorio de temas personalizados si no existe
mkdir -p "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"

if [ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" ]; then
    print_info "Powerlevel10k ya está instalado, actualizando..."
    cd "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
    git pull --depth=1
    cd - > /dev/null
else
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
fi

# -- PASO 19: Configurar tema en ~/.zshrc
print_info "Configurando Powerlevel10k como tema..."

# Asegurar que ZSH está definido
if ! grep -q "export ZSH=" ~/.zshrc; then
    echo 'export ZSH="$HOME/.oh-my-zsh"' >> ~/.zshrc
fi

# Cambiar o añadir ZSH_THEME
if grep -q "ZSH_THEME=" ~/.zshrc; then
    # Si ya existe, reemplazar
    if command -v sed &> /dev/null; then
        sed -i.bak 's|^ZSH_THEME=.*|ZSH_THEME="powerlevel10k/powerlevel10k"|' ~/.zshrc
    else
        # Fallback para sistemas sin sed
        print_warning "sed no disponible, usando método alternativo..."
        cp ~/.zshrc ~/.zshrc.backup
        grep -v "ZSH_THEME=" ~/.zshrc.backup > ~/.zshrc
        echo 'ZSH_THEME="powerlevel10k/powerlevel10k"' >> ~/.zshrc
    fi
else
    # Si no existe, añadirlo
    echo 'ZSH_THEME="powerlevel10k/powerlevel10k"' >> ~/.zshrc
fi

# -- PASO 20: Instalar plugins de zsh (VERSIÓN CORREGIDA)
print_info "Instalando plugins de Zsh..."

# Crear directorio de plugins personalizados
mkdir -p "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins"

# Instalar zsh-autosuggestions
if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]; then
    git clone https://github.com/zsh-users/zsh-autosuggestions "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"
else
    print_info "zsh-autosuggestions ya está instalado"
fi

# Instalar zsh-syntax-highlighting
if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" ]; then
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"
else
    print_info "zsh-syntax-highlighting ya está instalado"
fi

# -- PASO 21: Actualizar plugins en .zshrc
print_info "Actualizando lista de plugins en .zshrc..."

# Crear backup
cp ~/.zshrc ~/.zshrc.backup_plugins

# Definir lista de plugins completa
PLUGINS_LIST='plugins=(git zsh-autosuggestions zsh-syntax-highlighting sudo history-substring-search colored-man-pages composer)'

if grep -q "^plugins=" ~/.zshrc; then
    # Reemplazar línea existente
    if command -v sed &> /dev/null; then
        sed -i "s/^plugins=.*/$PLUGINS_LIST/" ~/.zshrc
    else
        awk -v new="$PLUGINS_LIST" '/^plugins=/{print new; next} 1' ~/.zshrc.backup_plugins > ~/.zshrc
    fi
else
    # Buscar dónde insertar (antes de source oh-my-zsh.sh)
    if grep -q "source.*oh-my-zsh.sh" ~/.zshrc; then
        awk -v new="$PLUGINS_LIST" '/source.*oh-my-zsh.sh/{print new; print; next} 1' ~/.zshrc > ~/.zshrc.tmp && mv ~/.zshrc.tmp ~/.zshrc
    else
        # Insertar antes del final
        echo "$PLUGINS_LIST" >> ~/.zshrc
    fi
fi

# -- PASO 22: Añadir configuración de Powerlevel10k
print_info "Añadiendo configuración de Powerlevel10k..."
if ! grep -q "p10k.zsh" ~/.zshrc; then
    echo '' >> ~/.zshrc
    echo '# Powerlevel10k instant prompt' >> ~/.zshrc
    echo 'if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then' >> ~/.zshrc
    echo '  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"' >> ~/.zshrc
    echo 'fi' >> ~/.zshrc
    echo '' >> ~/.zshrc
    echo '# Powerlevel10k configuration' >> ~/.zshrc
    echo '[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh' >> ~/.zshrc
fi

# -- PASO 23: Instalar NVM y Node.js (VERSIÓN MEJORADA)
print_info "Instalando NVM y Node.js..."
if [ ! -d "$HOME/.nvm" ]; then
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    
    # Cargar NVM en el script actual
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
    
    # Añadir NVM al .zshrc si no está
    if ! grep -q "NVM_DIR" ~/.zshrc; then
        echo '' >> ~/.zshrc
        echo '# NVM' >> ~/.zshrc
        echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc
        echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.zshrc
        echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.zshrc
    fi
    
    # Instalar Node.js si NVM está disponible
    if command -v nvm &> /dev/null; then
        nvm install 22
        nvm use 22
        nvm alias default 22
        print_success "Node.js $(node --version) instalado"
    fi
else
    print_info "NVM ya está instalado"
fi

# -- PASO 24: Agregar configuraciones personalizadas al .zshrc
print_info "Añadiendo configuraciones personalizadas..."

# Verificar si ya existen nuestras configuraciones
if ! grep -q "function indicadores" ~/.zshrc; then
    cat >> ~/.zshrc << 'EOF'

# ============================================
# CONFIGURACIONES PERSONALIZADAS
# ============================================

# Funciones personalizadas
function indicadores() {
  cd /var/www/html/jobran/indicadores/ && ls -lt --color=auto
}

function proyectos() {
  cd /var/www/html/jobran/ && ls -lt --color=auto
}

php-server() {
  local framework=$1
  local port=${2:-8000}
  local ruta=$3
  case "$framework" in
    yii2)
      ruta=${ruta:-backend/web}
      echo "🚀 Iniciando Yii2 en http://localhost:$port"
      php -S localhost:$port -t "$ruta"
      ;;
    laravel)
      ruta=${ruta:-public}
      echo "🚀 Iniciando Laravel en http://localhost:$port"
      php -S localhost:$port -t "$ruta"
      ;;
    *)
      echo "⚠️  Framework no reconocido: '$framework'"
      echo "📌 Uso: php-server [yii2|laravel] [puerto] [ruta]"
      ;;
  esac
}

# Activar globbing avanzado
setopt extendedglob
setopt globdots
setopt nomatch

# ============================================
# ALIAS
# ============================================

# Laravel
alias art="php artisan"
alias tinker="php artisan tinker"
alias serve="php artisan serve"
alias migrate="php artisan migrate"
alias seed="php artisan db:seed"
alias fresh="php artisan migrate:fresh --seed"

# Composer
alias cdu="composer dump-autoload"
alias ci="composer install"
alias cu="composer update"

# PostgreSQL
alias psqlc="psql -h localhost -U postgres -W"
alias pgstart="sudo systemctl start postgresql"
alias pgstop="sudo systemctl stop postgresql"
alias pgrestart="sudo systemctl restart postgresql"
alias pgstatus="sudo systemctl status postgresql"
alias psql-iniciar="psql -h localhost -U postgres -W"

# Navegación
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'

# Seguridad
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Git
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
alias gl='git log --oneline --graph'

# Sistema
alias update='sudo apt update && sudo apt upgrade -y'
alias reboot='sudo reboot'
alias shutdown='sudo shutdown -h now'
alias ports='sudo netstat -tulpn'

# Funciones útiles
mkcd() {
    mkdir -p "$1" && cd "$1"
}

findin() {
    grep -r "$1" . --color=always
}

EOF
fi

# -- PASO 25: Verificaciones finales
print_info "Verificando instalaciones..."
echo ""
echo "=== VERSIONES INSTALADAS ==="
[ -x "$(command -v psql)" ] && echo "PostgreSQL: $(psql --version | head -n1)" || echo "PostgreSQL: No instalado"
[ -x "$(command -v git)" ] && echo "Git: $(git --version)" || echo "Git: No instalado"
[ -x "$(command -v php)" ] && echo "PHP: $(php --version | head -n1)" || echo "PHP: No instalado"
[ -x "$(command -v python3)" ] && echo "Python: $(python3 --version)" || echo "Python: No instalado"
[ -x "$(command -v composer)" ] && echo "Composer: $(composer --version | head -n1)" || echo "Composer: No instalado"
[ -x "$(command -v code)" ] && echo "VS Code: $(code --version | head -n1)" || echo "VS Code: No instalado"
[ -x "$(command -v node)" ] && echo "Node.js: $(node --version)" || echo "Node.js: No instalado"
[ -x "$(command -v zsh)" ] && echo "Zsh: $(zsh --version)" || echo "Zsh: No instalado"
[ -d "$HOME/.oh-my-zsh" ] && echo "Oh My Zsh: Instalado" || echo "Oh My Zsh: No instalado"
[ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" ] && echo "Powerlevel10k: Instalado" || echo "Powerlevel10k: No instalado"

echo ""
print_success "¡Instalación completada con éxito!"
print_warning "Pasos finales:"
echo "  1. Cierra y abre una nueva terminal"
echo "  2. O ejecuta: source ~/.zshrc"
echo "  3. Para configurar Powerlevel10k: p10k configure"
echo "  4. Para cambiar a Zsh como shell por defecto: chsh -s $(which zsh)"
echo ""
print_info "Si ves errores con Powerlevel10k, ejecuta manualmente:"
echo "  git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/.powerlevel10k"
echo "  echo 'source ~/.powerlevel10k/powerlevel10k.zsh-theme' >> ~/.zshrc"
echo "  source ~/.zshrc"
echo "  p10k configure"
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":mirror_ball::man_dancing: Are you Retro Rewind Ready?:man_dancing::mirror_ball:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " \n\n:alarm_clock: The Clock is Ticking! Only *3* days left to Register, *RSVP NOW!*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Hello Brissy!* \n\nAs 2025 comes to a close, get ready to rewind, connect, and celebrate with a blast through the decades at our End of Year Event! \n\n*Here’s everything you need to know:*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"fields": [
				{
					"type": "mrkdwn",
					"text": "*📅 When:*\n Friday 28th November "
				},
				{
					"type": "mrkdwn",
					"text": "*📍 Where:*\n Bar Pacino - 175 Eagle Street, Brisbane City, Queensland 4000"
				},
				{
					"type": "mrkdwn",
					"text": "*⏰ Time:*\n 4.00pm - 9.00 PM"
				}
			]
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:disco_dance::vinyl: Theme:*\n_Retro Rewind_ – A nostalgic, high-energy trip through the decades. From disco balls to Y2k vibes, Retro Rewind is about celebrating together, embracing individuality, and creating an inclusive space where everyone can join the fun."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:dress: Dress Code:*\nSmart casual – Show your personality, but no Xero tees or lanyards, please!\nFeeling inspired by the theme? Why not bring a decade to life? Disco 70s, neon 80s, grungy 90s or sparkling 00s. The choice is yours. (Totally optional, of course! ✨)"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:microphone: :hamburger: Entertainment & Food:*\nEach location will bring Retro Rewind to life in its own way! No two events will be the same. You can look forward to retro vibes with great music, delicious bites, refreshing drinks, and maybe even a few surprises along the way. ✨🎶"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*🎟 RSVP Now:*\nPlease click <https://xero-wx.jomablue.com/reg/store/eoy_bri_2025|*HERE*>! Make sure you RSVP by *Monday, 14 November*!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":question:Got questions? See the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|FAQs> doc or post in the Slack channel.\n\nWe can’t wait to celebrate with you! :partying_face: :xero-love:"
			}
		}
	]
}
queryMap = Map();
queryMap.put("select_query","SELECT TransUnion_Application_ID, TransUnion_Application_Number, Credit_Report, Eviction_Report, Criminal_Report FROM Tenant_Applications WHERE ((TransUnion_Application_ID != ''  AND (TransUnion_Application_Number != '' AND (Criminal_Report = 'No' OR (Credit_Report = 'No' OR( Eviction_Report = 'No' or (Criminal_Report = null or(Credit_Report = null or(Eviction_Report = null))))))))) LIMIT 2");
response = invokeurl
[
	url :"https://www.zohoapis.com/crm/v8/coql"
	type :POST
	body:queryMap.toString()
	connection:"zoho_crm"
];
info response;
A Peer-to-Peer (P2P) Crypto Exchange Script enables users to trade cryptocurrencies directly with each other without intermediaries. It’s designed for decentralized, secure, and flexible trading. Core features include:
Direct wallet-to-wallet transactions


Integrated escrow system for secure trading


Support for multiple payment methods (bank transfer, PayPal, e-wallets)


User ratings and reputation system


Admin dashboard for monitoring trades and managing disputes
This script is perfect for building a P2P platform similar to LocalBitcoins or Paxful, empowering users to trade safely and efficiently.


Mobile: +91 6369366250
Telegram : @Thecryptoape
Mail : info@thecryptoape.com
Visit : https://www.thecryptoape.com/p2p-crypto-exchange-script 

A Cryptocurrency Exchange Script is a pre-built platform that allows users to buy, sell, and trade digital currencies securely. It provides the essential infrastructure for running a centralized or decentralized crypto exchange. Key features include:
Multi-currency support (BTC, ETH, USDT, and more)


Secure wallets and instant deposits/withdrawals


Order book management and trade matching engine


User-friendly interface for web and mobile


Admin panel with detailed reporting and analytics
This script is suitable for startups or businesses wanting a professional crypto exchange without building from scratch.


Mobile: +91 6369366250
Telegram : @Thecryptoape
Mail : info@thecryptoape.com
Visit : https://www.thecryptoape.com/cryptocurrency-exchange-script 

A Binance Clone Script is a ready-made solution designed to replicate the core functionalities of the Binance cryptocurrency exchange platform. It enables entrepreneurs and businesses to launch a feature-rich, secure, and scalable crypto trading platform quickly. Features typically include:
Spot and margin trading


Multiple cryptocurrency support


Advanced charting and analytics tools


High liquidity and fast transaction processing


Two-factor authentication (2FA) and KYC/AML compliance


Admin dashboard for managing users, transactions, and listings

This script is ideal for those looking to establish a global cryptocurrency exchange like Binance with minimal development effort.

https://www.thecryptoape.com/binance-clone-script
keypad Code 
library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 
entity tb_keypad is 
Port ( clk : in STD_LOGIC; -- 100 MHz clock 
row : in STD_LOGIC_VECTOR (3 downto 0); -- Rows of keypad (inputs) 
col : out STD_LOGIC_VECTOR (3 downto 0); -- Columns of keypad (outputs) 
seg : out STD_LOGIC_VECTOR (6 downto 0); -- Seven-segment cathodes 
an : out STD_LOGIC_VECTOR (3 downto 0)); -- Seven-segment anodes 
end tb_keypad; 
architecture Behavioral of tb_keypad is 
signal col_sel : std_logic_vector(1 downto 0) := "00"; 
signal display_digit : std_logic_vector(3 downto 0) := "1111"; -- Latched display 
signal counter: unsigned(28 downto 0) := (others => '0'); 
signal clk_div : std_logic := '0'; 
begin 
an <= "1110"; -- Enable rightmost digit -- Clock divider process 
process(clk) 
begin 
if rising_edge(clk) then 
counter <= counter + 1; 
if counter = 19 then -- This value determines the scanning speed. 
clk_div <= not clk_div; 
counter <= (others => '0'); 
end if; 
end if; 
end process; -- Drive columns based on col_sel 
with col_sel select 
col <= "0111" when "00", 
"1011" when "01", 
"1101" when "10", 
"1110" when "11", 
"1111" when others; -- Keypad scanning and display latching process 
process(clk_div) 
begin 
if rising_edge(clk_div) then 
case col_sel is 
when "00" => 
if row(3) = '0' then display_digit <= "0001"; -- 1 
elsif row(2) = '0' then display_digit <= "0100"; -- 4 
elsif row(1) = '0' then display_digit <= "0111"; -- 7 
elsif row(0) = '0' then display_digit <= "0000"; -- 0 
end if; 
when "01" => 
if row(3) = '0' then display_digit <= "0010"; -- 2 
elsif row(2) = '0' then display_digit <= "0101"; -- 5 
elsif row(1) = '0' then display_digit <= "1000"; -- 8 
elsif row(0) = '0' then display_digit <= "1111"; -- F 
end if; 
when "10" => 
if row(3) = '0' then display_digit <= "0011"; -- 3 
elsif row(2) = '0' then display_digit <= "0110"; -- 6 
elsif row(1) = '0' then display_digit <= "1001"; -- 9 
elsif row(0) = '0' then display_digit <= "1110"; -- E 
end if; 
when "11" => 
if row(3) = '0' then display_digit <= "1010"; -- A 
elsif row(2) = '0' then display_digit <= "1011"; -- B 
elsif row(1) = '0' then display_digit <= "1100"; -- C 
elsif row(0) = '0' then display_digit <= "1101"; -- D 
end if; 
when others => 
null; 
end case; 
col_sel <= std_logic_vector(unsigned(col_sel) + 1); -- Cycle col_sel to scan all columns 
end if; 
end process; -- Seven-segment decoder 
process(display_digit) 
begin 
case display_digit is 
when "0000" => seg <= "1000000"; -- 0 
when "0001" => seg <= "1111001"; -- 1 
when "0010" => seg <= "0100100"; -- 2 
when "0011" => seg <= "0110000"; -- 3 
when "0100" => seg <= "0011001"; -- 4 
when "0101" => seg <= "0010010"; -- 5 
when "0110" => seg <= "0000010"; -- 6 
when "0111" => seg <= "1111000"; -- 7 
when "1000" => seg <= "0000000"; -- 8 
when "1001" => seg <= "0010000"; -- 9 
when "1010" => seg <= "0001000"; -- A 
when "1011" => seg <= "0000011"; -- B 
when "1100" => seg <= "1000110"; -- C 
when "1101" => seg <= "0100001"; -- D 
when "1110" => seg <= "0000110"; -- E 
when "1111" => seg <= "0001110"; -- F 
when others => seg <= "1111111"; -- Blank 
end case; 
end process; 
end Behavioral; 
Constraint Code 
set_property PACKAGE_PIN W4 [get_ports {an[3]}] 
set_property PACKAGE_PIN V4 [get_ports {an[2]}] 
set_property PACKAGE_PIN U4 [get_ports {an[1]}] 
set_property PACKAGE_PIN U2 [get_ports {an[0]}] 
set_property PACKAGE_PIN G3 [get_ports {row[3]}] 
set_property PACKAGE_PIN H2 [get_ports {row[2]}] 
set_property PACKAGE_PIN K2 [get_ports {row[1]}] 
set_property PACKAGE_PIN H1 [get_ports {row[0]}] 
set_property PACKAGE_PIN G2 [get_ports {col[3]}] 
set_property PACKAGE_PIN J2 [get_ports {col[2]}] 
set_property PACKAGE_PIN L2 [get_ports {col[1]}] 
set_property PACKAGE_PIN J1 [get_ports {col[0]}] 
set_property PACKAGE_PIN U7 [get_ports {seg[6]}] 
set_property PACKAGE_PIN V5 [get_ports {seg[5]}] 
set_property PACKAGE_PIN U5 [get_ports {seg[4]}] 
set_property PACKAGE_PIN V8 [get_ports {seg[3]}] 
set_property PACKAGE_PIN U8 [get_ports {seg[2]}] 
set_property PACKAGE_PIN W6 [get_ports {seg[1]}] 
set_property PACKAGE_PIN W7 [get_ports {seg[0]}] 
set_property PACKAGE_PIN W5 [get_ports clk] 
set_property IOSTANDARD LVCMOS33 [get_ports clk] 
set_property IOSTANDARD LVCMOS33 [get_ports {seg[6]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {seg[5]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {seg[4]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {seg[3]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {seg[2]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {seg[1]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {seg[0]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {col[3]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {col[2]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {col[1]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {col[0]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {row[3]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {row[2]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {row[1]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {row[0]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {an[3]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {an[2]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {an[1]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {an[0]}]
extends CharacterBody2D


var speed : float = 100

func _physics_process(delta: float) -> void:
	velocity.x = 0
	velocity.y = 0
	
	if Input.is_key_pressed(KEY_RIGHT):
		velocity.x += speed
		
	if Input.is_key_pressed(KEY_LEFT):
		velocity.x -= speed	
		
	if Input.is_key_pressed(KEY_UP):
		velocity.y -= speed	
		
	if Input.is_key_pressed(KEY_DOWN):
		velocity.y += speed	
	
	move_and_slide()
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":sunshine: :x-connect: Boost Days: What's on this week :x-connect: :sunshine:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Good morning Melbourne and hope you all had a fab weekend! :sunshine: \n\n Please see below for what's on this week! :yay: "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-12: Wednesday, 12th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: :muffin: *Xero Café* – Banana Muffins, cookies & Vanilla Crown Danishes.\n :coffee: *Barista Special* – Iced Matcha Latte \n :Lunch::flag-gr: Join us at *12.00pm* for *The Souvlaki Station* in the Wominjeka Breakout Space on Level 3."
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-13: Thursday, 13th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Cafe*: Banana Muffins, cookies & Vanilla Crown Danishes.\n :coffee: *Barista Special* –Iced Matcha Latte \n :Breakfast: Join us at *8.30am -10.30am* for a *Greek Breakfast Buffet* in the Wominjeka Breakout Space on Level 3 . "
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-14: Friday, 14th November ",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":cheers-9743: :beer: *Happy Hour:* from 4pm - 5.30pm in the Wominjeka Breakout space. Wind down for the week over some drinks and nibbles."
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " What else? :heart: \n\n:disco::discodancer: As 2025 comes to a close, get ready to rewind, connect, and celebrate with a blast through the decades at our *End of Year Event*! Register for the End of Year Celebration <https://xero-wx.jomablue.com/reg/store/eoy_akl_2025|*HERE*>. Don't miss out on this exciting *EOY* event. \n\nStay tuned to this channel, and make sure you’re subscribed to the <https://calendar.google.com/calendar/u/0/r?cid=Y19xczkyMjk5ZGlsODJzMjA4aGt1b3RnM2t1MEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t /|*Melbourne Social Calendar*> for all upcoming events."
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":countdown: It's the Final Countdown! \n\nOur Retro Rewind End of Year Celebration is TODAY!:disco:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":celebrate: Let's get this party started, *London*!\nFrom disco to the digital age, let's pump up the volume and press play!  We're stepping back in time for our End of Year Celebration at <https://www.google.com/maps/place/Roxy+Ball+Room+London+St+Mary+Axe/@51.5148883,-0.084179,16.59z/data=!3m1!5s0x4876034d6a8d950d:0x8b4b36257ce84e8f!4m14!1m7!3m6!1s0x4876030472f0049d:0x6d6e1e50dfe592f0!2sRoxy+Ball+Room+London+St+Mary+Axe!8m2!3d51.5149255!4d-0.080769!16s/g/11wr3mz2hk!3m5!1s0x4876030472f0049d:0x6d6e1e50dfe592f0!8m2!3d51.5149255!4d-0.080769!16s/g/11wr3mz2hk?entry=ttu&g_ep=EgoyMDI1MDgwNi4wIKXMDSoASAFQAw==|*Roxy Ballroom, London, St Mary Axe*> \n\n*Today*, we’re turning up the nostalgia and the good vibes to celebrate 2025 in true throwback style! \n\n*Here’s what you need to know:*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:admission_tickets: Access to the event:*\nFor seamless entry, please have your *e-ticket* (sent via email) ready on your phone! \n\nThe *unique QR code* will be scanned at the entrance. \n\n:bulb:*Tip:* Ensure your screen is bright for a fast check-in.\n\n\n\n:info: For more info about accessing your E-Ticket and QR Code check out these <https://docs.google.com/document/d/19Sqjusdd9D_VU4tpvqq_E3kfwUAm3BzL5ZbDNy99Jbg/edit?usp=sharing| *FAQs*>"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":connect: *Chill out and connection zones:* Whether you're up for dancing all night or prefer a quieter area to catch up with friends, we've planned a few different spaces so you can enjoy the event your way."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":disco_dance:*Dressing up:*\nSmart casual is the vibe, but please no Xero tees or lanyards.  If you’re feeling inspired, why not bring a decade to life? Think *disco 70s*, *neon 80s*, *grungy 90s*, or *sparkling 00s!* Every little retro touch adds to the fun.(Totally optional, of course!) :sparkles:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":vape: *Smoking/Vaping:*\n[Insert local smoking/vaping info here — e.g., “A designated area will be available outside near the main entrance.”]"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":fireworks-star: *What’s in store?*\nEach location is bringing Retro Rewind to life in its own unique way. Expect great tunes, delicious food & drinks, and a few surprises along the way!\n[Optional: Add local highlights here, e.g., “DJ, live performace, DIY glow up station, activities!”]"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "We are so excited to rewind, connect, and celebrate with you! :partying_face:\n\nIf you’ve got any questions, check out the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|*FAQs*> or post in the Slack channel.\n\nLove,\n\nWX :party-wx:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":mirror_ball: :dancing:Don't Stop Believin'..... Our Retro Rewind End of Year Celebration is almost here!:dancing: :mirror_ball:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":music: Sweet dreams are made of this, *Wellington*!\nWe're just *one* sleep until we step back in time for our End of Year Celebration at <https://www.google.com/maps/place/Shed+6/@-41.2851544,174.7792458,17z/data=!3m1!4b1!4m6!3m5!1s0x6d38af007dc7b483:0x9235d8609c45cd40!8m2!3d-41.2851544!4d174.7792458!16s/g/11y2775r48?entry=ttu&g_ep=EgoyMDI1MTEwNC4xIKXMDSoASAFQAw==|*Shed 6, Wellington Central*> \n\n*Tomorrow*, we're firing up the time machine to celebrate 2025 in true throwback style! \n\n*Here’s what you need to know:*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:admission_tickets: Access to the event:*\nFor seamless entry, please have your *e-ticket* (sent via email) ready on your phone! \n\nThe *unique QR code* will be scanned at the entrance. \n\n:bulb:*Tip:* Ensure your screen is bright for a fast check-in.\n\n\n\n:info: For more info about accessing your E-Ticket and QR Code check out these <https://docs.google.com/document/d/19Sqjusdd9D_VU4tpvqq_E3kfwUAm3BzL5ZbDNy99Jbg/edit?usp=sharing| *FAQs*>"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":connect: *Chill out and connection zones:* Whether you're up for dancing all night or prefer a quieter area to catch up with friends, we've planned a few different spaces so you can enjoy the event your way."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":disco_dance:*Dressing up:*\nSmart casual is the vibe, but please no Xero tees or lanyards.  If you’re feeling inspired, why not bring a decade to life? Think *disco 70s*, *neon 80s*, *grungy 90s*, or *sparkling 00s!* Every little retro touch adds to the fun.(Totally optional, of course!) :sparkles:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":vape: *Smoking/Vaping:*\n[Insert local smoking/vaping info here — e.g., “A designated area will be available outside near the main entrance.”]"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":fireworks-star: *What’s in store?*\nEach location is bringing Retro Rewind to life in its own unique way. Expect great tunes, delicious food & drinks, and a few surprises along the way!\n[Optional: Add local highlights here, e.g., “DJ, live performance, DIY glow up station, activities!”]"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "We are so excited to rewind, connect, and celebrate with you! :partying_face:\n\nIf you’ve got any questions, check out the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|*FAQs*> or post in the Slack channel.\n\nLove,\n\nWX :party-wx:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":mirror_ball: :dancing-napoleon:Rewind and Press Play! Our End of Year Celebration is 1 WEEK AWAY!:dancing-napoleon: :mirror_ball:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hi Melbourne, \n\nWe’re only one week away from our End of Year Celebration at <https://www.google.com/maps/place/Greenfields+Albert+Park/@-37.8481994,144.9765768,17z/data=!3m1!4b1!4m6!3m5!1s0x6ad668113e20236d:0xc70db23d5d7b651a!8m2!3d-37.8481994!4d144.9765768!16s/g/11c2j7hrfm?entry=ttu&g_ep=EgoyMDI1MDgwNi4wIKXMDSoASAFQAw==|*Greenfields, Albert Park!*> \n\nWe can’t wait to rewind, press play, and celebrate an incredible 2025 together! \n\n*Here’s what you need to know:*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:admission_tickets: Access to the event:*\nFor seamless entry, please have your *e-ticket* (sent via email) ready on your phone! \n\nThe *unique QR code* will be scanned at the entrance. \n\n:bulb:*Tip:* Ensure your screen is bright for a fast check-in.\n\n :info: For more info about accessing your E-Ticket and QR Code check out these <https://docs.google.com/document/d/19Sqjusdd9D_VU4tpvqq_E3kfwUAm3BzL5ZbDNy99Jbg/edit?usp=sharing|*FAQs*>"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":connect: *Chill out and connection zones:* Whether you're up for dancing all night or prefer a quieter area to catch up with friends, we've planned a few different spaces so you can enjoy the event your way."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":disco_dance:*Dressing up:*\nSmart casual is the vibe, but please no Xero tees or lanyards.  If you’re feeling inspired, why not bring a decade to life? Think *disco 70s*, *neon 80s*, *grungy 90s*, or *sparkling 00s!* Every little retro touch adds to the fun. (Totally optional, of course!):sparkles:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":vape: *Smoking/Vaping:*\n[Insert local smoking/vaping info here — e.g., “A designated area will be available outside near the main entrance.”]"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":fireworks-star: *What’s in store?*\nEach location is bringing Retro Rewind to life in its own unique way. Expect great tunes, delicious food & drinks, and a few surprises along the way!\n[Optional: Add local highlights here, e.g., “DJ, live performace, DIY glow up station, activities!”]"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "We are so excited to rewind, connect, and celebrate with you! :partying_face:\n\nIf you’ve got any questions, check out the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|FAQs> or post in the Slack channel.\n\nLove,\n\nWX :party-wx:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":mirror_ball::man_dancing: Final Call - Registrations Close Today!:man_dancing::mirror_ball:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " \n\n:alarm_clock: Today's your last chance to secure your spot at our *Retro Rewind* End of Year Celebration! *RSVP NOW!*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Hi Auckland!* \n\nAs 2025 comes to a close, get ready to rewind, connect, and celebrate with a blast through the decades at our End of Year Event! \n\n*Here’s everything you need to know:*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"fields": [
				{
					"type": "mrkdwn",
					"text": "*📅 When:*\nFriday 12 December "
				},
				{
					"type": "mrkdwn",
					"text": "*📍 Where:*\n<https://www.google.com/maps/place/Viaduct+Events+Centre/@-36.8408231,174.7592327,16z/data=!3m1!4b1!4m6!3m5!1s0x6d0d47f6612e7db9:0x598e07bafbb2d3b4!8m2!3d-36.8408231!4d174.7592327!16s/m/0gvqwyq?entry=ttu&g_ep=EgoyMDI1MTEwNC4xIKXMDSoASAFQAw==|*Viaduct Events Centre*> \n171 Halsey Street, Auckland Central, Auckland"
				},
				{
					"type": "mrkdwn",
					"text": "*⏰ Time:*\n5:30 PM - 10 PM"
				}
			]
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:disco_dance::vinyl: Theme:*\n_Retro Rewind_ – A nostalgic, high-energy trip through the decades. From disco balls to Y2k vibes, Retro Rewind is about celebrating together, embracing individuality, and creating an inclusive space where everyone can join the fun."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:dress: Dress Code:*\nSmart casual – Show your personality, but no Xero tees or lanyards, please! Feeling inspired by the theme? Why not bring a decade to life? Disco 70s, neon 80s, grungy 90s or sparkling 00s. The choice is yours. (Totally optional, of course! ✨)"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:microphone: :hamburger:  Entertainment & Food:*\nEach location will bring Retro Rewind to life in its own way! No two events will be the same. You can look forward to retro vibes with great music, delicious bites, refreshing drinks, and maybe even a few surprises along the way. ✨🎶"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*🎟 RSVP Now:*\nPlease click <https://xero-wx.jomablue.com/reg/store/eoy_mel_2025|*HERE*>! Make sure you RSVP by *Friday, 28 November*!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":question:Got questions? See the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|FAQs> doc or post in the Slack channel.\n\nWe can’t wait to celebrate with you! :partying_face: :xero-love:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":x-connect: Boost Days - What's on this week! :x-connect:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Morena team. Let's get ready to dive into another great week here in the Auckland office! \n \n See below for what's in store:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-11: Tuesday, 11th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Café:* Café-style beverages and sweet treats.\n:mango: *Barista Special:* Sticking to our Spring theme - Mango iced Tea \n:toast: *Breakfast:* Provided from *8.30am* in the All Hands kitchen \n  "
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-13: Thursday, 13th November",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Café:* Café-style beverages and sweet treats.\n:mango: *Barista Special:* Mango iced Tea \n:noodles: *Light Lunch*: Provided from *12:30pm* in the All Hands kitchen \n :meow_wine: *Social Happy Hour:* Join your fellow Xeros for a beverage and nibbles in *All Hands from 4pm* to celebrate another great week "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*What else?*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":disco: As 2025 comes to a close, get ready to rewind, connect, and celebrate with a blast through the decades at our *End of Year Event*! Register for the End of Year Celebration <https://xero-wx.jomablue.com/reg/store/eoy_akl_2025|*HERE*>"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Stay tuned to this channel for more details, check out the <https://calendar.google.com/calendar/u/0?cid=eGVyby5jb21fMXM4M3NiZzc1dnY0aThpY2FiZDZvZ2xncW9AZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ|*Auckland Social Calendar.*>\n\nLove,\nWX :wx:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":mirror_ball::man_dancing: Don't Get Left in the Past - Registrations Close Tomorrow!:man_dancing::mirror_ball:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " \n\n:alarm_clock: *RSVP for Retro Rewind NOW!*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Hi Denver!* \n\nWe're nearly ready to rewind the clock and celebrate the end of 2025 together!\nDon't miss your chance to join us for a night of connection and retro magic at our End of Year Event! \n\n*Here’s everything you need to know:*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"fields": [
				{
					"type": "mrkdwn",
					"text": "*📅 When:*\nThursday 11 December "
				},
				{
					"type": "mrkdwn",
					"text": "*📍 Where:*\n<https://the1uparcadebar.com/pages/lodo|*The 1up Arcade Car*> \nAt 19th and Blake Street"
				},
				{
					"type": "mrkdwn",
					"text": "*⏰ Time:*\n6 PM - 9 PM"
				}
			]
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:disco_dance::vinyl: Theme:*\n_Retro Rewind_ – A nostalgic, high-energy trip through the decades. From disco balls to Y2k vibes, Retro Rewind is about celebrating together, embracing individuality, and creating an inclusive space where everyone can join the fun."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:dress: Dress Code:*\nSmart casual – Show your personality, but no Xero tees or lanyards, please!\nFeeling inspired by the theme? Why not bring a decade to life? Disco 70s, neon 80s, grungy 90s or sparkling 00s. The choice is yours. (Totally optional, of course! ✨)"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:microphone: :hamburger:  Entertainment & Food:*\nEach location will bring Retro Rewind to life in its own way! No two events will be the same. You can look forward to retro vibes with great music, delicious bites, refreshing drinks, and maybe even a few surprises along the way. ✨🎶"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*🎟 RSVP Now:*\nPlease click <https://xero-wx.jomablue.com/reg/store/eoy_mel_2025|*HERE*>! Make sure you *RSVP* by *EOD TOMORROW*!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":question:Got questions? See the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|FAQs> doc or post in the Slack channel.\n\nWe can’t wait to celebrate with you! :partying_face: \n\nLove, \n WX :party-wx:"
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":mirror_ball::man_dancing: Are you Retro Rewind Ready?:man_dancing::mirror_ball:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " \n\n:alarm_clock: The Clock is Ticking! Only *7* days left to Register, *RSVP NOW!*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Hi Melbourne!* \n\nAs 2025 comes to a close, get ready to rewind, connect, and celebrate with a blast through the decades at our End of Year Event! \n\n*Here’s everything you need to know:*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"fields": [
				{
					"type": "mrkdwn",
					"text": "*📅 When:*\nThursday 11 December "
				},
				{
					"type": "mrkdwn",
					"text": "*📍 Where:*\n<https://www.google.com/maps/place/Greenfields+Albert+Park/@-37.8481994,144.9765768,17z/data=!3m1!4b1!4m6!3m5!1s0x6ad668113e20236d:0xc70db23d5d7b651a!8m2!3d-37.8481994!4d144.9765768!16s/g/11c2j7hrfm?entry=ttu&g_ep=EgoyMDI1MDgwNi4wIKXMDSoASAFQAw==|*Greenfields*> \nCnr Lakeside Drive & Queens Road Albert Park Lake"
				},
				{
					"type": "mrkdwn",
					"text": "*⏰ Time:*\n5:30 PM - 11 PM"
				}
			]
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:disco_dance::vinyl: Theme:*\n_Retro Rewind_ – A nostalgic, high-energy trip through the decades. From disco balls to Y2k vibes, Retro Rewind is about celebrating together, embracing individuality, and creating an inclusive space where everyone can join the fun."
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:dress: Dress Code:*\nSmart casual – Show your personality, but no Xero tees or lanyards, please!\nFeeling inspired by the theme? Why not bring a decade to life? Disco 70s, neon 80s, grungy 90s or sparkling 00s. The choice is yours. (Totally optional, of course! ✨)"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*:microphone: :hamburger: Entertainment & Food:*\nEach location will bring Retro Rewind to life in its own way! No two events will be the same. You can look forward to retro vibes with great music, delicious bites, refreshing drinks, and maybe even a few surprises along the way. ✨🎶"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*🎟 RSVP Now:*\nPlease click <https://xero-wx.jomablue.com/reg/store/eoy_mel_2025|*HERE*>! Make sure you RSVP by *Thursday, 27 November*!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":question:Got questions? See the <https://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing|FAQs> doc or post in the Slack channel.\n\nWe can’t wait to celebrate with you! :partying_face: :xero-love:"
			}
		}
	]
}
Public class NW_QRHelper
{
    public static container GenerateQRImageCode(container _qrContainer)
    {
    
        System.Drawing.Bitmap bm = null;
        str base64String;
        try
        {

            var qrCodeEncoder = new Microsoft.Dynamics.ApplicationSuite.QRCode.Encoder();
            base64String = NW_QRHelper::EncodeQRContentToBase64(_qrContainer);
            bm = qrCodeEncoder.Encode(base64String);

        }
        catch (Exception::CLRError)
        {
            error(CLRInterop::getLastException().ToString());
        }
        using (var stream = new System.IO.MemoryStream())
        {
            bm.Save(stream, System.Drawing.Imaging.ImageFormat::Bmp);
            bm.Dispose();
           
            return Binary::constructFromMemoryStream(stream).getContainer();
        }
    }

    private static str EncodeQRContentToBase64(container _qrContainer)
    {
        System.Byte[] finalByteArray = new System.Byte[499]();
        System.Byte[] byteArray ;
        str base64String;
        int i,k, byte;
        int j = 0, finalArrayLength = 0;
        anytype aty;

        for (i= 1; i <= conLen(_qrContainer); i++)
        {
            aty = conPeek(_qrContainer, i);
            //info(int2str(i) + " :  " + aty);

            byteArray = NW_QRHelper::EncodeStrToUTF8(i, any2Str(aty));
            finalArrayLength += byteArray.get_Length();

            for (k = 0; k <  byteArray.get_Length() && j < 499; k++)
            {
                byte = byteArray.GetValue(k);
                finalByteArray.SetValue(System.Convert::ToByte(byte),j);
                j++;
            }
            
        }

        System.Byte[] finalByteArrayLessLength = new System.Byte[finalArrayLength]();

        for (k = 0; k <  finalArrayLength && k < finalByteArray.get_Length() ; k++)
        {
            byte = finalByteArray.GetValue(k);
            finalByteArrayLessLength.SetValue(System.Convert::ToByte(byte),k);
        }


        base64String = System.Convert::ToBase64String(finalByteArrayLessLength, 0, finalByteArrayLessLength.get_Length());
        return base64String;
    }

    private static  System.Byte[]  EncodeStrToUTF8 (int _tag,str _qrCodeField)
    {
        System.Byte[]           byteArray;
        System.Byte[]           finalByteArray;
        System.Text.Encoding    encodingUTF8;
        int                     byte, i, arrayLength;
 
        ;
 
        encodingUTF8 = System.Text.Encoding::get_UTF8();
        byteArray = encodingUTF8.GetBytes(_qrCodeField);
        arrayLength = byteArray.get_Length();

   
        System.Byte byteTag = System.Convert::ToByte(_tag);
        System.Byte byteArrayLength = System.Convert::ToByte(arrayLength);

        finalByteArray = new System.Byte[arrayLength + 2]();
        finalByteArray.SetValue(byteTag,0);
        finalByteArray.SetValue(byteArrayLength,1);

        for (i = 0; i < arrayLength; i++)
        {
            byte = byteArray.GetValue(i);
            finalByteArray.SetValue(System.Convert::ToByte(byte),i+2);
        }

        return finalByteArray;

    }

    public static container GenerateQRCode(str _QR)
    {
    
        System.Drawing.Bitmap bm = null;
        str base64String;
        try
        {

            var qrCodeEncoder = new Microsoft.Dynamics.ApplicationSuite.QRCode.Encoder();
            //base64String = NW_QRHelper::EncodeQRContentToBase64(_qrContainer);
            bm = qrCodeEncoder.Encode(_QR);

        }
        catch (Exception::CLRError)
        {
            error(CLRInterop::getLastException().ToString());
        }
        using (var stream = new System.IO.MemoryStream())
        {
            bm.Save(stream, System.Drawing.Imaging.ImageFormat::Bmp);
            bm.Dispose();
           
            return Binary::constructFromMemoryStream(stream).getContainer();
        }
    }

}
[Form]
public class CPLOperatorPackageAndStockTrackingDetails extends FormRun
{
    [DataSource]
    class HcmEmployment
    {
        /// <summary>
        ///
        /// </summary>
        public void executeQuery()
        {
            RecId selectedLegalEntityRecId;
            QueryBuildRange employmentRange;
            selectedLegalEntityRecId = CompanyInfo::current();
            employmentRange = this.query().dataSourceTable(tableNum(HcmEmployment)).findRange(fieldNum(HcmEmployment, LegalEntity));
            employmentRange.value(queryValue(selectedLegalEntityRecId));

            super();
        }

        public void init()
        {
            QueryBuildDataSource qbds;
            QueryBuildRange employmentRange;

            super();
            
            qbds = this.query().dataSourceTable(tableNum(HcmEmployment));
            employmentRange = qbds.addRange(fieldNum(HcmEmployment, LegalEntity));
            hcmEmployment_ds.executeQuery();
        }

    }

}
/**************************************************************
-> Order team members alphabetically in the back end
 **************************************************************/
function set_post_order_in_admin($wp_query)
{

    global $pagenow;

    if (is_admin() && 'edit.php' == $pagenow && !isset($_GET['orderby']) && isset($_GET['post_type']) && $_GET['post_type'] == 'team-member') {

        $wp_query->set('orderby', 'title');
        $wp_query->set('order', 'ASC');
    }
}

add_filter('pre_get_posts', 'set_post_order_in_admin', 5);
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode fast = dummy;
        ListNode slow = dummy;

        for (int i = 0; i <= n; i++) {
            fast = fast.next;
        }

        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }

        slow.next = slow.next.next;
        
        return dummy.next;
    }
}
public class ListNode() {

    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

public class Solution() {

    public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }
}
,{"trigger":["workflow","blueprint"]});
 
Get into party with wedding outfits by JOVI India’s Indian wedding wear guest dresses for women . The range is inspired by Indian wedding and therefore offers women wedding wear outfits such as light haldi and mehendi dresses, rich gown and lehenga. Each artwork emphasizes the magnificent handcraft and colours that communicate the moments of celebrations. Coming in a complete range of sizes, in XS to 6XL, our wedding wear plus size ensures that all people are radiant. Be it traditional cuts or modern wedding trouser suits, JOVI has a bit of Indian heritage in all of them. Just right to brides, sisters or wedding guests. Use JOVI25 and receive 25% off with free shipping in India and free international shipping on all orders over USD 500. 
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":asx::xero: FY26 Half Year Results + Boost Days for next week | Please read! :xero::asx:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Sydney! It's that time a year again where we host half year results in our office and support the live call to the ASX, our Boost Days for next week will run a little differently, however we will continue to run the office as BAU as much as possible."
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":dot-blue:*FOH* - Front of house will be closed for the week for the results working group \n:dot-blue:*Staff Entry* - Please use the White Staff entry doors located on each side of the floor \n :dot-blue:*Barty, Anzac & Waratah* - These rooms are offline this week to also support the results working group \n :dot-blue:*Filming & Pre Records* - Our Kitchen/breakout space will be closed between 12:45pm - 1:00pm 12/11/25. Please also be mindful during this time of noise levels!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":star: Boost Days :star:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":calendar-date-10: *Monday, 10th November:* \n\n :coffee: *Café Partnership:* Enjoy free coffee @ Naked Duck from 8am - 11am \n :Lunch: *Lunch:* Join us for Lunch from 12pm in the kitchen \n\n :calendar-date-11: *Tuesday, 11th November:* \n\n :coffee: *Café Partnership:* Enjoy Free Coffee @ Naked Duck from 8am -11am \n :breakfast: *Breakfast:* Join us for breakfast from 9am in the kitchen \n\n :calendar-date-12: *Wednesday, 12th November:* \n\n :coffee: *Café Partnership:* Enjoy Free Coffee @ Naked Duck from 8am - 11am \n :Lunch: *Lunch:* Join us for Lunch from 12pm in the kitchen"
			}
		},
		{
			"type": "actions",
			"elements": [
				{
					"type": "button",
					"text": {
						"type": "plain_text",
						"text": "Farmhouse",
						"emoji": true
					},
					"value": "click_me_123"
				},
				{
					"type": "button",
					"text": {
						"type": "plain_text",
						"text": "Kin Khao",
						"emoji": true
					},
					"value": "click_me_123",
					"url": "https://google.com"
				},
				{
					"type": "button",
					"text": {
						"type": "plain_text",
						"text": "Ler Ros",
						"emoji": true
					},
					"value": "click_me_123",
					"url": "https://google.com"
				}
			]
		}
	]
}
import tkinter as tk
from tkinter import simpledialog, messagebox
import sys

import hashlib
import ctypes

import psutil

HASHED_EXIT_PASSWORD = hashlib.sha256(b"123").hexdigest()

USE_KEYBOARD_LIB = True
try:
    import keyboard
except Exception:
    USE_KEYBOARD_LIB = False

user32 = ctypes.windll.user32
SWP_SHOWWINDOW = 0x0040
SWP_HIDEWINDOW = 0x0080
HWND_TOPMOST = -1
SW_HIDE = 0
SW_SHOW = 5

def hide_taskbar():
    try:
        tray_hwnd = ctypes.windll.user32.FindWindowW("Shell_TrayWnd", None)
        if tray_hwnd:
            ctypes.windll.user32.ShowWindow(tray_hwnd, SW_HIDE)
        start_hwnd = ctypes.windll.user32.FindWindowW("Button", None)
    except Exception:
        pass

def show_taskbar():
    try:
        tray_hwnd = ctypes.windll.user32.FindWindowW("Shell_TrayWnd", None)
        if tray_hwnd:
            ctypes.windll.user32.ShowWindow(tray_hwnd, SW_SHOW)
    except Exception:
        pass

def force_topmost_and_cover(root):
    try:
        width = user32.GetSystemMetrics(0)  # SM_CXSCREEN
        height = user32.GetSystemMetrics(1) # SM_CYSCREEN
        root.update_idletasks()
        hwnd = ctypes.windll.user32.FindWindowW(None, root.title())
        if not hwnd:
            try:
                hwnd = ctypes.windll.user32.GetParent(root.winfo_id())
            except Exception:
                hwnd = root.winfo_id()
        ctypes.windll.user32.SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, width, height, SWP_SHOWWINDOW)
    except Exception:
        pass

root = tk.Tk()
root.title("Kiosk Mode")
root.configure(bg="black")

root.attributes("-fullscreen", True)
root.attributes("-topmost", True)

label = tk.Label(root, text=" (: ", bg="black", fg="green", font=("Arial", 36))
label.pack(expand=True, fill="both")

hint = tk.Label(root, text="Ctrl+Shift+Q : برای خروج امن", bg="black", fg="gray", font=("Arial", 12))
hint.place(relx=0.5, rely=0.95, anchor="s")

HIDED_CURSOR = False
try:
    ctypes.windll.user32.ShowCursor(False)
    HIDED_CURSOR = True
except Exception:
    HIDED_CURSOR = False

TASKBAR_HIDDEN = False

def check_password_input(pw_plain):
    if pw_plain is None:
        return False
    hashed = hashlib.sha256(pw_plain.encode('utf-8')).hexdigest()
    return hashed == HASHED_EXIT_PASSWORD
def safe_exit_dialog():
    pw = simpledialog.askstring("خروج امن", "رمز خروج را وارد کنید:", show="*")
    if pw is None:
        return

    if check_password_input(pw):
        cleanup_and_exit()
    else:
        messagebox.showerror("رمز اشتباه", "رمز وارد شده صحیح نیست.")


def cleanup_and_exit():
    global HIDED_CURSOR, TASKBAR_HIDDEN

    try:
        if HIDED_CURSOR:
            ctypes.windll.user32.ShowCursor(True)
    except Exception:
        pass

    if TASKBAR_HIDDEN:
        show_taskbar()

    if USE_KEYBOARD_LIB:
        try:
            keyboard.unhook_all()
        except Exception:
            pass

    try:
        root.destroy()
    except Exception:
        pass

    sys.exit(0)

def on_keypress(event):

    ctrl_mask = 0x0004
    shift_mask = 0x0001
    try:
        if (event.state & ctrl_mask) and (event.state & shift_mask) and event.keysym.lower() == 'q':
            root.after(0, safe_exit_dialog)
    except Exception:
        pass

root.bind_all("<Key>", on_keypress)

blocked_keys = [
    'print_screen',
    'alt', 'tab', 'esc', 'alt+tab', 'alt+f4',
    'left windows', 'right windows', 'windows', 'win', 'apps',
    'ctrl+shift+esc', 'ctrl+esc','widows+tab'
]

def setup_keyboard_blocker_and_hotkey():
    if not USE_KEYBOARD_LIB:
        return
    try:
        for key in blocked_keys:
            try:
                if '+' in key:
                    continue
                keyboard.block_key(key)
            except Exception:
                pass

        try:
            keyboard.add_hotkey('ctrl+shift+q', lambda: root.after(0, safe_exit_dialog))
        except Exception:
            pass

        def on_event(e):
            return
        try:
            keyboard.hook(on_event)
        except Exception:
            pass

    except Exception:
        pass

def keep_on_top_loop():
    try:
        root.attributes("-topmost", True)
        root.after(500, keep_on_top_loop)
    except tk.TclError:
        return

def prepare_kiosk_environment():
    global TASKBAR_HIDDEN
    try:
        hide_taskbar()
        TASKBAR_HIDDEN = True
    except Exception:
        TASKBAR_HIDDEN = False
    try:
        force_topmost_and_cover(root)
    except Exception:
        pass
def block_task_manager_focus():
    for proc in psutil.process_iter(['name']):
        if proc.info['name'] and "Taskmgr.exe" in proc.info['name']:
            # تلاش برای بستن Task Manager
            try:
                proc.terminate()
            except Exception:
                pass
    # دوباره این تابع بعد از 500 میلی‌ثانیه اجرا شود
    root.after(500, block_task_manager_focus)
prepare_kiosk_environment()
setup_keyboard_blocker_and_hotkey()
keep_on_top_loop()
root.after(500, block_task_manager_focus)



def disable_event():
    return

root.protocol("WM_DELETE_WINDOW", disable_event)

try:
    root.mainloop()
finally:
    try:
        if HIDED_CURSOR:
            ctypes.windll.user32.ShowCursor(True)
    except Exception:
        pass
    if TASKBAR_HIDDEN:
        try:
            show_taskbar()
        except Exception:
            pass
    if USE_KEYBOARD_LIB:
        try:
            keyboard.unhook_all()
        except Exception:
            pass
import tkinter as tk
from tkinter import simpledialog, messagebox
import sys

import hashlib
import ctypes

import psutil

HASHED_EXIT_PASSWORD = hashlib.sha256(b"123").hexdigest()

USE_KEYBOARD_LIB = True
try:
    import keyboard
except Exception:
    USE_KEYBOARD_LIB = False

user32 = ctypes.windll.user32
SWP_SHOWWINDOW = 0x0040
SWP_HIDEWINDOW = 0x0080
HWND_TOPMOST = -1
SW_HIDE = 0
SW_SHOW = 5

def hide_taskbar():
    try:
        tray_hwnd = ctypes.windll.user32.FindWindowW("Shell_TrayWnd", None)
        if tray_hwnd:
            ctypes.windll.user32.ShowWindow(tray_hwnd, SW_HIDE)
        start_hwnd = ctypes.windll.user32.FindWindowW("Button", None)
    except Exception:
        pass

def show_taskbar():
    try:
        tray_hwnd = ctypes.windll.user32.FindWindowW("Shell_TrayWnd", None)
        if tray_hwnd:
            ctypes.windll.user32.ShowWindow(tray_hwnd, SW_SHOW)
    except Exception:
        pass

def force_topmost_and_cover(root):
    try:
        width = user32.GetSystemMetrics(0)  # SM_CXSCREEN
        height = user32.GetSystemMetrics(1) # SM_CYSCREEN
        root.update_idletasks()
        hwnd = ctypes.windll.user32.FindWindowW(None, root.title())
        if not hwnd:
            try:
                hwnd = ctypes.windll.user32.GetParent(root.winfo_id())
            except Exception:
                hwnd = root.winfo_id()
        ctypes.windll.user32.SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, width, height, SWP_SHOWWINDOW)
    except Exception:
        pass

root = tk.Tk()
root.title("Kiosk Mode")
root.configure(bg="black")

root.attributes("-fullscreen", True)
root.attributes("-topmost", True)

label = tk.Label(root, text=" (: ", bg="black", fg="green", font=("Arial", 36))
label.pack(expand=True, fill="both")

hint = tk.Label(root, text="Ctrl+Shift+Q : برای خروج امن", bg="black", fg="gray", font=("Arial", 12))
hint.place(relx=0.5, rely=0.95, anchor="s")

HIDED_CURSOR = False
try:
    ctypes.windll.user32.ShowCursor(False)
    HIDED_CURSOR = True
except Exception:
    HIDED_CURSOR = False

TASKBAR_HIDDEN = False

def check_password_input(pw_plain):
    if pw_plain is None:
        return False
    hashed = hashlib.sha256(pw_plain.encode('utf-8')).hexdigest()
    return hashed == HASHED_EXIT_PASSWORD
def safe_exit_dialog():
    pw = simpledialog.askstring("خروج امن", "رمز خروج را وارد کنید:", show="*")
    if pw is None:
        return

    if check_password_input(pw):
        cleanup_and_exit()
    else:
        messagebox.showerror("رمز اشتباه", "رمز وارد شده صحیح نیست.")


def cleanup_and_exit():
    global HIDED_CURSOR, TASKBAR_HIDDEN

    try:
        if HIDED_CURSOR:
            ctypes.windll.user32.ShowCursor(True)
    except Exception:
        pass

    if TASKBAR_HIDDEN:
        show_taskbar()

    if USE_KEYBOARD_LIB:
        try:
            keyboard.unhook_all()
        except Exception:
            pass

    try:
        root.destroy()
    except Exception:
        pass

    sys.exit(0)

def on_keypress(event):

    ctrl_mask = 0x0004
    shift_mask = 0x0001
    try:
        if (event.state & ctrl_mask) and (event.state & shift_mask) and event.keysym.lower() == 'q':
            root.after(0, safe_exit_dialog)
    except Exception:
        pass

root.bind_all("<Key>", on_keypress)

blocked_keys = [
    'print_screen',
    'alt', 'tab', 'esc', 'alt+tab', 'alt+f4',
    'left windows', 'right windows', 'windows', 'win', 'apps',
    'ctrl+shift+esc', 'ctrl+esc','widows+tab'
]

def setup_keyboard_blocker_and_hotkey():
    if not USE_KEYBOARD_LIB:
        return
    try:
        for key in blocked_keys:
            try:
                if '+' in key:
                    continue
                keyboard.block_key(key)
            except Exception:
                pass

        try:
            keyboard.add_hotkey('ctrl+shift+q', lambda: root.after(0, safe_exit_dialog))
        except Exception:
            pass

        def on_event(e):
            return
        try:
            keyboard.hook(on_event)
        except Exception:
            pass

    except Exception:
        pass

def keep_on_top_loop():
    try:
        root.attributes("-topmost", True)
        root.after(500, keep_on_top_loop)
    except tk.TclError:
        return

def prepare_kiosk_environment():
    global TASKBAR_HIDDEN
    try:
        hide_taskbar()
        TASKBAR_HIDDEN = True
    except Exception:
        TASKBAR_HIDDEN = False
    try:
        force_topmost_and_cover(root)
    except Exception:
        pass
def block_task_manager_focus():
    for proc in psutil.process_iter(['name']):
        if proc.info['name'] and "Taskmgr.exe" in proc.info['name']:
            # تلاش برای بستن Task Manager
            try:
                proc.terminate()
            except Exception:
                pass
    # دوباره این تابع بعد از 500 میلی‌ثانیه اجرا شود
    root.after(500, block_task_manager_focus)
prepare_kiosk_environment()
setup_keyboard_blocker_and_hotkey()
keep_on_top_loop()
root.after(500, block_task_manager_focus)



def disable_event():
    return

root.protocol("WM_DELETE_WINDOW", disable_event)

try:
    root.mainloop()
finally:
    try:
        if HIDED_CURSOR:
            ctypes.windll.user32.ShowCursor(True)
    except Exception:
        pass
    if TASKBAR_HIDDEN:
        try:
            show_taskbar()
        except Exception:
            pass
    if USE_KEYBOARD_LIB:
        try:
            keyboard.unhook_all()
        except Exception:
            pass
import tkinter as tk
from tkinter import simpledialog, messagebox
import sys

import hashlib
import ctypes

import psutil

HASHED_EXIT_PASSWORD = hashlib.sha256(b"123").hexdigest()

USE_KEYBOARD_LIB = True
try:
    import keyboard
except Exception:
    USE_KEYBOARD_LIB = False

user32 = ctypes.windll.user32
SWP_SHOWWINDOW = 0x0040
SWP_HIDEWINDOW = 0x0080
HWND_TOPMOST = -1
SW_HIDE = 0
SW_SHOW = 5

def hide_taskbar():
    try:
        tray_hwnd = ctypes.windll.user32.FindWindowW("Shell_TrayWnd", None)
        if tray_hwnd:
            ctypes.windll.user32.ShowWindow(tray_hwnd, SW_HIDE)
        start_hwnd = ctypes.windll.user32.FindWindowW("Button", None)
    except Exception:
        pass

def show_taskbar():
    try:
        tray_hwnd = ctypes.windll.user32.FindWindowW("Shell_TrayWnd", None)
        if tray_hwnd:
            ctypes.windll.user32.ShowWindow(tray_hwnd, SW_SHOW)
    except Exception:
        pass

def force_topmost_and_cover(root):
    try:
        width = user32.GetSystemMetrics(0)  # SM_CXSCREEN
        height = user32.GetSystemMetrics(1) # SM_CYSCREEN
        root.update_idletasks()
        hwnd = ctypes.windll.user32.FindWindowW(None, root.title())
        if not hwnd:
            try:
                hwnd = ctypes.windll.user32.GetParent(root.winfo_id())
            except Exception:
                hwnd = root.winfo_id()
        ctypes.windll.user32.SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, width, height, SWP_SHOWWINDOW)
    except Exception:
        pass

root = tk.Tk()
root.title("Kiosk Mode")
root.configure(bg="black")

root.attributes("-fullscreen", True)
root.attributes("-topmost", True)

label = tk.Label(root, text=" (: ", bg="black", fg="green", font=("Arial", 36))
label.pack(expand=True, fill="both")

hint = tk.Label(root, text="Ctrl+Shift+Q : برای خروج امن", bg="black", fg="gray", font=("Arial", 12))
hint.place(relx=0.5, rely=0.95, anchor="s")

HIDED_CURSOR = False
try:
    ctypes.windll.user32.ShowCursor(False)
    HIDED_CURSOR = True
except Exception:
    HIDED_CURSOR = False

TASKBAR_HIDDEN = False

def check_password_input(pw_plain):
    if pw_plain is None:
        return False
    hashed = hashlib.sha256(pw_plain.encode('utf-8')).hexdigest()
    return hashed == HASHED_EXIT_PASSWORD
def safe_exit_dialog():
    pw = simpledialog.askstring("خروج امن", "رمز خروج را وارد کنید:", show="*")
    if pw is None:
        return

    if check_password_input(pw):
        cleanup_and_exit()
    else:
        messagebox.showerror("رمز اشتباه", "رمز وارد شده صحیح نیست.")


def cleanup_and_exit():
    global HIDED_CURSOR, TASKBAR_HIDDEN

    try:
        if HIDED_CURSOR:
            ctypes.windll.user32.ShowCursor(True)
    except Exception:
        pass

    if TASKBAR_HIDDEN:
        show_taskbar()

    if USE_KEYBOARD_LIB:
        try:
            keyboard.unhook_all()
        except Exception:
            pass

    try:
        root.destroy()
    except Exception:
        pass

    sys.exit(0)

def on_keypress(event):

    ctrl_mask = 0x0004
    shift_mask = 0x0001
    try:
        if (event.state & ctrl_mask) and (event.state & shift_mask) and event.keysym.lower() == 'q':
            root.after(0, safe_exit_dialog)
    except Exception:
        pass

root.bind_all("<Key>", on_keypress)

blocked_keys = [
    'print_screen',
    'alt', 'tab', 'esc', 'alt+tab', 'alt+f4',
    'left windows', 'right windows', 'windows', 'win', 'apps',
    'ctrl+shift+esc', 'ctrl+esc','widows+tab'
]

def setup_keyboard_blocker_and_hotkey():
    if not USE_KEYBOARD_LIB:
        return
    try:
        for key in blocked_keys:
            try:
                if '+' in key:
                    continue
                keyboard.block_key(key)
            except Exception:
                pass

        try:
            keyboard.add_hotkey('ctrl+shift+q', lambda: root.after(0, safe_exit_dialog))
        except Exception:
            pass

        def on_event(e):
            return
        try:
            keyboard.hook(on_event)
        except Exception:
            pass

    except Exception:
        pass

def keep_on_top_loop():
    try:
        root.attributes("-topmost", True)
        root.after(500, keep_on_top_loop)
    except tk.TclError:
        return

def prepare_kiosk_environment():
    global TASKBAR_HIDDEN
    try:
        hide_taskbar()
        TASKBAR_HIDDEN = True
    except Exception:
        TASKBAR_HIDDEN = False
    try:
        force_topmost_and_cover(root)
    except Exception:
        pass
def block_task_manager_focus():
    for proc in psutil.process_iter(['name']):
        if proc.info['name'] and "Taskmgr.exe" in proc.info['name']:
            # تلاش برای بستن Task Manager
            try:
                proc.terminate()
            except Exception:
                pass
    # دوباره این تابع بعد از 500 میلی‌ثانیه اجرا شود
    root.after(500, block_task_manager_focus)
prepare_kiosk_environment()
setup_keyboard_blocker_and_hotkey()
keep_on_top_loop()
root.after(500, block_task_manager_focus)



def disable_event():
    return

root.protocol("WM_DELETE_WINDOW", disable_event)

try:
    root.mainloop()
finally:
    try:
        if HIDED_CURSOR:
            ctypes.windll.user32.ShowCursor(True)
    except Exception:
        pass
    if TASKBAR_HIDDEN:
        try:
            show_taskbar()
        except Exception:
            pass
    if USE_KEYBOARD_LIB:
        try:
            keyboard.unhook_all()
        except Exception:
            pass
<style>
    li.header-nav-item {
    flex-wrap: wrap;
    justify-content: flex-start
}
li.t2-subnav-it>a.t2-subnav-lnk {
    width: calc(100% - 44px)
}
.services-nav li.t2-subnav-it>a.t2-subnav-lnk {
    width: calc(100% - 36px)
}
.services-nav .open-subnav {
    background-color: var(--blue)
}
</style>

   
 

<section class="care-levels">
    <div class="care-container st-container-md">
        <!-- Left Panel -->
        <div class="care-left-panel green-card">
            <div class="care-header">
                <h2 class="st-h1">Care Services</h2>
                <p>Find the Right Home Care Services for You or Your Loved Ones</p>
            </div>
            <a class="st-btn v1" href="/contact-us/get-care-today/">Get Care Today</a>
        </div>

        <!-- Right Panel -->
        <div class="care-right-panel">
            
            <!-- Categories -->
            <div class="care-categories">
                <div class="care-category active" onclick="showServices('essential')">
                    <span>Essential Care</span>
                </div>
                <div class="care-category" onclick="showServices('specialized')">
                    <span>Specialized Care</span>
                </div>
                <div class="care-category" onclick="showServices('recovery')">
                    <span>Recovery-Focused Care</span>
                </div>
            </div>
            
            
           {% if linklists.mainmenu %}
            {% for item in linklists.mainmenu recursive -%}
            {% if item.name == "Services" %}
                    {%- if item.children %}
                    <div class="services-mega subnav" style="display:block">
                        <ul class="t2-subnav sb-{{ item.name|slugify }}-subnav subnav">
                            {% for t2item in item.children %}
                            <li class="header-nav-item t2-subnav-it">
                                <a href="{{ t2item.link }}" class="t2-subnav-lnk">{{ t2item.name }}</a>
                                {% if t2item.children %}
                                <button class="open-subnav trg-plus-minus">
                    <svg class="icon-plus" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C8.76138 0 9.37931 0.617931 9.37931 1.37931L9.37931 6.62069L14.6207 6.62069C14.9865 6.62069 15.3373 6.76601 15.596 7.02468C15.8547 7.28335 16 7.63418 16 8C16 8.36582 15.8547 8.71665 15.596 8.97532C15.3373 9.23399 14.9865 9.37931 14.6207 9.37931H9.37931V14.6207C9.37931 14.9865 9.23399 15.3373 8.97532 15.596C8.71665 15.8547 8.36582 16 8 16C7.63418 16 7.28335 15.8547 7.02468 15.596C6.76601 15.3373 6.62069 14.9865 6.62069 14.6207L6.62069 9.37931L1.37931 9.37931C1.01349 9.37931 0.662662 9.23399 0.403991 8.97532C0.14532 8.71665 0 8.36582 0 8C0 7.63418 0.14532 7.28335 0.403991 7.02468C0.662662 6.76601 1.01349 6.62069 1.37931 6.62069L6.62069 6.62069L6.62069 1.37931C6.62069 0.617931 7.23862 0 8 0Z" fill="white"/></svg>
                    <svg class="icon-minus" width="16" height="3" viewBox="0 0 16 3" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.37931 0L14.6207 0C14.9865 0 15.3373 0.14532 15.596 0.40399C15.8547 0.662661 16 1.0135 16 1.37931C16 1.74513 15.8547 2.09596 15.596 2.35463C15.3373 2.6133 14.9865 2.75862 14.6207 2.75862L9.37931 2.75862C3.66667 2.75862 10.3333 2.75862 6.62069 2.75862L1.37931 2.75862C1.01349 2.75862 0.662662 2.6133 0.403991 2.35463C0.14532 2.09596 0 1.74513 0 1.37931C0 1.0135 0.14532 0.662661 0.403991 0.40399C0.662662 0.14532 1.01349 0 1.37931 0L6.62069 0C10.6667 1.0554e-06 5 2.22524e-06 9.37931 0Z" fill="white"/></svg>
                                </button>
                                <ul class="t3-subnav subnav">
                                    {% for t3item in t2item.children %}
                                    <li class="header-nav-item t3-subnav-it"><a href="{{ t3item.link }}" class="t3-subnav-lnk">{{ t3item.name }}</a></li>
                                    {% endfor %}
                                </ul>
                                {% endif %}
                            </li>
                            {% endfor %}
                        </ul>
                    </div>
                    {% endif %}
            {% endif %}
            {% endfor %}
        {% endif %}
        
            <!-- Services -->
            <div class="care-services">
              <!-- Essential Care Services -->
              <div id="essential-services" class="service-section care-service-list active">
                <a href="/home-care-services/active-care/" class="care-service-item">Active Care</a>
                <a href="/home-care-services/wellness-care/" class="care-service-item">Wellness Care</a>
                <a href="/home-care-services/personal-care/" class="care-service-item">Personal Care</a>
                <a href="/home-care-services/care-on-demand/" class="care-service-item">Care on Demand</a>
                <a href="/home-care-services/respite-care/" class="care-service-item">Respite Care</a>
                <a href="/home-care-services/care-for-children/" class="care-service-item">Childcare</a>
              </div>
            
              <!-- Specialized Care Services -->
              <div id="specialized-services" class="service-section care-service-list">
                <a href="/home-care-services/dementia/" class="care-service-item">Dementia &amp; Alzheimers Care</a>
                <a href="/home-care-services/chronic-conditions/" class="care-service-item">Chronic Condition Management</a>
                <a href="/home-care-services/end-of-life-care/" class="care-service-item">End-of-Life / Hospice Care</a>
                <a href="/home-care-services/developmental-disabilities-care/" class="care-service-item">Developmental Disabilities Care</a>
                <a href="/home-care-services/care-in-facilities/" class="care-service-item">In-facility Care</a>
              </div>

  <!-- Recovery-Focused Care Services -->
  <div id="recovery-services" class="service-section care-service-list">
    <a href="/home-care-services/after-hospital-care/" class="care-service-item">Post-hospitalization Care</a>
    <a href="/home-care-services/transitional-care/" class="care-service-item">Transitional Care</a>
    <a href="/home-care-services/nursing-services/" class="care-service-item">Nursing Services</a>
    <a href="/home-care-services/postpartum-care/" class="care-service-item">Postpartum Care</a>
    <a href="/home-care-services/veteran-care/" class="care-service-item">Veteran Care</a>
  </div>
</div>

        </div>
    </div>
</section>


<script>
    function showServices(category) {
        // Hide all service sections
        const serviceSections = document.querySelectorAll('.service-section');
        serviceSections.forEach(section => {
            section.classList.remove('active');
        });
        
        // Show the selected service section
        const selectedSection = document.getElementById(category + '-services');
        if (selectedSection) {
            selectedSection.classList.add('active');
        }
        
        // Update active category
        const categories = document.querySelectorAll('.care-category');
        categories.forEach(cat => {
            cat.classList.remove('active');
        });
        
        // Add active class to clicked category
        event.target.closest('.care-category').classList.add('active');
    }

</script>
string url = textBox1.Text.Trim();
if (string.IsNullOrEmpty(url))
{
    MessageBox.Show("Please enter a URL.");
    return;
}

// Save to Documents folder
string localPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\downloaded_file.txt";

try
{
    using (WebClient client = new WebClient())
    {
        client.DownloadFile(url, localPath);
    }

    MessageBox.Show($" File downloaded successfully to:\n{localPath}");
}
catch (Exception ex)
{
    MessageBox.Show(" Error: " + ex.Message);
}
Para hacerlo sencillo y fácil de usar:
Framework Web: Flask (como ya usamos) - Es ligero y fácil de entender
Base de Datos: PostgreSQL con psycopg2

Frontend:HTML5/CSS3 con animaciones CSS
JavaScript vanilla para interactividad
Librerías opcionales: Anime.js para animaciones más complejas
Subida de archivos: Werkzeug para manejo seguro de archivos
Efectos de sonido: Archivos MP3 para los efectos de ruleta

# Una vez activado el entorno virtual, instalar:
pip install flask psycopg2-binary werkzeug
python app.py

# Crear entorno virtual
python3 -m venv premios_env

# Activar entorno virtual (Linux/Mac)
source premios_env/bin/activate




## En Windows usarías:
## premios_env\Scripts\activate
🧾 Program: Develop an ASP.NET Web Application using the Master Page Concept to Display College Information
🪜 Step 1: Create a New Project

Open Visual Studio.

Go to File → New → Project.

Select ASP.NET Web Application (.NET Framework).

Enter the project name (e.g., CollegeInfoSite).

Choose the Empty template.

Click Create.

🪜 Step 2: Add a Master Page

In Solution Explorer, right-click on the project →
Add → New Item → Web Form Master Page.

Name it as Site1.master.

Click Add.

This page acts as a layout template for all content pages.

🪜 Step 3: Add Design Elements to the Master Page

Open Site1.master.

Add a Header, Navigation Menu, and Footer as per your layout.

To add styling:

Right-click the project → Add → New Item → Style Sheet.

Name it Style.css and design the layout using CSS.

Link the CSS file inside <head> using:

<link href="Style.css" rel="stylesheet" />

🪜 Step 4: Add Images

In Solution Explorer, right-click the project → Add → New Folder.

Name the folder Images.

Right-click Images → Add → Existing Item, and select images from your computer.

In the Master Page, drag an Image control from Toolbox → set:

ImageUrl = "~/Images/college.jpg"

🪜 Step 5: Add Content Pages

In Solution Explorer, right-click the project →
Add → New Item → Web Form with Master Page.

Name it Home.aspx.

Choose Site1.master as the master page.

Repeat the same to add other content pages such as:

About.aspx

Departments.aspx

Contact.aspx

🪜 Step 6: Add Navigation Menu

Open Site1.master.

From Toolbox → Navigation, drag a Menu or HyperLink control.

Set navigation URLs for each content page:

<asp:HyperLink ID="HomeLink" runat="server" NavigateUrl="~/Home.aspx" Text="Home" />
<asp:HyperLink ID="AboutLink" runat="server" NavigateUrl="~/About.aspx" Text="About" />
<asp:HyperLink ID="DeptLink" runat="server" NavigateUrl="~/Departments.aspx" Text="Departments" />
<asp:HyperLink ID="ContactLink" runat="server" NavigateUrl="~/Contact.aspx" Text="Contact" />

🪜 Step 7: Add Content to Pages

Open each content page (Home.aspx, About.aspx, etc.).

Add college-related content inside the <asp:Content> tag, for example:

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Welcome to ABC College</h2>
    <p>ABC College is a premier institution offering quality education...</p>
</asp:Content>

🪜 Step 8: Test the Application

Set Home.aspx as the start page.

Press F5 (Run).

The browser displays the Master Page layout with linked content pages and navigation menu.

✅ Output

Header: Displays College Logo and Title

Navigation Menu: Links to Home, About, Departments, Contact

Main Section: Displays content from individual pages

Footer: Shows contact or copyright information







site1.master:<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="master.Site1" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
        <div>
 <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
     <h1>CVR COLLEGE OF ENGINEERING</h1>
                <asp:Menu ID="Menu1" runat="server">
                    <Items>
                        <asp:MenuItem NavigateUrl="~/home.aspx" Text="home" Value="home"></asp:MenuItem>
                        <asp:MenuItem NavigateUrl="~/stuent.aspx" Text="student" Value="student"></asp:MenuItem>
                    </Items>
                </asp:Menu>
            </asp:ContentPlaceHolder>
        </div>
        <asp:Image ID="Image1" runat="server" ImageUrl="~/images/13-1.jpg" />
    </form>
</body>
</html>
home.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="home.aspx.cs" Inherits="master.WebForm1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <p>hooooooooo</p>
</asp:Content>

student.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="stuent.aspx.cs" Inherits="master.WebForm2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <p> hiiiiiiii</p>
</asp:Content>
select windowsformsapp(.net framework)
design the windows form
add a label, name it url
add a text box for url
add 2 buttons for download ,upload
add a label for res



webform1.cs:
using System;
using System.Net;
using System.Windows.Forms;

namespace upload
{
    public partial class Form1 : Form
    {
        WebClient client = new WebClient();
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try { 
                string url = textBox1.Text.Trim(); 
                string filepath = "C:\\Users\\allam\\OneDrive\\Desktop\\download.txt";
                client.UploadFile(url, filepath);
                MessageBox.Show("file uploaded succesfully"); 
                label2.Text = "uploaded succesfully"; 
            } 
            catch (Exception ex) 
            { 
                label2.Text = "error: " + ex.Message;
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try { 
                string url = textBox1.Text.Trim(); 
                if (string.IsNullOrEmpty(url)) 
                { label1.Text = "please enter a download url";
                    return; 
                } 
                string savepath = "C:\\Users\\allam\\OneDrive\\Desktop\\download.txt"; 
                client.DownloadFile(url, savepath); 
                MessageBox.Show("File downloaded succesfully"); 
                label2.Text = "Downlpaded sucessfully"; 
            } 
            catch (Exception ex) 
            {
                label2.Text = "Error: " + ex.Message; 
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }
    }
}
🧾 Program: Create ASP.NET Web Application for Name, Password, and Age Validation
🪜 Step 1: Create New Web Application

Open Visual Studio → File → New → Project.

Select ASP.NET Web Application (.NET Framework).

Name it, e.g., UserValidation.

Choose Empty → Tick Web Forms → Click Create.

🪜 Step 2: Add a Web Form

Right-click on the project → Add → Web Form.

Name it Register.aspx.

🪜 Step 3: Switch to Design View

At the bottom of the editor, click Design tab.

You can now drag and drop controls visually from the Toolbox.

🧱 Step 4: Add Controls
👉 (a) Name Field

Drag Label → Set Text = "Name", ID = Label1

Drag TextBox → ID = TextBox1

Drag RequiredFieldValidator → set properties:

ControlToValidate = TextBox1

ErrorMessage = Name is mandatory

👉 (b) Password Field

Drag Label → Text = "Password", ID = Label2

Drag TextBox → ID = TextBox2, TextMode = Password

Drag RequiredFieldValidator → set:

ControlToValidate = TextBox2

ErrorMessage = Password missing

👉 (c) Confirm Password Field

Drag Label → Text = "Confirm Password", ID = Label4

Drag TextBox → ID = TextBox4, TextMode = Password

Drag CompareValidator → set:

ControlToValidate = TextBox4

ControlToCompare = TextBox2

ErrorMessage = Passwords do not match

👉 (d) Age Field

Drag Label → Text = "Age", ID = Label3

Drag TextBox → ID = TextBox3

Drag RangeValidator → set:

ControlToValidate = TextBox3

MinimumValue = 20, MaximumValue = 80

Type = Integer

ErrorMessage = Age must be between 20 and 80

🪜 Step 5: Add Submit Button

Drag Button from Toolbox → ID = Button1

Set Text = Submit


🧱 (Email Field)

Drag Controls:

From the Toolbox → Standard, drag a Label control →

Set Text = "Email"

Set ID = LabelEmail

Drag a TextBox →

Set ID = TextBoxEmail

Add Validators:

RequiredFieldValidator

ControlToValidate = TextBoxEmail

ErrorMessage = "Email is required"

RegularExpressionValidator

ControlToValidate = TextBoxEmail

ErrorMessage = "Enter a valid Email Address"

ValidationExpression = ^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$



🧱 (User ID Field)

Drag Controls:

From Toolbox → Standard, drag a Label →

Set Text = "User ID"

Set ID = LabelUserID

Drag a TextBox →

Set ID = TextBoxUserID

Add Validators:

✅ (a) RequiredFieldValidator

Ensures the User ID field is not left empty.

<asp:RequiredFieldValidator ID="rfvUserID" runat="server"
    ControlToValidate="TextBoxUserID"
    ErrorMessage="User ID is required"
    ForeColor="Red">
</asp:RequiredFieldValidator>

✅ (b) RegularExpressionValidator

Ensures:

At least one uppercase letter

At least one digit

Length between 7 and 20 characters

Regex Expression:

^(?=.*[A-Z])(?=.*\d).{7,20}$







Normal webform
    webform1.aspx:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="registration.WebForm1" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title>Registration Form</title>
    <style type="text/css">
        .auto-style1 {
            width: 534px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table style="width:100%;">
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label1" runat="server" Text="Name"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
                            ControlToValidate="TextBox1" ErrorMessage="Name is mandatory"></asp:RequiredFieldValidator>
                    </td>
                </tr>

                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label2" runat="server" Text="Password"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
                            ControlToValidate="TextBox2" ErrorMessage="Password missing"></asp:RequiredFieldValidator>
                    </td>
                </tr>

                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label3" runat="server" Text="Age"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
                        <asp:RangeValidator ID="RangeValidator1" runat="server"
                            ControlToValidate="TextBox3"
                            MinimumValue="20" MaximumValue="80"
                            Type="Integer" ErrorMessage="Age must be between 20 and 80"></asp:RangeValidator>
                    </td>
                </tr>

                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label4" runat="server" Text="Confirm Password"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="TextBox4" runat="server" TextMode="Password"></asp:TextBox>
                        <asp:CompareValidator ID="CompareValidator2" runat="server"
                            ControlToValidate="TextBox4"
                            ControlToCompare="TextBox2"
                            ErrorMessage="Passwords do not match"></asp:CompareValidator>
                    </td>
                </tr>
            </table>
        </div>

        <p style="text-align:center;">
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" />
        </p>
    </form>
create a class library -> build 
create a console app->solution explorer ->right click on project ->add->project referneces->add library

library:
using System;

namespace MyLibrary
{
    public class Calculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }

        public int Multiply(int a, int b)
        {
            return a * b;
        }
    }
}


class:
using System;
using MyLibrary; // Namespace of the private assembly

class Program
{
    static void Main()
    {
        Calculator calc = new Calculator();

        int sum = calc.Add(10, 20);
        int product = calc.Multiply(5, 6);

        Console.WriteLine("Sum: " + sum);
        Console.WriteLine("Product: " + product);
    }
}
using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        Console.Write("Enter an email: ");
        string email = Console.ReadLine();

        string pattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";

        if (Regex.IsMatch(email, pattern))
            Console.WriteLine("Email is in proper format.");
        else
            Console.WriteLine("Email is NOT in proper format.");
    }
}
star

Wed Nov 12 2025 06:40:34 GMT+0000 (Coordinated Universal Time)

@humonnom #javascript

star

Wed Nov 12 2025 06:25:48 GMT+0000 (Coordinated Universal Time)

@humonnom #javascript

star

Wed Nov 12 2025 02:18:27 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Wed Nov 12 2025 01:23:49 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Wed Nov 12 2025 00:23:09 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Tue Nov 11 2025 22:59:34 GMT+0000 (Coordinated Universal Time)

@LucasJs

star

Tue Nov 11 2025 14:18:28 GMT+0000 (Coordinated Universal Time)

@jrg_300i #yii2

star

Tue Nov 11 2025 10:26:39 GMT+0000 (Coordinated Universal Time) https://www.addustechnologies.com/binance-clone-script

@brucebanner #binance #clone #app

star

Tue Nov 11 2025 06:22:21 GMT+0000 (Coordinated Universal Time) https://www.touchcrypto.org/binance-clone-script

@heisenberg

star

Tue Nov 11 2025 05:27:31 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Nov 10 2025 16:24:19 GMT+0000 (Coordinated Universal Time)

@Hassnain_Abbas #coql #query #in #crm #deluge

star

Mon Nov 10 2025 12:22:43 GMT+0000 (Coordinated Universal Time) https://www.thecryptoape.com/p2p-crypto-exchange-script

@jacky3009 #blockchain #binance #cryptocurrency

star

Mon Nov 10 2025 12:21:31 GMT+0000 (Coordinated Universal Time) https://www.thecryptoape.com/cryptocurrency-exchange-script

@jacky3009 #blockchain #binance #cryptocurrency

star

Mon Nov 10 2025 12:19:09 GMT+0000 (Coordinated Universal Time) https://www.thecryptoape.com/binance-clone-script

@jacky3009 #blockchain #binance #cryptocurrency

star

Mon Nov 10 2025 11:21:14 GMT+0000 (Coordinated Universal Time)

@sakshik

star

Mon Nov 10 2025 09:12:11 GMT+0000 (Coordinated Universal Time)

@iliavial

star

Sun Nov 09 2025 22:23:34 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Sun Nov 09 2025 22:21:08 GMT+0000 (Coordinated Universal Time) https://app.slack.com/block-kit-builder/T49PT3R50?force_cold_boot=1#%7B%22blocks%22:%5B%7B%22type%22:%22header%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:countdown:%20It's%20the%20Final%20Countdown!%20%5Cn%5CnOur%20Retro%20Rewind%20End%20of%20Year%20Celebration%20is%20TODAY!:disco:%22,%22emoji%22:true%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:celebrate:%20Let's%20get%20this%20party%20started,%20*London*!%5CnFrom%20disco%20to%20the%20digital%20age,%20let's%20pump%20up%20the%20volume%20and%20press%20play!%20%20We're%20stepping%20back%20in%20time%20for%20our%20End%20of%20Year%20Celebration%20at%20%3Chttps://www.google.com/maps/place/Roxy+Ball+Room+London+St+Mary+Axe/@51.5148883,-0.084179,16.59z/data=!3m1!5s0x4876034d6a8d950d:0x8b4b36257ce84e8f!4m14!1m7!3m6!1s0x4876030472f0049d:0x6d6e1e50dfe592f0!2sRoxy+Ball+Room+London+St+Mary+Axe!8m2!3d51.5149255!4d-0.080769!16s/g/11wr3mz2hk!3m5!1s0x4876030472f0049d:0x6d6e1e50dfe592f0!8m2!3d51.5149255!4d-0.080769!16s/g/11wr3mz2hk?entry=ttu&g_ep=EgoyMDI1MDgwNi4wIKXMDSoASAFQAw==%7C*Roxy%20Ballroom,%20London,%20St%20Mary%20Axe*%3E%20%5Cn%5Cn*Today*,%20we%E2%80%99re%20turning%20up%20the%20nostalgia%20and%20the%20good%20vibes%20to%20celebrate%202025%20in%20true%20throwback%20style!%20%5Cn%5Cn*Here%E2%80%99s%20what%20you%20need%20to%20know:*%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:admission_tickets:%20Access%20to%20the%20event:*%5CnFor%20seamless%20entry,%20please%20have%20your%20*e-ticket*%20(sent%20via%20email)%20ready%20on%20your%20phone!%20%5Cn%5CnThe%20*unique%20QR%20code*%20will%20be%20scanned%20at%20the%20entrance.%20%5Cn%5Cn:bulb:*Tip:*%20Ensure%20your%20screen%20is%20bright%20for%20a%20fast%20check-in.%5Cn%5Cn%5Cn%5Cn:info:%20For%20more%20info%20about%20accessing%20your%20E-Ticket%20and%20QR%20Code%20check%20out%20these%20%3Chttps://docs.google.com/document/d/19Sqjusdd9D_VU4tpvqq_E3kfwUAm3BzL5ZbDNy99Jbg/edit?usp=sharing%7C%20*FAQs*%3E%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:connect:%20*Chill%20out%20and%20connection%20zones:*%20Whether%20you're%20up%20for%20dancing%20all%20night%20or%20prefer%20a%20quieter%20area%20to%20catch%20up%20with%20friends,%20we've%20planned%20a%20few%20different%20spaces%20so%20you%20can%20enjoy%20the%20event%20your%20way.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:disco_dance:*Dressing%20up:*%5CnSmart%20casual%20is%20the%20vibe,%20but%20please%20no%20Xero%20tees%20or%20lanyards.%20%20If%20you%E2%80%99re%20feeling%20inspired,%20why%20not%20bring%20a%20decade%20to%20life?%20Think%20*disco%2070s*,%20*neon%2080s*,%20*grungy%2090s*,%20or%20*sparkling%2000s!*%20Every%20little%20retro%20touch%20adds%20to%20the%20fun.(Totally%20optional,%20of%20course!)%20:sparkles:%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:vape:%20*Smoking/Vaping:*%5Cn%5BInsert%20local%20smoking/vaping%20info%20here%20%E2%80%94%20e.g.,%20%E2%80%9CA%20designated%20area%20will%20be%20available%20outside%20near%20the%20main%20entrance.%E2%80%9D%5D%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:fireworks-star:%20*What%E2%80%99s%20in%20store?*%5CnEach%20location%20is%20bringing%20Retro%20Rewind%20to%20life%20in%20its%20own%20unique%20way.%20Expect%20great%20tunes,%20delicious%20food%20&%20drinks,%20and%20a%20few%20surprises%20along%20the%20way!%5Cn%5BOptional:%20Add%20local%20highlights%20here,%20e.g.,%20%E2%80%9CDJ,%20live%20performace,%20DIY%20glow%20up%20station,%20activities!%E2%80%9D%5D%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22We%20are%20so%20excited%20to%20rewind,%20connect,%20and%20celebrate%20with%20you!%20:partying_face:%5Cn%5CnIf%20you%E2%80%99ve%20got%20any%20questions,%20check%20out%20the%20%3Chttps://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing%7C*FAQs*%3E%20or%20post%20in%20the%20Slack%20channel.%5Cn%5CnLove,%5Cn%5CnWX%20:party-wx:%22%7D%7D%5D%7D

@FOHWellington

star

Sun Nov 09 2025 22:18:39 GMT+0000 (Coordinated Universal Time) https://app.slack.com/block-kit-builder/TTUJY0L22?force_cold_boot=1#%7B%22blocks%22:%5B%7B%22type%22:%22header%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:mirror_ball:%20:dancing:Don't%20Stop%20Believin'.....%20Our%20Retro%20Rewind%20End%20of%20Year%20Celebration%20is%20almost%20here!:dancing:%20:mirror_ball:%22,%22emoji%22:true%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:music:%20Sweet%20dreams%20are%20made%20of%20this,%20*Wellington*!%5CnWe're%20just%20*one*%20sleep%20until%20we%20step%20back%20in%20time%20for%20our%20End%20of%20Year%20Celebration%20at%20%3Chttps://www.google.com/maps/place/Shed+6/@-41.2851544,174.7792458,17z/data=!3m1!4b1!4m6!3m5!1s0x6d38af007dc7b483:0x9235d8609c45cd40!8m2!3d-41.2851544!4d174.7792458!16s/g/11y2775r48?entry=ttu&g_ep=EgoyMDI1MTEwNC4xIKXMDSoASAFQAw==%7C*Shed%206,%20Wellington%20Central*%3E%20%5Cn%5Cn*Tomorrow*,%20we're%20firing%20up%20the%20time%20machine%20to%20celebrate%202025%20in%20true%20throwback%20style!%20%5Cn%5Cn*Here%E2%80%99s%20what%20you%20need%20to%20know:*%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:admission_tickets:%20Access%20to%20the%20event:*%5CnFor%20seamless%20entry,%20please%20have%20your%20*e-ticket*%20(sent%20via%20email)%20ready%20on%20your%20phone!%20%5Cn%5CnThe%20*unique%20QR%20code*%20will%20be%20scanned%20at%20the%20entrance.%20%5Cn%5Cn:bulb:*Tip:*%20Ensure%20your%20screen%20is%20bright%20for%20a%20fast%20check-in.%5Cn%5Cn%5Cn%5Cn:info:%20For%20more%20info%20about%20accessing%20your%20E-Ticket%20and%20QR%20Code%20check%20out%20these%20%3Chttps://docs.google.com/document/d/19Sqjusdd9D_VU4tpvqq_E3kfwUAm3BzL5ZbDNy99Jbg/edit?usp=sharing%7C%20*FAQs*%3E%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:connect:%20*Chill%20out%20and%20connection%20zones:*%20Whether%20you're%20up%20for%20dancing%20all%20night%20or%20prefer%20a%20quieter%20area%20to%20catch%20up%20with%20friends,%20we've%20planned%20a%20few%20different%20spaces%20so%20you%20can%20enjoy%20the%20event%20your%20way.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:disco_dance:*Dressing%20up:*%5CnSmart%20casual%20is%20the%20vibe,%20but%20please%20no%20Xero%20tees%20or%20lanyards.%20%20If%20you%E2%80%99re%20feeling%20inspired,%20why%20not%20bring%20a%20decade%20to%20life?%20Think%20*disco%2070s*,%20*neon%2080s*,%20*grungy%2090s*,%20or%20*sparkling%2000s!*%20Every%20little%20retro%20touch%20adds%20to%20the%20fun.(Totally%20optional,%20of%20course!)%20:sparkles:%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:vape:%20*Smoking/Vaping:*%5Cn%5BInsert%20local%20smoking/vaping%20info%20here%20%E2%80%94%20e.g.,%20%E2%80%9CA%20designated%20area%20will%20be%20available%20outside%20near%20the%20main%20entrance.%E2%80%9D%5D%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:fireworks-star:%20*What%E2%80%99s%20in%20store?*%5CnEach%20location%20is%20bringing%20Retro%20Rewind%20to%20life%20in%20its%20own%20unique%20way.%20Expect%20great%20tunes,%20delicious%20food%20&%20drinks,%20and%20a%20few%20surprises%20along%20the%20way!%5Cn%5BOptional:%20Add%20local%20highlights%20here,%20e.g.,%20%E2%80%9CDJ,%20live%20performance,%20DIY%20glow%20up%20station,%20activities!%E2%80%9D%5D%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22We%20are%20so%20excited%20to%20rewind,%20connect,%20and%20celebrate%20with%20you!%20:partying_face:%5Cn%5CnIf%20you%E2%80%99ve%20got%20any%20questions,%20check%20out%20the%20%3Chttps://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing%7C*FAQs*%3E%20or%20post%20in%20the%20Slack%20channel.%5Cn%5CnLove,%5Cn%5CnWX%20:party-wx:%22%7D%7D%5D%7D

@FOHWellington

star

Sun Nov 09 2025 22:15:42 GMT+0000 (Coordinated Universal Time) https://app.slack.com/block-kit-builder/TTUJY0L22#%7B%22blocks%22:%5B%7B%22type%22:%22header%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:mirror_ball:%20:dancing-napoleon:Rewind%20and%20Press%20Play!%20Our%20End%20of%20Year%20Celebration%20is%201%20WEEK%20AWAY!:dancing-napoleon:%20:mirror_ball:%22,%22emoji%22:true%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hi%20Melbourne,%20%5Cn%5CnWe%E2%80%99re%20only%20one%20week%20away%20from%20our%20End%20of%20Year%20Celebration%20at%20%3Chttps://www.google.com/maps/place/Greenfields+Albert+Park/@-37.8481994,144.9765768,17z/data=!3m1!4b1!4m6!3m5!1s0x6ad668113e20236d:0xc70db23d5d7b651a!8m2!3d-37.8481994!4d144.9765768!16s/g/11c2j7hrfm?entry=ttu&g_ep=EgoyMDI1MDgwNi4wIKXMDSoASAFQAw==%7C*Greenfields,%20Albert%20Park!*%3E%20%5Cn%5CnWe%20can%E2%80%99t%20wait%20to%20rewind,%20press%20play,%20and%20celebrate%20an%20incredible%202025%20together!%20%5Cn%5Cn*Here%E2%80%99s%20what%20you%20need%20to%20know:*%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:admission_tickets:%20Access%20to%20the%20event:*%5CnFor%20seamless%20entry,%20please%20have%20your%20*e-ticket*%20(sent%20via%20email)%20ready%20on%20your%20phone!%20%5Cn%5CnThe%20*unique%20QR%20code*%20will%20be%20scanned%20at%20the%20entrance.%20%5Cn%5Cn:bulb:*Tip:*%20Ensure%20your%20screen%20is%20bright%20for%20a%20fast%20check-in.%5Cn%5Cn%20:info:%20For%20more%20info%20about%20accessing%20your%20E-Ticket%20and%20QR%20Code%20check%20out%20these%20%3Chttps://docs.google.com/document/d/19Sqjusdd9D_VU4tpvqq_E3kfwUAm3BzL5ZbDNy99Jbg/edit?usp=sharing%7C*FAQs*%3E%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:connect:%20*Chill%20out%20and%20connection%20zones:*%20Whether%20you're%20up%20for%20dancing%20all%20night%20or%20prefer%20a%20quieter%20area%20to%20catch%20up%20with%20friends,%20we've%20planned%20a%20few%20different%20spaces%20so%20you%20can%20enjoy%20the%20event%20your%20way.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:disco_dance:*Dressing%20up:*%5CnSmart%20casual%20is%20the%20vibe,%20but%20please%20no%20Xero%20tees%20or%20lanyards.%20%20If%20you%E2%80%99re%20feeling%20inspired,%20why%20not%20bring%20a%20decade%20to%20life?%20Think%20*disco%2070s*,%20*neon%2080s*,%20*grungy%2090s*,%20or%20*sparkling%2000s!*%20Every%20little%20retro%20touch%20adds%20to%20the%20fun.%20(Totally%20optional,%20of%20course!):sparkles:%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:vape:%20*Smoking/Vaping:*%5Cn%5BInsert%20local%20smoking/vaping%20info%20here%20%E2%80%94%20e.g.,%20%E2%80%9CA%20designated%20area%20will%20be%20available%20outside%20near%20the%20main%20entrance.%E2%80%9D%5D%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:fireworks-star:%20*What%E2%80%99s%20in%20store?*%5CnEach%20location%20is%20bringing%20Retro%20Rewind%20to%20life%20in%20its%20own%20unique%20way.%20Expect%20great%20tunes,%20delicious%20food%20&%20drinks,%20and%20a%20few%20surprises%20along%20the%20way!%5Cn%5BOptional:%20Add%20local%20highlights%20here,%20e.g.,%20%E2%80%9CDJ,%20live%20performace,%20DIY%20glow%20up%20station,%20activities!%E2%80%9D%5D%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22We%20are%20so%20excited%20to%20rewind,%20connect,%20and%20celebrate%20with%20you!%20:partying_face:%5Cn%5CnIf%20you%E2%80%99ve%20got%20any%20questions,%20check%20out%20the%20%3Chttps://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing%7CFAQs%3E%20or%20post%20in%20the%20Slack%20channel.%5Cn%5CnLove,%5Cn%5CnWX%20:party-wx:%22%7D%7D%5D%7D

@FOHWellington

star

Sun Nov 09 2025 22:08:44 GMT+0000 (Coordinated Universal Time) https://app.slack.com/block-kit-builder/TTUJY0L22?force_cold_boot=1#%7B%22blocks%22:%5B%7B%22type%22:%22header%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:mirror_ball::man_dancing:%20Final%20Call%20-%20Registrations%20Close%20Today!:man_dancing::mirror_ball:%22,%22emoji%22:true%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%20%5Cn%5Cn:alarm_clock:%20Today's%20your%20last%20chance%20to%20secure%20your%20spot%20at%20our%20*Retro%20Rewind*%20End%20of%20Year%20Celebration!%20*RSVP%20NOW!*%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Hi%20Auckland!*%20%5Cn%5CnAs%202025%20comes%20to%20a%20close,%20get%20ready%20to%20rewind,%20connect,%20and%20celebrate%20with%20a%20blast%20through%20the%20decades%20at%20our%20End%20of%20Year%20Event!%20%5Cn%5Cn*Here%E2%80%99s%20everything%20you%20need%20to%20know:*%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22section%22,%22fields%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%93%85%20When:*%5CnFriday%2012%20December%20%22%7D,%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%93%8D%20Where:*%5Cn%3Chttps://www.google.com/maps/place/Viaduct+Events+Centre/@-36.8408231,174.7592327,16z/data=!3m1!4b1!4m6!3m5!1s0x6d0d47f6612e7db9:0x598e07bafbb2d3b4!8m2!3d-36.8408231!4d174.7592327!16s/m/0gvqwyq?entry=ttu&g_ep=EgoyMDI1MTEwNC4xIKXMDSoASAFQAw==%7C*Viaduct%20Events%20Centre*%3E%20%5Cn171%20Halsey%20Street,%20Auckland%20Central,%20Auckland%22%7D,%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%E2%8F%B0%20Time:*%5Cn5:30%20PM%20-%2010%20PM%22%7D%5D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:disco_dance::vinyl:%20Theme:*%5Cn_Retro%20Rewind_%20%E2%80%93%20A%20nostalgic,%20high-energy%20trip%20through%20the%20decades.%20From%20disco%20balls%20to%20Y2k%20vibes,%20Retro%20Rewind%20is%20about%20celebrating%20together,%20embracing%20individuality,%20and%20creating%20an%20inclusive%20space%20where%20everyone%20can%20join%20the%20fun.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:dress:%20Dress%20Code:*%5CnSmart%20casual%20%E2%80%93%20Show%20your%20personality,%20but%20no%20Xero%20tees%20or%20lanyards,%20please!%20Feeling%20inspired%20by%20the%20theme?%20Why%20not%20bring%20a%20decade%20to%20life?%20Disco%2070s,%20neon%2080s,%20grungy%2090s%20or%20sparkling%2000s.%20The%20choice%20is%20yours.%20(Totally%20optional,%20of%20course!%20%E2%9C%A8)%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:microphone:%20:hamburger:%20%20Entertainment%20&%20Food:*%5CnEach%20location%20will%20bring%20Retro%20Rewind%20to%20life%20in%20its%20own%20way!%20No%20two%20events%20will%20be%20the%20same.%20You%20can%20look%20forward%20to%20retro%20vibes%20with%20great%20music,%20delicious%20bites,%20refreshing%20drinks,%20and%20maybe%20even%20a%20few%20surprises%20along%20the%20way.%20%E2%9C%A8%F0%9F%8E%B6%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%8E%9F%20RSVP%20Now:*%5CnPlease%20click%20%3Chttps://xero-wx.jomablue.com/reg/store/eoy_mel_2025%7C*HERE*%3E!%20Make%20sure%20you%20RSVP%20by%20*Friday,%2028%20November*!%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:question:Got%20questions?%20See%20the%20%3Chttps://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing%7CFAQs%3E%20doc%20or%20post%20in%20the%20Slack%20channel.%5Cn%5CnWe%20can%E2%80%99t%20wait%20to%20celebrate%20with%20you!%20:partying_face:%20:xero-love:%22%7D%7D%5D%7D

@FOHWellington

star

Sun Nov 09 2025 19:44:49 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Sun Nov 09 2025 03:52:54 GMT+0000 (Coordinated Universal Time) https://app.slack.com/block-kit-builder/T49PT3R50?force_cold_boot=1#%7B%22blocks%22:%5B%7B%22type%22:%22header%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:mirror_ball::man_dancing:%20Don't%20Get%20Left%20in%20the%20Past%20-%20Registrations%20Close%20Tomorrow!:man_dancing::mirror_ball:%22,%22emoji%22:true%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%20%5Cn%5Cn:alarm_clock:%20*RSVP%20for%20Retro%20Rewind%20NOW!*%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Hi%20Denver!*%20%5Cn%5CnWe're%20nearly%20ready%20to%20rewind%20the%20clock%20and%20celebrate%20the%20end%20of%202025%20together!%5CnDon't%20miss%20your%20chance%20to%20join%20us%20for%20a%20night%20of%20connection%20and%20retro%20magic%20at%20our%20End%20of%20Year%20Event!%20%5Cn%5Cn*Here%E2%80%99s%20everything%20you%20need%20to%20know:*%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22section%22,%22fields%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%93%85%20When:*%5CnThursday%2011%20December%20%22%7D,%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%93%8D%20Where:*%5Cn%3Chttps://the1uparcadebar.com/pages/lodo%7C*The%201up%20Arcade%20Car*%3E%20%5CnAt%2019th%20and%20Blake%20Street%22%7D,%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%E2%8F%B0%20Time:*%5Cn6%20PM%20-%209%20PM%22%7D%5D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:disco_dance::vinyl:%20Theme:*%5Cn_Retro%20Rewind_%20%E2%80%93%20A%20nostalgic,%20high-energy%20trip%20through%20the%20decades.%20From%20disco%20balls%20to%20Y2k%20vibes,%20Retro%20Rewind%20is%20about%20celebrating%20together,%20embracing%20individuality,%20and%20creating%20an%20inclusive%20space%20where%20everyone%20can%20join%20the%20fun.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:dress:%20Dress%20Code:*%5CnSmart%20casual%20%E2%80%93%20Show%20your%20personality,%20but%20no%20Xero%20tees%20or%20lanyards,%20please!%5CnFeeling%20inspired%20by%20the%20theme?%20Why%20not%20bring%20a%20decade%20to%20life?%20Disco%2070s,%20neon%2080s,%20grungy%2090s%20or%20sparkling%2000s.%20The%20choice%20is%20yours.%20(Totally%20optional,%20of%20course!%20%E2%9C%A8)%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:microphone:%20:hamburger:%20%20Entertainment%20&%20Food:*%5CnEach%20location%20will%20bring%20Retro%20Rewind%20to%20life%20in%20its%20own%20way!%20No%20two%20events%20will%20be%20the%20same.%20You%20can%20look%20forward%20to%20retro%20vibes%20with%20great%20music,%20delicious%20bites,%20refreshing%20drinks,%20and%20maybe%20even%20a%20few%20surprises%20along%20the%20way.%20%E2%9C%A8%F0%9F%8E%B6%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%8E%9F%20RSVP%20Now:*%5CnPlease%20click%20%3Chttps://xero-wx.jomablue.com/reg/store/eoy_mel_2025%7C*HERE*%3E!%20Make%20sure%20you%20*RSVP*%20by%20*EOD%20TOMORROW*!%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:question:Got%20questions?%20See%20the%20%3Chttps://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing%7CFAQs%3E%20doc%20or%20post%20in%20the%20Slack%20channel.%5Cn%5CnWe%20can%E2%80%99t%20wait%20to%20celebrate%20with%20you!%20:partying_face:%20%5Cn%5CnLove,%20%5Cn%20WX%20:party-wx:%22%7D%7D%5D%7D

@FOHWellington

star

Sun Nov 09 2025 03:48:45 GMT+0000 (Coordinated Universal Time) https://app.slack.com/block-kit-builder/TTUJY0L22#%7B%22blocks%22:%5B%7B%22type%22:%22header%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:mirror_ball::man_dancing:%20Are%20you%20Retro%20Rewind%20Ready?:man_dancing::mirror_ball:%22,%22emoji%22:true%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%20%5Cn%5Cn:alarm_clock:%20The%20Clock%20is%20Ticking!%20Only%20*7*%20days%20left%20to%20Register,%20*RSVP%20NOW!*%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Hi%20Melbourne!*%20%5Cn%5CnAs%202025%20comes%20to%20a%20close,%20get%20ready%20to%20rewind,%20connect,%20and%20celebrate%20with%20a%20blast%20through%20the%20decades%20at%20our%20End%20of%20Year%20Event!%20%5Cn%5Cn*Here%E2%80%99s%20everything%20you%20need%20to%20know:*%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22section%22,%22fields%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%93%85%20When:*%5CnThursday%2011%20December%20%22%7D,%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%93%8D%20Where:*%5Cn%3Chttps://www.google.com/maps/place/Greenfields+Albert+Park/@-37.8481994,144.9765768,17z/data=!3m1!4b1!4m6!3m5!1s0x6ad668113e20236d:0xc70db23d5d7b651a!8m2!3d-37.8481994!4d144.9765768!16s/g/11c2j7hrfm?entry=ttu&g_ep=EgoyMDI1MDgwNi4wIKXMDSoASAFQAw==%7C*Greenfields*%3E%20%5CnCnr%20Lakeside%20Drive%20&%20Queens%20Road%20Albert%20Park%20Lake%22%7D,%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%E2%8F%B0%20Time:*%5Cn5:30%20PM%20-%2011%20PM%22%7D%5D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:disco_dance::vinyl:%20Theme:*%5Cn_Retro%20Rewind_%20%E2%80%93%20A%20nostalgic,%20high-energy%20trip%20through%20the%20decades.%20From%20disco%20balls%20to%20Y2k%20vibes,%20Retro%20Rewind%20is%20about%20celebrating%20together,%20embracing%20individuality,%20and%20creating%20an%20inclusive%20space%20where%20everyone%20can%20join%20the%20fun.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:dress:%20Dress%20Code:*%5CnSmart%20casual%20%E2%80%93%20Show%20your%20personality,%20but%20no%20Xero%20tees%20or%20lanyards,%20please!%5CnFeeling%20inspired%20by%20the%20theme?%20Why%20not%20bring%20a%20decade%20to%20life?%20Disco%2070s,%20neon%2080s,%20grungy%2090s%20or%20sparkling%2000s.%20The%20choice%20is%20yours.%20(Totally%20optional,%20of%20course!%20%E2%9C%A8)%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*:microphone:%20:hamburger:%20Entertainment%20&%20Food:*%5CnEach%20location%20will%20bring%20Retro%20Rewind%20to%20life%20in%20its%20own%20way!%20No%20two%20events%20will%20be%20the%20same.%20You%20can%20look%20forward%20to%20retro%20vibes%20with%20great%20music,%20delicious%20bites,%20refreshing%20drinks,%20and%20maybe%20even%20a%20few%20surprises%20along%20the%20way.%20%E2%9C%A8%F0%9F%8E%B6%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*%F0%9F%8E%9F%20RSVP%20Now:*%5CnPlease%20click%20%3Chttps://xero-wx.jomablue.com/reg/store/eoy_mel_2025%7C*HERE*%3E!%20Make%20sure%20you%20RSVP%20by%20*Thursday,%2027%20November*!%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:question:Got%20questions?%20See%20the%20%3Chttps://docs.google.com/document/d/1z9C8nPENyGoFR8eqzRLWSZ-poPVAD32n5M0IhBN0oUk/edit?usp=sharing%7CFAQs%3E%20doc%20or%20post%20in%20the%20Slack%20channel.%5Cn%5CnWe%20can%E2%80%99t%20wait%20to%20celebrate%20with%20you!%20:partying_face:%20:xero-love:%22%7D%7D%5D%7D

@FOHWellington

star

Thu Nov 06 2025 08:43:53 GMT+0000 (Coordinated Universal Time)

@MinaTimo

star

Thu Nov 06 2025 05:14:56 GMT+0000 (Coordinated Universal Time)

@Manjunath

star

Wed Nov 05 2025 15:15:28 GMT+0000 (Coordinated Universal Time)

@bekah #php

star

Wed Nov 05 2025 14:16:12 GMT+0000 (Coordinated Universal Time)

@Inescn

star

Wed Nov 05 2025 13:48:55 GMT+0000 (Coordinated Universal Time)

@Inescn

star

Wed Nov 05 2025 12:02:10 GMT+0000 (Coordinated Universal Time) https://www.kryptobees.com/tap-to-earn-game-development-company

@Marcochatt01

star

Tue Nov 04 2025 15:20:44 GMT+0000 (Coordinated Universal Time) https://www.appmaisters.com/mobile-application-development/

@jackolier ##mobileappdevelopment ##applicationdevelopmentcompany

star

Tue Nov 04 2025 12:03:48 GMT+0000 (Coordinated Universal Time) https://appticz.com/hybrid-cryptocurrency-exchange-development

@davidscott

star

Tue Nov 04 2025 11:54:33 GMT+0000 (Coordinated Universal Time)

@usman13

star

Tue Nov 04 2025 10:11:00 GMT+0000 (Coordinated Universal Time) https://www.joviindia.com/collections/indian-wedding-wear-guest-dresses-for-women

@auraphia123 ##indianweddingdress #weddingguestdress ##indianfashion ##weddingoutfit

star

Mon Nov 03 2025 04:36:25 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Fri Oct 31 2025 08:29:03 GMT+0000 (Coordinated Universal Time) https://www.kryptobees.com/tap-to-earn-game-development-company

@Marcochatt01

star

Fri Oct 31 2025 07:59:51 GMT+0000 (Coordinated Universal Time) https://www.katomaran.com/products-overview/vsaas

@katomaran #vsaas

star

Fri Oct 31 2025 07:57:17 GMT+0000 (Coordinated Universal Time) https://www.katomaran.com/products-overview/intelligent-traffic-management-system

@katomaran #itms #traffic #management #system

star

Thu Oct 30 2025 15:53:00 GMT+0000 (Coordinated Universal Time)

@mehran

star

Thu Oct 30 2025 15:52:56 GMT+0000 (Coordinated Universal Time)

@mehran

star

Thu Oct 30 2025 15:51:09 GMT+0000 (Coordinated Universal Time)

@mehran

star

Thu Oct 30 2025 04:14:26 GMT+0000 (Coordinated Universal Time)

@kimicodes ##corp ##hwcg ##blog ##resources ##backup

star

Thu Oct 30 2025 02:58:53 GMT+0000 (Coordinated Universal Time)

@vplab

star

Wed Oct 29 2025 20:15:16 GMT+0000 (Coordinated Universal Time)

@jrg_300i #yii2

star

Wed Oct 29 2025 18:51:14 GMT+0000 (Coordinated Universal Time)

@final

star

Wed Oct 29 2025 18:50:02 GMT+0000 (Coordinated Universal Time)

@final

star

Wed Oct 29 2025 18:48:17 GMT+0000 (Coordinated Universal Time)

@final

star

Wed Oct 29 2025 18:46:24 GMT+0000 (Coordinated Universal Time)

@final

star

Wed Oct 29 2025 18:44:37 GMT+0000 (Coordinated Universal Time)

@final

Save snippets that work with our extensions

Available in the Chrome Web Store Get Firefox Add-on Get VS Code extension