Greasy Fork is available in English.

MultiBox 2.0 [Bots] Action Like The Player

command : !send [value] / for the spawn bot | !f / follow | !wood (food stone gold) / farm the resources | !aim / for aim bot to the cursor | !dc multibox / disconnect the bot and self

// ==UserScript==
// @name         MultiBox 2.0 [Bots] Action Like The Player
// @version      2
// @description  command : !send [value] / for the spawn bot | !f / follow | !wood (food stone gold) / farm the resources | !aim / for aim bot to the cursor | !dc multibox / disconnect the bot and self
// @author       Ha Thu
// @namespace    https://cheatx.ygto.com/
// @match        *://moomoo.io/*
// @match        *://dev.moomoo.io/*
// @match        *://sandbox.moomoo.io/*
// @require      https://cdn.jsdelivr.net/npm/msgpack-lite@0.1.26/dist/msgpack.min.js
// @require      https://cdn.jsdelivr.net/npm/fontfaceobserver@2.1.0/fontfaceobserver.standalone.min.js
// @icon         https://cheatx.ygto.com/cxteam.png
// @grant        none
// ==/UserScript==

// I M P O R T A N T !

// READ THIS
// You may use vpn to spawn bot cuz develop limit ip now
// My Discord : harryhathu._.
// Yea that me again Ha Thu the villain of bots


function getEl(id) {
    return document.getElementById(id);
}

(function () {
    'use strict';
    const style = document.createElement('style');
    style.innerHTML = `
        #modMenu {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 460px;
            height: 420px;
            background: #1c1c1c;
            border-radius: 12px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);
            padding: 20px;
            color: white;
            font-family: Arial, sans-serif;
            opacity: 0;
            z-index: 10000;
            transition: opacity 0.8s ease;
            pointer-events: none;
        }

        #modMenu.show {
            opacity: 1;
            pointer-events: all;
        }

        #modMenu.hide {
            opacity: 0;
            pointer-events: none;
        }

        #modMenu .header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
        }

        #modMenu .header .title {
            font-size: 22px;
            font-weight: bold;
            display: flex;
            align-items: center;
        }

        #modMenu .header .version {
            font-size: 14px;
            margin-left: 8px;
            color: #4caf50;
            opacity: 0.9;
        }

        #modMenu .search-icon {
            font-size: 24px;
            color: #999;
            cursor: pointer;
            transition: color 0.3s ease, transform 0.3s ease;
        }

        #modMenu .search-icon:hover {
            color: #4caf50;
            transform: scale(1.1);
        }

        #modMenu .search-bar {
            display: none;
            margin-top: 5px;
            background: #2c2c2c;
            border-radius: 8px;
            padding: 8px 12px;
            transition: max-height 0.3s ease, padding 0.3s ease, margin-top 0.3s ease;
            max-height: 0;
            overflow: hidden;
        }

        #modMenu .search-bar.open {
            display: block;
            max-height: 50px;
            padding: 8px 12px;
            margin-top: 5px;
        }

        #modMenu .search-bar input {
            width: 100%;
            border: none;
            background: transparent;
            color: white;
            font-size: 14px;
            outline: none;
        }

        #modMenu .tabs {
            display: flex;
            justify-content: space-between;
            margin-bottom: 15px;
            transition: margin-top 0.3s ease;
        }

        #modMenu .tab {
            flex: 1;
            text-align: center;
            padding: 10px;
            margin: 0 5px;
            background: #333;
            border-radius: 8px;
            transition: background 0.3s ease, transform 0.2s ease;
            font-size: 14px;
            cursor: pointer;
        }

        #modMenu .tab:hover {
            background: #555;
            transform: scale(1.05);
        }

        #modMenu .tab.active {
            background: #4caf50;
            color: white;
        }

        #modMenu .content {
            height: 240px;
            overflow-y: auto;
            display: none;
            transition: opacity 0.3s ease;
        }

        #modMenu .content.active {
            display: block;
            opacity: 1;
        }

        #modMenu .content.inactive {
            opacity: 0;
        }

        .toggle {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin: 12px 0;
            font-size: 16px;
        }

        .toggle-switch {
            position: relative;
            width: 50px;
            height: 25px;
            background: #ccc;
            border-radius: 50px;
            cursor: pointer;
            transition: background 0.3s ease;
        }

        .toggle-switch::before {
            content: '';
            position: absolute;
            width: 23px;
            height: 23px;
            background: white;
            border-radius: 50%;
            top: 1px;
            left: 1px;
            transition: transform 0.3s ease;
        }

        .toggle-switch.active {
            background: #4caf50;
        }

        .toggle-switch.active::before {
            transform: translateX(25px);
        }

        .toggle-switch input {
            display: none;
        }
    `;
    document.head.appendChild(style);
    const menu = document.createElement('div');
    menu.id = 'modMenu';
    menu.innerHTML = `
        <div class="header">
            <div class="title">
                CheatCore<span class="version">v1</span>
            </div>
            <div class="search-icon" id="searchIcon">🔍</div>
        </div>
        <div class="search-bar" id="searchBar">
            <input type="text" placeholder="Search functions..." id="functionSearch">
        </div>
        <div class="tabs">
            <div class="tab active" data-tab="bots">Bots</div>
            <div class="tab" data-tab="combat">Visuals</div>
            <div class="tab" data-tab="modules">Modules</div>
        </div>
        <div class="content active" id="content-bots">
            <div class="toggle">
                Enable Auto Spawn
                <div class="toggle-switch" data-option="autoSpawn">
                    <input type="checkbox" id="autoSpawn">
                </div>
            </div>
        </div>
        <div class="content" id="content-combat">
            <div class="toggle">
                Disable Wiggle
                <div class="toggle-switch" data-option="disableWiggle">
                    <input type="checkbox" id="disableWiggle">
                </div>
            </div>
            <div class="toggle">
                Disable Hit Animation
                <div class="toggle-switch" data-option="disableHitAnimation">
                    <input type="checkbox" id="disableHitAnimation">
                </div>
            </div>
            <div class="toggle">
            Draw Player In Near
                <div class="toggle-switch" data-option="drawplayer">
                    <input type="checkbox" id="drawplayer">
                </div>
            </div>
        </div>
        <div class="content" id="content-modules">
            <div class="toggle">
                Draw Tracers(Useless)
                <div class="toggle-switch" data-option="tracers">
                    <input type="checkbox" id="tracers">
                </div>
            </div>
        </div>
    `;
    document.body.appendChild(menu);
    document.querySelectorAll('.tab').forEach(tab => {
        tab.addEventListener('click', () => {
            document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
            tab.classList.add('active');

            document.querySelectorAll('.content').forEach(content => content.classList.remove('active'));
            document.getElementById(`content-${tab.dataset.tab}`).classList.add('active');
        });
    });
    document.querySelectorAll('.toggle-switch').forEach(toggle => {
        toggle.addEventListener('click', () => {
            const checkbox = toggle.querySelector('input');
            checkbox.checked = !checkbox.checked;

            toggle.classList.toggle('active', checkbox.checked);
            const option = toggle.dataset.option;
            console.log(`${option}: ${checkbox.checked ? 'Enabled' : 'Disabled'}`);
        });
    });
    let isMenuVisible = false;
    document.addEventListener('keydown', (e) => {
        if (e.key === 'Escape') {
            isMenuVisible = !isMenuVisible;
            menu.classList.toggle('show', isMenuVisible);
            menu.classList.toggle('hide', !isMenuVisible);
        }
    });
    document.getElementById('searchIcon').addEventListener('click', () => {
        const searchBar = document.getElementById('searchBar');
        const tabs = document.querySelector('.tabs');
        searchBar.classList.toggle('open');
        tabs.style.marginTop = searchBar.classList.contains('open') ? '30px' : '0px';
        if (searchBar.classList.contains('open')) {
            document.getElementById('functionSearch').focus();
        }
    });
    document.getElementById('functionSearch').addEventListener('input', function () {
        const searchTerm = this.value.toLowerCase();
        document.querySelectorAll('.toggle').forEach(toggle => {
            const text = toggle.textContent.toLowerCase();
            toggle.style.display = text.includes(searchTerm) ? 'flex' : 'none';
        });
    });
})();

let angles = [];
let point = {x: null, y: null, x2: null, y2: null}

let healToggle = true;
let hatToggle = false;
let empToggle = false;

let ws;
let cvs;
let width;
let height;
let mouseX;
let mouseY;
let dir;

let primary;
let secondary;
let foodType;
let wallType;
let spikeType;
let millType;
let mineType;
let boostType;
let turretType;
let spawnpadType;

let healer;
let spiker;
let trapper;
let miller;
let crashing;
let playerFollowerGlobal;
let ffs;
let ffsps;
let sockets = {};
let bots = {};
let closed;
let myPlayer = {};
let pointer = true;
let pointingOnPosition = {};
let enemiesNear;
let players = {};
let isEnemyNear;
let nearestEnemy;
let nearestEnemyAngle;
let autoaim = false;
let autoAttackWithAim3 = false;
let autoInsta;
let JustDied;
let normalHat;
let normalAcc;
let oldHat;
let oldAcc;
let cursor = false;

let weapons = [{
    id: 0,
    type: 0,
    name: "tool hammer",
    desc: "tool for gathering all resources",
    src: "hammer_1",
    length: 140,
    width: 140,
    xOff: -3,
    yOff: 18,
    dmg: 25,
    range: 65,
    gather: 1,
    speed: 300
}, {
    id: 1,
    type: 0,
    age: 2,
    name: "hand axe",
    desc: "gathers resources at a higher rate",
    src: "axe_1",
    length: 140,
    width: 140,
    xOff: 3,
    yOff: 24,
    dmg: 30,
    spdMult: 1,
    range: 70,
    gather: 2,
    speed: 400
}, {
    id: 2,
    type: 0,
    age: 8,
    pre: 1,
    name: "great axe",
    desc: "deal more damage and gather more resources",
    src: "great_axe_1",
    length: 140,
    width: 140,
    xOff: -8,
    yOff: 25,
    dmg: 35,
    spdMult: 1,
    range: 75,
    gather: 4,
    speed: 400
}, {
    id: 3,
    type: 0,
    age: 2,
    name: "short sword",
    desc: "increased attack power but slower move speed",
    src: "sword_1",
    iPad: 1.3,
    length: 130,
    width: 210,
    xOff: -8,
    yOff: 46,
    dmg: 35,
    spdMult: .85,
    range: 110,
    gather: 1,
    speed: 300
}, {
    id: 4,
    type: 0,
    age: 8,
    pre: 3,
    name: "katana",
    desc: "greater range and damage",
    src: "samurai_1",
    iPad: 1.3,
    length: 130,
    width: 210,
    xOff: -8,
    yOff: 59,
    dmg: 40,
    spdMult: .8,
    range: 118,
    gather: 1,
    speed: 300
}, {
    id: 5,
    type: 0,
    age: 2,
    name: "polearm",
    desc: "long range melee weapon",
    src: "spear_1",
    iPad: 1.3,
    length: 130,
    width: 210,
    xOff: -8,
    yOff: 53,
    dmg: 45,
    knock: .2,
    spdMult: .82,
    range: 142,
    gather: 1,
    speed: 700
}, {
    id: 6,
    type: 0,
    age: 2,
    name: "bat",
    desc: "fast long range melee weapon",
    src: "bat_1",
    iPad: 1.3,
    length: 110,
    width: 180,
    xOff: -8,
    yOff: 53,
    dmg: 20,
    knock: .7,
    range: 110,
    gather: 1,
    speed: 300
}, {
    id: 7,
    type: 0,
    age: 2,
    name: "daggers",
    desc: "really fast short range weapon",
    src: "dagger_1",
    iPad: .8,
    length: 110,
    width: 110,
    xOff: 18,
    yOff: 0,
    dmg: 20,
    knock: .1,
    range: 65,
    gather: 1,
    hitSlow: .1,
    spdMult: 1.13,
    speed: 100
}]

let hats = [{
    id: 51,
    name: "Moo Cap",
    price: 0,
    scale: 120,
    desc: "coolest mooer around"
}, {
    id: 50,
    name: "Apple Cap",
    price: 0,
    scale: 120,
    desc: "apple farms remembers"
}, {
    id: 28,
    name: "Moo Head",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 29,
    name: "Pig Head",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 30,
    name: "Fluff Head",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 36,
    name: "Pandou Head",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 37,
    name: "Bear Head",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 38,
    name: "Monkey Head",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 44,
    name: "Polar Head",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 35,
    name: "Fez Hat",
    price: 0,
    scale: 120,
    desc: "no effect"
}, {
    id: 42,
    name: "Enigma Hat",
    price: 0,
    scale: 120,
    desc: "join the enigma army"
}, {
    id: 43,
    name: "Blitz Hat",
    price: 0,
    scale: 120,
    desc: "hey everybody i'm blitz"
}, {
    id: 49,
    name: "Bob XIII Hat",
    price: 0,
    scale: 120,
    desc: "like and subscribe"
}, {
    id: 57,
    name: "Pumpkin",
    price: 50,
    scale: 120,
    desc: "Spooooky"
}, {
    id: 8,
    name: "Bummle Hat",
    price: 100,
    scale: 120,
    desc: "no effect"
}, {
    id: 2,
    name: "Straw Hat",
    price: 500,
    scale: 120,
    desc: "no effect"
}, {
    id: 15,
    name: "Winter Cap",
    price: 600,
    scale: 120,
    desc: "allows you to move at normal speed in snow",
    coldM: 1
}, {
    id: 5,
    name: "Cowboy Hat",
    price: 1e3,
    scale: 120,
    desc: "no effect"
}, {
    id: 4,
    name: "Ranger Hat",
    price: 2e3,
    scale: 120,
    desc: "no effect"
}, {
    id: 18,
    name: "Explorer Hat",
    price: 2e3,
    scale: 120,
    desc: "no effect"
}, {
    id: 31,
    name: "Flipper Hat",
    price: 2500,
    scale: 120,
    desc: "have more control while in water",
    watrImm: !0
}, {
    id: 1,
    name: "Marksman Cap",
    price: 3e3,
    scale: 120,
    desc: "increases arrow speed and range",
    aMlt: 1.3
}, {
    id: 10,
    name: "Bush Gear",
    price: 3e3,
    scale: 160,
    desc: "allows you to disguise yourself as a bush"
}, {
    id: 48,
    name: "Halo",
    price: 3e3,
    scale: 120,
    desc: "no effect"
}, {
    id: 6,
    name: "Soldier Helmet",
    price: 4e3,
    scale: 120,
    desc: "reduces damage taken but slows movement",
    spdMult: .94,
    dmgMult: .75
}, {
    id: 23,
    name: "Anti Venom Gear",
    price: 4e3,
    scale: 120,
    desc: "makes you immune to poison",
    poisonRes: 1
}, {
    id: 13,
    name: "Medic Gear",
    price: 5e3,
    scale: 110,
    desc: "slowly regenerates health over time",
    healthRegen: 3
}, {
    id: 9,
    name: "Miners Helmet",
    price: 5e3,
    scale: 120,
    desc: "earn 1 extra gold per resource",
    extraGold: 1
}, {
    id: 32,
    name: "Musketeer Hat",
    price: 5e3,
    scale: 120,
    desc: "reduces cost of projectiles",
    projCost: .5
}, {
    id: 7,
    name: "Bull Helmet",
    price: 6e3,
    scale: 120,
    desc: "increases damage done but drains health",
    healthRegen: -5,
    dmgMultO: 1.5,
    spdMult: .96
}, {
    id: 22,
    name: "Emp Helmet",
    price: 6e3,
    scale: 120,
    desc: "turrets won't attack but you move slower",
    antiTurret: 1,
    spdMult: .7
}, {
    id: 12,
    name: "Booster Hat",
    price: 6e3,
    scale: 120,
    desc: "increases your movement speed",
    spdMult: 1.16
}, {
    id: 26,
    name: "Barbarian Armor",
    price: 8e3,
    scale: 120,
    desc: "knocks back enemies that attack you",
    dmgK: .6
}, {
    id: 21,
    name: "Plague Mask",
    price: 1e4,
    scale: 120,
    desc: "melee attacks deal poison damage",
    poisonDmg: 5,
    poisonTime: 6
}, {
    id: 46,
    name: "Bull Mask",
    price: 1e4,
    scale: 120,
    desc: "bulls won't target you unless you attack them",
    bullRepel: 1
}, {
    id: 14,
    name: "Windmill Hat",
    topSprite: !0,
    price: 1e4,
    scale: 120,
    desc: "generates points while worn",
    pps: 1.5
}, {
    id: 11,
    name: "Spike Gear",
    topSprite: !0,
    price: 1e4,
    scale: 120,
    desc: "deal damage to players that damage you",
    dmg: .45
}, {
    id: 53,
    name: "Turret Gear",
    topSprite: !0,
    price: 1e4,
    scale: 120,
    desc: "you become a walking turret",
    turret: {
        proj: 1,
        range: 700,
        rate: 2500
    },
    spdMult: .7
}, {
    id: 20,
    name: "Samurai Armor",
    price: 12e3,
    scale: 120,
    desc: "increased attack speed and fire rate",
    atkSpd: .78
}, {
    id: 58,
    name: "Dark Knight",
    price: 12e3,
    scale: 120,
    desc: "restores health when you deal damage",
    healD: .4
}, {
    id: 27,
    name: "Scavenger Gear",
    price: 15e3,
    scale: 120,
    desc: "earn double points for each kill",
    kScrM: 2
}, {
    id: 40,
    name: "Tank Gear",
    price: 15e3,
    scale: 120,
    desc: "increased damage to buildings but slower movement",
    spdMult: .3,
    bDmg: 3.3
}, {
    id: 52,
    name: "Thief Gear",
    price: 15e3,
    scale: 120,
    desc: "steal half of a players gold when you kill them",
    goldSteal: .5
}, {
    id: 55,
    name: "Bloodthirster",
    price: 2e4,
    scale: 120,
    desc: "Restore Health when dealing damage. And increased damage",
    healD: .25,
    dmgMultO: 1.2
}, {
    id: 56,
    name: "Assassin Gear",
    price: 2e4,
    scale: 120,
    desc: "Go invisible when not moving. Can't eat. Increased speed",
    noEat: !0,
    spdMult: 1.1,
    invisTimer: 1e3
}]

let msgpack5 = window.msgpack; //msgpack hahah
document.msgpack = msgpack5;

let autoAttack;
let freeze;
function dist(a, b){
    return Math.sqrt( Math.pow((b.y-a[2]), 2) + Math.pow((b.x-a[1]), 2) );
}
function acc(id) {
    doNewSend(["c", [1, id, 1]]);
    doNewSend(["c", [0, 0, 1]]);
    doNewSend(["c", [0, id, 1]]);
}

function hat(id) {
    doNewSend(["c", [1, id, 0]]);
    doNewSend(["c", [0, id, 0]]);
}
let treeList = [], bushList = [], stoneList = [], goldList = [], followingfarm = false, followingtype = null, LED = Date.now(), playerss = []
let handleMessage = function(e) {
    let temp = msgpack5.decode(new Uint8Array(e.data));
    let data = null;
    if(temp.length > 1) {
        data = [temp[0], ...temp[1]];
        if (data[1] instanceof Array){
            data = data;
        }
    } else {
        data = temp;
    }
    let item = data[0];
    if(!data) {return};
    if (item == "io-init") {
        const touchscreen = document.getElementById('touch-controls-fullscreen');
        let cvs = document.getElementById("gameCanvas");
        //setTimeout(() => { if (document.getElementById("mainMenu")) { document.getElementById("mainMenu").remove(); } }, 5000);
        let width = touchscreen.clientWidth;
        let height = touchscreen.clientHeight;
        $(window).resize(function() {
            width = touchscreen.clientWidth;
            height = touchscreen.clientHeight;
        });
        let place = (e, t = dir) => {
            doNewSend(['z', [e, null]]);
            doNewSend(['F', [1, t]]);
            doNewSend(['F', [0, t]]);
            doNewSend(['z', [1]]);
        }
        let placeForAll = (e, t = dir) => {
            sendForAll(['z', [e, null]]);
            sendForAll(['F', [1, t]]);
            sendForAll(['F', [0, t]]);
            sendForAll(['z', [1]]);
        }
        touchscreen.addEventListener('mousemove', e => {
            mouseX = e.clientX;
            mouseY = e.clientY;
            dir = Math.atan2(event.clientY - height / 2, event.clientX - width / 2)
            if (!autoaim && Date.now() - LED > 63) {
                LED = Date.now()
                if(followingfarm == true) {
                    doNewSend(['D', [dir]]);
                } else {
                    if(autoattack == true) {
                        for (let i in sockets) {
                            if(sockets[i].attack2 == false) {
                                sockets[i].oldSend(new Uint8Array(Array.from(msgpack5.encode(e))));
                            }
                        }
                    } else {
                        if(cursor == true) {
                            doNewSend(["D", [dir]])
                            for(let i in bots) {
                                sockets[i].oldSend(new Uint8Array(Array.from(msgpack5.encode(["D", [Math.atan2((myPlayer.y - bots[i].y) + mouseY - (height / 2), (myPlayer.x - bots[i].x) + mouseX - (width / 2))]]))))
                            }
                        } else {
                            sendForAll(["D", [dir]])
                        }
                    }
                }
            }
        })
        document.key22 = 1;
        document.addEventListener('keydown', e => {
            if (document.key22 !== e.keyCode) {
                document.key22 = e.keyCode;
                if (document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea" && !document.getElementById('chatHolder').offsetParent) {
                    if (e.keyCode == 82) {
                        if(e.repeat) return
                        autoaim=true;
                        doNewSend(["D", [cursor?(Math.atan2(mouseY - height / 2, mouseX - width / 2)):nearestEnemyAngle]])
                        doNewSend(["K", [1]])
                        doNewSend(["z", [15, 1]])
                        setTimeout(() => {
                            autoaim=false
                            doNewSend(["K", [1]])
                        }, 130)
                    }
                    if (e.keyCode == 70) {
                        if(e.repeat) return
                        sendForAll(["z", [boostType]])
                    }
                    if (e.keyCode == 86) {
                        if(e.repeat) return
                        sendForAll(["z", [spikeType]])
                    }
                    /*if (e.keyCode == 89) {
                        healer = true;
                    }
                    if (e.keyCode == 86) {
                        spiker = true;
                    }
                    if (e.keyCode == 70) {
                        trapper = true;
                    }
                    if (e.keyCode == 54) {
                        miller = true;
                    }
                    if (e.keyCode == 0) {
                        healToggle = !healToggle;
                    }
                    if (e.keyCode == 39) {
                        hatToggle = !hatToggle;
                    }
                    if (e.keyCode == 40) {
                        empToggle = !empToggle;
                    }*/
                    if (e.keyCode == 80) {
                        pointer = !pointer;
                    }
                    /*if (e.keyCode == 84) {
                        autoaim = true;
                        doNewSend(["13c", [1, 6, 0]]);
                        doNewSend(["13c", [1, 7, 0]]);
                        doNewSend(["13c", [1, 53, 0]]);
                        autoAttackWithAim3 = true;
                        doNewSend(['c', [1]])
                        doNewSend(["H", [5]]);
                        doNewSend(["H", [17]]);
                        doNewSend(["H", [31]]);
                        doNewSend(["H", [23]]);
                        doNewSend(["H", [9]]);
                        doNewSend(["H", [18]]);
                        doNewSend(['5', [9, true]]);
                        doNewSend(["13c", [0, 53, 0]]);
                        setTimeout(() => {
                            doNewSend(['6', [12]]);
                        }, 130);
                        setTimeout(() => {
                            doNewSend(['6', [15]])
                            doNewSend(['5', [secondary, true]]);
                            setTimeout(() => {
                                sendForAll(['5', [primary, true]])
                                if (!empToggle) {
                                    doNewSend(["13c", [1, 6, 0]]);
                                    doNewSend(["13c", [0, 6, 0]]);
                                }
                                if (empToggle) {
                                    doNewSend(["13c", [1, 22, 0]]);
                                    doNewSend(["13c", [0, 22, 0]]);
                                }
                                autoaim = false;
                                autoAttackWithAim3 = false;
                                doNewSend(['c', [0]])
                                doNewSend(["2", [dir]]);
                            }, 270);
                        }, 210);
                    }
                    if (e.keyCode == 0) {
                        for (let i=0;i<180;i++) {
                            let angle = toRad(i*2);
                            place(boostType, angle);
                        }
                    }
                    if (e.keyCode == 0) {
                        for (let i=0;i<4;i++) {
                            let angle = toRad(i * 90);
                            place(spikeType, angle);
                        }
                    }
                    if (e.keyCode == 77) {
                        if (myPlayer.y < 2400) {
                            doNewSend(["13c", [1, 15, 0]]);
                            doNewSend(["13c", [0, 15, 0]]);
                        } else if (myPlayer.y > 6850 && myPlayer.y < 7550) {
                            doNewSend(["13c", [1, 31, 0]]);
                            doNewSend(["13c", [0, 31, 0]]);
                        } else {
                            doNewSend(["13c", [1, 12, 0]]);
                            doNewSend(["13c", [0, 12, 0]]);
                        }
                        doNewSend(["13c", [1, 0, 1]]);
                        doNewSend(["13c", [0, 0, 1]]);
                    }
                    if (e.keyCode == 37) {
                        sendForAll(["H", [8]]);
                        sendForAll(["H", [3]]);
                        sendForAll(["H", [5]]);
                    }
                    if(e.keyCode == 39) {
                        sendForAll(["H", [8]]);
                        sendForAll(["H", [4]]);
                        sendForAll(["H", [5]]);
                        sendForAll(["H", [10]]);
                        sendForAll(["H", [28]]);
                        sendForAll(["H", [10]]);
                    }
                    if(e.keyCode == 16) {
                        sendForAll(["13c", [0, 0, 0]]);
                        sendForAll(["13c", [0, 0, 1]]);
                    }
                    if (e.keyCode == 38) {
                        sendForAll(["H", [5]]);
                        sendForAll(["H", [17]]);
                        sendForAll(["H", [31]]);
                        sendForAll(["H", [23]]);
                        sendForAll(["H", [13]]);
                        sendForAll(["H", [18]]);
                        sendForAll(["H", [28]]);
                    }
                    if (e.keyCode == 120) {
                        sendForAll(["H", [4]]);
                        sendForAll(["H", [15]]);
                    }
                    if (e.keyCode == 90) {
                        sendForAll(["13c", [0, 0, 1]]);
                        sendForAll(["13c", [1, 40, 0]]);
                        sendForAll(["13c", [0, 40, 0]]);
                    }
                    if (e.keyCode == 32) {
                        if (!empToggle) {
                        sendForAll(["13c", [0, 0, 1]]);
                            sendForAll(["13c", [1, 6, 0]]);
                            sendForAll(["13c", [0, 6, 0]]);
                        }
                        if (empToggle) {
                            sendForAll(["13c", [1, 22, 0]]);
                            sendForAll(["13c", [0, 22, 0]]);
                        }
                    }
                    if (e.keyCode == 66) {
                        sendForAll(["13c", [0, 0, 1]]);
                        sendForAll(["13c", [1, 7, 0]]);
                        sendForAll(["13c", [0, 7, 0]]);
                    }
                    if (e.keyCode == 45) {
                        doNewSend(["13c", [1, 6, 0]]);
                        doNewSend(["13c", [1, 7, 0]]);
                        doNewSend(["13c", [1, 53, 0]]);
                        autoInsta = true;
                    }
                    if (e.keyCode == 46) {
                        autoInsta = false;
                    }
                    if (e.keyCode == 85) {
                        sendForAll(["13c", [1, 20, 0]]);
                        sendForAll(["13c", [0, 20, 0]]);
                    }
                    if (e.keyCode == 114) {
                        sendForAll(["H", [28]]);
                    }
                    if (e.keyCode == 115) {
                        sendForAll(["H", [4]]);
                        sendForAll(["H", [25]]);
                    }*/
                }
            }
        })
        document.addEventListener('keyup', e => {
            document.key22 = null;
            if (e.keyCode == 81) {
                healer = false;
            }
            if (e.keyCode == 86) {
                spiker = false;
            }
            if (e.keyCode == 70) {
                trapper = false;
            }
            if (e.keyCode == 54) {
                miller = false;
            }
        })
        setInterval(() => {
            if (autoaim) {
                doNewSend(['D', [nearestEnemyAngle]]);
            }
            if (autoAttackWithAim3) {
                doNewSend(['F', [1]]);
            }
            if (crashing && !closed) {
                for (let e = 0; e < 1000; e++) {
                    let result = new Uint8Array(Math.round(Math.random() * 18));for (let i = 0; i < result.length; i++) {if (i == 0) {result[i] = Math.round(Math.random() * 256);} else {if (i == 1) {result[i] = Math.round(Math.random() * 256);} else {if (i == 2) {result[i] = Math.round(Math.random() * 128);} else {if (i == 3) {result[i] = Math.round(Math.random() * 85);} else {if (i == 4) {result[i] = Math.round(Math.random() * 64);} else {if (i == 5) {result[i] = Math.round(Math.random() * 51);} else {if (i == 6) {result[i] = Math.round(Math.random() * 42);} else {if (i == 7) {result[i] = Math.round(Math.random() * 36);} else {if (i == 8) {result[i] = Math.round(Math.random() * 32);} else {if (i == 9) {result[i] = Math.round(Math.random() * 28);} else {if (i == 10) {result[i] = Math.round(Math.random() * 25);} else {if (i == 11) {result[i] = Math.round(Math.random() * 23);} else {if (i == 12) {result[i] = Math.round(Math.random() * 21);} else {if (i == 13) {result[i] = Math.round(Math.random() * 19);} else {if (i == 14) {result[i] = Math.round(Math.random() * 18);} else {if (i == 15) {result[i] = Math.round(Math.random() * 17);} else {if (i == 16) {result[i] = Math.round(Math.random() * 16);} else {if (i == 17) {result[i] = Math.round(Math.random() * 15);}}}}}}}}}}}}}}}}}}}ws.oldSend(result);
                }
        }
        if (healer) {
                place(foodType, null);
            }
            if (spiker) {
                place(spikeType, null);
            }
            if (trapper) {
                place(boostType, null);
            }
            if (miller) {
                place(millType, null);
            }
        }, 100)
        primary = 0;
        foodType = 0;
        wallType = 3;
        spikeType = 6;
        millType = 10;
        myPlayer.weapon = 0;
        doNewSend(['M', [{name: localStorage.moo_name, moofoll: "1", skin: 4}]]);
        setTimeout(() => {
            let kk;
            let host = "127.0.0.1" !== location.hostname && !location.hostname.startsWith("192.168.");
            for (let i2 = 0; i2 < 4; i2++) {
                const urlBase = document.ws.url.split("token=")[0];
                const token = encodeURIComponent("alt:" + $i);
                wsType(`${urlBase}token=${token}`);
            }
        }, 100);
    }
    if (item == "C" && !myPlayer.id) {
        myPlayer.id = data[1];
    }
    if (item == "D") {
        playerss.push({
            sid: data[1][1],
            name: data[1][2]
        })
    }
    if (item == "E") {
        let t = playerss.findIndex(e=>e.sid==data[1])
        if(t !== undefined) {
            playerss.splice(t, 1)
        }
    }
    if (item == "H") {
        for(let i = 0; i < data[1].length/8; i++) {
            let objectData = data[1].slice(8*i, 8*i+8)
            if(objectData[6] == null) {
                if(objectData[5] == 0) {
                    treeList.push({
                        x: objectData[1],
                        y: objectData[2]
                    })
                } else if (objectData[5] == 1) {
                    bushList.push({
                        x: objectData[1],
                        y: objectData[2]
                    })
                } else if (objectData[5] == 2) {
                    stoneList.push({
                        x: objectData[1],
                        y: objectData[2]
                    })
                } else if (objectData[5] == 3) {
                    goldList.push({
                        x: objectData[1],
                        y: objectData[2]
                    })
                }
            }
        }
    }
    if (item == "N") {
        if(data[1] == "kills") {
            sendForAll(["6", ["gg - Get Deleted"]], true)
        }
    }
    if (item == "P") {
        primary = 0;
        foodType = 0;
        wallType = 3;
        spikeType = 6;
        millType = 10;
        if (!autoAttack && !freeze) {
            doNewSend(['M', [{name: localStorage.moo_name, moofoll: "1", skin: 4}]]);
        } else {
            JustDied = true;
        }
        let e = setInterval(() => {
            if(document.getElementById('mainMenu').style.display == "block") {
                clearInterval(e)
                document.getElementById('mainMenu').style.display = "none"
            }
        })
    }
    if (JustDied) {
        if (!autoAttack && !freeze) {
            JustDied = false;
            doNewSend(['M', [{name: localStorage.moo_name, moofoll: "1", skin: 4}]]);
        }
    }
    if (item == "X") {
        //console.log(data)
    }
    if (item == "a") {
        enemiesNear = [];
        players = {};
        for(let i = 0; i < data[1].length / 13; i++) {
            let playerInfo = data[1].slice(13*i, 13*i+13);
            if(playerInfo[0] == myPlayer.id) {
                myPlayer.x = playerInfo[1];
                myPlayer.y = playerInfo[2];
                myPlayer.dir = playerInfo[3];
                myPlayer.object = playerInfo[4];
                myPlayer.clan = playerInfo[7];
                myPlayer.isLeader = playerInfo[8];
                myPlayer.hat = playerInfo[9];
                myPlayer.accessory = playerInfo[10];
                myPlayer.isSkull = playerInfo[11];
            } else if(playerInfo[7] !== myPlayer.clan || playerInfo[7] === null) {
                enemiesNear.push(playerInfo);
            }
            let U = players[playerInfo[0]]
            if(U && (U.clan !== myPlayer.clan && myPlayer.clan !== null || myPlayer.clan == null)) {
                if(Math.sqrt(Math.pow(U.x - playerInfo[1], 2)+Math.pow(U.y - playerInfo[2], 2)) >= 70 && (Math.abs(Math.atan2(playerInfo[2] - U.y, playerInfo[1] - U.x) - Math.atan2(playerInfo[2] - myPlayer.y, playerInfo[1] - myPlayer.x)) % (2 * Math.PI)) < Math.PI/4) {
                    let dir = Math.atan2(playerInfo[2] - myPlayer.y, playerInfo[1] - myPlayer.x)
                    if(boostType) {
                        sendForAll(["z", [boostType]])
                        sendForAll(["F", [1, dir]])
                        sendForAll(["z", [boostType]])
                        sendForAll(["F", [1, dir+Math.PI/2]])
                        sendForAll(["z", [boostType]])
                        sendForAll(["F", [1, dir-Math.PI/2]])
                        sendForAll(["z", [boostType]])
                        sendForAll(["F", [1, dir+Math.PI]])
                        sendForAll(["F", [0]])
                        sendForAll(["z", [null]])
                    } else {
                        sendForAll(["z", [spikeType]])
                        sendForAll(["F", [1, dir]])
                        sendForAll(["z", [spikeType]])
                        sendForAll(["F", [1, dir+Math.PI/2]])
                        sendForAll(["z", [spikeType]])
                        sendForAll(["F", [1, dir-Math.PI/2]])
                        sendForAll(["z", [spikeType]])
                        sendForAll(["F", [1, dir+Math.PI]])
                        sendForAll(["F", [0]])
                        sendForAll(["z", [null]])
                    }
                }
            }
            players[playerInfo[0]] = {
                id: playerInfo[0],
                x: playerInfo[1],
                y: playerInfo[2],
                dir: playerInfo[3],
                object: playerInfo[4],
                weapon: playerInfo[5],
                clan: playerInfo[7],
                isLeader: playerInfo[8],
                hat: playerInfo[9],
                accessory: playerInfo[10],
                isSkull: playerInfo[11]
            };
        }
        isEnemyNear = false;
        if(enemiesNear) {
            nearestEnemy = enemiesNear.sort((a,b) => dist(a, myPlayer) - dist(b, myPlayer))[0];
        }
        if(nearestEnemy) {
            nearestEnemyAngle = Math.atan2(nearestEnemy[2]-myPlayer.y, nearestEnemy[1]-myPlayer.x);
            if(Math.sqrt(Math.pow((myPlayer.y-nearestEnemy[2]), 2) + Math.pow((myPlayer.x-nearestEnemy[1]), 2)) < 500) {
                isEnemyNear = true;
                if(autoaim == false && myPlayer.hat != 7 && myPlayer.hat != 53) {
                    normalHat = 6;
                    if(primary != 8) {
                        normalAcc = 19;
                    }
                };
            }
        }
        /*if (autoaim) {
            doNewSend(['2', [nearestEnemyAngle]]);
        }*/
        if (autoAttackWithAim3) {
            doNewSend(['F', [1]]);
        }
        if(isEnemyNear == false && autoaim == false) {
            normalAcc = 0;
            if (myPlayer.y < 2400){
                normalHat = 15;
            } else if (myPlayer.y > 6850 && myPlayer.y < 7550){
                normalHat = 31;
            } else {
                normalHat = 12;
            }
        }
        if(hatToggle) {
            if(oldHat != normalHat) {
                hat(normalHat);
            }
            if(oldAcc != normalAcc) {
                acc(normalAcc);
            }
            oldHat = normalHat;
            oldAcc = normalAcc
        }
        if (nearestEnemy && autoInsta) {
            if (Math.sqrt(Math.pow((myPlayer.y-nearestEnemy[2]), 2) + Math.pow((myPlayer.x-nearestEnemy[1]), 2)) < 215) {
                autoInsta = false;
                autoaim = true;
                doNewSend(['9', [nearestEnemyAngle]]);
                setTimeout(() => {
                    doNewSend(['9', []]);
                    doNewSend(['c', [0, 11, 1]]);
                }, 300)
                doNewSend(['K', [1]]);
                if (myPlayer.weapon == 0) {
                    doNewSend(["H", [5]]);
                    doNewSend(["H", [17]]);
                    doNewSend(["H", [31]]);
                    doNewSend(["H", [23]]);
                    doNewSend(["H", [10]]);
                    doNewSend(["H", [18]]);
                    doNewSend(["H", [28]]);
                }
                doNewSend(["H", [15]]);
                doNewSend(['c', [0, 0, 1]])
                doNewSend(['c', [0, 19, 1]])
                doNewSend(['c', [0, 7, 0]])
                doNewSend(["z", [primary, 1]]);
                for (let i = 0; i < 25; i++) {
                    doNewSend(['F', [1, nearestEnemyAngle]]);
                }
                setTimeout(() => {
                    doNewSend(['c', [0, 53, 0]]);
                    doNewSend(["z", [15, 1]]);
                    doNewSend(["z", [secondary, 1]]);
                    setTimeout(() => {
                        autoaim = false;
                        doNewSend(["z", [primary, 1]]);
                        if (!empToggle) {
                            doNewSend(["c", [1, 6, 0]]);
                            doNewSend(["c", [0, 6, 0]]);
                        }
                        if (empToggle) {
                            doNewSend(["c", [1, 22, 0]]);
                            doNewSend(["c", [0, 22, 0]]);
                        }
                        doNewSend(['K', [1]]);
                        doNewSend(['F', [0]]);
                    }, 270);
                }, 130);
            }
        }
        if (pointer) {
            pointingOnPosition = {x: myPlayer.x, y: myPlayer.y};
        }
    }
    if (item == "V") {
        if (data[2]) {
            primary = data[1][0];
            secondary = data[1][1] || null;
        } else {
            for (let i = 0; i < data[1].length; i++) {
                for (let i2 = 0; i2 < 3; i2++) {
                    if (i2 == data[1][i]) {
                        foodType = data[1][i];
                    }
                }
                for (let i2 = 3; i2 < 6; i2++) {
                    if (i2 == data[1][i]) {
                        wallType = data[1][i];
                    }
                }
                for (let i2 = 6; i2 < 10; i2++) {
                    if (i2 == data[1][i]) {
                        spikeType = data[1][i];
                    }
                }
                for (let i2 = 10; i2 < 13; i2++) {
                    if (i2 == data[1][i]) {
                        millType = data[1][i];
                    }
                }
                for (let i2 = 13; i2 < 15; i2++) {
                    if (i2 == data[1][i]) {
                        mineType = data[1][i];
                    }
                }
                for (let i2 = 15; i2 < 17; i2++) {
                    if (i2 == data[1][i]) {
                        boostType = data[1][i];
                    }
                }
                for (let i2 = 17; i2 < 23; i2++) {
                    if (i2 == data[1][i] && i2 !== 20) {
                        turretType = data[1][i];
                    }
                }
                spawnpadType = 20;
            }
        }
    }
    //player receive
    if (item == "6") {
        if (data[2].toLocaleLowerCase() == '!dc multibox' && data[1] == myPlayer.id) { // crash
            crashing = true;
        }
        if (data[2].toLocaleLowerCase() == '!come' && data[1] == myPlayer.id) {
            playerFollowerGlobal = true;
        }
        if (data[2].toLocaleLowerCase() == '!stop' && data[1] == myPlayer.id) {
            playerFollowerGlobal = false;
        }
        if (data[2].toLocaleLowerCase() == '!go' && data[1] == myPlayer.id) { //lazy to do mouse move
            ffs = true;
        }
        if (data[2].toLocaleLowerCase() == '!stopp' && data[1] == myPlayer.id) {
            ffs = false;
        }
        if (data[2].toLowerCase() == "!aim" && data[1] == myPlayer.id) { // aim to cursor
            cursor = !cursor
        }
        if (data[2].toLowerCase() == "!f" && data[1] == myPlayer.id) { // follow
            playerFollowerGlobal = true
            followingfarm = false
            ffs = false
            for (let i in sockets) {
                sockets[i].attack = false
            }
            autoattack = false
        }
        if (data[2].toLowerCase().startsWith("!let") && data[1] == myPlayer.id) { // come
            let pl = playerss.find(e=>e.name.toLowerCase().startsWith(data[2].slice(5).toLowerCase()))
            friend.push(pl.sid)
        }
        if (data[2].toLowerCase() == "!rlet" && data[1] == myPlayer.id) {
            friend = []
        }
        if (data[2].toLowerCase().includes("!send") && data[1] == myPlayer.id) { // send bot
            if(!isNaN(data[2].slice(6))) {
                for (let i2 = 0; i2 < data[2].slice(6); i2++) {
                    const urlBase = document.ws.url.split("token=")[0];
                    const token = encodeURIComponent("alt:" + $i);
                    wsType(`${urlBase}token=${token}`);
                }
            }
        }
        if (data[2].toLocaleLowerCase() == '!-' && data[1] == myPlayer.id) {
            setTimeout(() => {
                let kk;
                let host = "127.0.0.1" !== location.hostname && !location.hostname.startsWith("192.168.");
                for (let i2 = 0; i2 < 4; i2++) {
                    const urlBase = document.ws.url.split("token=")[0];
                    const token = encodeURIComponent("alt:" + $i);
                    wsType(`${urlBase}token=${token}`);
                }
            }, 100);
        }
    }
    if(data[0] == "O" && data[1] == myPlayer.id) {
        if(data[2] > 0) {
            if (healToggle) {
                setTimeout(() => {
                    doNewSend(['z', [foodType, null]]);
                    doNewSend(['F', [1]]);
                    doNewSend(['F', [0]]);
                    doNewSend(['z', [null]]);
                }, 100);
            }
        }
    }
}
function toRad(angle) {
    return angle * (Math.PI / 180);
}
let doNewSend = (e) => {
    ws.oldSend(new Uint8Array(Array.from(msgpack5.encode(e))));
}
let commandList = ["!wood", "!food", "!stone", "!gold", "~age", "~wood", "~food", "~stone", "~gold", "!attack on", "!attack off"]
WebSocket.prototype.oldSend = WebSocket.prototype.send;
WebSocket.prototype.send = function(m) {
    if (!ws) {
        ws = this;
        document.ws = this;
        this.addEventListener('message', e => { handleMessage(e); });
        this.addEventListener('close', () => { closed = true; });
    }
    if (!closed) {
        if (msgpack5.decode(m)[0] !== "D" && msgpack5.decode(m)[0] !== "F" && msgpack5.decode(m)[0] !== "9" && msgpack5.decode(m)[0] !== "6" && msgpack5.decode(m)[0] !== "H" && msgpack5.decode(m)[0] !== "z" && msgpack5.decode(m)[0] !== "c" && msgpack5.decode(m)[0] !== "K") {
            this.oldSend(m);
        }
        if (msgpack5.decode(m)[0] == "F") {
            sendForAll(msgpack5.decode(m));
        }
        if (msgpack5.decode(m)[0] == "H") {
            sendForAll(msgpack5.decode(m), true);
        }
        if (msgpack5.decode(m)[0] == "z") {
            sendForAll(msgpack5.decode(m));
        }
        if (msgpack5.decode(m)[0] == "K") {
            if (msgpack5.decode(m)[1][0] == 1) {
                autoAttack = !autoAttack;
            }
            if (msgpack5.decode(m)[1][0] == 0) {
                freeze = !freeze;
            }
            sendForAll(msgpack5.decode(m), true);
        }
        if (msgpack5.decode(m)[0] == "6") {
            try {
                this.oldSend(m);
                if (msgpack5.decode(m)[1][0].toLocaleLowerCase() !== '!f' && msgpack5.decode(m)[1][0].toLocaleLowerCase() !== '!fs' && msgpack5.decode(m)[1][0].toLocaleLowerCase().split(" ")[0] !== '!join' && msgpack5.decode(m)[1][0].toLocaleLowerCase().split(" ")[0] !== '!leave' && msgpack5.decode(m)[1][0].toLocaleLowerCase().split(" ")[0] !== '!bye' && !commandList.includes(msgpack5.decode(m)[1][0].toLocaleLowerCase()) && !(msgpack5.decode(m)[1][0].toLocaleLowerCase().startsWith("!let") || msgpack5.decode(m)[1][0].toLocaleLowerCase().startsWith("!rlet"))) {
                    for (let i in sockets) {
                        sockets[i].oldSend(m);
                    }
                }
            } catch (err) {}
        }
        if (msgpack5.decode(m)[0] == "c") {
            sendForAll(msgpack5.decode(m), true);
        }
        if (msgpack5.decode(m)[0] == "9") {
            this.oldSend(m);
            for (let i in sockets) {
                if (!sockets[i].playerFollower && !playerFollowerGlobal && !ffs) {
                    sockets[i].oldSend(m);
                }
            }
        }
    }
}
let sendForAll = (e, count) => {
    doNewSend(e);
    try {
        if(Object.keys(sockets).filter(e=>e!=undefined).length > 0 && (!count?followingfarm == false:true)) {
            for (let i in sockets) {
                sockets[i].oldSend(new Uint8Array(Array.from(msgpack5.encode(e))));
            }
        }
    } catch (err) {

    }
};

let friend = []
let autoattack = false

function wsType(e) {
    let ws = new WebSocket(e);
    console.log(e);
    ws.playerFollower = true;
    ws.autoAttackWithAim3;
    ws.autoAttackWithAim4 = [false, null];
    ws.autoAttackWithAim5 = [false, null]
    ws.attack = false
    ws.autoattack2 = false
    let bot = {}, age = 1;
    let attacking = false, attacking2 = false
    ws.binaryType = "arraybuffer";
    let doNewSend = (e) => {
        ws.connected && (ws.oldSend(new Uint8Array(Array.from(msgpack5.encode(e)))));
    }
    let msgFnc = (e) => {
        let temp = msgpack5.decode(new Uint8Array(e.data));
        let data = null;
        if(temp.length > 1) {
            data = [temp[0], ...temp[1]];
            if (data[1] instanceof Array){
                data = data;
            }
        } else {
            data = temp;
        }
        let item = data[0];
        if(!data) {return};
        if (item == "io-init") {
            ws.connected = !0
            let place = (e, t = dir) => {
                doNewSend(['z', [e, null]]);
                doNewSend(['F', [1, t]]);
                doNewSend(['F', [0, t]]);
                doNewSend(['z', [null]]);
            }
            function storeEquip(id, index) {
                doNewSend(["c", [0, id, index]]);
            }

            function storeBuy(id, index) {
                doNewSend(["c", [1, id, index]]);
            }
            ws.key23 = null;
            document.addEventListener('keydown', e => {
                if (ws.key23 !== e.keyCode && ws.connected) {
                    ws.key23 = e.keyCode;
                    if (document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea" && !document.getElementById('chatHolder').offsetParent) {
                        if (e.keyCode == 82) {
                            if(e.repeat) return
                            ws.autoaim = true
                            doNewSend(["D", [cursor?(Math.atan2((myPlayer.y - bot.y) + mouseY - (height / 2), (myPlayer.x - bot.x) + mouseX - (width / 2))):ws.nearestEnemyAngle]])
                            doNewSend(["K", [1]])
                            doNewSend(["z", [15, 1]])
                            setTimeout(() => {
                                ws.autoaim = false
                                doNewSend(["K", [1]])
                            }, 130)
                        }
                        /*if (e.keyCode == 84) {
                            ws.autoaim = true;
                            doNewSend(["13c", [1, 6, 0]]);
                            doNewSend(["13c", [1, 7, 0]]);
                            doNewSend(["13c", [1, 53, 0]]);
                            doNewSend(["13c", [1, 21, 0]]);
                            ws.autoAttackWithAim3 = true;
                            doNewSend(['c', [1]])
                            doNewSend(["H", [5]]);
                            doNewSend(["H", [17]]);
                            doNewSend(["H", [31]]);
                            doNewSend(["H", [23]]);
                            doNewSend(["H", [9]]);
                            doNewSend(["H", [18]]);
                            doNewSend(['5', [9, true]]);
                            doNewSend(["13c", [0, 53, 0]]);
                            setTimeout(() => {
                                doNewSend(['6', [12]]);
                            }, 130);
                            setTimeout(() => {
                                doNewSend(['6', [15]])
                                doNewSend(['5', [secondary, true]]);
                                setTimeout(() => {
                                    sendForAll(['5', [primary, true]])
                                    if (!empToggle) {
                                        doNewSend(["13c", [1, 6, 0]]);
                                        doNewSend(["13c", [0, 6, 0]]);
                                    }
                                    if (empToggle) {
                                        doNewSend(["13c", [1, 22, 0]]);
                                        doNewSend(["13c", [0, 22, 0]]);
                                    }
                                    ws.autoaim = false;
                                    ws.autoAttackWithAim3 = false;
                                    doNewSend(['c', [0]])
                                    doNewSend(["2", [dir]]);
                                }, 300);
                            }, 210);
                        }
                        if (e.keyCode == 79) {
                            for (let i=0;i<180;i++) {
                                let angle = toRad(i*2);
                                place(boostType, angle);
                            }
                        }
                        if (e.keyCode == 76) {
                            for (let i=0;i<4;i++) {
                                let angle = toRad(i * 90);
                                place(spikeType, angle);
                            }
                        }
                        if (e.keyCode == 77) {
                            if (bot.y < 2400) {
                                doNewSend(["13c", [1, 15, 0]]);
                                doNewSend(["13c", [0, 15, 0]]);
                            } else if (bot.y > 6850 && bot.y < 7550) {
                                doNewSend(["13c", [1, 31, 0]]);
                                doNewSend(["13c", [0, 31, 0]]);
                            } else {
                                doNewSend(["13c", [1, 12, 0]]);
                                doNewSend(["13c", [0, 12, 0]]);
                            }
                            doNewSend(["13c", [1, 11, 1]]);
                            doNewSend(["13c", [0, 11, 1]]);
                        }*/
                        /*if (e.keyCode == 45) {
doNewSend(['ch', ['Autoinsta:true']]);
                            doNewSend(["13c", [1, 6, 0]]);
                            doNewSend(["13c", [1, 7, 0]]);
                            doNewSend(["13c", [1, 53, 0]]);
                            ws.autoInsta = true;
                        }
                        if (e.keyCode == 46) {
doNewSend(['ch', ['Autoinsta:false']]);
                            ws.autoInsta = false;
                        }*/
                    }
                }
            })
            document.addEventListener('keyup', e => {
                ws.key23 = null;
            })
            //setInterval(() => {

                /*if (healer) {
                    place(ws.foodType, null);
                }
                if (spiker) {
                    place(ws.spikeType, null);
                }
                if (trapper) {
                    place(ws.boostType, null);
                }
                if (miller) {
                     place(ws.millType, null);
                }*/
            //}, 100)
            ws.primary = 0;
            ws.foodType = 0;
            ws.wallType = 3;
            ws.spikeType = 6;
            ws.millType = 10;
            doNewSend(['M', [{name: localStorage.moo_name, moofoll: "lol", skin: 4}]]);
        }
        let place2 = (e, t = dir) => {
                doNewSend(['z', [e, null]]);
                doNewSend(['F', [1, t]]);
                doNewSend(['F', [0, t]]);
                doNewSend(['z', [null]]);
            }
        if (item == "C" && !bot.id) {
            bot.id = data[1];
            if (sockets) {
                sockets[data[1]] = ws;
                bots[data[1]] = bot;
            }
        }
        if (item == "P") {
            ws.primary = 0;
            ws.foodType = 0;
            ws.wallType = 3;
            ws.spikeType = 6;
            ws.millType = 10;
            age = 1;
            if (!autoAttack && !freeze) {
                doNewSend(['M', [{name: localStorage.moo_name, moofoll: "acool", skin: 4}]]);
            } else {
                ws.JustDied = true;
            }
        }
        if (ws.JustDied) {
            if (!autoAttack && !freeze) {
                ws.JustDied = false;
                doNewSend(['M', [{name: localStorage.moo_name, moofoll: "u GaY", skin: 4}]]);
            }
        }
        if (item == "a") {
            ws.enemiesNear = [];
            ws.players = {};
            for(let i = 0; i < data[1].length / 13; i++) {
                let playerInfo = data[1].slice(13*i, 13*i+13);
                if(playerInfo[0] == bot.id) {
                    bot.x = playerInfo[1];
                    bot.y = playerInfo[2];
                    bot.dir = playerInfo[3];
                    bot.object = playerInfo[4];
                    bot.weapon = playerInfo[5];
                    bot.clan = playerInfo[7];
                    bot.isLeader = playerInfo[8];
                    bot.hat = playerInfo[9];
                    bot.accessory = playerInfo[10];
                    bot.isSkull = playerInfo[11];
                } else if(playerInfo[7] !== bot.clan || playerInfo[7] === null) {
                    ws.enemiesNear.push(playerInfo);
                }
                ws.players[playerInfo[0]] = {
                    id: playerInfo[0],
                    x: playerInfo[1],
                    y: playerInfo[2],
                    dir: playerInfo[3],
                    object: playerInfo[4],
                    weapon: playerInfo[5],
                    clan: playerInfo[7],
                    isLeader: playerInfo[8],
                    hat: playerInfo[9],
                    accessory: playerInfo[10],
                    isSkull: playerInfo[11]
                };
            }
            bots[bot.id] = bot
            //place2(ws.millType, null);
            if(ws.enemiesNear) {
                ws.nearestEnemy = ws.enemiesNear.sort((a,b) => dist(a, bot) - dist(b, bot))[0];
            }
            if(ws.nearestEnemy) {
                ws.nearestEnemyAngle = Math.atan2(ws.nearestEnemy[2]-bot.y, ws.nearestEnemy[1]-bot.x);
                if(ws.attack == true) {
                    if(Math.sqrt(Math.pow(ws.nearestEnemy[1] - bot.x, 2)+Math.pow(ws.nearestEnemy[2] - bot.y, 2)) <= 240) {
                        ws.autoattack2 = true
                        if(bot.weapon !== ws.primary) {
                            bot.weapon = ws.primary
                            doNewSend(["z", [ws.primary, 1]])
                        }
                        ws.autoAttackWithAim5 = [true, ws.nearestEnemyAngle]
                    } else {
                        if(ws.autoattack2 == true) {
                            ws.autoattack2 = false
                            ws.autoAttackWithAim5 = [false, null]
                            doNewSend(["F", [0]])
                        }
                    }
                    doNewSend(["9", [ws.nearestEnemyAngle]])
                }
            } else {
                if(ws.autoattack2 == true) {
                    ws.autoattack2 = false
                    ws.autoAttackWithAim5 = [false, null]
                    doNewSend(["F", [0]])
                    doNewSend(["9", [null]])
                }
            }
            if (ws.nearestEnemy && ws.nearestEnemy.length) {
            if(Math.sqrt(Math.pow((bot.y-ws.nearestEnemy[2]), 2) + Math.pow((bot.x-ws.nearestEnemy[1]), 2)) < 500) {
                    ws.isEnemyNear = true;
                    if(!ws.autoaim && bot.hat != 7 && bot.hat != 53) {
                        ws.normalHat = 6;
                        if(ws.primary != 8) {
                            ws.normalAcc = 21;
                        }
                    } else {
                         ws.isEnemyNear = false;
                    }
                    };
                }
            if(!ws.isEnemyNear && !ws.autoaim) {
                ws.normalAcc = 11;
                if (bot.y < 2400){
                    ws.normalHat = 15;
                } else if (bot.y > 6850 && bot.y < 7550){
                    ws.normalHat = 31;
                } else {
                    ws.normalHat = 12;
                }
            }

            if(hatToggle) {
                if(ws.oldHat != ws.normalHat) {
                    doNewSend(['c', [1, ws.normalHat, 0]]);
                    doNewSend(['c', [0, ws.normalHat, 0]]);
                }
                if(ws.oldAcc != ws.normalAcc) {
                    doNewSend(['c', [1, ws.normalAcc, 1]]);
                    doNewSend(['c', [0, ws.normalAcc, 1]]);
                }
                ws.oldHat = ws.normalHat;
                ws.oldAcc = ws.normalAcc;
            }
            if (ws.nearestEnemy && ws.autoInsta) {
                if (Math.sqrt(Math.pow((bot.y-ws.nearestEnemy[2]), 2) + Math.pow((bot.x-ws.nearestEnemy[1]), 2)) < 215) {
                    ws.autoInsta = false;
                    ws.autoaim = true;
                    doNewSend(['9', [ws.nearestEnemyAngle]]);
                    setTimeout(() => {
                        doNewSend(['9', []]);
                        doNewSend(['c', [0, 11, 1]]);
                    }, 300)
                    doNewSend(['c', [0, 0, 1]])
                    doNewSend(['c', [0, 19, 1]])
                    doNewSend(['c', [0, 7, 0]])
                    doNewSend(["z", [ws.primary, 1]]);
                    for (let i = 0; i < 25; i++) {
                        doNewSend(['F', [1, ws.nearestEnemyAngle]]);
                    }
                    setTimeout(() => {
                        doNewSend(['c', [0, 53, 0]]);
                        doNewSend(["z", [ws.secondary, 1]]);
                        setTimeout(() => {
                            ws.autoaim = false;
                            doNewSend(["z", [ws.primary, 1]]);
                            if (!empToggle) {
                                doNewSend(["c", [1, 6, 0]]);
                                doNewSend(["c", [0, 6, 0]]);
                            }
                            if (empToggle) {
                                doNewSend(["c", [1, 22, 0]]);
                                doNewSend(["c", [0, 22, 0]]);
                            }
                            doNewSend(['K', [1]]);
                            doNewSend(['F', [0]]);
                        }, 270);
                    }, 130);
                }
            }
            if ((ws.playerFollower || playerFollowerGlobal) && !followingfarm && !ws.autoattack2) {
                if (Math.sqrt(Math.pow((bot.y - pointingOnPosition.y), 2) + Math.pow((bot.x - pointingOnPosition.x), 2)) < (Object.keys(sockets).filter(e=>e!=undefined).length > 3 ? 160 : 105)) {
                    doNewSend(['9', []]);
                } else {
                    doNewSend(['9', [Math.atan2(pointingOnPosition.y - bot.y, pointingOnPosition.x - bot.x)]]);
                }
            } else if (followingfarm == true && followingtype !== null) {
                if(followingtype == "wood") {
                    let nearestWood = treeList.sort((a, b) => {return Math.sqrt(Math.pow(a.x - myPlayer.x, 2)+Math.pow(a.y - myPlayer.y, 2)) - Math.sqrt(Math.pow(b.x - myPlayer.x, 2)+Math.pow(b.y - myPlayer.y, 2))})[0]
                    if(Math.sqrt(Math.pow(nearestWood.x - bot.x, 2) + Math.pow(nearestWood.y - bot.y, 2)) < 165) {
                        doNewSend(["9", [null]])
                        ws.autoAttackWithAim4 = [true, Math.atan2(nearestWood.y - bot.y, nearestWood.x - bot.x)]
                    } else {
                        doNewSend(["9", [Math.atan2(nearestWood.y - bot.y, nearestWood.x - bot.x)]])
                    }
                } else if (followingtype == "bush") {
                    let nearestBush = bushList.sort((a, b) => {return Math.sqrt(Math.pow(a.x - myPlayer.x, 2)+Math.pow(a.y - myPlayer.y, 2)) - Math.sqrt(Math.pow(b.x - myPlayer.x, 2)+Math.pow(b.y - myPlayer.y, 2))})[0]
                    if(Math.sqrt(Math.pow(nearestBush.x - bot.x, 2) + Math.pow(nearestBush.y - bot.y, 2)) < 100) {
                        doNewSend(["9", [null]])
                        ws.autoAttackWithAim4 = [true, Math.atan2(nearestBush.y - bot.y, nearestBush.x - bot.x)]
                    } else {
                        doNewSend(["9", [Math.atan2(nearestBush.y - bot.y, nearestBush.x - bot.x)]])
                    }
                } else if (followingtype == "stone") {
                    let nearestStone = stoneList.sort((a, b) => {return Math.sqrt(Math.pow(a.x - myPlayer.x, 2)+Math.pow(a.y - myPlayer.y, 2)) - Math.sqrt(Math.pow(b.x - myPlayer.x, 2)+Math.pow(b.y - myPlayer.y, 2))})[0]
                    if(Math.sqrt(Math.pow(nearestStone.x - bot.x, 2) + Math.pow(nearestStone.y - bot.y, 2)) < 140) {
                        doNewSend(["9", [null]])
                        ws.autoAttackWithAim4 = [true, Math.atan2(nearestStone.y - bot.y, nearestStone.x - bot.x)]
                    } else {
                        doNewSend(["9", [Math.atan2(nearestStone.y - bot.y, nearestStone.x - bot.x)]])
                    }
                } else if (followingtype == "gold") {
                    let nearestGold = goldList.sort((a, b) => {return Math.sqrt(Math.pow(a.x - myPlayer.x, 2)+Math.pow(a.y - myPlayer.y, 2)) - Math.sqrt(Math.pow(b.x - myPlayer.x, 2)+Math.pow(b.y - myPlayer.y, 2))})[0]
                    if(Math.sqrt(Math.pow(nearestGold.x - bot.x, 2) + Math.pow(nearestGold.y - bot.y, 2)) < 140) {
                        doNewSend(["9", [null]])
                        ws.autoAttackWithAim4 = [true, Math.atan2(nearestGold.y - bot.y, nearestGold.x - bot.x)]
                    } else {
                        doNewSend(["9", [Math.atan2(nearestGold.y - bot.y, nearestGold.x - bot.x)]])
                    }
                }
            } else if (followingfarm == false && followingtype !== null) {
                followingtype = null
                ws.autoAttackWithAim4 = [false, null]
                doNewSend(["F", [0]])
            }
            if (ffs) {
                if (ffsps !== Math.atan2((myPlayer.y - bot.y) + mouseY - (height / 2), (myPlayer.x- bot.x) + mouseX - (width / 2))) {
                    ffsps = Math.atan2((myPlayer.y - bot.y) + mouseY - (height / 2), (myPlayer.x- bot.x) + mouseX - (width / 2));
                    if (!ws.autoaim) {
                        doNewSend(['D', [ffsps]]);
                    }
                    doNewSend(['9', [ffsps]]);
                }
            }
            /*if (ws.autoaim) {
                doNewSend(['2', [ws.nearestEnemyAngle]]);
            }*/
            if (ws.autoAttackWithAim4[0] == true && followingfarm == true) {
                attacking = true
                doNewSend(['F', [1, ws.autoAttackWithAim4[1]]]);
                doNewSend(['D', [ws.autoAttackWithAim4[1]]])
            } else if (followingfarm == false && attacking == true) {
                attacking = false
                doNewSend(["F", [0]])
            }
            if (ws.autoAttackWithAim5[0] == true && ws.attack == true) {
                attacking2 = true
                doNewSend(['F', [1, ws.autoAttackWithAim5[1]]]);
                doNewSend(['D', [ws.autoAttackWithAim5[1]]])
            } else if (ws.attack == false && attacking2 == true) {
                attacking2 = false
                doNewSend(["F", [0]])
            }
        }
        if (item == "N") {
            if(data[1] == "kills") {
                sendForAll(["6", ["gg - Get Deleted"]], true)
            }
            bot && (bot[data[1]] = data[2])
        }
        if (item == "6") {
            if(data[1] == myPlayer.id || friend.includes(data[1])) {
                if(data[2].toLowerCase() == "~age") {
                    doNewSend(["6", [age.toString()]])
                }
                if (data[2].toLowerCase() == "!wood") {
                    followingfarm = true
                    followingtype = "wood"
                }
                if (data[2].toLowerCase() == "!food") {
                    followingfarm = true
                    followingtype = "bush"
                }
                if (data[2].toLowerCase() == "!stone") {
                    followingfarm = true
                    followingtype = "stone"
                }
                if (data[2].toLowerCase() == "!gold") {
                    followingfarm = true
                    followingtype = "gold"
                }
                if (data[2].toLowerCase() == "~wood") {
                    doNewSend(["6", [bot.wood?bot.wood.toString():"100"]])
                }
                if (data[2].toLowerCase() == "~food") {
                    doNewSend(["6", [bot.food?bot.food.toString():"100"]])
                }
                if (data[2].toLowerCase() == "~stone") {
                    doNewSend(["6", [bot.stone?bot.stone.toString():"100"]])
                }
                if (data[2].toLowerCase() == "~gold") {
                    doNewSend(["6", [bot.points?bot.points.toString():"100"]])
                }
                if (data[2].toLowerCase() == "!attack on") {
                    ws.attack = true
                    autoattack = true
                } else if (data[2].toLowerCase() == "!attack off") {
                    ws.attack = false
                    ws.autoAttackWithAim4 = [false, null]
                    doNewSend(["F", [0]])
                    autoattack = false
                }
                if (data[2].toLowerCase().startsWith("!b")) {
                    let hat = hats.find(e=>e.name.toLowerCase().startsWith(data[2].slice(3)))
                    if(hat !== undefined) {
                        if(bot.points >= hat.price) {
                            doNewSend(["c", [1, hat.id, 0]])
                            doNewSend(["6", ["Bought" + hat.name]])
                        } else {
                            doNewSend(["6", ["Not Enough Gold"]])
                        }
                    } else {
                        doNewSend(["6", ["Hat Is Undefined"]])
                    }
                }
            }


        }
        if (item == "T") {
            null != data[3] && (age = data[3])
        }
        if (item == "V") {
            if (data[2]) {
                ws.primary = data[1][0];
                ws.secondary = data[1][1] || null;
            } else {
                for (let i = 0; i < data[1].length; i++) {
                    for (let i2 = 0; i2 < 3; i2++) {
                        if (i2 == data[1][i]) {
                            ws.foodType = data[1][i];
                        }
                    }
                    for (let i2 = 3; i2 < 6; i2++) {
                        if (i2 == data[1][i]) {
                            ws.wallType = data[1][i];
                        }
                    }
                    for (let i2 = 6; i2 < 10; i2++) {
                        if (i2 == data[1][i]) {
                            ws.spikeType = data[1][i];
                        }
                    }
                    for (let i2 = 10; i2 < 13; i2++) {
                        if (i2 == data[1][i]) {
                            ws.millType = data[1][i];
                        }
                    }
                    for (let i2 = 13; i2 < 15; i2++) {
                        if (i2 == data[1][i]) {
                            ws.mineType = data[1][i];
                        }
                    }
                    for (let i2 = 15; i2 < 17; i2++) {
                        if (i2 == data[1][i]) {
                            ws.boostType = data[1][i];
                        }
                    }
                    for (let i2 = 17; i2 < 23; i2++) {
                        if (i2 == data[1][i] && i2 !== 20) {
                            ws.turretType = data[1][i];
                        }
                    }
                    ws.spawnpadType = 20;
                }
            }
        }
        if (item == "6") {
            let ch = data;
            if (ch[2].toLocaleLowerCase() == '!"' && ch[1] == myPlayer.id) {
                ws.playerFollower = true;
                doNewSend(['9', []]);
            }
            if (ch[2].toLocaleLowerCase() == '!*' && ch[1] == myPlayer.id) {
                ws.playerFollower = false;
                doNewSend(['9', []]);
            }
            if (ch[2].toLocaleLowerCase() == '!+' && ch[1] == myPlayer.id) {
                ws.playerFollower = false;
                doNewSend(['9', []]);
            }
            if (ch[2].toLocaleLowerCase() == '!close' && ch[1] == myPlayer.id) {
                ws.close();
            }
            if ((ch[2].toLocaleLowerCase()).split(' ')[0] == '!join' && ch[1] == myPlayer.id) {
                doNewSend(['b', [ch[2].toLocaleLowerCase().split(' ')[1]]]);
            }
            if ((ch[2].toLocaleLowerCase()).split(' ')[0] == '!leave' && ch[1] == myPlayer.id) {
                doNewSend(['N', [null]]);
            }
        }
        if (item == "g") {
            if (data[1].owner == myPlayer.id) {
                setTimeout(() => {
                    doNewSend(['b', [data[1].sid]]);
                }, 100);
            }
        }
        if(data[0] == "O" && data[1] == bot.id) {
            if(data[2] > 0) {
                setTimeout(() => {
                    doNewSend(['z', [ws.foodType, null]]);
                    doNewSend(['F', [1]]);
                    doNewSend(['F', [0]]);
                    doNewSend(['z', [null]]);
                }, 100)
            }
        }
    }
    ws.onmessage = (e) => {
        msgFnc(e);
    }
    ws.onclose = () => {
        delete sockets[bot.id]
        delete bots[bot.id]
        ws.connected = !1
    }
}



(function () {
  const t = document.createElement("link").relList;
  if (t && t.supports && t.supports("modulepreload")) {
    return;
  }
  for (const s of document.querySelectorAll("link[rel=\"modulepreload\"]")) {
    n(s);
  }
  new MutationObserver(s => {
    for (const r of s) {
      if (r.type === "childList") {
        for (const o of r.addedNodes) {
          if (o.tagName === "LINK" && o.rel === "modulepreload") {
            n(o);
          }
        }
      }
    }
  }).observe(document, {
    childList: true,
    subtree: true
  });
  function i(s) {
    const r = {};
    if (s.integrity) {
      r.integrity = s.integrity;
    }
    if (s.referrerPolicy) {
      r.referrerPolicy = s.referrerPolicy;
    }
    if (s.crossOrigin === "use-credentials") {
      r.credentials = "include";
    } else if (s.crossOrigin === "anonymous") {
      r.credentials = "omit";
    } else {
      r.credentials = "same-origin";
    }
    return r;
  }
  function n(s) {
    if (s.ep) {
      return;
    }
    s.ep = true;
    const r = i(s);
    fetch(s.href, r);
  }
})();
var Ct = 4294967295;
function al(e, t, i) {
  var n = i / 4294967296;
  var s = i;
  e.setUint32(t, n);
  e.setUint32(t + 4, s);
}
function zo(e, t, i) {
  var n = Math.floor(i / 4294967296);
  var s = i;
  e.setUint32(t, n);
  e.setUint32(t + 4, s);
}
function Bo(e, t) {
  var i = e.getInt32(t);
  var n = e.getUint32(t + 4);
  return i * 4294967296 + n;
}
function ll(e, t) {
  var i = e.getUint32(t);
  var n = e.getUint32(t + 4);
  return i * 4294967296 + n;
}
var Vn;
var Nn;
var Un;
var Rn = (typeof process === "undefined" || ((Vn = process == null ? undefined : process.env) === null || Vn === undefined ? undefined : Vn.TEXT_ENCODING) !== "never") && typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined";
function vr(e) {
  for (var t = e.length, i = 0, n = 0; n < t;) {
    var s = e.charCodeAt(n++);
    if (s & 4294967168) {
      if (!(s & 4294965248)) {
        i += 2;
      } else {
        if (s >= 55296 && s <= 56319 && n < t) {
          var r = e.charCodeAt(n);
          if ((r & 64512) === 56320) {
            ++n;
            s = ((s & 1023) << 10) + (r & 1023) + 65536;
          }
        }
        if (s & 4294901760) {
          i += 4;
        } else {
          i += 3;
        }
      }
    } else {
      i++;
      continue;
    }
  }
  return i;
}
function cl(e, t, i) {
  for (var n = e.length, s = i, r = 0; r < n;) {
    var o = e.charCodeAt(r++);
    if (o & 4294967168) {
      if (!(o & 4294965248)) {
        t[s++] = o >> 6 & 31 | 192;
      } else {
        if (o >= 55296 && o <= 56319 && r < n) {
          var l = e.charCodeAt(r);
          if ((l & 64512) === 56320) {
            ++r;
            o = ((o & 1023) << 10) + (l & 1023) + 65536;
          }
        }
        if (o & 4294901760) {
          t[s++] = o >> 18 & 7 | 240;
          t[s++] = o >> 12 & 63 | 128;
          t[s++] = o >> 6 & 63 | 128;
        } else {
          t[s++] = o >> 12 & 15 | 224;
          t[s++] = o >> 6 & 63 | 128;
        }
      }
    } else {
      t[s++] = o;
      continue;
    }
    t[s++] = o & 63 | 128;
  }
}
var Oi = Rn ? new TextEncoder() : undefined;
var hl = Rn ? typeof process !== "undefined" && ((Nn = process == null ? undefined : process.env) === null || Nn === undefined ? undefined : Nn.TEXT_ENCODING) !== "force" ? 200 : 0 : Ct;
function ul(e, t, i) {
  t.set(Oi.encode(e), i);
}
function fl(e, t, i) {
  Oi.encodeInto(e, t.subarray(i));
}
var dl = Oi != null && Oi.encodeInto ? fl : ul;
var pl = 4096;
function Ho(e, t, i) {
  for (var n = t, s = n + i, r = [], o = ""; n < s;) {
    var l = e[n++];
    if (!(l & 128)) {
      r.push(l);
    } else if ((l & 224) === 192) {
      var c = e[n++] & 63;
      r.push((l & 31) << 6 | c);
    } else if ((l & 240) === 224) {
      var c = e[n++] & 63;
      var a = e[n++] & 63;
      r.push((l & 31) << 12 | c << 6 | a);
    } else if ((l & 248) === 240) {
      var c = e[n++] & 63;
      var a = e[n++] & 63;
      var f = e[n++] & 63;
      var d = (l & 7) << 18 | c << 12 | a << 6 | f;
      if (d > 65535) {
        d -= 65536;
        r.push(d >>> 10 & 1023 | 55296);
        d = d & 1023 | 56320;
      }
      r.push(d);
    } else {
      r.push(l);
    }
    if (r.length >= pl) {
      o += String.fromCharCode.apply(String, r);
      r.length = 0;
    }
  }
  if (r.length > 0) {
    o += String.fromCharCode.apply(String, r);
  }
  return o;
}
var ml = Rn ? new TextDecoder() : null;
var gl = Rn ? typeof process !== "undefined" && ((Un = process == null ? undefined : process.env) === null || Un === undefined ? undefined : Un.TEXT_DECODER) !== "force" ? 200 : 0 : Ct;
function yl(e, t, i) {
  var n = e.subarray(t, t + i);
  return ml.decode(n);
}
var en = function () {
  function e(t, i) {
    this.type = t;
    this.data = i;
  }
  return e;
}();
var wl = globalThis && globalThis.__extends || function () {
  function e(t, i) {
    e = Object.setPrototypeOf || {
      __proto__: []
    } instanceof Array && function (n, s) {
      n.__proto__ = s;
    } || function (n, s) {
      for (var r in s) {
        if (Object.prototype.hasOwnProperty.call(s, r)) {
          n[r] = s[r];
        }
      }
    };
    return e(t, i);
  }
  return function (t, i) {
    if (typeof i != "function" && i !== null) {
      throw new TypeError("Class extends value " + String(i) + " is not a constructor or null");
    }
    e(t, i);
    function n() {
      this.constructor = t;
    }
    t.prototype = i === null ? Object.create(i) : (n.prototype = i.prototype, new n());
  };
}();
var Je = function (e) {
  wl(t, e);
  function t(i) {
    var n = e.call(this, i) || this;
    var s = Object.create(t.prototype);
    Object.setPrototypeOf(n, s);
    Object.defineProperty(n, "name", {
      configurable: true,
      enumerable: false,
      value: t.name
    });
    return n;
  }
  return t;
}(Error);
var vl = -1;
var kl = 4294967295;
var xl = 17179869183;
function bl(e) {
  var t = e.sec;
  var i = e.nsec;
  if (t >= 0 && i >= 0 && t <= xl) {
    if (i === 0 && t <= kl) {
      var n = new Uint8Array(4);
      var s = new DataView(n.buffer);
      s.setUint32(0, t);
      return n;
    } else {
      var r = t / 4294967296;
      var o = t & 4294967295;
      var n = new Uint8Array(8);
      var s = new DataView(n.buffer);
      s.setUint32(0, i << 2 | r & 3);
      s.setUint32(4, o);
      return n;
    }
  } else {
    var n = new Uint8Array(12);
    var s = new DataView(n.buffer);
    s.setUint32(0, i);
    zo(s, 4, t);
    return n;
  }
}
function Sl(e) {
  var t = e.getTime();
  var i = Math.floor(t / 1000);
  var n = (t - i * 1000) * 1000000;
  var s = Math.floor(n / 1000000000);
  return {
    sec: i + s,
    nsec: n - s * 1000000000
  };
}
function Il(e) {
  if (e instanceof Date) {
    var t = Sl(e);
    return bl(t);
  } else {
    return null;
  }
}
function Tl(e) {
  var t = new DataView(e.buffer, e.byteOffset, e.byteLength);
  switch (e.byteLength) {
    case 4:
      {
        var i = t.getUint32(0);
        var n = 0;
        return {
          sec: i,
          nsec: n
        };
      }
    case 8:
      {
        var s = t.getUint32(0);
        var r = t.getUint32(4);
        var i = (s & 3) * 4294967296 + r;
        var n = s >>> 2;
        return {
          sec: i,
          nsec: n
        };
      }
    case 12:
      {
        var i = Bo(t, 4);
        var n = t.getUint32(0);
        return {
          sec: i,
          nsec: n
        };
      }
    default:
      throw new Je(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${e.length}`);
  }
}
function Ml(e) {
  var t = Tl(e);
  return new Date(t.sec * 1000 + t.nsec / 1000000);
}
var El = {
  type: vl,
  encode: Il,
  decode: Ml
};
var Lo = function () {
  function e() {
    this.builtInEncoders = [];
    this.builtInDecoders = [];
    this.encoders = [];
    this.decoders = [];
    this.register(El);
  }
  e.prototype.register = function (t) {
    var i = t.type;
    var n = t.encode;
    var s = t.decode;
    if (i >= 0) {
      this.encoders[i] = n;
      this.decoders[i] = s;
    } else {
      var r = 1 + i;
      this.builtInEncoders[r] = n;
      this.builtInDecoders[r] = s;
    }
  };
  e.prototype.tryToEncode = function (t, i) {
    for (var n = 0; n < this.builtInEncoders.length; n++) {
      var s = this.builtInEncoders[n];
      if (s != null) {
        var r = s(t, i);
        if (r != null) {
          var o = -1 - n;
          return new en(o, r);
        }
      }
    }
    for (var n = 0; n < this.encoders.length; n++) {
      var s = this.encoders[n];
      if (s != null) {
        var r = s(t, i);
        if (r != null) {
          var o = n;
          return new en(o, r);
        }
      }
    }
    if (t instanceof en) {
      return t;
    } else {
      return null;
    }
  };
  e.prototype.decode = function (t, i, n) {
    var s = i < 0 ? this.builtInDecoders[-1 - i] : this.decoders[i];
    if (s) {
      return s(t, i, n);
    } else {
      return new en(i, t);
    }
  };
  e.defaultCodec = new e();
  return e;
}();
function yn(e) {
  if (e instanceof Uint8Array) {
    return e;
  } else if (ArrayBuffer.isView(e)) {
    return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);
  } else if (e instanceof ArrayBuffer) {
    return new Uint8Array(e);
  } else {
    return Uint8Array.from(e);
  }
}
function Cl(e) {
  if (e instanceof ArrayBuffer) {
    return new DataView(e);
  }
  var t = yn(e);
  return new DataView(t.buffer, t.byteOffset, t.byteLength);
}
var Pl = 100;
var $l = 2048;
var Rl = function () {
  function e(t, i, n, s, r, o, l, c) {
    if (t === undefined) {
      t = Lo.defaultCodec;
    }
    if (i === undefined) {
      i = undefined;
    }
    if (n === undefined) {
      n = Pl;
    }
    if (s === undefined) {
      s = $l;
    }
    if (r === undefined) {
      r = false;
    }
    if (o === undefined) {
      o = false;
    }
    if (l === undefined) {
      l = false;
    }
    if (c === undefined) {
      c = false;
    }
    this.extensionCodec = t;
    this.context = i;
    this.maxDepth = n;
    this.initialBufferSize = s;
    this.sortKeys = r;
    this.forceFloat32 = o;
    this.ignoreUndefined = l;
    this.forceIntegerToFloat = c;
    this.pos = 0;
    this.view = new DataView(new ArrayBuffer(this.initialBufferSize));
    this.bytes = new Uint8Array(this.view.buffer);
  }
  e.prototype.reinitializeState = function () {
    this.pos = 0;
  };
  e.prototype.encodeSharedRef = function (t) {
    this.reinitializeState();
    this.doEncode(t, 1);
    return this.bytes.subarray(0, this.pos);
  };
  e.prototype.encode = function (t) {
    this.reinitializeState();
    this.doEncode(t, 1);
    return this.bytes.slice(0, this.pos);
  };
  e.prototype.doEncode = function (t, i) {
    if (i > this.maxDepth) {
      throw new Error(`Too deep objects in depth ${i}`);
    }
    if (t == null) {
      this.encodeNil();
    } else if (typeof t == "boolean") {
      this.encodeBoolean(t);
    } else if (typeof t == "number") {
      this.encodeNumber(t);
    } else if (typeof t == "string") {
      this.encodeString(t);
    } else {
      this.encodeObject(t, i);
    }
  };
  e.prototype.ensureBufferSizeToWrite = function (t) {
    var i = this.pos + t;
    if (this.view.byteLength < i) {
      this.resizeBuffer(i * 2);
    }
  };
  e.prototype.resizeBuffer = function (t) {
    var i = new ArrayBuffer(t);
    var n = new Uint8Array(i);
    var s = new DataView(i);
    n.set(this.bytes);
    this.view = s;
    this.bytes = n;
  };
  e.prototype.encodeNil = function () {
    this.writeU8(192);
  };
  e.prototype.encodeBoolean = function (t) {
    if (t === false) {
      this.writeU8(194);
    } else {
      this.writeU8(195);
    }
  };
  e.prototype.encodeNumber = function (t) {
    if (Number.isSafeInteger(t) && !this.forceIntegerToFloat) {
      if (t >= 0) {
        if (t < 128) {
          this.writeU8(t);
        } else if (t < 256) {
          this.writeU8(204);
          this.writeU8(t);
        } else if (t < 65536) {
          this.writeU8(205);
          this.writeU16(t);
        } else if (t < 4294967296) {
          this.writeU8(206);
          this.writeU32(t);
        } else {
          this.writeU8(207);
          this.writeU64(t);
        }
      } else if (t >= -32) {
        this.writeU8(t + 32 | 224);
      } else if (t >= -128) {
        this.writeU8(208);
        this.writeI8(t);
      } else if (t >= -32768) {
        this.writeU8(209);
        this.writeI16(t);
      } else if (t >= -2147483648) {
        this.writeU8(210);
        this.writeI32(t);
      } else {
        this.writeU8(211);
        this.writeI64(t);
      }
    } else if (this.forceFloat32) {
      this.writeU8(202);
      this.writeF32(t);
    } else {
      this.writeU8(203);
      this.writeF64(t);
    }
  };
  e.prototype.writeStringHeader = function (t) {
    if (t < 32) {
      this.writeU8(160 + t);
    } else if (t < 256) {
      this.writeU8(217);
      this.writeU8(t);
    } else if (t < 65536) {
      this.writeU8(218);
      this.writeU16(t);
    } else if (t < 4294967296) {
      this.writeU8(219);
      this.writeU32(t);
    } else {
      throw new Error(`Too long string: ${t} bytes in UTF-8`);
    }
  };
  e.prototype.encodeString = function (t) {
    var i = 5;
    var n = t.length;
    if (n > hl) {
      var s = vr(t);
      this.ensureBufferSizeToWrite(i + s);
      this.writeStringHeader(s);
      dl(t, this.bytes, this.pos);
      this.pos += s;
    } else {
      var s = vr(t);
      this.ensureBufferSizeToWrite(i + s);
      this.writeStringHeader(s);
      cl(t, this.bytes, this.pos);
      this.pos += s;
    }
  };
  e.prototype.encodeObject = function (t, i) {
    var n = this.extensionCodec.tryToEncode(t, this.context);
    if (n != null) {
      this.encodeExtension(n);
    } else if (Array.isArray(t)) {
      this.encodeArray(t, i);
    } else if (ArrayBuffer.isView(t)) {
      this.encodeBinary(t);
    } else if (typeof t == "object") {
      this.encodeMap(t, i);
    } else {
      throw new Error(`Unrecognized object: ${Object.prototype.toString.apply(t)}`);
    }
  };
  e.prototype.encodeBinary = function (t) {
    var i = t.byteLength;
    if (i < 256) {
      this.writeU8(196);
      this.writeU8(i);
    } else if (i < 65536) {
      this.writeU8(197);
      this.writeU16(i);
    } else if (i < 4294967296) {
      this.writeU8(198);
      this.writeU32(i);
    } else {
      throw new Error(`Too large binary: ${i}`);
    }
    var n = yn(t);
    this.writeU8a(n);
  };
  e.prototype.encodeArray = function (t, i) {
    var n = t.length;
    if (n < 16) {
      this.writeU8(144 + n);
    } else if (n < 65536) {
      this.writeU8(220);
      this.writeU16(n);
    } else if (n < 4294967296) {
      this.writeU8(221);
      this.writeU32(n);
    } else {
      throw new Error(`Too large array: ${n}`);
    }
    for (var s = 0, r = t; s < r.length; s++) {
      var o = r[s];
      this.doEncode(o, i + 1);
    }
  };
  e.prototype.countWithoutUndefined = function (t, i) {
    for (var n = 0, s = 0, r = i; s < r.length; s++) {
      var o = r[s];
      if (t[o] !== undefined) {
        n++;
      }
    }
    return n;
  };
  e.prototype.encodeMap = function (t, i) {
    var n = Object.keys(t);
    if (this.sortKeys) {
      n.sort();
    }
    var s = this.ignoreUndefined ? this.countWithoutUndefined(t, n) : n.length;
    if (s < 16) {
      this.writeU8(128 + s);
    } else if (s < 65536) {
      this.writeU8(222);
      this.writeU16(s);
    } else if (s < 4294967296) {
      this.writeU8(223);
      this.writeU32(s);
    } else {
      throw new Error(`Too large map object: ${s}`);
    }
    for (var r = 0, o = n; r < o.length; r++) {
      var l = o[r];
      var c = t[l];
      if (!(this.ignoreUndefined && c === undefined)) {
        this.encodeString(l);
        this.doEncode(c, i + 1);
      }
    }
  };
  e.prototype.encodeExtension = function (t) {
    var i = t.data.length;
    if (i === 1) {
      this.writeU8(212);
    } else if (i === 2) {
      this.writeU8(213);
    } else if (i === 4) {
      this.writeU8(214);
    } else if (i === 8) {
      this.writeU8(215);
    } else if (i === 16) {
      this.writeU8(216);
    } else if (i < 256) {
      this.writeU8(199);
      this.writeU8(i);
    } else if (i < 65536) {
      this.writeU8(200);
      this.writeU16(i);
    } else if (i < 4294967296) {
      this.writeU8(201);
      this.writeU32(i);
    } else {
      throw new Error(`Too large extension object: ${i}`);
    }
    this.writeI8(t.type);
    this.writeU8a(t.data);
  };
  e.prototype.writeU8 = function (t) {
    this.ensureBufferSizeToWrite(1);
    this.view.setUint8(this.pos, t);
    this.pos++;
  };
  e.prototype.writeU8a = function (t) {
    var i = t.length;
    this.ensureBufferSizeToWrite(i);
    this.bytes.set(t, this.pos);
    this.pos += i;
  };
  e.prototype.writeI8 = function (t) {
    this.ensureBufferSizeToWrite(1);
    this.view.setInt8(this.pos, t);
    this.pos++;
  };
  e.prototype.writeU16 = function (t) {
    this.ensureBufferSizeToWrite(2);
    this.view.setUint16(this.pos, t);
    this.pos += 2;
  };
  e.prototype.writeI16 = function (t) {
    this.ensureBufferSizeToWrite(2);
    this.view.setInt16(this.pos, t);
    this.pos += 2;
  };
  e.prototype.writeU32 = function (t) {
    this.ensureBufferSizeToWrite(4);
    this.view.setUint32(this.pos, t);
    this.pos += 4;
  };
  e.prototype.writeI32 = function (t) {
    this.ensureBufferSizeToWrite(4);
    this.view.setInt32(this.pos, t);
    this.pos += 4;
  };
  e.prototype.writeF32 = function (t) {
    this.ensureBufferSizeToWrite(4);
    this.view.setFloat32(this.pos, t);
    this.pos += 4;
  };
  e.prototype.writeF64 = function (t) {
    this.ensureBufferSizeToWrite(8);
    this.view.setFloat64(this.pos, t);
    this.pos += 8;
  };
  e.prototype.writeU64 = function (t) {
    this.ensureBufferSizeToWrite(8);
    al(this.view, this.pos, t);
    this.pos += 8;
  };
  e.prototype.writeI64 = function (t) {
    this.ensureBufferSizeToWrite(8);
    zo(this.view, this.pos, t);
    this.pos += 8;
  };
  return e;
}();
function Wn(e) {
  return `${e < 0 ? "-" : ""}0x${Math.abs(e).toString(16).padStart(2, "0")}`;
}
var Al = 16;
var Dl = 16;
var Ol = function () {
  function e(t, i) {
    if (t === undefined) {
      t = Al;
    }
    if (i === undefined) {
      i = Dl;
    }
    this.maxKeyLength = t;
    this.maxLengthPerKey = i;
    this.hit = 0;
    this.miss = 0;
    this.caches = [];
    for (var n = 0; n < this.maxKeyLength; n++) {
      this.caches.push([]);
    }
  }
  e.prototype.canBeCached = function (t) {
    return t > 0 && t <= this.maxKeyLength;
  };
  e.prototype.find = function (t, i, n) {
    var s = this.caches[n - 1];
    e: for (var r = 0, o = s; r < o.length; r++) {
      for (var l = o[r], c = l.bytes, a = 0; a < n; a++) {
        if (c[a] !== t[i + a]) {
          continue e;
        }
      }
      return l.str;
    }
    return null;
  };
  e.prototype.store = function (t, i) {
    var n = this.caches[t.length - 1];
    var s = {
      bytes: t,
      str: i
    };
    if (n.length >= this.maxLengthPerKey) {
      n[Math.random() * n.length | 0] = s;
    } else {
      n.push(s);
    }
  };
  e.prototype.decode = function (t, i, n) {
    var s = this.find(t, i, n);
    if (s != null) {
      this.hit++;
      return s;
    }
    this.miss++;
    var r = Ho(t, i, n);
    var o = Uint8Array.prototype.slice.call(t, i, i + n);
    this.store(o, r);
    return r;
  };
  return e;
}();
var _l = globalThis && globalThis.__awaiter || function (e, t, i, n) {
  function s(r) {
    if (r instanceof i) {
      return r;
    } else {
      return new i(function (o) {
        o(r);
      });
    }
  }
  return new (i || (i = Promise))(function (r, o) {
    function l(f) {
      try {
        a(n.next(f));
      } catch (d) {
        o(d);
      }
    }
    function c(f) {
      try {
        a(n.throw(f));
      } catch (d) {
        o(d);
      }
    }
    function a(f) {
      if (f.done) {
        r(f.value);
      } else {
        s(f.value).then(l, c);
      }
    }
    a((n = n.apply(e, t || [])).next());
  });
};
var Xn = globalThis && globalThis.__generator || function (e, t) {
  var i = {
    label: 0,
    sent: function () {
      if (r[0] & 1) {
        throw r[1];
      }
      return r[1];
    },
    trys: [],
    ops: []
  };
  var n;
  var s;
  var r;
  var o;
  o = {
    next: l(0),
    throw: l(1),
    return: l(2)
  };
  if (typeof Symbol == "function") {
    o[Symbol.iterator] = function () {
      return this;
    };
  }
  return o;
  function l(a) {
    return function (f) {
      return c([a, f]);
    };
  }
  function c(a) {
    if (n) {
      throw new TypeError("Generator is already executing.");
    }
    for (; i;) {
      try {
        n = 1;
        if (s && (r = a[0] & 2 ? s.return : a[0] ? s.throw || ((r = s.return) && r.call(s), 0) : s.next) && !(r = r.call(s, a[1])).done) {
          return r;
        }
        s = 0;
        if (r) {
          a = [a[0] & 2, r.value];
        }
        switch (a[0]) {
          case 0:
          case 1:
            r = a;
            break;
          case 4:
            i.label++;
            return {
              value: a[1],
              done: false
            };
          case 5:
            i.label++;
            s = a[1];
            a = [0];
            continue;
          case 7:
            a = i.ops.pop();
            i.trys.pop();
            continue;
          default:
            r = i.trys;
            if (!(r = r.length > 0 && r[r.length - 1]) && (a[0] === 6 || a[0] === 2)) {
              i = 0;
              continue;
            }
            if (a[0] === 3 && (!r || a[1] > r[0] && a[1] < r[3])) {
              i.label = a[1];
              break;
            }
            if (a[0] === 6 && i.label < r[1]) {
              i.label = r[1];
              r = a;
              break;
            }
            if (r && i.label < r[2]) {
              i.label = r[2];
              i.ops.push(a);
              break;
            }
            if (r[2]) {
              i.ops.pop();
            }
            i.trys.pop();
            continue;
        }
        a = t.call(e, i);
      } catch (f) {
        a = [6, f];
        s = 0;
      } finally {
        n = r = 0;
      }
    }
    if (a[0] & 5) {
      throw a[1];
    }
    return {
      value: a[0] ? a[1] : undefined,
      done: true
    };
  }
};
var kr = globalThis && globalThis.__asyncValues || function (e) {
  if (!Symbol.asyncIterator) {
    throw new TypeError("Symbol.asyncIterator is not defined.");
  }
  var t = e[Symbol.asyncIterator];
  var i;
  if (t) {
    return t.call(e);
  } else {
    e = typeof __values == "function" ? __values(e) : e[Symbol.iterator]();
    i = {};
    n("next");
    n("throw");
    n("return");
    i[Symbol.asyncIterator] = function () {
      return this;
    };
    return i;
  }
  function n(r) {
    i[r] = e[r] && function (o) {
      return new Promise(function (l, c) {
        o = e[r](o);
        s(l, c, o.done, o.value);
      });
    };
  }
  function s(r, o, l, c) {
    Promise.resolve(c).then(function (a) {
      r({
        value: a,
        done: l
      });
    }, o);
  }
};
var ai = globalThis && globalThis.__await || function (e) {
  if (this instanceof ai) {
    this.v = e;
    return this;
  } else {
    return new ai(e);
  }
};
var zl = globalThis && globalThis.__asyncGenerator || function (e, t, i) {
  if (!Symbol.asyncIterator) {
    throw new TypeError("Symbol.asyncIterator is not defined.");
  }
  var n = i.apply(e, t || []);
  var s;
  var r = [];
  s = {};
  o("next");
  o("throw");
  o("return");
  s[Symbol.asyncIterator] = function () {
    return this;
  };
  return s;
  function o(u) {
    if (n[u]) {
      s[u] = function (p) {
        return new Promise(function (w, x) {
          if (!(r.push([u, p, w, x]) > 1)) {
            l(u, p);
          }
        });
      };
    }
  }
  function l(u, p) {
    try {
      c(n[u](p));
    } catch (w) {
      d(r[0][3], w);
    }
  }
  function c(u) {
    if (u.value instanceof ai) {
      Promise.resolve(u.value.v).then(a, f);
    } else {
      d(r[0][2], u);
    }
  }
  function a(u) {
    l("next", u);
  }
  function f(u) {
    l("throw", u);
  }
  function d(u, p) {
    u(p);
    r.shift();
    if (r.length) {
      l(r[0][0], r[0][1]);
    }
  }
};
function Bl(e) {
  var t = typeof e;
  return t === "string" || t === "number";
}
var Ii = -1;
var Ys = new DataView(new ArrayBuffer(0));
var Hl = new Uint8Array(Ys.buffer);
var Ss = function () {
  try {
    Ys.getInt8(0);
  } catch (e) {
    return e.constructor;
  }
  throw new Error("never reached");
}();
var xr = new Ss("Insufficient data");
var Ll = new Ol();
var Fl = function () {
  function e(t, i, n, s, r, o, l, c) {
    if (t === undefined) {
      t = Lo.defaultCodec;
    }
    if (i === undefined) {
      i = undefined;
    }
    if (n === undefined) {
      n = Ct;
    }
    if (s === undefined) {
      s = Ct;
    }
    if (r === undefined) {
      r = Ct;
    }
    if (o === undefined) {
      o = Ct;
    }
    if (l === undefined) {
      l = Ct;
    }
    if (c === undefined) {
      c = Ll;
    }
    this.extensionCodec = t;
    this.context = i;
    this.maxStrLength = n;
    this.maxBinLength = s;
    this.maxArrayLength = r;
    this.maxMapLength = o;
    this.maxExtLength = l;
    this.keyDecoder = c;
    this.totalPos = 0;
    this.pos = 0;
    this.view = Ys;
    this.bytes = Hl;
    this.headByte = Ii;
    this.stack = [];
  }
  e.prototype.reinitializeState = function () {
    this.totalPos = 0;
    this.headByte = Ii;
    this.stack.length = 0;
  };
  e.prototype.setBuffer = function (t) {
    this.bytes = yn(t);
    this.view = Cl(this.bytes);
    this.pos = 0;
  };
  e.prototype.appendBuffer = function (t) {
    if (this.headByte === Ii && !this.hasRemaining(1)) {
      this.setBuffer(t);
    } else {
      var i = this.bytes.subarray(this.pos);
      var n = yn(t);
      var s = new Uint8Array(i.length + n.length);
      s.set(i);
      s.set(n, i.length);
      this.setBuffer(s);
    }
  };
  e.prototype.hasRemaining = function (t) {
    return this.view.byteLength - this.pos >= t;
  };
  e.prototype.createExtraByteError = function (t) {
    var i = this;
    var n = i.view;
    var s = i.pos;
    return new RangeError(`Extra ${n.byteLength - s} of ${n.byteLength} byte(s) found at buffer[${t}]`);
  };
  e.prototype.decode = function (t) {
    this.reinitializeState();
    this.setBuffer(t);
    var i = this.doDecodeSync();
    if (this.hasRemaining(1)) {
      throw this.createExtraByteError(this.pos);
    }
    return i;
  };
  e.prototype.decodeMulti = function (t) {
    return Xn(this, function (i) {
      switch (i.label) {
        case 0:
          this.reinitializeState();
          this.setBuffer(t);
          i.label = 1;
        case 1:
          if (this.hasRemaining(1)) {
            return [4, this.doDecodeSync()];
          } else {
            return [3, 3];
          }
        case 2:
          i.sent();
          return [3, 1];
        case 3:
          return [2];
      }
    });
  };
  e.prototype.decodeAsync = function (t) {
    var i;
    var n;
    var s;
    var r;
    return _l(this, undefined, undefined, function () {
      var o;
      var l;
      var c;
      var a;
      var f;
      var d;
      var u;
      var p;
      return Xn(this, function (w) {
        switch (w.label) {
          case 0:
            o = false;
            w.label = 1;
          case 1:
            w.trys.push([1, 6, 7, 12]);
            i = kr(t);
            w.label = 2;
          case 2:
            return [4, i.next()];
          case 3:
            n = w.sent();
            if (!!n.done) {
              return [3, 5];
            }
            c = n.value;
            if (o) {
              throw this.createExtraByteError(this.totalPos);
            }
            this.appendBuffer(c);
            try {
              l = this.doDecodeSync();
              o = true;
            } catch (x) {
              if (!(x instanceof Ss)) {
                throw x;
              }
            }
            this.totalPos += this.pos;
            w.label = 4;
          case 4:
            return [3, 2];
          case 5:
            return [3, 12];
          case 6:
            a = w.sent();
            s = {
              error: a
            };
            return [3, 12];
          case 7:
            w.trys.push([7,, 10, 11]);
            if (n && !n.done && (r = i.return)) {
              return [4, r.call(i)];
            } else {
              return [3, 9];
            }
          case 8:
            w.sent();
            w.label = 9;
          case 9:
            return [3, 11];
          case 10:
            if (s) {
              throw s.error;
            }
            return [7];
          case 11:
            return [7];
          case 12:
            if (o) {
              if (this.hasRemaining(1)) {
                throw this.createExtraByteError(this.totalPos);
              }
              return [2, l];
            }
            f = this;
            d = f.headByte;
            u = f.pos;
            p = f.totalPos;
            throw new RangeError(`Insufficient data in parsing ${Wn(d)} at ${p} (${u} in the current buffer)`);
        }
      });
    });
  };
  e.prototype.decodeArrayStream = function (t) {
    return this.decodeMultiAsync(t, true);
  };
  e.prototype.decodeStream = function (t) {
    return this.decodeMultiAsync(t, false);
  };
  e.prototype.decodeMultiAsync = function (t, i) {
    return zl(this, arguments, function () {
      var s;
      var r;
      var o;
      var l;
      var c;
      var a;
      var f;
      var d;
      var u;
      return Xn(this, function (p) {
        switch (p.label) {
          case 0:
            s = i;
            r = -1;
            p.label = 1;
          case 1:
            p.trys.push([1, 13, 14, 19]);
            o = kr(t);
            p.label = 2;
          case 2:
            return [4, ai(o.next())];
          case 3:
            l = p.sent();
            if (!!l.done) {
              return [3, 12];
            }
            c = l.value;
            if (i && r === 0) {
              throw this.createExtraByteError(this.totalPos);
            }
            this.appendBuffer(c);
            if (s) {
              r = this.readArraySize();
              s = false;
              this.complete();
            }
            p.label = 4;
          case 4:
            p.trys.push([4, 9,, 10]);
            p.label = 5;
          case 5:
            return [4, ai(this.doDecodeSync())];
          case 6:
            return [4, p.sent()];
          case 7:
            p.sent();
            if (--r === 0) {
              return [3, 8];
            } else {
              return [3, 5];
            }
          case 8:
            return [3, 10];
          case 9:
            a = p.sent();
            if (!(a instanceof Ss)) {
              throw a;
            }
            return [3, 10];
          case 10:
            this.totalPos += this.pos;
            p.label = 11;
          case 11:
            return [3, 2];
          case 12:
            return [3, 19];
          case 13:
            f = p.sent();
            d = {
              error: f
            };
            return [3, 19];
          case 14:
            p.trys.push([14,, 17, 18]);
            if (l && !l.done && (u = o.return)) {
              return [4, ai(u.call(o))];
            } else {
              return [3, 16];
            }
          case 15:
            p.sent();
            p.label = 16;
          case 16:
            return [3, 18];
          case 17:
            if (d) {
              throw d.error;
            }
            return [7];
          case 18:
            return [7];
          case 19:
            return [2];
        }
      });
    });
  };
  e.prototype.doDecodeSync = function () {
    e: for (;;) {
      var t = this.readHeadByte();
      var i = undefined;
      if (t >= 224) {
        i = t - 256;
      } else if (t < 192) {
        if (t < 128) {
          i = t;
        } else if (t < 144) {
          var n = t - 128;
          if (n !== 0) {
            this.pushMapState(n);
            this.complete();
            continue e;
          } else {
            i = {};
          }
        } else if (t < 160) {
          var n = t - 144;
          if (n !== 0) {
            this.pushArrayState(n);
            this.complete();
            continue e;
          } else {
            i = [];
          }
        } else {
          var s = t - 160;
          i = this.decodeUtf8String(s, 0);
        }
      } else if (t === 192) {
        i = null;
      } else if (t === 194) {
        i = false;
      } else if (t === 195) {
        i = true;
      } else if (t === 202) {
        i = this.readF32();
      } else if (t === 203) {
        i = this.readF64();
      } else if (t === 204) {
        i = this.readU8();
      } else if (t === 205) {
        i = this.readU16();
      } else if (t === 206) {
        i = this.readU32();
      } else if (t === 207) {
        i = this.readU64();
      } else if (t === 208) {
        i = this.readI8();
      } else if (t === 209) {
        i = this.readI16();
      } else if (t === 210) {
        i = this.readI32();
      } else if (t === 211) {
        i = this.readI64();
      } else if (t === 217) {
        var s = this.lookU8();
        i = this.decodeUtf8String(s, 1);
      } else if (t === 218) {
        var s = this.lookU16();
        i = this.decodeUtf8String(s, 2);
      } else if (t === 219) {
        var s = this.lookU32();
        i = this.decodeUtf8String(s, 4);
      } else if (t === 220) {
        var n = this.readU16();
        if (n !== 0) {
          this.pushArrayState(n);
          this.complete();
          continue e;
        } else {
          i = [];
        }
      } else if (t === 221) {
        var n = this.readU32();
        if (n !== 0) {
          this.pushArrayState(n);
          this.complete();
          continue e;
        } else {
          i = [];
        }
      } else if (t === 222) {
        var n = this.readU16();
        if (n !== 0) {
          this.pushMapState(n);
          this.complete();
          continue e;
        } else {
          i = {};
        }
      } else if (t === 223) {
        var n = this.readU32();
        if (n !== 0) {
          this.pushMapState(n);
          this.complete();
          continue e;
        } else {
          i = {};
        }
      } else if (t === 196) {
        var n = this.lookU8();
        i = this.decodeBinary(n, 1);
      } else if (t === 197) {
        var n = this.lookU16();
        i = this.decodeBinary(n, 2);
      } else if (t === 198) {
        var n = this.lookU32();
        i = this.decodeBinary(n, 4);
      } else if (t === 212) {
        i = this.decodeExtension(1, 0);
      } else if (t === 213) {
        i = this.decodeExtension(2, 0);
      } else if (t === 214) {
        i = this.decodeExtension(4, 0);
      } else if (t === 215) {
        i = this.decodeExtension(8, 0);
      } else if (t === 216) {
        i = this.decodeExtension(16, 0);
      } else if (t === 199) {
        var n = this.lookU8();
        i = this.decodeExtension(n, 1);
      } else if (t === 200) {
        var n = this.lookU16();
        i = this.decodeExtension(n, 2);
      } else if (t === 201) {
        var n = this.lookU32();
        i = this.decodeExtension(n, 4);
      } else {
        throw new Je(`Unrecognized type byte: ${Wn(t)}`);
      }
      this.complete();
      for (var r = this.stack; r.length > 0;) {
        var o = r[r.length - 1];
        if (o.type === 0) {
          o.array[o.position] = i;
          o.position++;
          if (o.position === o.size) {
            r.pop();
            i = o.array;
          } else {
            continue e;
          }
        } else if (o.type === 1) {
          if (!Bl(i)) {
            throw new Je("The type of key must be string or number but " + typeof i);
          }
          if (i === "__proto__") {
            throw new Je("The key __proto__ is not allowed");
          }
          o.key = i;
          o.type = 2;
          continue e;
        } else {
          o.map[o.key] = i;
          o.readCount++;
          if (o.readCount === o.size) {
            r.pop();
            i = o.map;
          } else {
            o.key = null;
            o.type = 1;
            continue e;
          }
        }
      }
      return i;
    }
  };
  e.prototype.readHeadByte = function () {
    if (this.headByte === Ii) {
      this.headByte = this.readU8();
    }
    return this.headByte;
  };
  e.prototype.complete = function () {
    this.headByte = Ii;
  };
  e.prototype.readArraySize = function () {
    var t = this.readHeadByte();
    switch (t) {
      case 220:
        return this.readU16();
      case 221:
        return this.readU32();
      default:
        {
          if (t < 160) {
            return t - 144;
          }
          throw new Je(`Unrecognized array type byte: ${Wn(t)}`);
        }
    }
  };
  e.prototype.pushMapState = function (t) {
    if (t > this.maxMapLength) {
      throw new Je(`Max length exceeded: map length (${t}) > maxMapLengthLength (${this.maxMapLength})`);
    }
    this.stack.push({
      type: 1,
      size: t,
      key: null,
      readCount: 0,
      map: {}
    });
  };
  e.prototype.pushArrayState = function (t) {
    if (t > this.maxArrayLength) {
      throw new Je(`Max length exceeded: array length (${t}) > maxArrayLength (${this.maxArrayLength})`);
    }
    this.stack.push({
      type: 0,
      size: t,
      array: new Array(t),
      position: 0
    });
  };
  e.prototype.decodeUtf8String = function (t, i) {
    var n;
    if (t > this.maxStrLength) {
      throw new Je(`Max length exceeded: UTF-8 byte length (${t}) > maxStrLength (${this.maxStrLength})`);
    }
    if (this.bytes.byteLength < this.pos + i + t) {
      throw xr;
    }
    var s = this.pos + i;
    var r;
    if (this.stateIsMapKey() && !((n = this.keyDecoder) === null || n === undefined) && n.canBeCached(t)) {
      r = this.keyDecoder.decode(this.bytes, s, t);
    } else if (t > gl) {
      r = yl(this.bytes, s, t);
    } else {
      r = Ho(this.bytes, s, t);
    }
    this.pos += i + t;
    return r;
  };
  e.prototype.stateIsMapKey = function () {
    if (this.stack.length > 0) {
      var t = this.stack[this.stack.length - 1];
      return t.type === 1;
    }
    return false;
  };
  e.prototype.decodeBinary = function (t, i) {
    if (t > this.maxBinLength) {
      throw new Je(`Max length exceeded: bin length (${t}) > maxBinLength (${this.maxBinLength})`);
    }
    if (!this.hasRemaining(t + i)) {
      throw xr;
    }
    var n = this.pos + i;
    var s = this.bytes.subarray(n, n + t);
    this.pos += i + t;
    return s;
  };
  e.prototype.decodeExtension = function (t, i) {
    if (t > this.maxExtLength) {
      throw new Je(`Max length exceeded: ext length (${t}) > maxExtLength (${this.maxExtLength})`);
    }
    var n = this.view.getInt8(this.pos + i);
    var s = this.decodeBinary(t, i + 1);
    return this.extensionCodec.decode(s, n, this.context);
  };
  e.prototype.lookU8 = function () {
    return this.view.getUint8(this.pos);
  };
  e.prototype.lookU16 = function () {
    return this.view.getUint16(this.pos);
  };
  e.prototype.lookU32 = function () {
    return this.view.getUint32(this.pos);
  };
  e.prototype.readU8 = function () {
    var t = this.view.getUint8(this.pos);
    this.pos++;
    return t;
  };
  e.prototype.readI8 = function () {
    var t = this.view.getInt8(this.pos);
    this.pos++;
    return t;
  };
  e.prototype.readU16 = function () {
    var t = this.view.getUint16(this.pos);
    this.pos += 2;
    return t;
  };
  e.prototype.readI16 = function () {
    var t = this.view.getInt16(this.pos);
    this.pos += 2;
    return t;
  };
  e.prototype.readU32 = function () {
    var t = this.view.getUint32(this.pos);
    this.pos += 4;
    return t;
  };
  e.prototype.readI32 = function () {
    var t = this.view.getInt32(this.pos);
    this.pos += 4;
    return t;
  };
  e.prototype.readU64 = function () {
    var t = ll(this.view, this.pos);
    this.pos += 8;
    return t;
  };
  e.prototype.readI64 = function () {
    var t = Bo(this.view, this.pos);
    this.pos += 8;
    return t;
  };
  e.prototype.readF32 = function () {
    var t = this.view.getFloat32(this.pos);
    this.pos += 4;
    return t;
  };
  e.prototype.readF64 = function () {
    var t = this.view.getFloat64(this.pos);
    this.pos += 8;
    return t;
  };
  return e;
}();
var Vt = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
function An(e) {
  if (e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default")) {
    return e.default;
  } else {
    return e;
  }
}
var Fo = {
  exports: {}
};
var xe = Fo.exports = {};
var Qe;
var je;
function Is() {
  throw new Error("setTimeout has not been defined");
}
function Ts() {
  throw new Error("clearTimeout has not been defined");
}
(function () {
  try {
    if (typeof setTimeout == "function") {
      Qe = setTimeout;
    } else {
      Qe = Is;
    }
  } catch {
    Qe = Is;
  }
  try {
    if (typeof clearTimeout == "function") {
      je = clearTimeout;
    } else {
      je = Ts;
    }
  } catch {
    je = Ts;
  }
})();
function Vo(e) {
  if (Qe === setTimeout) {
    return (// TOLOOK
      setTimeout(e, 0)
    );
  }
  if ((Qe === Is || !Qe) && setTimeout) {
    Qe = setTimeout;
    return (// TOLOOK
      setTimeout(e, 0)
    );
  }
  try {
    return Qe(e, 0);
  } catch {
    try {
      return Qe.call(null, e, 0);
    } catch {
      return Qe.call(this, e, 0);
    }
  }
}
function Vl(e) {
  if (je === clearTimeout) {
    return clearTimeout(e);
  }
  if ((je === Ts || !je) && clearTimeout) {
    je = clearTimeout;
    return clearTimeout(e);
  }
  try {
    return je(e);
  } catch {
    try {
      return je.call(null, e);
    } catch {
      return je.call(this, e);
    }
  }
}
var ct = [];
var li = false;
var $t;
var on = -1;
function Nl() {
  if (!(!li || !$t)) {
    li = false;
    if ($t.length) {
      ct = $t.concat(ct);
    } else {
      on = -1;
    }
    if (ct.length) {
      No();
    }
  }
}
function No() {
  if (!li) {
    var e = Vo(Nl);
    li = true;
    for (var t = ct.length; t;) {
      $t = ct;
      ct = [];
      for (; ++on < t;) {
        if ($t) {
          $t[on].run();
        }
      }
      on = -1;
      t = ct.length;
    }
    $t = null;
    li = false;
    Vl(e);
  }
}
xe.nextTick = function (e) {
  var t = new Array(arguments.length - 1);
  if (arguments.length > 1) {
    for (var i = 1; i < arguments.length; i++) {
      t[i - 1] = arguments[i];
    }
  }
  ct.push(new Uo(e, t));
  if (ct.length === 1 && !li) {
    Vo(No);
  }
};
function Uo(e, t) {
  this.fun = e;
  this.array = t;
}
Uo.prototype.run = function () {
  this.fun.apply(null, this.array);
};
xe.title = "browser";
xe.browser = true;
xe.env = {};
xe.argv = [];
xe.version = "";
xe.versions = {};
function ft() {}
xe.on = ft;
xe.addListener = ft;
xe.once = ft;
xe.off = ft;
xe.removeListener = ft;
xe.removeAllListeners = ft;
xe.emit = ft;
xe.prependListener = ft;
xe.prependOnceListener = ft;
xe.listeners = function (e) {
  return [];
};
xe.binding = function (e) {
  throw new Error("process.binding is not supported");
};
xe.cwd = function () {
  return "/";
};
xe.chdir = function (e) {
  throw new Error("process.chdir is not supported");
};
xe.umask = function () {
  return 0;
};
var Ul = Fo.exports;
const Ms = An(Ul);
const Wl = 1920;
const Xl = 1080;
const ql = 9;
const Wo = Ms && Ms.argv.indexOf("--largeserver") != -1 ? 80 : 40;
const Gl = Wo + 10;
const Yl = 6;
const Kl = 3000;
const Zl = 10;
const Jl = 5;
const Ql = 50;
const jl = 4.5;
const ec = 15;
const tc = 0.9;
const ic = 3000;
const nc = 60;
const sc = 35;
const rc = 3000;
const oc = 500;
const ac = Ms && {}.IS_SANDBOX;
const lc = 100;
const cc = Math.PI / 2.6;
const hc = 10;
const uc = 0.25;
const fc = Math.PI / 2;
const dc = 35;
const pc = 0.0016;
const mc = 0.993;
const gc = 34;
const yc = ["#bf8f54", "#cbb091", "#896c4b", "#fadadc", "#ececec", "#c37373", "#4c4c4c", "#ecaff7", "#738cc3", "#8bc373"];
const wc = 7;
const vc = 0.06;
const kc = ["Sid", "Steph", "Bmoe", "Romn", "Jononthecool", "Fiona", "Vince", "Nathan", "Nick", "Flappy", "Ronald", "Otis", "Pepe", "Mc Donald", "Theo", "Fabz", "Oliver", "Jeff", "Jimmy", "Helena", "Reaper", "Ben", "Alan", "Naomi", "XYZ", "Clever", "Jeremy", "Mike", "Destined", "Stallion", "Allison", "Meaty", "Sophia", "Vaja", "Joey", "Pendy", "Murdoch", "Theo", "Jared", "July", "Sonia", "Mel", "Dexter", "Quinn", "Milky"];
const xc = Math.PI / 3;
const an = [{
  id: 0,
  src: "",
  xp: 0,
  val: 1
}, {
  id: 1,
  src: "_g",
  xp: 3000,
  val: 1.1
}, {
  id: 2,
  src: "_d",
  xp: 7000,
  val: 1.18
}, {
  id: 3,
  src: "_r",
  poison: true,
  xp: 12000,
  val: 1.18
}];
const bc = function (e) {
  const t = e.weaponXP[e.weaponIndex] || 0;
  for (let i = an.length - 1; i >= 0; --i) {
    if (t >= an[i].xp) {
      return an[i];
    }
  }
};
const Sc = ["wood", "food", "stone", "points"];
const Ic = 7;
const Tc = 9;
const Mc = 3;
const Ec = 32;
const Cc = 7;
const Pc = 724;
const $c = 114;
const Rc = 0.0011;
const Ac = 0.0001;
const Dc = 1.3;
const Oc = [150, 160, 165, 175];
const _c = [80, 85, 95];
const zc = [80, 85, 90];
const Bc = 2400;
const Hc = 0.75;
const Lc = 15;
const Ks = 14400;
const Fc = 40;
const Vc = 2200;
const Nc = 0.6;
const Uc = 1;
const Wc = 0.3;
const Xc = 0.3;
const qc = 1440000;
const Zs = 320;
const Gc = 100;
const Yc = 2;
const Kc = 3200;
const Zc = 1440;
const Jc = 0.2;
const Qc = -1;
const jc = Ks - Zs - 120;
const eh = Ks - Zs - 120;
const T = {
  maxScreenWidth: Wl,
  maxScreenHeight: Xl,
  serverUpdateRate: ql,
  maxPlayers: Wo,
  maxPlayersHard: Gl,
  collisionDepth: Yl,
  minimapRate: Kl,
  colGrid: Zl,
  clientSendRate: Jl,
  healthBarWidth: Ql,
  healthBarPad: jl,
  iconPadding: ec,
  iconPad: tc,
  deathFadeout: ic,
  crownIconScale: nc,
  crownPad: sc,
  chatCountdown: rc,
  chatCooldown: oc,
  inSandbox: ac,
  maxAge: lc,
  gatherAngle: cc,
  gatherWiggle: hc,
  hitReturnRatio: uc,
  hitAngle: fc,
  playerScale: dc,
  playerSpeed: pc,
  playerDecel: mc,
  nameY: gc,
  skinColors: yc,
  animalCount: wc,
  aiTurnRandom: vc,
  cowNames: kc,
  shieldAngle: xc,
  weaponVariants: an,
  fetchVariant: bc,
  resourceTypes: Sc,
  areaCount: Ic,
  treesPerArea: Tc,
  bushesPerArea: Mc,
  totalRocks: Ec,
  goldOres: Cc,
  riverWidth: Pc,
  riverPadding: $c,
  waterCurrent: Rc,
  waveSpeed: Ac,
  waveMax: Dc,
  treeScales: Oc,
  bushScales: _c,
  rockScales: zc,
  snowBiomeTop: Bc,
  snowSpeed: Hc,
  maxNameLength: Lc,
  mapScale: Ks,
  mapPingScale: Fc,
  mapPingTime: Vc,
  volcanoScale: Zs,
  innerVolcanoScale: Gc,
  volcanoAnimalStrength: Yc,
  volcanoAnimationDuration: Kc,
  volcanoAggressionRadius: Zc,
  volcanoAggressionPercentage: Jc,
  volcanoDamagePerSecond: Qc,
  volcanoLocationX: jc,
  volcanoLocationY: eh,
  MAX_ATTACK: Nc,
  MAX_SPAWN_DELAY: Uc,
  MAX_SPEED: Wc,
  MAX_TURN_SPEED: Xc,
  DAY_INTERVAL: qc
};
const th = new Rl();
const ih = new Fl();
const me = {
  socket: null,
  connected: false,
  socketId: -1,
  connect: function (e, t, i) {
    if (this.socket) {
      return;
    }
    const n = this;
    try {
      let s = false;
      const r = e;
      this.socket = new WebSocket(e);
      this.socket.binaryType = "arraybuffer";
      this.socket.onmessage = function (o) {
        var a = new Uint8Array(o.data);
        const l = ih.decode(a);
        const c = l[0];
        var a = l[1];
        if (c == "io-init") {
          n.socketId = a[0];
        } else {
          i[c].apply(undefined, a);
        }
      };
      this.socket.onopen = function () {
        n.connected = true;
        t();
      };
      this.socket.onclose = function (o) {
        n.connected = false;
        if (o.code == 4001) {
          t("Invalid Connection");
        } else if (!s) {
          t("disconnected");
        }
      };
      this.socket.onerror = function (o) {
        if (this.socket && this.socket.readyState != WebSocket.OPEN) {
          s = true;
          console.error("Socket error", arguments);
          t("Socket error");
        }
      };
    } catch (s) {
      console.warn("Socket connection error:", s);
      t(s);
    }
  },
  send: function (e) {
    const t = Array.prototype.slice.call(arguments, 1);
    const i = th.encode([e, t]);
    if (this.socket) {
      this.socket.send(i);
    }
  },
  socketReady: function () {
    return this.socket && this.connected;
  },
  close: function () {
    if (this.socket) {
      this.socket.close();
    }
    this.socket = null;
    this.connected = false;
  }
};
var Xo = Math.abs;
const nh = Math.sqrt;
var Xo = Math.abs;
const sh = Math.atan2;
const qn = Math.PI;
const rh = function (e, t) {
  return Math.floor(Math.random() * (t - e + 1)) + e;
};
const oh = function (e, t) {
  return Math.random() * (t - e + 1) + e;
};
const ah = function (e, t, i) {
  return e + (t - e) * i;
};
const lh = function (e, t) {
  if (e > 0) {
    e = Math.max(0, e - t);
  } else if (e < 0) {
    e = Math.min(0, e + t);
  }
  return e;
};
const ch = function (e, t, i, n) {
  return nh((i -= e) * i + (n -= t) * n);
};
const hh = function (e, t, i, n) {
  return sh(t - n, e - i);
};
const uh = function (e, t) {
  const i = Xo(t - e) % (qn * 2);
  if (i > qn) {
    return qn * 2 - i;
  } else {
    return i;
  }
};
const fh = function (e) {
  return typeof e == "number" && !isNaN(e) && isFinite(e);
};
const dh = function (e) {
  return e && typeof e == "string";
};
const ph = function (e) {
  if (e > 999) {
    return (e / 1000).toFixed(1) + "k";
  } else {
    return e;
  }
};
const mh = function (e) {
  return e.charAt(0).toUpperCase() + e.slice(1);
};
const gh = function (e, t) {
  if (e) {
    return parseFloat(e.toFixed(t));
  } else {
    return 0;
  }
};
const yh = function (e, t) {
  return parseFloat(t.points) - parseFloat(e.points);
};
const wh = function (e, t, i, n, s, r, o, l) {
  let c = s;
  let a = o;
  if (s > o) {
    c = o;
    a = s;
  }
  if (a > i) {
    a = i;
  }
  if (c < e) {
    c = e;
  }
  if (c > a) {
    return false;
  }
  let f = r;
  let d = l;
  const u = o - s;
  if (Math.abs(u) > 1e-7) {
    const p = (l - r) / u;
    const w = r - p * s;
    f = p * c + w;
    d = p * a + w;
  }
  if (f > d) {
    const p = d;
    d = f;
    f = p;
  }
  if (d > n) {
    d = n;
  }
  if (f < t) {
    f = t;
  }
  return !(f > d);
};
const qo = function (e, t, i) {
  const n = e.getBoundingClientRect();
  const s = n.left + window.scrollX;
  const r = n.top + window.scrollY;
  const o = n.width;
  const l = n.height;
  const c = t > s && t < s + o;
  const a = i > r && i < r + l;
  return c && a;
};
const ln = function (e) {
  const t = e.changedTouches[0];
  e.screenX = t.screenX;
  e.screenY = t.screenY;
  e.clientX = t.clientX;
  e.clientY = t.clientY;
  e.pageX = t.pageX;
  e.pageY = t.pageY;
};
const Go = function (e, t) {
  const i = !t;
  let n = false;
  const s = false;
  e.addEventListener("touchstart", lt(r), s);
  e.addEventListener("touchmove", lt(o), s);
  e.addEventListener("touchend", lt(l), s);
  e.addEventListener("touchcancel", lt(l), s);
  e.addEventListener("touchleave", lt(l), s);
  function r(c) {
    ln(c);
    window.setUsingTouch(true);
    if (i) {
      c.preventDefault();
      c.stopPropagation();
    }
    if (e.onmouseover) {
      e.onmouseover(c);
    }
    n = true;
  }
  function o(c) {
    ln(c);
    window.setUsingTouch(true);
    if (i) {
      c.preventDefault();
      c.stopPropagation();
    }
    if (qo(e, c.pageX, c.pageY)) {
      if (!n) {
        if (e.onmouseover) {
          e.onmouseover(c);
        }
        n = true;
      }
    } else if (n) {
      if (e.onmouseout) {
        e.onmouseout(c);
      }
      n = false;
    }
  }
  function l(c) {
    ln(c);
    window.setUsingTouch(true);
    if (i) {
      c.preventDefault();
      c.stopPropagation();
    }
    if (n) {
      if (e.onclick) {
        e.onclick(c);
      }
      if (e.onmouseout) {
        e.onmouseout(c);
      }
      n = false;
    }
  }
};
const vh = function (e) {
  for (; e.hasChildNodes();) {
    e.removeChild(e.lastChild);
  }
};
const kh = function (e) {
  const t = document.createElement(e.tag || "div");
  function i(n, s) {
    if (e[n]) {
      t[s] = e[n];
    }
  }
  i("text", "textContent");
  i("html", "innerHTML");
  i("class", "className");
  for (const n in e) {
    switch (n) {
      case "tag":
      case "text":
      case "html":
      case "class":
      case "style":
      case "hookTouch":
      case "parent":
      case "children":
        continue;
    }
    t[n] = e[n];
  }
  if (t.onclick) {
    t.onclick = lt(t.onclick);
  }
  if (t.onmouseover) {
    t.onmouseover = lt(t.onmouseover);
  }
  if (t.onmouseout) {
    t.onmouseout = lt(t.onmouseout);
  }
  if (e.style) {
    t.style.cssText = e.style;
  }
  if (e.hookTouch) {
    Go(t);
  }
  if (e.parent) {
    e.parent.appendChild(t);
  }
  if (e.children) {
    for (let n = 0; n < e.children.length; n++) {
      t.appendChild(e.children[n]);
    }
  }
  return t;
};
const Yo = function (e) {
  if (e && typeof e.isTrusted == "boolean") {
    return e.isTrusted;
  } else {
    return true;
  }
};
const lt = function (e) {
  return function (t) {
    if (t && t instanceof Event && Yo(t)) {
      e(t);
    }
  };
};
const xh = function (e) {
  let t = "";
  const i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  for (let n = 0; n < e; n++) {
    t += i.charAt(Math.floor(Math.random() * i.length));
  }
  return t;
};
const bh = function (e, t) {
  let i = 0;
  for (let n = 0; n < e.length; n++) {
    if (e[n] === t) {
      i++;
    }
  }
  return i;
};
const A = {
  randInt: rh,
  randFloat: oh,
  lerp: ah,
  decel: lh,
  getDistance: ch,
  getDirection: hh,
  getAngleDist: uh,
  isNumber: fh,
  isString: dh,
  kFormat: ph,
  capitalizeFirst: mh,
  fixTo: gh,
  sortByPoints: yh,
  lineInRect: wh,
  containsPoint: qo,
  mousifyTouchEvent: ln,
  hookTouchEvents: Go,
  removeAllChildren: vh,
  generateElement: kh,
  eventIsTrusted: Yo,
  checkTrusted: lt,
  randomString: xh,
  countInArray: bh
};
const Sh = function () {
  this.init = function (e, t, i, n, s, r, o) {
    this.x = e;
    this.y = t;
    this.color = o;
    this.scale = i;
    this.startScale = this.scale;
    this.maxScale = i * 1.5;
    this.scaleSpeed = 0.7;
    this.speed = n;
    this.life = s;
    this.text = r;
  };
  this.update = function (e) {
    if (this.life) {
      this.life -= e;
      this.y -= this.speed * e;
      this.scale += this.scaleSpeed * e;
      if (this.scale >= this.maxScale) {
        this.scale = this.maxScale;
        this.scaleSpeed *= -1;
      } else if (this.scale <= this.startScale) {
        this.scale = this.startScale;
        this.scaleSpeed = 0;
      }
      if (this.life <= 0) {
        this.life = 0;
      }
    }
  };
  this.render = function (e, t, i) {
    e.fillStyle = this.color;
    e.font = this.scale + "px Hammersmith One";
    e.fillText(this.text, this.x - t, this.y - i);
  };
};
const Ih = function () {
  this.texts = [];
  this.update = function (e, t, i, n) {
    t.textBaseline = "middle";
    t.textAlign = "center";
    for (let s = 0; s < this.texts.length; ++s) {
      if (this.texts[s].life) {
        this.texts[s].update(e);
        this.texts[s].render(t, i, n);
      }
    }
  };
  this.showText = function (e, t, i, n, s, r, o) {
    let l;
    for (let c = 0; c < this.texts.length; ++c) {
      if (!this.texts[c].life) {
        l = this.texts[c];
        break;
      }
    }
    if (!l) {
      l = new Sh();
      this.texts.push(l);
    }
    l.init(e, t, i, n, s, r, o);
  };
};
const Th = function (e, t) {
  let i;
  this.sounds = [];
  this.active = true;
  this.play = function (n, s, r) {
    if (!(!s || !this.active)) {
      i = this.sounds[n];
      if (!i) {
        i = new Howl({
          src: ".././sound/" + n + ".mp3"
        });
        this.sounds[n] = i;
      }
      if (!r || !i.isPlaying) {
        i.isPlaying = true;
        i.play();
        i.volume((s || 1) * e.volumeMult);
        i.loop(r);
      }
    }
  };
  this.toggleMute = function (n, s) {
    i = this.sounds[n];
    if (i) {
      i.mute(s);
    }
  };
  this.stop = function (n) {
    i = this.sounds[n];
    if (i) {
      i.stop();
      i.isPlaying = false;
    }
  };
};
const br = Math.floor;
const Sr = Math.abs;
const Ti = Math.cos;
const Mi = Math.sin;
const Mh = Math.sqrt;
function Eh(e, t, i, n, s, r) {
  this.objects = t;
  this.grids = {};
  this.updateObjects = [];
  let o;
  let l;
  const c = n.mapScale / n.colGrid;
  this.setObjectGrids = function (u) {
    const p = Math.min(n.mapScale, Math.max(0, u.x));
    const w = Math.min(n.mapScale, Math.max(0, u.y));
    for (let x = 0; x < n.colGrid; ++x) {
      o = x * c;
      for (let b = 0; b < n.colGrid; ++b) {
        l = b * c;
        if (p + u.scale >= o && p - u.scale <= o + c && w + u.scale >= l && w - u.scale <= l + c) {
          if (!this.grids[x + "_" + b]) {
            this.grids[x + "_" + b] = [];
          }
          this.grids[x + "_" + b].push(u);
          u.gridLocations.push(x + "_" + b);
        }
      }
    }
  };
  this.removeObjGrid = function (u) {
    let p;
    for (let w = 0; w < u.gridLocations.length; ++w) {
      p = this.grids[u.gridLocations[w]].indexOf(u);
      if (p >= 0) {
        this.grids[u.gridLocations[w]].splice(p, 1);
      }
    }
  };
  this.disableObj = function (u) {
    u.active = false;
    if (r) {
      if (u.owner && u.pps) {
        u.owner.pps -= u.pps;
      }
      this.removeObjGrid(u);
      const p = this.updateObjects.indexOf(u);
      if (p >= 0) {
        this.updateObjects.splice(p, 1);
      }
    }
  };
  this.hitObj = function (u, p) {
    for (let w = 0; w < s.length; ++w) {
      if (s[w].active) {
        if (u.sentTo[s[w].id]) {
          if (u.active) {
            if (s[w].canSee(u)) {
              r.send(s[w].id, "L", i.fixTo(p, 1), u.sid);
            }
          } else {
            r.send(s[w].id, "Q", u.sid);
          }
        }
        if (!u.active && u.owner == s[w]) {
          s[w].changeItemCount(u.group.id, -1);
        }
      }
    }
  };
  const a = [];
  let f;
  this.getGridArrays = function (u, p, w) {
    o = br(u / c);
    l = br(p / c);
    a.length = 0;
    try {
      if (this.grids[o + "_" + l]) {
        a.push(this.grids[o + "_" + l]);
      }
      if (u + w >= (o + 1) * c) {
        f = this.grids[o + 1 + "_" + l];
        if (f) {
          a.push(f);
        }
        if (l && p - w <= l * c) {
          f = this.grids[o + 1 + "_" + (l - 1)];
          if (f) {
            a.push(f);
          }
        } else if (p + w >= (l + 1) * c) {
          f = this.grids[o + 1 + "_" + (l + 1)];
          if (f) {
            a.push(f);
          }
        }
      }
      if (o && u - w <= o * c) {
        f = this.grids[o - 1 + "_" + l];
        if (f) {
          a.push(f);
        }
        if (l && p - w <= l * c) {
          f = this.grids[o - 1 + "_" + (l - 1)];
          if (f) {
            a.push(f);
          }
        } else if (p + w >= (l + 1) * c) {
          f = this.grids[o - 1 + "_" + (l + 1)];
          if (f) {
            a.push(f);
          }
        }
      }
      if (p + w >= (l + 1) * c) {
        f = this.grids[o + "_" + (l + 1)];
        if (f) {
          a.push(f);
        }
      }
      if (l && p - w <= l * c) {
        f = this.grids[o + "_" + (l - 1)];
        if (f) {
          a.push(f);
        }
      }
    } catch {}
    return a;
  };
  let d;
  this.add = function (u, p, w, x, b, $, v, S, R) {
    d = null;
    for (var G = 0; G < t.length; ++G) {
      if (t[G].sid == u) {
        d = t[G];
        break;
      }
    }
    if (!d) {
      for (var G = 0; G < t.length; ++G) {
        if (!t[G].active) {
          d = t[G];
          break;
        }
      }
    }
    if (!d) {
      d = new e(u);
      t.push(d);
    }
    if (S) {
      d.sid = u;
    }
    d.init(p, w, x, b, $, v, R);
    if (r) {
      this.setObjectGrids(d);
      if (d.doUpdate) {
        this.updateObjects.push(d);
      }
    }
  };
  this.disableBySid = function (u) {
    for (let p = 0; p < t.length; ++p) {
      if (t[p].sid == u) {
        this.disableObj(t[p]);
        break;
      }
    }
  };
  this.removeAllItems = function (u, p) {
    for (let w = 0; w < t.length; ++w) {
      if (t[w].active && t[w].owner && t[w].owner.sid == u) {
        this.disableObj(t[w]);
      }
    }
    if (p) {
      p.broadcast("R", u);
    }
  };
  this.fetchSpawnObj = function (u) {
    let p = null;
    for (let w = 0; w < t.length; ++w) {
      d = t[w];
      if (d.active && d.owner && d.owner.sid == u && d.spawnPoint) {
        p = [d.x, d.y];
        this.disableObj(d);
        r.broadcast("Q", d.sid);
        if (d.owner) {
          d.owner.changeItemCount(d.group.id, -1);
        }
        break;
      }
    }
    return p;
  };
  this.checkItemLocation = function (u, p, w, x, b, $, v) {
    for (let S = 0; S < t.length; ++S) {
      const R = t[S].blocker ? t[S].blocker : t[S].getScale(x, t[S].isItem);
      if (t[S].active && i.getDistance(u, p, t[S].x, t[S].y) < w + R) {
        return false;
      }
    }
    return !(!$ && b != 18 && p >= n.mapScale / 2 - n.riverWidth / 2 && p <= n.mapScale / 2 + n.riverWidth / 2);
  };
  this.addProjectile = function (u, p, w, x, b) {
    const $ = items.projectiles[b];
    let v;
    for (let S = 0; S < projectiles.length; ++S) {
      if (!projectiles[S].active) {
        v = projectiles[S];
        break;
      }
    }
    if (!v) {
      v = new Projectile(s, i);
      projectiles.push(v);
    }
    v.init(b, u, p, w, $.speed, x, $.scale);
  };
  this.checkCollision = function (u, p, w) {
    w = w || 1;
    const x = u.x - p.x;
    const b = u.y - p.y;
    let $ = u.scale + p.scale;
    if (Sr(x) <= $ || Sr(b) <= $) {
      $ = u.scale + (p.getScale ? p.getScale() : p.scale);
      let v = Mh(x * x + b * b) - $;
      if (v <= 0) {
        if (p.ignoreCollision) {
          if (p.trap && !u.noTrap && p.owner != u && !(p.owner && p.owner.team && p.owner.team == u.team)) {
            u.lockMove = true;
            p.hideFromEnemy = false;
          } else if (p.boostSpeed) {
            u.xVel += w * p.boostSpeed * (p.weightM || 1) * Ti(p.dir);
            u.yVel += w * p.boostSpeed * (p.weightM || 1) * Mi(p.dir);
          } else if (p.healCol) {
            u.healCol = p.healCol;
          } else if (p.teleport) {
            u.x = i.randInt(0, n.mapScale);
            u.y = i.randInt(0, n.mapScale);
          }
        } else {
          const S = i.getDirection(u.x, u.y, p.x, p.y);
          i.getDistance(u.x, u.y, p.x, p.y);
          if (p.isPlayer) {
            v = v * -1 / 2;
            u.x += v * Ti(S);
            u.y += v * Mi(S);
            p.x -= v * Ti(S);
            p.y -= v * Mi(S);
          } else {
            u.x = p.x + $ * Ti(S);
            u.y = p.y + $ * Mi(S);
            u.xVel *= 0.75;
            u.yVel *= 0.75;
          }
          if (p.dmg && p.owner != u && !(p.owner && p.owner.team && p.owner.team == u.team)) {
            u.changeHealth(-p.dmg, p.owner, p);
            const R = (p.weightM || 1) * 1.5;
            u.xVel += R * Ti(S);
            u.yVel += R * Mi(S);
            if (p.pDmg && !(u.skin && u.skin.poisonRes)) {
              u.dmgOverTime.dmg = p.pDmg;
              u.dmgOverTime.time = 5;
              u.dmgOverTime.doer = p.owner;
            }
            if (u.colDmg && p.health) {
              if (p.changeHealth(-u.colDmg)) {
                this.disableObj(p);
              }
              this.hitObj(p, i.getDirection(u.x, u.y, p.x, p.y));
            }
          }
        }
        if (p.zIndex > u.zIndex) {
          u.zIndex = p.zIndex;
        }
        return true;
      }
    }
    return false;
  };
}
function Ch(e, t, i, n, s, r, o, l, c) {
  this.addProjectile = function (a, f, d, u, p, w, x, b, $) {
    const v = r.projectiles[w];
    let S;
    for (let R = 0; R < t.length; ++R) {
      if (!t[R].active) {
        S = t[R];
        break;
      }
    }
    if (!S) {
      S = new e(i, n, s, r, o, l, c);
      S.sid = t.length;
      t.push(S);
    }
    S.init(w, a, f, d, p, v.dmg, u, v.scale, x);
    S.ignoreObj = b;
    S.layer = $ || v.layer;
    S.src = v.src;
    return S;
  };
}
function Ph(e, t, i, n, s, r, o, l, c) {
  this.aiTypes = [{
    id: 0,
    src: "cow_1",
    killScore: 150,
    health: 500,
    weightM: 0.8,
    speed: 0.00095,
    turnSpeed: 0.001,
    scale: 72,
    drop: ["food", 50]
  }, {
    id: 1,
    src: "pig_1",
    killScore: 200,
    health: 800,
    weightM: 0.6,
    speed: 0.00085,
    turnSpeed: 0.001,
    scale: 72,
    drop: ["food", 80]
  }, {
    id: 2,
    name: "Bull",
    src: "bull_2",
    hostile: true,
    dmg: 20,
    killScore: 1000,
    health: 1800,
    weightM: 0.5,
    speed: 0.00094,
    turnSpeed: 0.00074,
    scale: 78,
    viewRange: 800,
    chargePlayer: true,
    drop: ["food", 100]
  }, {
    id: 3,
    name: "Bully",
    src: "bull_1",
    hostile: true,
    dmg: 20,
    killScore: 2000,
    health: 2800,
    weightM: 0.45,
    speed: 0.001,
    turnSpeed: 0.0008,
    scale: 90,
    viewRange: 900,
    chargePlayer: true,
    drop: ["food", 400]
  }, {
    id: 4,
    name: "Wolf",
    src: "wolf_1",
    hostile: true,
    dmg: 8,
    killScore: 500,
    health: 300,
    weightM: 0.45,
    speed: 0.001,
    turnSpeed: 0.002,
    scale: 84,
    viewRange: 800,
    chargePlayer: true,
    drop: ["food", 200]
  }, {
    id: 5,
    name: "Quack",
    src: "chicken_1",
    dmg: 8,
    killScore: 2000,
    noTrap: true,
    health: 300,
    weightM: 0.2,
    speed: 0.0018,
    turnSpeed: 0.006,
    scale: 70,
    drop: ["food", 100]
  }, {
    id: 6,
    name: "MOOSTAFA",
    nameScale: 50,
    src: "enemy",
    hostile: true,
    dontRun: true,
    fixedSpawn: true,
    spawnDelay: 60000,
    noTrap: true,
    colDmg: 100,
    dmg: 40,
    killScore: 8000,
    health: 18000,
    weightM: 0.4,
    speed: 0.0007,
    turnSpeed: 0.01,
    scale: 80,
    spriteMlt: 1.8,
    leapForce: 0.9,
    viewRange: 1000,
    hitRange: 210,
    hitDelay: 1000,
    chargePlayer: true,
    drop: ["food", 100]
  }, {
    id: 7,
    name: "Treasure",
    hostile: true,
    nameScale: 35,
    src: "crate_1",
    fixedSpawn: true,
    spawnDelay: 120000,
    colDmg: 200,
    killScore: 5000,
    health: 20000,
    weightM: 0.1,
    speed: 0,
    turnSpeed: 0,
    scale: 70,
    spriteMlt: 1
  }, {
    id: 8,
    name: "MOOFIE",
    src: "wolf_2",
    hostile: true,
    fixedSpawn: true,
    dontRun: true,
    hitScare: 4,
    spawnDelay: 30000,
    noTrap: true,
    nameScale: 35,
    dmg: 10,
    colDmg: 100,
    killScore: 3000,
    health: 7000,
    weightM: 0.45,
    speed: 0.0015,
    turnSpeed: 0.002,
    scale: 90,
    viewRange: 800,
    chargePlayer: true,
    drop: ["food", 1000]
  }, {
    id: 9,
    name: "💀MOOFIE",
    src: "wolf_2",
    hostile: true,
    fixedSpawn: true,
    dontRun: true,
    hitScare: 50,
    spawnDelay: 60000,
    noTrap: true,
    nameScale: 35,
    dmg: 12,
    colDmg: 100,
    killScore: 3000,
    health: 9000,
    weightM: 0.45,
    speed: 0.0015,
    turnSpeed: 0.0025,
    scale: 94,
    viewRange: 1440,
    chargePlayer: true,
    drop: ["food", 3000],
    minSpawnRange: 0.85,
    maxSpawnRange: 0.9
  }, {
    id: 10,
    name: "💀Wolf",
    src: "wolf_1",
    hostile: true,
    fixedSpawn: true,
    dontRun: true,
    hitScare: 50,
    spawnDelay: 30000,
    dmg: 10,
    killScore: 700,
    health: 500,
    weightM: 0.45,
    speed: 0.00115,
    turnSpeed: 0.0025,
    scale: 88,
    viewRange: 1440,
    chargePlayer: true,
    drop: ["food", 400],
    minSpawnRange: 0.85,
    maxSpawnRange: 0.9
  }, {
    id: 11,
    name: "💀Bully",
    src: "bull_1",
    hostile: true,
    fixedSpawn: true,
    dontRun: true,
    hitScare: 50,
    dmg: 20,
    killScore: 5000,
    health: 5000,
    spawnDelay: 100000,
    weightM: 0.45,
    speed: 0.00115,
    turnSpeed: 0.0025,
    scale: 94,
    viewRange: 1440,
    chargePlayer: true,
    drop: ["food", 800],
    minSpawnRange: 0.85,
    maxSpawnRange: 0.9
  }];
  this.spawn = function (a, f, d, u) {
    if (!this.aiTypes[u]) {
      console.error("missing ai type", u);
      return this.spawn(a, f, d, 0);
    }
    let p;
    for (let w = 0; w < e.length; ++w) {
      if (!e[w].active) {
        p = e[w];
        break;
      }
    }
    if (!p) {
      p = new t(e.length, s, i, n, o, r, l, c);
      e.push(p);
    }
    p.init(a, f, d, u, this.aiTypes[u]);
    return p;
  };
}
const Nt = Math.PI * 2;
const Gn = 0;
function $h(e, t, i, n, s, r, o, l) {
  this.sid = e;
  this.isAI = true;
  this.nameIndex = s.randInt(0, r.cowNames.length - 1);
  this.init = function (d, u, p, w, x) {
    this.x = d;
    this.y = u;
    this.startX = x.fixedSpawn ? d : null;
    this.startY = x.fixedSpawn ? u : null;
    this.xVel = 0;
    this.yVel = 0;
    this.zIndex = 0;
    this.dir = p;
    this.dirPlus = 0;
    this.index = w;
    this.src = x.src;
    if (x.name) {
      this.name = x.name;
    }
    if ((this.name || "").startsWith("💀")) {
      this.isVolcanoAi = true;
    }
    this.weightM = x.weightM;
    this.speed = x.speed;
    this.killScore = x.killScore;
    this.turnSpeed = x.turnSpeed;
    this.scale = x.scale;
    this.maxHealth = x.health;
    this.leapForce = x.leapForce;
    this.health = this.maxHealth;
    this.chargePlayer = x.chargePlayer;
    this.viewRange = x.viewRange;
    this.drop = x.drop;
    this.dmg = x.dmg;
    this.hostile = x.hostile;
    this.dontRun = x.dontRun;
    this.hitRange = x.hitRange;
    this.hitDelay = x.hitDelay;
    this.hitScare = x.hitScare;
    this.spriteMlt = x.spriteMlt;
    this.nameScale = x.nameScale;
    this.colDmg = x.colDmg;
    this.noTrap = x.noTrap;
    this.spawnDelay = x.spawnDelay;
    this.minSpawnRange = x.minSpawnRange;
    this.maxSpawnRange = x.maxSpawnRange;
    this.hitWait = 0;
    this.waitCount = 1000;
    this.moveCount = 0;
    this.targetDir = 0;
    this.active = true;
    this.alive = true;
    this.runFrom = null;
    this.chargeTarget = null;
    this.dmgOverTime = {};
  };
  this.getVolcanoAggression = function () {
    const d = s.getDistance(this.x, this.y, r.volcanoLocationX, r.volcanoLocationY);
    const u = d > r.volcanoAggressionRadius ? 0 : r.volcanoAggressionRadius - d;
    return 1 + r.volcanoAggressionPercentage * (1 - u / r.volcanoAggressionRadius);
  };
  let c = 0;
  this.update = function (d) {
    if (this.active) {
      if (this.spawnCounter) {
        this.spawnCounter -= d * 1 * this.getVolcanoAggression();
        if (this.spawnCounter <= 0) {
          this.spawnCounter = 0;
          if (this.minSpawnRange || this.maxSpawnRange) {
            const V = r.mapScale * this.minSpawnRange;
            const F = r.mapScale * this.maxSpawnRange;
            this.x = s.randInt(V, F);
            this.y = s.randInt(V, F);
          } else {
            this.x = this.startX || s.randInt(0, r.mapScale);
            this.y = this.startY || s.randInt(0, r.mapScale);
          }
        }
        return;
      }
      c -= d;
      if (c <= 0) {
        if (this.dmgOverTime.dmg) {
          this.changeHealth(-this.dmgOverTime.dmg, this.dmgOverTime.doer);
          this.dmgOverTime.time -= 1;
          if (this.dmgOverTime.time <= 0) {
            this.dmgOverTime.dmg = 0;
          }
        }
        c = 1000;
      }
      let v = false;
      let S = 1;
      if (!this.zIndex && !this.lockMove && this.y >= r.mapScale / 2 - r.riverWidth / 2 && this.y <= r.mapScale / 2 + r.riverWidth / 2) {
        S = 0.33;
        this.xVel += r.waterCurrent * d;
      }
      if (this.lockMove) {
        this.xVel = 0;
        this.yVel = 0;
      } else if (this.waitCount > 0) {
        this.waitCount -= d;
        if (this.waitCount <= 0) {
          if (this.chargePlayer) {
            let V;
            let F;
            let _;
            for (var u = 0; u < i.length; ++u) {
              if (i[u].alive && !(i[u].skin && i[u].skin.bullRepel)) {
                _ = s.getDistance(this.x, this.y, i[u].x, i[u].y);
                if (_ <= this.viewRange && (!V || _ < F)) {
                  F = _;
                  V = i[u];
                }
              }
            }
            if (V) {
              this.chargeTarget = V;
              this.moveCount = s.randInt(8000, 12000);
            } else {
              this.moveCount = s.randInt(1000, 2000);
              this.targetDir = s.randFloat(-Math.PI, Math.PI);
            }
          } else {
            this.moveCount = s.randInt(4000, 10000);
            this.targetDir = s.randFloat(-Math.PI, Math.PI);
          }
        }
      } else if (this.moveCount > 0) {
        var p = this.speed * S * (1 + r.MAX_SPEED * Gn) * this.getVolcanoAggression();
        if (this.runFrom && this.runFrom.active && !(this.runFrom.isPlayer && !this.runFrom.alive)) {
          this.targetDir = s.getDirection(this.x, this.y, this.runFrom.x, this.runFrom.y);
          p *= 1.42;
        } else if (this.chargeTarget && this.chargeTarget.alive) {
          this.targetDir = s.getDirection(this.chargeTarget.x, this.chargeTarget.y, this.x, this.y);
          p *= 1.75;
          v = true;
        }
        if (this.hitWait) {
          p *= 0.3;
        }
        if (this.dir != this.targetDir) {
          this.dir %= Nt;
          const V = (this.dir - this.targetDir + Nt) % Nt;
          const F = Math.min(Math.abs(V - Nt), V, this.turnSpeed * d);
          const _ = V - Math.PI >= 0 ? 1 : -1;
          this.dir += _ * F + Nt;
        }
        this.dir %= Nt;
        this.xVel += p * d * Math.cos(this.dir);
        this.yVel += p * d * Math.sin(this.dir);
        this.moveCount -= d;
        if (this.moveCount <= 0) {
          this.runFrom = null;
          this.chargeTarget = null;
          this.waitCount = this.hostile ? 1500 : s.randInt(1500, 6000);
        }
      }
      this.zIndex = 0;
      this.lockMove = false;
      var w;
      const R = s.getDistance(0, 0, this.xVel * d, this.yVel * d);
      const G = Math.min(4, Math.max(1, Math.round(R / 40)));
      const X = 1 / G;
      for (var u = 0; u < G; ++u) {
        if (this.xVel) {
          this.x += this.xVel * d * X;
        }
        if (this.yVel) {
          this.y += this.yVel * d * X;
        }
        w = t.getGridArrays(this.x, this.y, this.scale);
        for (var x = 0; x < w.length; ++x) {
          for (let F = 0; F < w[x].length; ++F) {
            if (w[x][F].active) {
              t.checkCollision(this, w[x][F], X);
            }
          }
        }
      }
      let W = false;
      if (this.hitWait > 0 && (this.hitWait -= d, this.hitWait <= 0)) {
        W = true;
        this.hitWait = 0;
        if (this.leapForce && !s.randInt(0, 2)) {
          this.xVel += this.leapForce * Math.cos(this.dir);
          this.yVel += this.leapForce * Math.sin(this.dir);
        }
        var w = t.getGridArrays(this.x, this.y, this.hitRange);
        var b;
        var $;
        for (let F = 0; F < w.length; ++F) {
          for (var x = 0; x < w[F].length; ++x) {
            b = w[F][x];
            if (b.health) {
              $ = s.getDistance(this.x, this.y, b.x, b.y);
              if ($ < b.scale + this.hitRange) {
                if (b.changeHealth(-this.dmg * 5)) {
                  t.disableObj(b);
                }
                t.hitObj(b, s.getDirection(this.x, this.y, b.x, b.y));
              }
            }
          }
        }
        for (var x = 0; x < i.length; ++x) {
          if (i[x].canSee(this)) {
            l.send(i[x].id, "J", this.sid);
          }
        }
      }
      if (v || W) {
        var b;
        var $;
        let _;
        for (var u = 0; u < i.length; ++u) {
          b = i[u];
          if (b && b.alive) {
            $ = s.getDistance(this.x, this.y, b.x, b.y);
            if (this.hitRange) {
              if (!this.hitWait && $ <= this.hitRange + b.scale) {
                if (W) {
                  _ = s.getDirection(b.x, b.y, this.x, this.y);
                  b.changeHealth(-this.dmg * (1 + r.MAX_ATTACK * Gn) * this.getVolcanoAggression());
                  b.xVel += Math.cos(_) * 0.6;
                  b.yVel += Math.sin(_) * 0.6;
                  this.runFrom = null;
                  this.chargeTarget = null;
                  this.waitCount = 3000;
                  this.hitWait = s.randInt(0, 2) ? 0 : 600;
                } else {
                  this.hitWait = this.hitDelay;
                }
              }
            } else if ($ <= this.scale + b.scale) {
              _ = s.getDirection(b.x, b.y, this.x, this.y);
              b.changeHealth(-this.dmg * (1 + r.MAX_ATTACK * Gn) * this.getVolcanoAggression());
              b.xVel += Math.cos(_) * 0.55;
              b.yVel += Math.sin(_) * 0.55;
            }
          }
        }
      }
      if (this.xVel) {
        this.xVel *= Math.pow(r.playerDecel, d);
      }
      if (this.yVel) {
        this.yVel *= Math.pow(r.playerDecel, d);
      }
      const M = this.scale;
      if (this.x - M < 0) {
        this.x = M;
        this.xVel = 0;
      } else if (this.x + M > r.mapScale) {
        this.x = r.mapScale - M;
        this.xVel = 0;
      }
      if (this.y - M < 0) {
        this.y = M;
        this.yVel = 0;
      } else if (this.y + M > r.mapScale) {
        this.y = r.mapScale - M;
        this.yVel = 0;
      }
      if (this.isVolcanoAi) {
        if (this.chargeTarget && (s.getDistance(this.chargeTarget.x, this.chargeTarget.y, r.volcanoLocationX, r.volcanoLocationY) || 0) > r.volcanoAggressionRadius) {
          this.chargeTarget = null;
        }
        if (this.xVel) {
          if (this.x < r.volcanoLocationX - r.volcanoAggressionRadius) {
            this.x = r.volcanoLocationX - r.volcanoAggressionRadius;
            this.xVel = 0;
          } else if (this.x > r.volcanoLocationX + r.volcanoAggressionRadius) {
            this.x = r.volcanoLocationX + r.volcanoAggressionRadius;
            this.xVel = 0;
          }
        }
        if (this.yVel) {
          if (this.y < r.volcanoLocationY - r.volcanoAggressionRadius) {
            this.y = r.volcanoLocationY - r.volcanoAggressionRadius;
            this.yVel = 0;
          } else if (this.y > r.volcanoLocationY + r.volcanoAggressionRadius) {
            this.y = r.volcanoLocationY + r.volcanoAggressionRadius;
            this.yVel = 0;
          }
        }
      }
    }
  };
  this.canSee = function (d) {
    if (!d || d.skin && d.skin.invisTimer && d.noMovTimer >= d.skin.invisTimer) {
      return false;
    }
    const u = Math.abs(d.x - this.x) - d.scale;
    const p = Math.abs(d.y - this.y) - d.scale;
    return u <= r.maxScreenWidth / 2 * 1.3 && p <= r.maxScreenHeight / 2 * 1.3;
  };
  let a = 0;
  let f = 0;
  this.animate = function (d) {
    if (this.animTime > 0) {
      this.animTime -= d;
      if (this.animTime <= 0) {
        this.animTime = 0;
        this.dirPlus = 0;
        a = 0;
        f = 0;
      } else if (f == 0) {
        a += d / (this.animSpeed * r.hitReturnRatio);
        this.dirPlus = s.lerp(0, this.targetAngle, Math.min(1, a));
        if (a >= 1) {
          a = 1;
          f = 1;
        }
      } else {
        a -= d / (this.animSpeed * (1 - r.hitReturnRatio));
        this.dirPlus = s.lerp(0, this.targetAngle, Math.max(0, a));
      }
    }
  };
  this.startAnim = function () {
    this.animTime = this.animSpeed = 600;
    this.targetAngle = Math.PI * 0.8;
    a = 0;
    f = 0;
  };
  this.changeHealth = function (d, u, p) {
    if (this.active && (this.health += d, p && (this.hitScare && !s.randInt(0, this.hitScare) ? (this.runFrom = p, this.waitCount = 0, this.moveCount = 2000) : this.hostile && this.chargePlayer && p.isPlayer ? (this.chargeTarget = p, this.waitCount = 0, this.moveCount = 8000) : this.dontRun || (this.runFrom = p, this.waitCount = 0, this.moveCount = 2000)), d < 0 && this.hitRange && s.randInt(0, 1) && (this.hitWait = 500), u && u.canSee(this) && d < 0 && l.send(u.id, "8", Math.round(this.x), Math.round(this.y), Math.round(-d), 1), this.health <= 0)) {
      if (this.spawnDelay) {
        this.spawnCounter = this.spawnDelay;
        this.x = -1000000;
        this.y = -1000000;
      } else if (this.minSpawnRange || this.maxSpawnRange) {
        const w = r.mapScale * this.minSpawnRange;
        const x = r.mapScale * this.maxSpawnRange;
        this.x = s.randInt(w, x);
        this.y = s.randInt(w, x);
      } else {
        this.x = this.startX || s.randInt(0, r.mapScale);
        this.y = this.startY || s.randInt(0, r.mapScale);
      }
      this.health = this.maxHealth;
      this.runFrom = null;
      if (u && (o(u, this.killScore), this.drop)) {
        for (let w = 0; w < this.drop.length;) {
          u.addResource(r.resourceTypes.indexOf(this.drop[w]), this.drop[w + 1]);
          w += 2;
        }
      }
    }
  };
}
function Rh(e) {
  this.sid = e;
  this.init = function (t, i, n, s, r, o, l) {
    o = o || {};
    this.sentTo = {};
    this.gridLocations = [];
    this.active = true;
    this.doUpdate = o.doUpdate;
    this.x = t;
    this.y = i;
    this.dir = n;
    this.xWiggle = 0;
    this.yWiggle = 0;
    this.scale = s;
    this.type = r;
    this.id = o.id;
    this.owner = l;
    this.name = o.name;
    this.isItem = this.id != null;
    this.group = o.group;
    this.health = o.health;
    this.layer = 2;
    if (this.group != null) {
      this.layer = this.group.layer;
    } else if (this.type == 0) {
      this.layer = 3;
    } else if (this.type == 2) {
      this.layer = 0;
    } else if (this.type == 4) {
      this.layer = -1;
    }
    this.colDiv = o.colDiv || 1;
    this.blocker = o.blocker;
    this.ignoreCollision = o.ignoreCollision;
    this.dontGather = o.dontGather;
    this.hideFromEnemy = o.hideFromEnemy;
    this.friction = o.friction;
    this.projDmg = o.projDmg;
    this.dmg = o.dmg;
    this.pDmg = o.pDmg;
    this.pps = o.pps;
    this.zIndex = o.zIndex || 0;
    this.turnSpeed = o.turnSpeed;
    this.req = o.req;
    this.trap = o.trap;
    this.healCol = o.healCol;
    this.teleport = o.teleport;
    this.boostSpeed = o.boostSpeed;
    this.projectile = o.projectile;
    this.shootRange = o.shootRange;
    this.shootRate = o.shootRate;
    this.shootCount = this.shootRate;
    this.spawnPoint = o.spawnPoint;
  };
  this.changeHealth = function (t, i) {
    this.health += t;
    return this.health <= 0;
  };
  this.getScale = function (t, i) {
    t = t || 1;
    return this.scale * (this.isItem || this.type == 2 || this.type == 3 || this.type == 4 ? 1 : t * 0.6) * (i ? 1 : this.colDiv);
  };
  this.visibleToPlayer = function (t) {
    return !this.hideFromEnemy || this.owner && (this.owner == t || this.owner.team && t.team == this.owner.team);
  };
  this.update = function (t) {
    if (this.active) {
      if (this.xWiggle) {
        this.xWiggle *= Math.pow(0.99, t);
      }
      if (this.yWiggle) {
        this.yWiggle *= Math.pow(0.99, t);
      }
      //if (this.turnSpeed) {
      //  this.dir += this.turnSpeed * t;
      //}
    }
  };
}
const de = [{
  id: 0,
  name: "food",
  layer: 0
}, {
  id: 1,
  name: "walls",
  place: true,
  limit: 30,
  layer: 0
}, {
  id: 2,
  name: "spikes",
  place: true,
  limit: 15,
  layer: 0
}, {
  id: 3,
  name: "mill",
  place: true,
  limit: 7,
  sandboxLimit: 299,
  layer: 1
}, {
  id: 4,
  name: "mine",
  place: true,
  limit: 1,
  layer: 0
}, {
  id: 5,
  name: "trap",
  place: true,
  limit: 6,
  layer: -1
}, {
  id: 6,
  name: "booster",
  place: true,
  limit: 12,
  sandboxLimit: 299,
  layer: -1
}, {
  id: 7,
  name: "turret",
  place: true,
  limit: 2,
  layer: 1
}, {
  id: 8,
  name: "watchtower",
  place: true,
  limit: 12,
  layer: 1
}, {
  id: 9,
  name: "buff",
  place: true,
  limit: 4,
  layer: -1
}, {
  id: 10,
  name: "spawn",
  place: true,
  limit: 1,
  layer: -1
}, {
  id: 11,
  name: "sapling",
  place: true,
  limit: 2,
  layer: 0
}, {
  id: 12,
  name: "blocker",
  place: true,
  limit: 3,
  layer: -1
}, {
  id: 13,
  name: "teleporter",
  place: true,
  limit: 2,
  sandboxLimit: 299,
  layer: -1
}];
const Ah = [{
  indx: 0,
  layer: 0,
  src: "arrow_1",
  dmg: 25,
  speed: 1.6,
  scale: 103,
  range: 1000
}, {
  indx: 1,
  layer: 1,
  dmg: 25,
  scale: 20
}, {
  indx: 0,
  layer: 0,
  src: "arrow_1",
  dmg: 35,
  speed: 2.5,
  scale: 103,
  range: 1200
}, {
  indx: 0,
  layer: 0,
  src: "arrow_1",
  dmg: 30,
  speed: 2,
  scale: 103,
  range: 1200
}, {
  indx: 1,
  layer: 1,
  dmg: 16,
  scale: 20
}, {
  indx: 0,
  layer: 0,
  src: "bullet_1",
  dmg: 50,
  speed: 3.6,
  scale: 160,
  range: 1400
}];
const Dh = [{
  id: 0,
  type: 0,
  name: "tool hammer",
  desc: "tool for gathering all resources",
  src: "hammer_1",
  length: 140,
  width: 140,
  xOff: -3,
  yOff: 18,
  dmg: 25,
  range: 65,
  gather: 1,
  speed: 300
}, {
  id: 1,
  type: 0,
  age: 2,
  name: "hand axe",
  desc: "gathers resources at a higher rate",
  src: "axe_1",
  length: 140,
  width: 140,
  xOff: 3,
  yOff: 24,
  dmg: 30,
  spdMult: 1,
  range: 70,
  gather: 2,
  speed: 400
}, {
  id: 2,
  type: 0,
  age: 8,
  pre: 1,
  name: "great axe",
  desc: "deal more damage and gather more resources",
  src: "great_axe_1",
  length: 140,
  width: 140,
  xOff: -8,
  yOff: 25,
  dmg: 35,
  spdMult: 1,
  range: 75,
  gather: 4,
  speed: 400
}, {
  id: 3,
  type: 0,
  age: 2,
  name: "short sword",
  desc: "increased attack power but slower move speed",
  src: "sword_1",
  iPad: 1.3,
  length: 130,
  width: 210,
  xOff: -8,
  yOff: 46,
  dmg: 35,
  spdMult: 0.85,
  range: 110,
  gather: 1,
  speed: 300
}, {
  id: 4,
  type: 0,
  age: 8,
  pre: 3,
  name: "katana",
  desc: "greater range and damage",
  src: "samurai_1",
  iPad: 1.3,
  length: 130,
  width: 210,
  xOff: -8,
  yOff: 59,
  dmg: 40,
  spdMult: 0.8,
  range: 118,
  gather: 1,
  speed: 300
}, {
  id: 5,
  type: 0,
  age: 2,
  name: "polearm",
  desc: "long range melee weapon",
  src: "spear_1",
  iPad: 1.3,
  length: 130,
  width: 210,
  xOff: -8,
  yOff: 53,
  dmg: 45,
  knock: 0.2,
  spdMult: 0.82,
  range: 142,
  gather: 1,
  speed: 700
}, {
  id: 6,
  type: 0,
  age: 2,
  name: "bat",
  desc: "fast long range melee weapon",
  src: "bat_1",
  iPad: 1.3,
  length: 110,
  width: 180,
  xOff: -8,
  yOff: 53,
  dmg: 20,
  knock: 0.7,
  range: 110,
  gather: 1,
  speed: 300
}, {
  id: 7,
  type: 0,
  age: 2,
  name: "daggers",
  desc: "really fast short range weapon",
  src: "dagger_1",
  iPad: 0.8,
  length: 110,
  width: 110,
  xOff: 18,
  yOff: 0,
  dmg: 20,
  knock: 0.1,
  range: 65,
  gather: 1,
  hitSlow: 0.1,
  spdMult: 1.13,
  speed: 100
}, {
  id: 8,
  type: 0,
  age: 2,
  name: "stick",
  desc: "great for gathering but very weak",
  src: "stick_1",
  length: 140,
  width: 140,
  xOff: 3,
  yOff: 24,
  dmg: 1,
  spdMult: 1,
  range: 70,
  gather: 7,
  speed: 400
}, {
  id: 9,
  type: 1,
  age: 6,
  name: "hunting bow",
  desc: "bow used for ranged combat and hunting",
  src: "bow_1",
  req: ["wood", 4],
  length: 120,
  width: 120,
  xOff: -6,
  yOff: 0,
  projectile: 0,
  spdMult: 0.75,
  speed: 600
}, {
  id: 10,
  type: 1,
  age: 6,
  name: "great hammer",
  desc: "hammer used for destroying structures",
  src: "great_hammer_1",
  length: 140,
  width: 140,
  xOff: -9,
  yOff: 25,
  dmg: 10,
  spdMult: 0.88,
  range: 75,
  sDmg: 7.5,
  gather: 1,
  speed: 400
}, {
  id: 11,
  type: 1,
  age: 6,
  name: "wooden shield",
  desc: "blocks projectiles and reduces melee damage",
  src: "shield_1",
  length: 120,
  width: 120,
  shield: 0.2,
  xOff: 6,
  yOff: 0,
  spdMult: 0.7
}, {
  id: 12,
  type: 1,
  age: 8,
  pre: 9,
  name: "crossbow",
  desc: "deals more damage and has greater range",
  src: "crossbow_1",
  req: ["wood", 5],
  aboveHand: true,
  armS: 0.75,
  length: 120,
  width: 120,
  xOff: -4,
  yOff: 0,
  projectile: 2,
  spdMult: 0.7,
  speed: 700
}, {
  id: 13,
  type: 1,
  age: 9,
  pre: 12,
  name: "repeater crossbow",
  desc: "high firerate crossbow with reduced damage",
  src: "crossbow_2",
  req: ["wood", 10],
  aboveHand: true,
  armS: 0.75,
  length: 120,
  width: 120,
  xOff: -4,
  yOff: 0,
  projectile: 3,
  spdMult: 0.7,
  speed: 230
}, {
  id: 14,
  type: 1,
  age: 6,
  name: "mc grabby",
  desc: "steals resources from enemies",
  src: "grab_1",
  length: 130,
  width: 210,
  xOff: -8,
  yOff: 53,
  dmg: 0,
  steal: 250,
  knock: 0.2,
  spdMult: 1.05,
  range: 125,
  gather: 0,
  speed: 700
}, {
  id: 15,
  type: 1,
  age: 9,
  pre: 12,
  name: "musket",
  desc: "slow firerate but high damage and range",
  src: "musket_1",
  req: ["stone", 10],
  aboveHand: true,
  rec: 0.35,
  armS: 0.6,
  hndS: 0.3,
  hndD: 1.6,
  length: 205,
  width: 205,
  xOff: 25,
  yOff: 0,
  projectile: 5,
  hideProjectile: true,
  spdMult: 0.6,
  speed: 1500
}];
const Zt = [{
  group: de[0],
  name: "apple",
  desc: "restores 20 health when consumed",
  req: ["food", 10],
  consume: function (e) {
    return e.changeHealth(20, e);
  },
  scale: 22,
  holdOffset: 15
}, {
  age: 3,
  group: de[0],
  name: "cookie",
  desc: "restores 40 health when consumed",
  req: ["food", 15],
  consume: function (e) {
    return e.changeHealth(40, e);
  },
  scale: 27,
  holdOffset: 15
}, {
  age: 7,
  group: de[0],
  name: "cheese",
  desc: "restores 30 health and another 50 over 5 seconds",
  req: ["food", 25],
  consume: function (e) {
    if (e.changeHealth(30, e) || e.health < 100) {
      e.dmgOverTime.dmg = -10;
      e.dmgOverTime.doer = e;
      e.dmgOverTime.time = 5;
      return true;
    } else {
      return false;
    }
  },
  scale: 27,
  holdOffset: 15
}, {
  group: de[1],
  name: "wood wall",
  desc: "provides protection for your village",
  req: ["wood", 10],
  projDmg: true,
  health: 380,
  scale: 50,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 3,
  group: de[1],
  name: "stone wall",
  desc: "provides improved protection for your village",
  req: ["stone", 25],
  health: 900,
  scale: 50,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 7,
  pre: 1,
  group: de[1],
  name: "castle wall",
  desc: "provides powerful protection for your village",
  req: ["stone", 35],
  health: 1500,
  scale: 52,
  holdOffset: 20,
  placeOffset: -5
}, {
  group: de[2],
  name: "spikes",
  desc: "damages enemies when they touch them",
  req: ["wood", 20, "stone", 5],
  health: 400,
  dmg: 20,
  scale: 49,
  spritePadding: -23,
  holdOffset: 8,
  placeOffset: -5
}, {
  age: 5,
  group: de[2],
  name: "greater spikes",
  desc: "damages enemies when they touch them",
  req: ["wood", 30, "stone", 10],
  health: 500,
  dmg: 35,
  scale: 52,
  spritePadding: -23,
  holdOffset: 8,
  placeOffset: -5
}, {
  age: 9,
  pre: 1,
  group: de[2],
  name: "poison spikes",
  desc: "poisons enemies when they touch them",
  req: ["wood", 35, "stone", 15],
  health: 600,
  dmg: 30,
  pDmg: 5,
  scale: 52,
  spritePadding: -23,
  holdOffset: 8,
  placeOffset: -5
}, {
  age: 9,
  pre: 2,
  group: de[2],
  name: "spinning spikes",
  desc: "damages enemies when they touch them",
  req: ["wood", 30, "stone", 20],
  health: 500,
  dmg: 45,
  turnSpeed: 0.003,
  scale: 52,
  spritePadding: -23,
  holdOffset: 8,
  placeOffset: -5
}, {
  group: de[3],
  name: "windmill",
  desc: "generates gold over time",
  req: ["wood", 50, "stone", 10],
  health: 400,
  pps: 1,
  turnSpeed: 0.0016,
  spritePadding: 25,
  iconLineMult: 12,
  scale: 45,
  holdOffset: 20,
  placeOffset: 5
}, {
  age: 5,
  pre: 1,
  group: de[3],
  name: "faster windmill",
  desc: "generates more gold over time",
  req: ["wood", 60, "stone", 20],
  health: 500,
  pps: 1.5,
  turnSpeed: 0.0025,
  spritePadding: 25,
  iconLineMult: 12,
  scale: 47,
  holdOffset: 20,
  placeOffset: 5
}, {
  age: 8,
  pre: 1,
  group: de[3],
  name: "power mill",
  desc: "generates more gold over time",
  req: ["wood", 100, "stone", 50],
  health: 800,
  pps: 2,
  turnSpeed: 0.005,
  spritePadding: 25,
  iconLineMult: 12,
  scale: 47,
  holdOffset: 20,
  placeOffset: 5
}, {
  age: 5,
  group: de[4],
  type: 2,
  name: "mine",
  desc: "allows you to mine stone",
  req: ["wood", 20, "stone", 100],
  iconLineMult: 12,
  scale: 65,
  holdOffset: 20,
  placeOffset: 0
}, {
  age: 5,
  group: de[11],
  type: 0,
  name: "sapling",
  desc: "allows you to farm wood",
  req: ["wood", 150],
  iconLineMult: 12,
  colDiv: 0.5,
  scale: 110,
  holdOffset: 50,
  placeOffset: -15
}, {
  age: 4,
  group: de[5],
  name: "pit trap",
  desc: "pit that traps enemies if they walk over it",
  req: ["wood", 30, "stone", 30],
  trap: true,
  ignoreCollision: true,
  hideFromEnemy: true,
  health: 500,
  colDiv: 0.2,
  scale: 50,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 4,
  group: de[6],
  name: "boost pad",
  desc: "provides boost when stepped on",
  req: ["stone", 20, "wood", 5],
  ignoreCollision: true,
  boostSpeed: 1.5,
  health: 150,
  colDiv: 0.7,
  scale: 45,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 7,
  group: de[7],
  doUpdate: true,
  name: "turret",
  desc: "defensive structure that shoots at enemies",
  req: ["wood", 200, "stone", 150],
  health: 800,
  projectile: 1,
  shootRange: 700,
  shootRate: 2200,
  scale: 43,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 7,
  group: de[8],
  name: "platform",
  desc: "platform to shoot over walls and cross over water",
  req: ["wood", 20],
  ignoreCollision: true,
  zIndex: 1,
  health: 300,
  scale: 43,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 7,
  group: de[9],
  name: "healing pad",
  desc: "standing on it will slowly heal you",
  req: ["wood", 30, "food", 10],
  ignoreCollision: true,
  healCol: 15,
  health: 400,
  colDiv: 0.7,
  scale: 45,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 9,
  group: de[10],
  name: "spawn pad",
  desc: "you will spawn here when you die but it will dissapear",
  req: ["wood", 100, "stone", 100],
  health: 400,
  ignoreCollision: true,
  spawnPoint: true,
  scale: 45,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 7,
  group: de[12],
  name: "blocker",
  desc: "blocks building in radius",
  req: ["wood", 30, "stone", 25],
  ignoreCollision: true,
  blocker: 300,
  health: 400,
  colDiv: 0.7,
  scale: 45,
  holdOffset: 20,
  placeOffset: -5
}, {
  age: 7,
  group: de[13],
  name: "teleporter",
  desc: "teleports you to a random point on the map",
  req: ["wood", 60, "stone", 60],
  ignoreCollision: true,
  teleport: true,
  health: 200,
  colDiv: 0.7,
  scale: 45,
  holdOffset: 20,
  placeOffset: -5
}];
for (let e = 0; e < Zt.length; ++e) {
  Zt[e].id = e;
  if (Zt[e].pre) {
    Zt[e].pre = e - Zt[e].pre;
  }
}
const L = {
  groups: de,
  projectiles: Ah,
  weapons: Dh,
  list: Zt
};
const Oh = ["ahole", "anus", "ash0le", "ash0les", "asholes", "ass", "Ass Monkey", "Assface", "assh0le", "assh0lez", "asshole", "assholes", "assholz", "asswipe", "azzhole", "bassterds", "bastard", "bastards", "bastardz", "basterds", "basterdz", "Biatch", "bitch", "bitches", "Blow Job", "boffing", "butthole", "buttwipe", "c0ck", "c0cks", "c0k", "Carpet Muncher", "cawk", "cawks", "Clit", "cnts", "cntz", "cock", "cockhead", "cock-head", "cocks", "CockSucker", "cock-sucker", "crap", "cum", "cunt", "cunts", "cuntz", "dick", "dild0", "dild0s", "dildo", "dildos", "dilld0", "dilld0s", "dominatricks", "dominatrics", "dominatrix", "dyke", "enema", "f u c k", "f u c k e r", "fag", "fag1t", "faget", "fagg1t", "faggit", "faggot", "fagg0t", "fagit", "fags", "fagz", "faig", "faigs", "fart", "flipping the bird", "fuck", "fucker", "fuckin", "fucking", "fucks", "Fudge Packer", "fuk", "Fukah", "Fuken", "fuker", "Fukin", "Fukk", "Fukkah", "Fukken", "Fukker", "Fukkin", "g00k", "God-damned", "h00r", "h0ar", "h0re", "hells", "hoar", "hoor", "hoore", "jackoff", "jap", "japs", "jerk-off", "jisim", "jiss", "jizm", "jizz", "knob", "knobs", "knobz", "kunt", "kunts", "kuntz", "Lezzian", "Lipshits", "Lipshitz", "masochist", "masokist", "massterbait", "masstrbait", "masstrbate", "masterbaiter", "masterbate", "masterbates", "Motha Fucker", "Motha Fuker", "Motha Fukkah", "Motha Fukker", "Mother Fucker", "Mother Fukah", "Mother Fuker", "Mother Fukkah", "Mother Fukker", "mother-fucker", "Mutha Fucker", "Mutha Fukah", "Mutha Fuker", "Mutha Fukkah", "Mutha Fukker", "n1gr", "nastt", "nigger;", "nigur;", "niiger;", "niigr;", "orafis", "orgasim;", "orgasm", "orgasum", "oriface", "orifice", "orifiss", "packi", "packie", "packy", "paki", "pakie", "paky", "pecker", "peeenus", "peeenusss", "peenus", "peinus", "pen1s", "penas", "penis", "penis-breath", "penus", "penuus", "Phuc", "Phuck", "Phuk", "Phuker", "Phukker", "polac", "polack", "polak", "Poonani", "pr1c", "pr1ck", "pr1k", "pusse", "pussee", "pussy", "puuke", "puuker", "qweir", "recktum", "rectum", "retard", "sadist", "scank", "schlong", "screwing", "semen", "sex", "sexy", "Sh!t", "sh1t", "sh1ter", "sh1ts", "sh1tter", "sh1tz", "shit", "shits", "shitter", "Shitty", "Shity", "shitz", "Shyt", "Shyte", "Shytty", "Shyty", "skanck", "skank", "skankee", "skankey", "skanks", "Skanky", "slag", "slut", "sluts", "Slutty", "slutz", "son-of-a-bitch", "tit", "turd", "va1jina", "vag1na", "vagiina", "vagina", "vaj1na", "vajina", "vullva", "vulva", "w0p", "wh00r", "wh0re", "whore", "xrated", "xxx", "b!+ch", "bitch", "blowjob", "clit", "arschloch", "fuck", "shit", "ass", "asshole", "b!tch", "b17ch", "b1tch", "bastard", "bi+ch", "boiolas", "buceta", "c0ck", "cawk", "chink", "cipa", "clits", "cock", "cum", "cunt", "dildo", "dirsa", "ejakulate", "fatass", "fcuk", "fuk", "fux0r", "hoer", "hore", "jism", "kawk", "l3itch", "l3i+ch", "masturbate", "masterbat*", "masterbat3", "motherfucker", "s.o.b.", "mofo", "nazi", "nigga", "nigger", "nutsack", "phuck", "pimpis", "pusse", "pussy", "scrotum", "sh!t", "shemale", "shi+", "sh!+", "slut", "smut", "teets", "tits", "boobs", "b00bs", "teez", "testical", "testicle", "titt", "w00se", "jackoff", "wank", "whoar", "whore", "*damn", "*dyke", "*fuck*", "*shit*", "@$$", "amcik", "andskota", "arse*", "assrammer", "ayir", "bi7ch", "bitch*", "bollock*", "breasts", "butt-pirate", "cabron", "cazzo", "chraa", "chuj", "Cock*", "cunt*", "d4mn", "daygo", "dego", "dick*", "dike*", "dupa", "dziwka", "ejackulate", "Ekrem*", "Ekto", "enculer", "faen", "fag*", "fanculo", "fanny", "feces", "feg", "Felcher", "ficken", "fitt*", "Flikker", "foreskin", "Fotze", "Fu(*", "fuk*", "futkretzn", "gook", "guiena", "h0r", "h4x0r", "hell", "helvete", "hoer*", "honkey", "Huevon", "hui", "injun", "jizz", "kanker*", "kike", "klootzak", "kraut", "knulle", "kuk", "kuksuger", "Kurac", "kurwa", "kusi*", "kyrpa*", "lesbo", "mamhoon", "masturbat*", "merd*", "mibun", "monkleigh", "mouliewop", "muie", "mulkku", "muschi", "nazis", "nepesaurio", "nigger*", "orospu", "paska*", "perse", "picka", "pierdol*", "pillu*", "pimmel", "piss*", "pizda", "poontsee", "poop", "porn", "p0rn", "pr0n", "preteen", "pula", "pule", "puta", "puto", "qahbeh", "queef*", "rautenberg", "schaffer", "scheiss*", "schlampe", "schmuck", "screw", "sh!t*", "sharmuta", "sharmute", "shipal", "shiz", "skribz", "skurwysyn", "sphencter", "spic", "spierdalaj", "splooge", "suka", "b00b*", "testicle*", "titt*", "twat", "vittu", "wank*", "wetback*", "wichser", "wop*", "yed", "zabourah"];
const _h = {
  words: Oh
};
var zh = {
  "4r5e": 1,
  "5h1t": 1,
  "5hit": 1,
  a55: 1,
  anal: 1,
  anus: 1,
  ar5e: 1,
  arrse: 1,
  arse: 1,
  ass: 1,
  "ass-fucker": 1,
  asses: 1,
  assfucker: 1,
  assfukka: 1,
  asshole: 1,
  assholes: 1,
  asswhole: 1,
  a_s_s: 1,
  "b!tch": 1,
  b00bs: 1,
  b17ch: 1,
  b1tch: 1,
  ballbag: 1,
  balls: 1,
  ballsack: 1,
  bastard: 1,
  beastial: 1,
  beastiality: 1,
  bellend: 1,
  bestial: 1,
  bestiality: 1,
  "bi+ch": 1,
  biatch: 1,
  bitch: 1,
  bitcher: 1,
  bitchers: 1,
  bitches: 1,
  bitchin: 1,
  bitching: 1,
  bloody: 1,
  "blow job": 1,
  blowjob: 1,
  blowjobs: 1,
  boiolas: 1,
  bollock: 1,
  bollok: 1,
  boner: 1,
  boob: 1,
  boobs: 1,
  booobs: 1,
  boooobs: 1,
  booooobs: 1,
  booooooobs: 1,
  breasts: 1,
  buceta: 1,
  bugger: 1,
  bum: 1,
  "bunny fucker": 1,
  butt: 1,
  butthole: 1,
  buttmuch: 1,
  buttplug: 1,
  c0ck: 1,
  c0cksucker: 1,
  "carpet muncher": 1,
  cawk: 1,
  chink: 1,
  cipa: 1,
  cl1t: 1,
  clit: 1,
  clitoris: 1,
  clits: 1,
  cnut: 1,
  cock: 1,
  "cock-sucker": 1,
  cockface: 1,
  cockhead: 1,
  cockmunch: 1,
  cockmuncher: 1,
  cocks: 1,
  cocksuck: 1,
  cocksucked: 1,
  cocksucker: 1,
  cocksucking: 1,
  cocksucks: 1,
  cocksuka: 1,
  cocksukka: 1,
  cok: 1,
  cokmuncher: 1,
  coksucka: 1,
  coon: 1,
  cox: 1,
  crap: 1,
  cum: 1,
  cummer: 1,
  cumming: 1,
  cums: 1,
  cumshot: 1,
  cunilingus: 1,
  cunillingus: 1,
  cunnilingus: 1,
  cunt: 1,
  cuntlick: 1,
  cuntlicker: 1,
  cuntlicking: 1,
  cunts: 1,
  cyalis: 1,
  cyberfuc: 1,
  cyberfuck: 1,
  cyberfucked: 1,
  cyberfucker: 1,
  cyberfuckers: 1,
  cyberfucking: 1,
  d1ck: 1,
  damn: 1,
  dick: 1,
  dickhead: 1,
  dildo: 1,
  dildos: 1,
  dink: 1,
  dinks: 1,
  dirsa: 1,
  dlck: 1,
  "dog-fucker": 1,
  doggin: 1,
  dogging: 1,
  donkeyribber: 1,
  doosh: 1,
  duche: 1,
  dyke: 1,
  ejaculate: 1,
  ejaculated: 1,
  ejaculates: 1,
  ejaculating: 1,
  ejaculatings: 1,
  ejaculation: 1,
  ejakulate: 1,
  "f u c k": 1,
  "f u c k e r": 1,
  f4nny: 1,
  fag: 1,
  fagging: 1,
  faggitt: 1,
  faggot: 1,
  faggs: 1,
  fagot: 1,
  fagots: 1,
  fags: 1,
  fanny: 1,
  fannyflaps: 1,
  fannyfucker: 1,
  fanyy: 1,
  fatass: 1,
  fcuk: 1,
  fcuker: 1,
  fcuking: 1,
  feck: 1,
  fecker: 1,
  felching: 1,
  fellate: 1,
  fellatio: 1,
  fingerfuck: 1,
  fingerfucked: 1,
  fingerfucker: 1,
  fingerfuckers: 1,
  fingerfucking: 1,
  fingerfucks: 1,
  fistfuck: 1,
  fistfucked: 1,
  fistfucker: 1,
  fistfuckers: 1,
  fistfucking: 1,
  fistfuckings: 1,
  fistfucks: 1,
  flange: 1,
  fook: 1,
  fooker: 1,
  fuck: 1,
  fucka: 1,
  fucked: 1,
  fucker: 1,
  fuckers: 1,
  fuckhead: 1,
  fuckheads: 1,
  fuckin: 1,
  fucking: 1,
  fuckings: 1,
  fuckingshitmotherfucker: 1,
  fuckme: 1,
  fucks: 1,
  fuckwhit: 1,
  fuckwit: 1,
  "fudge packer": 1,
  fudgepacker: 1,
  fuk: 1,
  fuker: 1,
  fukker: 1,
  fukkin: 1,
  fuks: 1,
  fukwhit: 1,
  fukwit: 1,
  fux: 1,
  fux0r: 1,
  f_u_c_k: 1,
  gangbang: 1,
  gangbanged: 1,
  gangbangs: 1,
  gaylord: 1,
  gaysex: 1,
  goatse: 1,
  God: 1,
  "god-dam": 1,
  "god-damned": 1,
  goddamn: 1,
  goddamned: 1,
  hardcoresex: 1,
  hell: 1,
  heshe: 1,
  hoar: 1,
  hoare: 1,
  hoer: 1,
  homo: 1,
  hore: 1,
  horniest: 1,
  horny: 1,
  hotsex: 1,
  "jack-off": 1,
  jackoff: 1,
  jap: 1,
  "jerk-off": 1,
  jism: 1,
  jiz: 1,
  jizm: 1,
  jizz: 1,
  kawk: 1,
  knob: 1,
  knobead: 1,
  knobed: 1,
  knobend: 1,
  knobhead: 1,
  knobjocky: 1,
  knobjokey: 1,
  kock: 1,
  kondum: 1,
  kondums: 1,
  kum: 1,
  kummer: 1,
  kumming: 1,
  kums: 1,
  kunilingus: 1,
  "l3i+ch": 1,
  l3itch: 1,
  labia: 1,
  lust: 1,
  lusting: 1,
  m0f0: 1,
  m0fo: 1,
  m45terbate: 1,
  ma5terb8: 1,
  ma5terbate: 1,
  masochist: 1,
  "master-bate": 1,
  masterb8: 1,
  "masterbat*": 1,
  masterbat3: 1,
  masterbate: 1,
  masterbation: 1,
  masterbations: 1,
  masturbate: 1,
  "mo-fo": 1,
  mof0: 1,
  mofo: 1,
  mothafuck: 1,
  mothafucka: 1,
  mothafuckas: 1,
  mothafuckaz: 1,
  mothafucked: 1,
  mothafucker: 1,
  mothafuckers: 1,
  mothafuckin: 1,
  mothafucking: 1,
  mothafuckings: 1,
  mothafucks: 1,
  "mother fucker": 1,
  motherfuck: 1,
  motherfucked: 1,
  motherfucker: 1,
  motherfuckers: 1,
  motherfuckin: 1,
  motherfucking: 1,
  motherfuckings: 1,
  motherfuckka: 1,
  motherfucks: 1,
  muff: 1,
  mutha: 1,
  muthafecker: 1,
  muthafuckker: 1,
  muther: 1,
  mutherfucker: 1,
  n1gga: 1,
  n1gger: 1,
  nazi: 1,
  nigg3r: 1,
  nigg4h: 1,
  nigga: 1,
  niggah: 1,
  niggas: 1,
  niggaz: 1,
  nigger: 1,
  niggers: 1,
  nob: 1,
  "nob jokey": 1,
  nobhead: 1,
  nobjocky: 1,
  nobjokey: 1,
  numbnuts: 1,
  nutsack: 1,
  orgasim: 1,
  orgasims: 1,
  orgasm: 1,
  orgasms: 1,
  p0rn: 1,
  pawn: 1,
  pecker: 1,
  penis: 1,
  penisfucker: 1,
  phonesex: 1,
  phuck: 1,
  phuk: 1,
  phuked: 1,
  phuking: 1,
  phukked: 1,
  phukking: 1,
  phuks: 1,
  phuq: 1,
  pigfucker: 1,
  pimpis: 1,
  piss: 1,
  pissed: 1,
  pisser: 1,
  pissers: 1,
  pisses: 1,
  pissflaps: 1,
  pissin: 1,
  pissing: 1,
  pissoff: 1,
  poop: 1,
  porn: 1,
  porno: 1,
  pornography: 1,
  pornos: 1,
  prick: 1,
  pricks: 1,
  pron: 1,
  pube: 1,
  pusse: 1,
  pussi: 1,
  pussies: 1,
  pussy: 1,
  pussys: 1,
  rectum: 1,
  retard: 1,
  rimjaw: 1,
  rimming: 1,
  "s hit": 1,
  "s.o.b.": 1,
  sadist: 1,
  schlong: 1,
  screwing: 1,
  scroat: 1,
  scrote: 1,
  scrotum: 1,
  semen: 1,
  sex: 1,
  "sh!+": 1,
  "sh!t": 1,
  sh1t: 1,
  shag: 1,
  shagger: 1,
  shaggin: 1,
  shagging: 1,
  shemale: 1,
  "shi+": 1,
  shit: 1,
  shitdick: 1,
  shite: 1,
  shited: 1,
  shitey: 1,
  shitfuck: 1,
  shitfull: 1,
  shithead: 1,
  shiting: 1,
  shitings: 1,
  shits: 1,
  shitted: 1,
  shitter: 1,
  shitters: 1,
  shitting: 1,
  shittings: 1,
  shitty: 1,
  skank: 1,
  slut: 1,
  sluts: 1,
  smegma: 1,
  smut: 1,
  snatch: 1,
  "son-of-a-bitch": 1,
  spac: 1,
  spunk: 1,
  s_h_i_t: 1,
  t1tt1e5: 1,
  t1tties: 1,
  teets: 1,
  teez: 1,
  testical: 1,
  testicle: 1,
  tit: 1,
  titfuck: 1,
  tits: 1,
  titt: 1,
  tittie5: 1,
  tittiefucker: 1,
  titties: 1,
  tittyfuck: 1,
  tittywank: 1,
  titwank: 1,
  tosser: 1,
  turd: 1,
  tw4t: 1,
  twat: 1,
  twathead: 1,
  twatty: 1,
  twunt: 1,
  twunter: 1,
  v14gra: 1,
  v1gra: 1,
  vagina: 1,
  viagra: 1,
  vulva: 1,
  w00se: 1,
  wang: 1,
  wank: 1,
  wanker: 1,
  wanky: 1,
  whoar: 1,
  whore: 1,
  willies: 1,
  willy: 1,
  xrated: 1,
  xxx: 1
};
var Hh = /\b(4r5e|5h1t|5hit|a55|anal|anus|ar5e|arrse|arse|ass|ass-fucker|asses|assfucker|assfukka|asshole|assholes|asswhole|a_s_s|b!tch|b00bs|b17ch|b1tch|ballbag|balls|ballsack|bastard|beastial|beastiality|bellend|bestial|bestiality|bi\+ch|biatch|bitch|bitcher|bitchers|bitches|bitchin|bitching|bloody|blow job|blowjob|blowjobs|boiolas|bollock|bollok|boner|boob|boobs|booobs|boooobs|booooobs|booooooobs|breasts|buceta|bugger|bum|bunny fucker|butt|butthole|buttmuch|buttplug|c0ck|c0cksucker|carpet muncher|cawk|chink|cipa|cl1t|clit|clitoris|clits|cnut|cock|cock-sucker|cockface|cockhead|cockmunch|cockmuncher|cocks|cocksuck|cocksucked|cocksucker|cocksucking|cocksucks|cocksuka|cocksukka|cok|cokmuncher|coksucka|coon|cox|crap|cum|cummer|cumming|cums|cumshot|cunilingus|cunillingus|cunnilingus|cunt|cuntlick|cuntlicker|cuntlicking|cunts|cyalis|cyberfuc|cyberfuck|cyberfucked|cyberfucker|cyberfuckers|cyberfucking|d1ck|damn|dick|dickhead|dildo|dildos|dink|dinks|dirsa|dlck|dog-fucker|doggin|dogging|donkeyribber|doosh|duche|dyke|ejaculate|ejaculated|ejaculates|ejaculating|ejaculatings|ejaculation|ejakulate|f u c k|f u c k e r|f4nny|fag|fagging|faggitt|faggot|faggs|fagot|fagots|fags|fanny|fannyflaps|fannyfucker|fanyy|fatass|fcuk|fcuker|fcuking|feck|fecker|felching|fellate|fellatio|fingerfuck|fingerfucked|fingerfucker|fingerfuckers|fingerfucking|fingerfucks|fistfuck|fistfucked|fistfucker|fistfuckers|fistfucking|fistfuckings|fistfucks|flange|fook|fooker|fuck|fucka|fucked|fucker|fuckers|fuckhead|fuckheads|fuckin|fucking|fuckings|fuckingshitmotherfucker|fuckme|fucks|fuckwhit|fuckwit|fudge packer|fudgepacker|fuk|fuker|fukker|fukkin|fuks|fukwhit|fukwit|fux|fux0r|f_u_c_k|gangbang|gangbanged|gangbangs|gaylord|gaysex|goatse|God|god-dam|god-damned|goddamn|goddamned|hardcoresex|hell|heshe|hoar|hoare|hoer|homo|hore|horniest|horny|hotsex|jack-off|jackoff|jap|jerk-off|jism|jiz|jizm|jizz|kawk|knob|knobead|knobed|knobend|knobhead|knobjocky|knobjokey|kock|kondum|kondums|kum|kummer|kumming|kums|kunilingus|l3i\+ch|l3itch|labia|lust|lusting|m0f0|m0fo|m45terbate|ma5terb8|ma5terbate|masochist|master-bate|masterb8|masterbat*|masterbat3|masterbate|masterbation|masterbations|masturbate|mo-fo|mof0|mofo|mothafuck|mothafucka|mothafuckas|mothafuckaz|mothafucked|mothafucker|mothafuckers|mothafuckin|mothafucking|mothafuckings|mothafucks|mother fucker|motherfuck|motherfucked|motherfucker|motherfuckers|motherfuckin|motherfucking|motherfuckings|motherfuckka|motherfucks|muff|mutha|muthafecker|muthafuckker|muther|mutherfucker|n1gga|n1gger|nazi|nigg3r|nigg4h|nigga|niggah|niggas|niggaz|nigger|niggers|nob|nob jokey|nobhead|nobjocky|nobjokey|numbnuts|nutsack|orgasim|orgasims|orgasm|orgasms|p0rn|pawn|pecker|penis|penisfucker|phonesex|phuck|phuk|phuked|phuking|phukked|phukking|phuks|phuq|pigfucker|pimpis|piss|pissed|pisser|pissers|pisses|pissflaps|pissin|pissing|pissoff|poop|porn|porno|pornography|pornos|prick|pricks|pron|pube|pusse|pussi|pussies|pussy|pussys|rectum|retard|rimjaw|rimming|s hit|s.o.b.|sadist|schlong|screwing|scroat|scrote|scrotum|semen|sex|sh!\+|sh!t|sh1t|shag|shagger|shaggin|shagging|shemale|shi\+|shit|shitdick|shite|shited|shitey|shitfuck|shitfull|shithead|shiting|shitings|shits|shitted|shitter|shitters|shitting|shittings|shitty|skank|slut|sluts|smegma|smut|snatch|son-of-a-bitch|spac|spunk|s_h_i_t|t1tt1e5|t1tties|teets|teez|testical|testicle|tit|titfuck|tits|titt|tittie5|tittiefucker|titties|tittyfuck|tittywank|titwank|tosser|turd|tw4t|twat|twathead|twatty|twunt|twunter|v14gra|v1gra|vagina|viagra|vulva|w00se|wang|wank|wanker|wanky|whoar|whore|willies|willy|xrated|xxx)\b/gi;
var Lh = {
  object: zh,
  array: 0,
  regex: Hh
};
const Fh = _h.words;
const Vh = Lh.array;
class Nh {
  constructor(t = {}) {
    Object.assign(this, {
      list: t.emptyList && [] || Array.prototype.concat.apply(Fh, [Vh, t.list || []]),
      exclude: t.exclude || [],
      splitRegex: t.splitRegex || /\b/,
      placeHolder: t.placeHolder || "*",
      regex: t.regex || /[^a-zA-Z0-9|\$|\@]|\^/g,
      replaceRegex: t.replaceRegex || /\w/g
    });
  }
  isProfane(t) {
    return this.list.filter(i => {
      const n = new RegExp(`\\b${i.replace(/(\W)/g, "\\$1")}\\b`, "gi");
      return !this.exclude.includes(i.toLowerCase()) && n.test(t);
    }).length > 0 || false;
  }
  replaceWord(t) {
    return t.replace(this.regex, "").replace(this.replaceRegex, this.placeHolder);
  }
  clean(t) {
    return t.split(this.splitRegex).map(i => this.isProfane(i) ? this.replaceWord(i) : i).join(this.splitRegex.exec(t)[0]);
  }
  addWords() {
    let t = Array.from(arguments);
    this.list.push(...t);
    t.map(i => i.toLowerCase()).forEach(i => {
      if (this.exclude.includes(i)) {
        this.exclude.splice(this.exclude.indexOf(i), 1);
      }
    });
  }
  removeWords() {
    this.exclude.push(...Array.from(arguments).map(t => t.toLowerCase()));
  }
}
var Uh = Nh;
const Wh = An(Uh);
const Ko = new Wh();
const Xh = ["jew", "black", "baby", "child", "white", "porn", "pedo", "trump", "clinton", "hitler", "nazi", "gay", "pride", "sex", "pleasure", "touch", "poo", "kids", "rape", "white power", "nigga", "nig nog", "doggy", "rapist", "boner", "nigger", "nigg", "finger", "nogger", "nagger", "nig", "fag", "gai", "pole", "stripper", "penis", "vagina", "pussy", "nazi", "hitler", "stalin", "burn", "chamber", "cock", "peen", "dick", "spick", "nieger", "die", "satan", "n|ig", "nlg", "cunt", "c0ck", "fag", "lick", "condom", "anal", "shit", "phile", "little", "kids", "free KR", "tiny", "sidney", "ass", "kill", ".io", "(dot)", "[dot]", "mini", "whiore", "whore", "faggot", "github", "1337", "666", "satan", "senpa", "discord", "d1scord", "mistik", ".io", "senpa.io", "sidney", "sid", "senpaio", "vries", "asa"];
Ko.addWords(...Xh);
const Ir = Math.abs;
const Ut = Math.cos;
const Wt = Math.sin;
const Tr = Math.pow;
const qh = Math.sqrt;
function Gh(e, t, i, n, s, r, o, l, c, a, f, d, u, p) {
  this.id = e;
  this.sid = t;
  this.tmpScore = 0;
  this.team = null;
  this.skinIndex = 0;
  this.tailIndex = 0;
  this.hitTime = 0;
  this.tails = {};
  for (var w = 0; w < f.length; ++w) {
    if (f[w].price <= 0) {
      this.tails[f[w].id] = 1;
    }
  }
  this.skins = {};
  for (var w = 0; w < a.length; ++w) {
    if (a[w].price <= 0) {
      this.skins[a[w].id] = 1;
    }
  }
  this.points = 0;
  this.dt = 0;
  this.hidden = false;
  this.itemCounts = {};
  this.isPlayer = true;
  this.pps = 0;
  this.moveDir = undefined;
  this.skinRot = 0;
  this.lastPing = 0;
  this.iconIndex = 0;
  this.skinColor = 0;
  this.spawn = function (v) {
    this.active = true;
    this.alive = true;
    this.lockMove = false;
    this.lockDir = false;
    this.minimapCounter = 0;
    this.chatCountdown = 0;
    this.shameCount = 0;
    this.shameTimer = 0;
    this.sentTo = {};
    this.gathering = 0;
    this.autoGather = 0;
    this.animTime = 0;
    this.animSpeed = 0;
    this.mouseState = 0;
    this.buildIndex = -1;
    this.weaponIndex = 0;
    this.dmgOverTime = {};
    this.noMovTimer = 0;
    this.maxXP = 300;
    this.XP = 0;
    this.age = 1;
    this.kills = 0;
    this.upgrAge = 2;
    this.upgradePoints = 0;
    this.x = 0;
    this.y = 0;
    this.zIndex = 0;
    this.xVel = 0;
    this.yVel = 0;
    this.slowMult = 1;
    this.dir = 0;
    this.dirPlus = 0;
    this.targetDir = 0;
    this.targetAngle = 0;
    this.maxHealth = 100;
    this.health = this.maxHealth;
    this.scale = i.playerScale;
    this.speed = i.playerSpeed;
    this.resetMoveDir();
    this.resetResources(v);
    this.items = [0, 3, 6, 10];
    this.weapons = [0];
    this.shootCount = 0;
    this.weaponXP = [];
    this.reloads = {};
    this.timeSpentNearVolcano = 0;
  };
  this.resetMoveDir = function () {
    this.moveDir = undefined;
  };
  this.resetResources = function (v) {
    for (let S = 0; S < i.resourceTypes.length; ++S) {
      this[i.resourceTypes[S]] = v ? 100 : 0;
    }
  };
  this.addItem = function (v) {
    const S = c.list[v];
    if (S) {
      for (let R = 0; R < this.items.length; ++R) {
        if (c.list[this.items[R]].group == S.group) {
          if (this.buildIndex == this.items[R]) {
            this.buildIndex = v;
          }
          this.items[R] = v;
          return true;
        }
      }
      this.items.push(v);
      return true;
    }
    return false;
  };
  this.setUserData = function (v) {
    if (v) {
      this.name = "unknown";
      let S = v.name + "";
      S = S.slice(0, i.maxNameLength);
      S = S.replace(/[^\w:\(\)\/? -]+/gmi, " ");
      S = S.replace(/[^\x00-\x7F]/g, " ");
      S = S.trim();
      let R = false;
      const G = S.toLowerCase().replace(/\s/g, "").replace(/1/g, "i").replace(/0/g, "o").replace(/5/g, "s");
      for (const X of Ko.list) {
        if (G.indexOf(X) != -1) {
          R = true;
          break;
        }
      }
      if (S.length > 0 && !R) {
        this.name = S;
      }
      this.skinColor = 0;
      if (i.skinColors[v.skin]) {
        this.skinColor = v.skin;
      }
    }
  };
  this.getData = function () {
    return [this.id, this.sid, this.name, n.fixTo(this.x, 2), n.fixTo(this.y, 2), n.fixTo(this.dir, 3), this.health, this.maxHealth, this.scale, this.skinColor];
  };
  this.setData = function (v) {
    this.id = v[0];
    this.sid = v[1];
    this.name = v[2];
    this.x = v[3];
    this.y = v[4];
    this.dir = v[5];
    this.health = v[6];
    this.maxHealth = v[7];
    this.scale = v[8];
    this.skinColor = v[9];
  };
  let x = 0;
  this.update = function (v) {
    if (!this.alive) {
      return;
    }
    if ((n.getDistance(this.x, this.y, i.volcanoLocationX, i.volcanoLocationY) || 0) < i.volcanoAggressionRadius) {
      this.timeSpentNearVolcano += v;
      if (this.timeSpentNearVolcano >= 1000) {
        this.changeHealth(i.volcanoDamagePerSecond, null);
        d.send(this.id, "8", Math.round(this.x), Math.round(this.y), i.volcanoDamagePerSecond, -1);
        this.timeSpentNearVolcano %= 1000;
      }
    }
    if (this.shameTimer > 0) {
      this.shameTimer -= v;
      if (this.shameTimer <= 0) {
        this.shameTimer = 0;
        this.shameCount = 0;
      }
    }
    x -= v;
    if (x <= 0) {
      const _ = (this.skin && this.skin.healthRegen ? this.skin.healthRegen : 0) + (this.tail && this.tail.healthRegen ? this.tail.healthRegen : 0);
      if (_) {
        this.changeHealth(_, this);
      }
      if (this.dmgOverTime.dmg) {
        this.changeHealth(-this.dmgOverTime.dmg, this.dmgOverTime.doer);
        this.dmgOverTime.time -= 1;
        if (this.dmgOverTime.time <= 0) {
          this.dmgOverTime.dmg = 0;
        }
      }
      if (this.healCol) {
        this.changeHealth(this.healCol, this);
      }
      x = 1000;
    }
    if (!this.alive) {
      return;
    }
    if (this.slowMult < 1) {
      this.slowMult += v * 0.0008;
      if (this.slowMult > 1) {
        this.slowMult = 1;
      }
    }
    this.noMovTimer += v;
    if (this.xVel || this.yVel) {
      this.noMovTimer = 0;
    }
    if (this.lockMove) {
      this.xVel = 0;
      this.yVel = 0;
    } else {
      let _ = (this.buildIndex >= 0 ? 0.5 : 1) * (c.weapons[this.weaponIndex].spdMult || 1) * (this.skin && this.skin.spdMult || 1) * (this.tail && this.tail.spdMult || 1) * (this.y <= i.snowBiomeTop ? this.skin && this.skin.coldM ? 1 : i.snowSpeed : 1) * this.slowMult;
      if (!this.zIndex && this.y >= i.mapScale / 2 - i.riverWidth / 2 && this.y <= i.mapScale / 2 + i.riverWidth / 2) {
        if (this.skin && this.skin.watrImm) {
          _ *= 0.75;
          this.xVel += i.waterCurrent * 0.4 * v;
        } else {
          _ *= 0.33;
          this.xVel += i.waterCurrent * v;
        }
      }
      let D = this.moveDir != null ? Ut(this.moveDir) : 0;
      let z = this.moveDir != null ? Wt(this.moveDir) : 0;
      const N = qh(D * D + z * z);
      if (N != 0) {
        D /= N;
        z /= N;
      }
      if (D) {
        this.xVel += D * this.speed * _ * v;
      }
      if (z) {
        this.yVel += z * this.speed * _ * v;
      }
    }
    this.zIndex = 0;
    this.lockMove = false;
    this.healCol = 0;
    let R;
    const G = n.getDistance(0, 0, this.xVel * v, this.yVel * v);
    const X = Math.min(4, Math.max(1, Math.round(G / 40)));
    const W = 1 / X;
    let M = {};
    for (var V = 0; V < X; ++V) {
      if (this.xVel) {
        this.x += this.xVel * v * W;
      }
      if (this.yVel) {
        this.y += this.yVel * v * W;
      }
      R = r.getGridArrays(this.x, this.y, this.scale);
      for (let _ = 0; _ < R.length; ++_) {
        for (let D = 0; D < R[_].length && !(R[_][D].active && !M[R[_][D].sid] && r.checkCollision(this, R[_][D], W) && (M[R[_][D].sid] = true, !this.alive)); ++D);
        if (!this.alive) {
          break;
        }
      }
      if (!this.alive) {
        break;
      }
    }
    for (var F = o.indexOf(this), V = F + 1; V < o.length; ++V) {
      if (o[V] != this && o[V].alive) {
        r.checkCollision(this, o[V]);
      }
    }
    if (this.xVel) {
      this.xVel *= Tr(i.playerDecel, v);
      if (this.xVel <= 0.01 && this.xVel >= -0.01) {
        this.xVel = 0;
      }
    }
    if (this.yVel) {
      this.yVel *= Tr(i.playerDecel, v);
      if (this.yVel <= 0.01 && this.yVel >= -0.01) {
        this.yVel = 0;
      }
    }
    if (this.x - this.scale < 0) {
      this.x = this.scale;
    } else if (this.x + this.scale > i.mapScale) {
      this.x = i.mapScale - this.scale;
    }
    if (this.y - this.scale < 0) {
      this.y = this.scale;
    } else if (this.y + this.scale > i.mapScale) {
      this.y = i.mapScale - this.scale;
    }
    if (this.buildIndex < 0) {
      if (this.reloads[this.weaponIndex] > 0) {
        this.reloads[this.weaponIndex] -= v;
        this.gathering = this.mouseState;
      } else if (this.gathering || this.autoGather) {
        let _ = true;
        if (c.weapons[this.weaponIndex].gather != null) {
          this.gather(o);
        } else if (c.weapons[this.weaponIndex].projectile != null && this.hasRes(c.weapons[this.weaponIndex], this.skin ? this.skin.projCost : 0)) {
          this.useRes(c.weapons[this.weaponIndex], this.skin ? this.skin.projCost : 0);
          this.noMovTimer = 0;
          var F = c.weapons[this.weaponIndex].projectile;
          const z = this.scale * 2;
          const N = this.skin && this.skin.aMlt ? this.skin.aMlt : 1;
          if (c.weapons[this.weaponIndex].rec) {
            this.xVel -= c.weapons[this.weaponIndex].rec * Ut(this.dir);
            this.yVel -= c.weapons[this.weaponIndex].rec * Wt(this.dir);
          }
          s.addProjectile(this.x + z * Ut(this.dir), this.y + z * Wt(this.dir), this.dir, c.projectiles[F].range * N, c.projectiles[F].speed * N, F, this, null, this.zIndex);
        } else {
          _ = false;
        }
        this.gathering = this.mouseState;
        if (_) {
          this.reloads[this.weaponIndex] = c.weapons[this.weaponIndex].speed * (this.skin && this.skin.atkSpd || 1);
        }
      }
    }
  };
  this.addWeaponXP = function (v) {
    if (!this.weaponXP[this.weaponIndex]) {
      this.weaponXP[this.weaponIndex] = 0;
    }
    this.weaponXP[this.weaponIndex] += v;
  };
  this.earnXP = function (v) {
    if (this.age < i.maxAge) {
      this.XP += v;
      if (this.XP >= this.maxXP) {
        if (this.age < i.maxAge) {
          this.age++;
          this.XP = 0;
          this.maxXP *= 1.2;
        } else {
          this.XP = this.maxXP;
        }
        this.upgradePoints++;
        d.send(this.id, "U", this.upgradePoints, this.upgrAge);
        d.send(this.id, "T", this.XP, n.fixTo(this.maxXP, 1), this.age);
      } else {
        d.send(this.id, "T", this.XP);
      }
    }
  };
  this.changeHealth = function (v, S) {
    if (v > 0 && this.health >= this.maxHealth) {
      return false;
    }
    if (v < 0 && this.skin) {
      v *= this.skin.dmgMult || 1;
    }
    if (v < 0 && this.tail) {
      v *= this.tail.dmgMult || 1;
    }
    if (v < 0) {
      this.hitTime = Date.now();
    }
    this.health += v;
    if (this.health > this.maxHealth) {
      v -= this.health - this.maxHealth;
      this.health = this.maxHealth;
    }
    if (this.health <= 0) {
      this.kill(S);
    }
    for (let R = 0; R < o.length; ++R) {
      if (this.sentTo[o[R].id]) {
        d.send(o[R].id, "O", this.sid, this.health);
      }
    }
    if (S && S.canSee(this) && !(S == this && v < 0)) {
      d.send(S.id, "8", Math.round(this.x), Math.round(this.y), Math.round(-v), 1);
    }
    return true;
  };
  this.kill = function (v) {
    if (v && v.alive) {
      v.kills++;
      if (v.skin && v.skin.goldSteal) {
        u(v, Math.round(this.points / 2));
      } else {
        u(v, Math.round(this.age * 100 * (v.skin && v.skin.kScrM ? v.skin.kScrM : 1)));
      }
      d.send(v.id, "N", "kills", v.kills, 1);
    }
    this.alive = false;
    d.send(this.id, "P");
    p();
  };
  this.addResource = function (v, S, R) {
    if (!R && S > 0) {
      this.addWeaponXP(S);
    }
    if (v == 3) {
      u(this, S, true);
    } else {
      this[i.resourceTypes[v]] += S;
      d.send(this.id, "N", i.resourceTypes[v], this[i.resourceTypes[v]], 1);
    }
  };
  this.changeItemCount = function (v, S) {
    this.itemCounts[v] = this.itemCounts[v] || 0;
    this.itemCounts[v] += S;
    d.send(this.id, "S", v, this.itemCounts[v]);
  };
  this.buildItem = function (v) {
    const S = this.scale + v.scale + (v.placeOffset || 0);
    const R = this.x + S * Ut(this.dir);
    const G = this.y + S * Wt(this.dir);
    if (this.canBuild(v) && !(v.consume && this.skin && this.skin.noEat) && (v.consume || r.checkItemLocation(R, G, v.scale, 0.6, v.id, false, this))) {
      let X = false;
      if (v.consume) {
        if (this.hitTime) {
          const W = Date.now() - this.hitTime;
          this.hitTime = 0;
          if (W <= 120) {
            this.shameCount++;
            if (this.shameCount >= 8) {
              this.shameTimer = 30000;
              this.shameCount = 0;
            }
          } else {
            this.shameCount -= 2;
            if (this.shameCount <= 0) {
              this.shameCount = 0;
            }
          }
        }
        if (this.shameTimer <= 0) {
          X = v.consume(this);
        }
      } else {
        X = true;
        if (v.group.limit) {
          this.changeItemCount(v.group.id, 1);
        }
        if (v.pps) {
          this.pps += v.pps;
        }
        r.add(r.objects.length, R, G, this.dir, v.scale, v.type, v, false, this);
      }
      if (X) {
        this.useRes(v);
        this.buildIndex = -1;
      }
    }
  };
  this.hasRes = function (v, S) {
    for (let R = 0; R < v.req.length;) {
      if (this[v.req[R]] < Math.round(v.req[R + 1] * (S || 1))) {
        return false;
      }
      R += 2;
    }
    return true;
  };
  this.useRes = function (v, S) {
    if (!i.inSandbox) {
      for (let R = 0; R < v.req.length;) {
        this.addResource(i.resourceTypes.indexOf(v.req[R]), -Math.round(v.req[R + 1] * (S || 1)));
        R += 2;
      }
    }
  };
  this.canBuild = function (v) {
    const S = i.inSandbox ? v.group.sandboxLimit || Math.max(v.group.limit * 3, 99) : v.group.limit;
    if (S && this.itemCounts[v.group.id] >= S) {
      return false;
    } else if (i.inSandbox) {
      return true;
    } else {
      return this.hasRes(v);
    }
  };
  this.gather = function () {
    this.noMovTimer = 0;
    this.slowMult -= c.weapons[this.weaponIndex].hitSlow || 0.3;
    if (this.slowMult < 0) {
      this.slowMult = 0;
    }
    const v = i.fetchVariant(this);
    const S = v.poison;
    const R = v.val;
    const G = {};
    let X;
    let W;
    let M;
    let V;
    const F = r.getGridArrays(this.x, this.y, c.weapons[this.weaponIndex].range);
    for (let D = 0; D < F.length; ++D) {
      for (var _ = 0; _ < F[D].length; ++_) {
        M = F[D][_];
        if (M.active && !M.dontGather && !G[M.sid] && M.visibleToPlayer(this) && (X = n.getDistance(this.x, this.y, M.x, M.y) - M.scale, X <= c.weapons[this.weaponIndex].range && (W = n.getDirection(M.x, M.y, this.x, this.y), n.getAngleDist(W, this.dir) <= i.gatherAngle))) {
          G[M.sid] = 1;
          if (M.health) {
            if (M.changeHealth(-c.weapons[this.weaponIndex].dmg * R * (c.weapons[this.weaponIndex].sDmg || 1) * (this.skin && this.skin.bDmg ? this.skin.bDmg : 1), this)) {
              for (let z = 0; z < M.req.length;) {
                this.addResource(i.resourceTypes.indexOf(M.req[z]), M.req[z + 1]);
                z += 2;
              }
              r.disableObj(M);
            }
          } else {
            if (M.name === "volcano") {
              this.hitVolcano(c.weapons[this.weaponIndex].gather);
            } else {
              this.earnXP(c.weapons[this.weaponIndex].gather * 4);
              const z = c.weapons[this.weaponIndex].gather + (M.type == 3 ? 4 : 0);
              this.addResource(M.type, z);
            }
            if (this.skin && this.skin.extraGold) {
              this.addResource(3, 1);
            }
          }
          V = true;
          r.hitObj(M, W);
        }
      }
    }
    for (var _ = 0; _ < o.length + l.length; ++_) {
      M = o[_] || l[_ - o.length];
      if (M != this && M.alive && !(M.team && M.team == this.team) && (X = n.getDistance(this.x, this.y, M.x, M.y) - M.scale * 1.8, X <= c.weapons[this.weaponIndex].range && (W = n.getDirection(M.x, M.y, this.x, this.y), n.getAngleDist(W, this.dir) <= i.gatherAngle))) {
        let z = c.weapons[this.weaponIndex].steal;
        if (z && M.addResource) {
          z = Math.min(M.points || 0, z);
          this.addResource(3, z);
          M.addResource(3, -z);
        }
        let N = R;
        if (M.weaponIndex != null && c.weapons[M.weaponIndex].shield && n.getAngleDist(W + Math.PI, M.dir) <= i.shieldAngle) {
          N = c.weapons[M.weaponIndex].shield;
        }
        const Y = c.weapons[this.weaponIndex].dmg;
        const K = Y * (this.skin && this.skin.dmgMultO ? this.skin.dmgMultO : 1) * (this.tail && this.tail.dmgMultO ? this.tail.dmgMultO : 1);
        const ie = (M.weightM || 1) * 0.3 + (c.weapons[this.weaponIndex].knock || 0);
        M.xVel += ie * Ut(W);
        M.yVel += ie * Wt(W);
        if (this.skin && this.skin.healD) {
          this.changeHealth(K * N * this.skin.healD, this);
        }
        if (this.tail && this.tail.healD) {
          this.changeHealth(K * N * this.tail.healD, this);
        }
        if (M.skin && M.skin.dmg) {
          this.changeHealth(-Y * M.skin.dmg, M);
        }
        if (M.tail && M.tail.dmg) {
          this.changeHealth(-Y * M.tail.dmg, M);
        }
        if (M.dmgOverTime && this.skin && this.skin.poisonDmg && !(M.skin && M.skin.poisonRes)) {
          M.dmgOverTime.dmg = this.skin.poisonDmg;
          M.dmgOverTime.time = this.skin.poisonTime || 1;
          M.dmgOverTime.doer = this;
        }
        if (M.dmgOverTime && S && !(M.skin && M.skin.poisonRes)) {
          M.dmgOverTime.dmg = 5;
          M.dmgOverTime.time = 5;
          M.dmgOverTime.doer = this;
        }
        if (M.skin && M.skin.dmgK) {
          this.xVel -= M.skin.dmgK * Ut(W);
          this.yVel -= M.skin.dmgK * Wt(W);
        }
        M.changeHealth(-K * N, this, this);
      }
    }
    this.sendAnimation(V ? 1 : 0);
  };
  this.hitVolcano = function (v) {
    const S = 5 + Math.round(v / 3.5);
    this.addResource(2, S);
    this.addResource(3, S);
  };
  this.sendAnimation = function (v) {
    for (let S = 0; S < o.length; ++S) {
      if (this.sentTo[o[S].id] && this.canSee(o[S])) {
        d.send(o[S].id, "K", this.sid, v ? 1 : 0, this.weaponIndex);
      }
    }
  };
  let b = 0;
  let $ = 0;
  this.animate = function (v) {
    if (this.animTime > 0) {
      this.animTime -= v;
      if (this.animTime <= 0) {
        this.animTime = 0;
        this.dirPlus = 0;
        b = 0;
        $ = 0;
      } else if ($ == 0) {
        b += v / (this.animSpeed * i.hitReturnRatio);
        this.dirPlus = n.lerp(0, this.targetAngle, Math.min(1, b));
        if (b >= 1) {
          b = 1;
          $ = 1;
        }
      } else {
        b -= v / (this.animSpeed * (1 - i.hitReturnRatio));
        this.dirPlus = n.lerp(0, this.targetAngle, Math.max(0, b));
      }
    }
  };
  this.startAnim = function (v, S) {
    this.animTime = this.animSpeed = c.weapons[S].speed;
    this.targetAngle = v ? -i.hitAngle : -Math.PI;
    b = 0;
    $ = 0;
  };
  this.canSee = function (v) {
    if (!v || v.skin && v.skin.invisTimer && v.noMovTimer >= v.skin.invisTimer) {
      return false;
    }
    const S = Ir(v.x - this.x) - v.scale;
    const R = Ir(v.y - this.y) - v.scale;
    return S <= i.maxScreenWidth / 2 * 1.3 && R <= i.maxScreenHeight / 2 * 1.3;
  };
}
const Yh = [{
  id: 45,
  name: "Shame!",
  dontSell: true,
  price: 0,
  scale: 120,
  desc: "hacks are for losers"
}, {
  id: 51,
  name: "Moo Cap",
  price: 0,
  scale: 120,
  desc: "coolest mooer around"
}, {
  id: 50,
  name: "Apple Cap",
  price: 0,
  scale: 120,
  desc: "apple farms remembers"
}, {
  id: 28,
  name: "Moo Head",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 29,
  name: "Pig Head",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 30,
  name: "Fluff Head",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 36,
  name: "Pandou Head",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 37,
  name: "Bear Head",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 38,
  name: "Monkey Head",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 44,
  name: "Polar Head",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 35,
  name: "Fez Hat",
  price: 0,
  scale: 120,
  desc: "no effect"
}, {
  id: 42,
  name: "Enigma Hat",
  price: 0,
  scale: 120,
  desc: "join the enigma army"
}, {
  id: 43,
  name: "Blitz Hat",
  price: 0,
  scale: 120,
  desc: "hey everybody i'm blitz"
}, {
  id: 49,
  name: "Bob XIII Hat",
  price: 0,
  scale: 120,
  desc: "like and subscribe"
}, {
  id: 57,
  name: "Pumpkin",
  price: 50,
  scale: 120,
  desc: "Spooooky"
}, {
  id: 8,
  name: "Bummle Hat",
  price: 100,
  scale: 120,
  desc: "no effect"
}, {
  id: 2,
  name: "Straw Hat",
  price: 500,
  scale: 120,
  desc: "no effect"
}, {
  id: 15,
  name: "Winter Cap",
  price: 600,
  scale: 120,
  desc: "allows you to move at normal speed in snow",
  coldM: 1
}, {
  id: 5,
  name: "Cowboy Hat",
  price: 1000,
  scale: 120,
  desc: "no effect"
}, {
  id: 4,
  name: "Ranger Hat",
  price: 2000,
  scale: 120,
  desc: "no effect"
}, {
  id: 18,
  name: "Explorer Hat",
  price: 2000,
  scale: 120,
  desc: "no effect"
}, {
  id: 31,
  name: "Flipper Hat",
  price: 2500,
  scale: 120,
  desc: "have more control while in water",
  watrImm: true
}, {
  id: 1,
  name: "Marksman Cap",
  price: 3000,
  scale: 120,
  desc: "increases arrow speed and range",
  aMlt: 1.3
}, {
  id: 10,
  name: "Bush Gear",
  price: 3000,
  scale: 160,
  desc: "allows you to disguise yourself as a bush"
}, {
  id: 48,
  name: "Halo",
  price: 3000,
  scale: 120,
  desc: "no effect"
}, {
  id: 6,
  name: "Soldier Helmet",
  price: 4000,
  scale: 120,
  desc: "reduces damage taken but slows movement",
  spdMult: 0.94,
  dmgMult: 0.75
}, {
  id: 23,
  name: "Anti Venom Gear",
  price: 4000,
  scale: 120,
  desc: "makes you immune to poison",
  poisonRes: 1
}, {
  id: 13,
  name: "Medic Gear",
  price: 5000,
  scale: 110,
  desc: "slowly regenerates health over time",
  healthRegen: 3
}, {
  id: 9,
  name: "Miners Helmet",
  price: 5000,
  scale: 120,
  desc: "earn 1 extra gold per resource",
  extraGold: 1
}, {
  id: 32,
  name: "Musketeer Hat",
  price: 5000,
  scale: 120,
  desc: "reduces cost of projectiles",
  projCost: 0.5
}, {
  id: 7,
  name: "Bull Helmet",
  price: 6000,
  scale: 120,
  desc: "increases damage done but drains health",
  healthRegen: -5,
  dmgMultO: 1.5,
  spdMult: 0.96
}, {
  id: 22,
  name: "Emp Helmet",
  price: 6000,
  scale: 120,
  desc: "turrets won't attack but you move slower",
  antiTurret: 1,
  spdMult: 0.7
}, {
  id: 12,
  name: "Booster Hat",
  price: 6000,
  scale: 120,
  desc: "increases your movement speed",
  spdMult: 1.16
}, {
  id: 26,
  name: "Barbarian Armor",
  price: 8000,
  scale: 120,
  desc: "knocks back enemies that attack you",
  dmgK: 0.6
}, {
  id: 21,
  name: "Plague Mask",
  price: 10000,
  scale: 120,
  desc: "melee attacks deal poison damage",
  poisonDmg: 5,
  poisonTime: 6
}, {
  id: 46,
  name: "Bull Mask",
  price: 10000,
  scale: 120,
  desc: "bulls won't target you unless you attack them",
  bullRepel: 1
}, {
  id: 14,
  name: "Windmill Hat",
  topSprite: true,
  price: 10000,
  scale: 120,
  desc: "generates points while worn",
  pps: 1.5
}, {
  id: 11,
  name: "Spike Gear",
  topSprite: true,
  price: 10000,
  scale: 120,
  desc: "deal damage to players that damage you",
  dmg: 0.45
}, {
  id: 53,
  name: "Turret Gear",
  topSprite: true,
  price: 10000,
  scale: 120,
  desc: "you become a walking turret",
  turret: {
    proj: 1,
    range: 700,
    rate: 2500
  },
  spdMult: 0.7
}, {
  id: 20,
  name: "Samurai Armor",
  price: 12000,
  scale: 120,
  desc: "increased attack speed and fire rate",
  atkSpd: 0.78
}, {
  id: 58,
  name: "Dark Knight",
  price: 12000,
  scale: 120,
  desc: "restores health when you deal damage",
  healD: 0.4
}, {
  id: 27,
  name: "Scavenger Gear",
  price: 15000,
  scale: 120,
  desc: "earn double points for each kill",
  kScrM: 2
}, {
  id: 40,
  name: "Tank Gear",
  price: 15000,
  scale: 120,
  desc: "increased damage to buildings but slower movement",
  spdMult: 0.3,
  bDmg: 3.3
}, {
  id: 52,
  name: "Thief Gear",
  price: 15000,
  scale: 120,
  desc: "steal half of a players gold when you kill them",
  goldSteal: 0.5
}, {
  id: 55,
  name: "Bloodthirster",
  price: 20000,
  scale: 120,
  desc: "Restore Health when dealing damage. And increased damage",
  healD: 0.25,
  dmgMultO: 1.2
}, {
  id: 56,
  name: "Assassin Gear",
  price: 20000,
  scale: 120,
  desc: "Go invisible when not moving. Can't eat. Increased speed",
  noEat: true,
  spdMult: 1.1,
  invisTimer: 1000
}];
const Kh = [{
  id: 12,
  name: "Snowball",
  price: 1000,
  scale: 105,
  xOff: 18,
  desc: "no effect"
}, {
  id: 9,
  name: "Tree Cape",
  price: 1000,
  scale: 90,
  desc: "no effect"
}, {
  id: 10,
  name: "Stone Cape",
  price: 1000,
  scale: 90,
  desc: "no effect"
}, {
  id: 3,
  name: "Cookie Cape",
  price: 1500,
  scale: 90,
  desc: "no effect"
}, {
  id: 8,
  name: "Cow Cape",
  price: 2000,
  scale: 90,
  desc: "no effect"
}, {
  id: 11,
  name: "Monkey Tail",
  price: 2000,
  scale: 97,
  xOff: 25,
  desc: "Super speed but reduced damage",
  spdMult: 1.35,
  dmgMultO: 0.2
}, {
  id: 17,
  name: "Apple Basket",
  price: 3000,
  scale: 80,
  xOff: 12,
  desc: "slowly regenerates health over time",
  healthRegen: 1
}, {
  id: 6,
  name: "Winter Cape",
  price: 3000,
  scale: 90,
  desc: "no effect"
}, {
  id: 4,
  name: "Skull Cape",
  price: 4000,
  scale: 90,
  desc: "no effect"
}, {
  id: 5,
  name: "Dash Cape",
  price: 5000,
  scale: 90,
  desc: "no effect"
}, {
  id: 2,
  name: "Dragon Cape",
  price: 6000,
  scale: 90,
  desc: "no effect"
}, {
  id: 1,
  name: "Super Cape",
  price: 8000,
  scale: 90,
  desc: "no effect"
}, {
  id: 7,
  name: "Troll Cape",
  price: 8000,
  scale: 90,
  desc: "no effect"
}, {
  id: 14,
  name: "Thorns",
  price: 10000,
  scale: 115,
  xOff: 20,
  desc: "no effect"
}, {
  id: 15,
  name: "Blockades",
  price: 10000,
  scale: 95,
  xOff: 15,
  desc: "no effect"
}, {
  id: 20,
  name: "Devils Tail",
  price: 10000,
  scale: 95,
  xOff: 20,
  desc: "no effect"
}, {
  id: 16,
  name: "Sawblade",
  price: 12000,
  scale: 90,
  spin: true,
  xOff: 0,
  desc: "deal damage to players that damage you",
  dmg: 0.15
}, {
  id: 13,
  name: "Angel Wings",
  price: 15000,
  scale: 138,
  xOff: 22,
  desc: "slowly regenerates health over time",
  healthRegen: 3
}, {
  id: 19,
  name: "Shadow Wings",
  price: 15000,
  scale: 138,
  xOff: 22,
  desc: "increased movement speed",
  spdMult: 1.1
}, {
  id: 18,
  name: "Blood Wings",
  price: 20000,
  scale: 178,
  xOff: 26,
  desc: "restores health when you deal damage",
  healD: 0.2
}, {
  id: 21,
  name: "Corrupt X Wings",
  price: 20000,
  scale: 178,
  xOff: 26,
  desc: "deal damage to players that damage you",
  dmg: 0.25
}];
const Zo = {
  hats: Yh,
  accessories: Kh
};
function Zh(e, t, i, n, s, r, o) {
  this.init = function (a, f, d, u, p, w, x, b, $) {
    this.active = true;
    this.indx = a;
    this.x = f;
    this.y = d;
    this.dir = u;
    this.skipMov = true;
    this.speed = p;
    this.dmg = w;
    this.scale = b;
    this.range = x;
    this.owner = $;
    if (o) {
      this.sentTo = {};
    }
  };
  const l = [];
  let c;
  this.update = function (a) {
    if (this.active) {
      let d = this.speed * a;
      let u;
      if (this.skipMov) {
        this.skipMov = false;
      } else {
        this.x += d * Math.cos(this.dir);
        this.y += d * Math.sin(this.dir);
        this.range -= d;
        if (this.range <= 0) {
          this.x += this.range * Math.cos(this.dir);
          this.y += this.range * Math.sin(this.dir);
          d = 1;
          this.range = 0;
          this.active = false;
        }
      }
      if (o) {
        for (var f = 0; f < e.length; ++f) {
          if (!this.sentTo[e[f].id] && e[f].canSee(this)) {
            this.sentTo[e[f].id] = 1;
            o.send(e[f].id, "X", r.fixTo(this.x, 1), r.fixTo(this.y, 1), r.fixTo(this.dir, 2), r.fixTo(this.range, 1), this.speed, this.indx, this.layer, this.sid);
          }
        }
        l.length = 0;
        for (var f = 0; f < e.length + t.length; ++f) {
          c = e[f] || t[f - e.length];
          if (c.alive && c != this.owner && !(this.owner.team && c.team == this.owner.team) && r.lineInRect(c.x - c.scale, c.y - c.scale, c.x + c.scale, c.y + c.scale, this.x, this.y, this.x + d * Math.cos(this.dir), this.y + d * Math.sin(this.dir))) {
            l.push(c);
          }
        }
        const p = i.getGridArrays(this.x, this.y, this.scale);
        for (let w = 0; w < p.length; ++w) {
          for (let x = 0; x < p[w].length; ++x) {
            c = p[w][x];
            u = c.getScale();
            if (c.active && this.ignoreObj != c.sid && this.layer <= c.layer && l.indexOf(c) < 0 && !c.ignoreCollision && r.lineInRect(c.x - u, c.y - u, c.x + u, c.y + u, this.x, this.y, this.x + d * Math.cos(this.dir), this.y + d * Math.sin(this.dir))) {
              l.push(c);
            }
          }
        }
        if (l.length > 0) {
          let w = null;
          let x = null;
          let b = null;
          for (var f = 0; f < l.length; ++f) {
            b = r.getDistance(this.x, this.y, l[f].x, l[f].y);
            if (x == null || b < x) {
              x = b;
              w = l[f];
            }
          }
          if (w.isPlayer || w.isAI) {
            const $ = (w.weightM || 1) * 0.3;
            w.xVel += $ * Math.cos(this.dir);
            w.yVel += $ * Math.sin(this.dir);
            if (w.weaponIndex == null || !(n.weapons[w.weaponIndex].shield && r.getAngleDist(this.dir + Math.PI, w.dir) <= s.shieldAngle)) {
              w.changeHealth(-this.dmg, this.owner, this.owner);
            }
          } else {
            if (w.projDmg && w.health && w.changeHealth(-this.dmg)) {
              i.disableObj(w);
            }
            for (var f = 0; f < e.length; ++f) {
              if (e[f].active) {
                if (w.sentTo[e[f].id]) {
                  if (w.active) {
                    if (e[f].canSee(w)) {
                      o.send(e[f].id, "L", r.fixTo(this.dir, 2), w.sid);
                    }
                  } else {
                    o.send(e[f].id, "Q", w.sid);
                  }
                }
                if (!w.active && w.owner == e[f]) {
                  e[f].changeItemCount(w.group.id, -1);
                }
              }
            }
          }
          this.active = false;
          for (var f = 0; f < e.length; ++f) {
            if (this.sentTo[e[f].id]) {
              o.send(e[f].id, "Y", this.sid, r.fixTo(x, 1));
            }
          }
        }
      }
    }
  };
}
var Jo = {
  exports: {}
};
var Qo = {
  exports: {}
};
(function () {
  var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var t = {
    rotl: function (i, n) {
      return i << n | i >>> 32 - n;
    },
    rotr: function (i, n) {
      return i << 32 - n | i >>> n;
    },
    endian: function (i) {
      if (i.constructor == Number) {
        return t.rotl(i, 8) & 16711935 | t.rotl(i, 24) & 4278255360;
      }
      for (var n = 0; n < i.length; n++) {
        i[n] = t.endian(i[n]);
      }
      return i;
    },
    randomBytes: function (i) {
      for (var n = []; i > 0; i--) {
        n.push(Math.floor(Math.random() * 256));
      }
      return n;
    },
    bytesToWords: function (i) {
      for (var n = [], s = 0, r = 0; s < i.length; s++, r += 8) {
        n[r >>> 5] |= i[s] << 24 - r % 32;
      }
      return n;
    },
    wordsToBytes: function (i) {
      for (var n = [], s = 0; s < i.length * 32; s += 8) {
        n.push(i[s >>> 5] >>> 24 - s % 32 & 255);
      }
      return n;
    },
    bytesToHex: function (i) {
      for (var n = [], s = 0; s < i.length; s++) {
        n.push((i[s] >>> 4).toString(16));
        n.push((i[s] & 15).toString(16));
      }
      return n.join("");
    },
    hexToBytes: function (i) {
      for (var n = [], s = 0; s < i.length; s += 2) {
        n.push(parseInt(i.substr(s, 2), 16));
      }
      return n;
    },
    bytesToBase64: function (i) {
      for (var n = [], s = 0; s < i.length; s += 3) {
        for (var r = i[s] << 16 | i[s + 1] << 8 | i[s + 2], o = 0; o < 4; o++) {
          if (s * 8 + o * 6 <= i.length * 8) {
            n.push(e.charAt(r >>> (3 - o) * 6 & 63));
          } else {
            n.push("=");
          }
        }
      }
      return n.join("");
    },
    base64ToBytes: function (i) {
      i = i.replace(/[^A-Z0-9+\/]/ig, "");
      for (var n = [], s = 0, r = 0; s < i.length; r = ++s % 4) {
        if (r != 0) {
          n.push((e.indexOf(i.charAt(s - 1)) & Math.pow(2, r * -2 + 8) - 1) << r * 2 | e.indexOf(i.charAt(s)) >>> 6 - r * 2);
        }
      }
      return n;
    }
  };
  Qo.exports = t;
})();
var Jh = Qo.exports;
var Es = {
  utf8: {
    stringToBytes: function (e) {
      return Es.bin.stringToBytes(unescape(encodeURIComponent(e)));
    },
    bytesToString: function (e) {
      return decodeURIComponent(escape(Es.bin.bytesToString(e)));
    }
  },
  bin: {
    stringToBytes: function (e) {
      for (var t = [], i = 0; i < e.length; i++) {
        t.push(e.charCodeAt(i) & 255);
      }
      return t;
    },
    bytesToString: function (e) {
      for (var t = [], i = 0; i < e.length; i++) {
        t.push(String.fromCharCode(e[i]));
      }
      return t.join("");
    }
  }
};
var Mr = Es;
/*!
* Determine if an object is a Buffer
*
* @author   Feross Aboukhadijeh <https://feross.org>
* @license  MIT
*/
function Qh(e) {
  return e != null && (jo(e) || jh(e) || !!e._isBuffer);
}
function jo(e) {
  return !!e.constructor && typeof e.constructor.isBuffer == "function" && e.constructor.isBuffer(e);
}
function jh(e) {
  return typeof e.readFloatLE == "function" && typeof e.slice == "function" && jo(e.slice(0, 0));
}
(function () {
  var e = Jh;
  var t = Mr.utf8;
  var i = Qh;
  var n = Mr.bin;
  function s(r, o) {
    if (r.constructor == String) {
      if (o && o.encoding === "binary") {
        r = n.stringToBytes(r);
      } else {
        r = t.stringToBytes(r);
      }
    } else if (i(r)) {
      r = Array.prototype.slice.call(r, 0);
    } else if (!Array.isArray(r) && r.constructor !== Uint8Array) {
      r = r.toString();
    }
    for (var l = e.bytesToWords(r), c = r.length * 8, a = 1732584193, f = -271733879, d = -1732584194, u = 271733878, p = 0; p < l.length; p++) {
      l[p] = (l[p] << 8 | l[p] >>> 24) & 16711935 | (l[p] << 24 | l[p] >>> 8) & 4278255360;
    }
    l[c >>> 5] |= 128 << c % 32;
    l[(c + 64 >>> 9 << 4) + 14] = c;
    for (var w = s._ff, x = s._gg, b = s._hh, $ = s._ii, p = 0; p < l.length; p += 16) {
      var v = a;
      var S = f;
      var R = d;
      var G = u;
      a = w(a, f, d, u, l[p + 0], 7, -680876936);
      u = w(u, a, f, d, l[p + 1], 12, -389564586);
      d = w(d, u, a, f, l[p + 2], 17, 606105819);
      f = w(f, d, u, a, l[p + 3], 22, -1044525330);
      a = w(a, f, d, u, l[p + 4], 7, -176418897);
      u = w(u, a, f, d, l[p + 5], 12, 1200080426);
      d = w(d, u, a, f, l[p + 6], 17, -1473231341);
      f = w(f, d, u, a, l[p + 7], 22, -45705983);
      a = w(a, f, d, u, l[p + 8], 7, 1770035416);
      u = w(u, a, f, d, l[p + 9], 12, -1958414417);
      d = w(d, u, a, f, l[p + 10], 17, -42063);
      f = w(f, d, u, a, l[p + 11], 22, -1990404162);
      a = w(a, f, d, u, l[p + 12], 7, 1804603682);
      u = w(u, a, f, d, l[p + 13], 12, -40341101);
      d = w(d, u, a, f, l[p + 14], 17, -1502002290);
      f = w(f, d, u, a, l[p + 15], 22, 1236535329);
      a = x(a, f, d, u, l[p + 1], 5, -165796510);
      u = x(u, a, f, d, l[p + 6], 9, -1069501632);
      d = x(d, u, a, f, l[p + 11], 14, 643717713);
      f = x(f, d, u, a, l[p + 0], 20, -373897302);
      a = x(a, f, d, u, l[p + 5], 5, -701558691);
      u = x(u, a, f, d, l[p + 10], 9, 38016083);
      d = x(d, u, a, f, l[p + 15], 14, -660478335);
      f = x(f, d, u, a, l[p + 4], 20, -405537848);
      a = x(a, f, d, u, l[p + 9], 5, 568446438);
      u = x(u, a, f, d, l[p + 14], 9, -1019803690);
      d = x(d, u, a, f, l[p + 3], 14, -187363961);
      f = x(f, d, u, a, l[p + 8], 20, 1163531501);
      a = x(a, f, d, u, l[p + 13], 5, -1444681467);
      u = x(u, a, f, d, l[p + 2], 9, -51403784);
      d = x(d, u, a, f, l[p + 7], 14, 1735328473);
      f = x(f, d, u, a, l[p + 12], 20, -1926607734);
      a = b(a, f, d, u, l[p + 5], 4, -378558);
      u = b(u, a, f, d, l[p + 8], 11, -2022574463);
      d = b(d, u, a, f, l[p + 11], 16, 1839030562);
      f = b(f, d, u, a, l[p + 14], 23, -35309556);
      a = b(a, f, d, u, l[p + 1], 4, -1530992060);
      u = b(u, a, f, d, l[p + 4], 11, 1272893353);
      d = b(d, u, a, f, l[p + 7], 16, -155497632);
      f = b(f, d, u, a, l[p + 10], 23, -1094730640);
      a = b(a, f, d, u, l[p + 13], 4, 681279174);
      u = b(u, a, f, d, l[p + 0], 11, -358537222);
      d = b(d, u, a, f, l[p + 3], 16, -722521979);
      f = b(f, d, u, a, l[p + 6], 23, 76029189);
      a = b(a, f, d, u, l[p + 9], 4, -640364487);
      u = b(u, a, f, d, l[p + 12], 11, -421815835);
      d = b(d, u, a, f, l[p + 15], 16, 530742520);
      f = b(f, d, u, a, l[p + 2], 23, -995338651);
      a = $(a, f, d, u, l[p + 0], 6, -198630844);
      u = $(u, a, f, d, l[p + 7], 10, 1126891415);
      d = $(d, u, a, f, l[p + 14], 15, -1416354905);
      f = $(f, d, u, a, l[p + 5], 21, -57434055);
      a = $(a, f, d, u, l[p + 12], 6, 1700485571);
      u = $(u, a, f, d, l[p + 3], 10, -1894986606);
      d = $(d, u, a, f, l[p + 10], 15, -1051523);
      f = $(f, d, u, a, l[p + 1], 21, -2054922799);
      a = $(a, f, d, u, l[p + 8], 6, 1873313359);
      u = $(u, a, f, d, l[p + 15], 10, -30611744);
      d = $(d, u, a, f, l[p + 6], 15, -1560198380);
      f = $(f, d, u, a, l[p + 13], 21, 1309151649);
      a = $(a, f, d, u, l[p + 4], 6, -145523070);
      u = $(u, a, f, d, l[p + 11], 10, -1120210379);
      d = $(d, u, a, f, l[p + 2], 15, 718787259);
      f = $(f, d, u, a, l[p + 9], 21, -343485551);
      a = a + v >>> 0;
      f = f + S >>> 0;
      d = d + R >>> 0;
      u = u + G >>> 0;
    }
    return e.endian([a, f, d, u]);
  }
  s._ff = function (r, o, l, c, a, f, d) {
    var u = r + (o & l | ~o & c) + (a >>> 0) + d;
    return (u << f | u >>> 32 - f) + o;
  };
  s._gg = function (r, o, l, c, a, f, d) {
    var u = r + (o & c | l & ~c) + (a >>> 0) + d;
    return (u << f | u >>> 32 - f) + o;
  };
  s._hh = function (r, o, l, c, a, f, d) {
    var u = r + (o ^ l ^ c) + (a >>> 0) + d;
    return (u << f | u >>> 32 - f) + o;
  };
  s._ii = function (r, o, l, c, a, f, d) {
    var u = r + (l ^ (o | ~c)) + (a >>> 0) + d;
    return (u << f | u >>> 32 - f) + o;
  };
  s._blocksize = 16;
  s._digestsize = 16;
  Jo.exports = function (r, o) {
    if (r == null) {
      throw new Error("Illegal argument " + r);
    }
    var l = e.wordsToBytes(s(r, o));
    if (o && o.asBytes) {
      return l;
    } else if (o && o.asString) {
      return n.bytesToString(l);
    } else {
      return e.bytesToHex(l);
    }
  };
})();
var eu = Jo.exports;
const tu = An(eu);
var Yn;
var Er;
function It() {
  if (Er) {
    return Yn;
  }
  Er = 1;
  function e(t, i, n, s, r, o) {
    return {
      tag: t,
      key: i,
      attrs: n,
      children: s,
      text: r,
      dom: o,
      domSize: undefined,
      state: undefined,
      events: undefined,
      instance: undefined
    };
  }
  e.normalize = function (t) {
    if (Array.isArray(t)) {
      return e("[", undefined, undefined, e.normalizeChildren(t), undefined, undefined);
    } else if (t == null || typeof t == "boolean") {
      return null;
    } else if (typeof t == "object") {
      return t;
    } else {
      return e("#", undefined, undefined, String(t), undefined, undefined);
    }
  };
  e.normalizeChildren = function (t) {
    var i = [];
    if (t.length) {
      for (var n = t[0] != null && t[0].key != null, s = 1; s < t.length; s++) {
        if ((t[s] != null && t[s].key != null) !== n) {
          throw new TypeError(n && (t[s] != null || typeof t[s] == "boolean") ? "In fragments, vnodes must either all have keys or none have keys. You may wish to consider using an explicit keyed empty fragment, m.fragment({key: ...}), instead of a hole." : "In fragments, vnodes must either all have keys or none have keys.");
        }
      }
      for (var s = 0; s < t.length; s++) {
        i[s] = e.normalize(t[s]);
      }
    }
    return i;
  };
  Yn = e;
  return Yn;
}
var iu = It();
function ea() {
  var e = arguments[this];
  var t = this + 1;
  var i;
  if (e == null) {
    e = {};
  } else if (typeof e != "object" || e.tag != null || Array.isArray(e)) {
    e = {};
    t = this;
  }
  if (arguments.length === t + 1) {
    i = arguments[t];
    if (!Array.isArray(i)) {
      i = [i];
    }
  } else {
    for (i = []; t < arguments.length;) {
      i.push(arguments[t++]);
    }
  }
  return iu("", e.key, e, i);
}
var Dn = {}.hasOwnProperty;
var nu = It();
var su = ea;
var Jt = Dn;
var ru = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g;
var ta = {};
function Cr(e) {
  for (var t in e) {
    if (Jt.call(e, t)) {
      return false;
    }
  }
  return true;
}
function ou(e) {
  for (var t, i = "div", n = [], s = {}; t = ru.exec(e);) {
    var r = t[1];
    var o = t[2];
    if (r === "" && o !== "") {
      i = o;
    } else if (r === "#") {
      s.id = o;
    } else if (r === ".") {
      n.push(o);
    } else if (t[3][0] === "[") {
      var l = t[6];
      if (l) {
        l = l.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\");
      }
      if (t[4] === "class") {
        n.push(l);
      } else {
        s[t[4]] = l === "" ? l : l || true;
      }
    }
  }
  if (n.length > 0) {
    s.className = n.join(" ");
  }
  return ta[e] = {
    tag: i,
    attrs: s
  };
}
function au(e, t) {
  var i = t.attrs;
  var n = Jt.call(i, "class");
  var s = n ? i.class : i.className;
  t.tag = e.tag;
  t.attrs = {};
  if (!Cr(e.attrs) && !Cr(i)) {
    var r = {};
    for (var o in i) {
      if (Jt.call(i, o)) {
        r[o] = i[o];
      }
    }
    i = r;
  }
  for (var o in e.attrs) {
    if (Jt.call(e.attrs, o) && o !== "className" && !Jt.call(i, o)) {
      i[o] = e.attrs[o];
    }
  }
  if (s != null || e.attrs.className != null) {
    i.className = s != null ? e.attrs.className != null ? String(e.attrs.className) + " " + String(s) : s : e.attrs.className != null ? e.attrs.className : null;
  }
  if (n) {
    i.class = null;
  }
  for (var o in i) {
    if (Jt.call(i, o) && o !== "key") {
      t.attrs = i;
      break;
    }
  }
  return t;
}
function lu(e) {
  if (e == null || typeof e != "string" && typeof e != "function" && typeof e.view != "function") {
    throw Error("The selector must be either a string or a component.");
  }
  var t = su.apply(1, arguments);
  if (typeof e == "string" && (t.children = nu.normalizeChildren(t.children), e !== "[")) {
    return au(ta[e] || ou(e), t);
  } else {
    t.tag = e;
    return t;
  }
}
var ia = lu;
var cu = It();
function hu(e) {
  if (e == null) {
    e = "";
  }
  return cu("<", undefined, undefined, e, undefined, undefined);
}
var uu = It();
var fu = ea;
function du() {
  var e = fu.apply(0, arguments);
  e.tag = "[";
  e.children = uu.normalizeChildren(e.children);
  return e;
}
var Js = ia;
Js.trust = hu;
Js.fragment = du;
var pu = Js;
var cn = {
  exports: {}
};
var Kn;
var Pr;
function na() {
  if (Pr) {
    return Kn;
  }
  Pr = 1;
  function e(t) {
    if (!(this instanceof e)) {
      throw new Error("Promise must be called with 'new'.");
    }
    if (typeof t != "function") {
      throw new TypeError("executor must be a function.");
    }
    var i = this;
    var n = [];
    var s = [];
    var r = a(n, true);
    var o = a(s, false);
    var l = i._instance = {
      resolvers: n,
      rejectors: s
    };
    var c = typeof setImmediate == "function" ? setImmediate : setTimeout;
    function a(d, u) {
      return function p(w) {
        var x;
        try {
          if (u && w != null && (typeof w == "object" || typeof w == "function") && typeof (x = w.then) == "function") {
            if (w === i) {
              throw new TypeError("Promise can't be resolved with itself.");
            }
            f(x.bind(w));
          } else {
            c(function () {
              if (!u && d.length === 0) {
                console.error("Possible unhandled promise rejection:", w);
              }
              for (var b = 0; b < d.length; b++) {
                d[b](w);
              }
              n.length = 0;
              s.length = 0;
              l.state = u;
              l.retry = function () {
                p(w);
              };
            });
          }
        } catch (b) {
          o(b);
        }
      };
    }
    function f(d) {
      var u = 0;
      function p(x) {
        return function (b) {
          if (!(u++ > 0)) {
            x(b);
          }
        };
      }
      var w = p(o);
      try {
        d(p(r), w);
      } catch (x) {
        w(x);
      }
    }
    f(t);
  }
  e.prototype.then = function (t, i) {
    var n = this;
    var s = n._instance;
    function r(a, f, d, u) {
      f.push(function (p) {
        if (typeof a != "function") {
          d(p);
        } else {
          try {
            o(a(p));
          } catch (w) {
            if (l) {
              l(w);
            }
          }
        }
      });
      if (typeof s.retry == "function" && u === s.state) {
        s.retry();
      }
    }
    var o;
    var l;
    var c = new e(function (a, f) {
      o = a;
      l = f;
    });
    r(t, s.resolvers, o, true);
    r(i, s.rejectors, l, false);
    return c;
  };
  e.prototype.catch = function (t) {
    return this.then(null, t);
  };
  e.prototype.finally = function (t) {
    return this.then(function (i) {
      return e.resolve(t()).then(function () {
        return i;
      });
    }, function (i) {
      return e.resolve(t()).then(function () {
        return e.reject(i);
      });
    });
  };
  e.resolve = function (t) {
    if (t instanceof e) {
      return t;
    } else {
      return new e(function (i) {
        i(t);
      });
    }
  };
  e.reject = function (t) {
    return new e(function (i, n) {
      n(t);
    });
  };
  e.all = function (t) {
    return new e(function (i, n) {
      var s = t.length;
      var r = 0;
      var o = [];
      if (t.length === 0) {
        i([]);
      } else {
        for (var l = 0; l < t.length; l++) {
          (function (c) {
            function a(f) {
              r++;
              o[c] = f;
              if (r === s) {
                i(o);
              }
            }
            if (t[c] != null && (typeof t[c] == "object" || typeof t[c] == "function") && typeof t[c].then == "function") {
              t[c].then(a, n);
            } else {
              a(t[c]);
            }
          })(l);
        }
      }
    });
  };
  e.race = function (t) {
    return new e(function (i, n) {
      for (var s = 0; s < t.length; s++) {
        t[s].then(i, n);
      }
    });
  };
  Kn = e;
  return Kn;
}
var Ei = na();
if (typeof window !== "undefined") {
  if (typeof window.Promise === "undefined") {
    window.Promise = Ei;
  } else if (!window.Promise.prototype.finally) {
    window.Promise.prototype.finally = Ei.prototype.finally;
  }
  cn.exports = window.Promise;
} else if (typeof Vt !== "undefined") {
  if (typeof Vt.Promise === "undefined") {
    Vt.Promise = Ei;
  } else if (!Vt.Promise.prototype.finally) {
    Vt.Promise.prototype.finally = Ei.prototype.finally;
  }
  cn.exports = Vt.Promise;
} else {
  cn.exports = Ei;
}
var sa = cn.exports;
var Zn = It();
function mu(e) {
  var t = e && e.document;
  var i;
  var n = {
    svg: "http://www.w3.org/2000/svg",
    math: "http://www.w3.org/1998/Math/MathML"
  };
  function s(m) {
    return m.attrs && m.attrs.xmlns || n[m.tag];
  }
  function r(m, h) {
    if (m.state !== h) {
      throw new Error("'vnode.state' must not be modified.");
    }
  }
  function o(m) {
    var h = m.state;
    try {
      return this.apply(h, arguments);
    } finally {
      r(m, h);
    }
  }
  function l() {
    try {
      return t.activeElement;
    } catch {
      return null;
    }
  }
  function c(m, h, g, I, E, O, q) {
    for (var Z = g; Z < I; Z++) {
      var U = h[Z];
      if (U != null) {
        a(m, U, E, q, O);
      }
    }
  }
  function a(m, h, g, I, E) {
    var O = h.tag;
    if (typeof O == "string") {
      h.state = {};
      if (h.attrs != null) {
        yi(h.attrs, h, g);
      }
      switch (O) {
        case "#":
          f(m, h, E);
          break;
        case "<":
          u(m, h, I, E);
          break;
        case "[":
          p(m, h, g, I, E);
          break;
        default:
          w(m, h, g, I, E);
      }
    } else {
      b(m, h, g, I, E);
    }
  }
  function f(m, h, g) {
    h.dom = t.createTextNode(h.children);
    N(m, h.dom, g);
  }
  var d = {
    caption: "table",
    thead: "table",
    tbody: "table",
    tfoot: "table",
    tr: "tbody",
    th: "tr",
    td: "tr",
    colgroup: "table",
    col: "colgroup"
  };
  function u(m, h, g, I) {
    var E = h.children.match(/^\s*?<(\w+)/im) || [];
    var O = t.createElement(d[E[1]] || "div");
    if (g === "http://www.w3.org/2000/svg") {
      O.innerHTML = "<svg xmlns=\"http://www.w3.org/2000/svg\">" + h.children + "</svg>";
      O = O.firstChild;
    } else {
      O.innerHTML = h.children;
    }
    h.dom = O.firstChild;
    h.domSize = O.childNodes.length;
    h.instance = [];
    for (var q = t.createDocumentFragment(), Z; Z = O.firstChild;) {
      h.instance.push(Z);
      q.appendChild(Z);
    }
    N(m, q, I);
  }
  function p(m, h, g, I, E) {
    var O = t.createDocumentFragment();
    if (h.children != null) {
      var q = h.children;
      c(O, q, 0, q.length, g, null, I);
    }
    h.dom = O.firstChild;
    h.domSize = O.childNodes.length;
    N(m, O, E);
  }
  function w(m, h, g, I, E) {
    var O = h.tag;
    var q = h.attrs;
    var Z = q && q.is;
    I = s(h) || I;
    var U = I ? Z ? t.createElementNS(I, O, {
      is: Z
    }) : t.createElementNS(I, O) : Z ? t.createElement(O, {
      is: Z
    }) : t.createElement(O);
    h.dom = U;
    if (q != null) {
      zt(h, q, I);
    }
    N(m, U, E);
    if (!Y(h) && h.children != null) {
      var j = h.children;
      c(U, j, 0, j.length, g, null, I);
      if (h.tag === "select" && q != null) {
        Be(h, q);
      }
    }
  }
  function x(m, h) {
    var g;
    if (typeof m.tag.view == "function") {
      m.state = Object.create(m.tag);
      g = m.state.view;
      if (g.$$reentrantLock$$ != null) {
        return;
      }
      g.$$reentrantLock$$ = true;
    } else {
      m.state = undefined;
      g = m.tag;
      if (g.$$reentrantLock$$ != null) {
        return;
      }
      g.$$reentrantLock$$ = true;
      m.state = m.tag.prototype != null && typeof m.tag.prototype.view == "function" ? new m.tag(m) : m.tag(m);
    }
    yi(m.state, m, h);
    if (m.attrs != null) {
      yi(m.attrs, m, h);
    }
    m.instance = Zn.normalize(o.call(m.state.view, m));
    if (m.instance === m) {
      throw Error("A view cannot return the vnode it received as argument");
    }
    g.$$reentrantLock$$ = null;
  }
  function b(m, h, g, I, E) {
    x(h, g);
    if (h.instance != null) {
      a(m, h.instance, g, I, E);
      h.dom = h.instance.dom;
      h.domSize = h.dom != null ? h.instance.domSize : 0;
    } else {
      h.domSize = 0;
    }
  }
  function $(m, h, g, I, E, O) {
    if (!(h === g || h == null && g == null)) {
      if (h == null || h.length === 0) {
        c(m, g, 0, g.length, I, E, O);
      } else if (g == null || g.length === 0) {
        K(m, h, 0, h.length);
      } else {
        var q = h[0] != null && h[0].key != null;
        var Z = g[0] != null && g[0].key != null;
        var U = 0;
        var j = 0;
        if (!q) {
          for (; j < h.length && h[j] == null;) {
            j++;
          }
        }
        if (!Z) {
          for (; U < g.length && g[U] == null;) {
            U++;
          }
        }
        if (q !== Z) {
          K(m, h, j, h.length);
          c(m, g, U, g.length, I, E, O);
        } else if (Z) {
          for (var Ce = h.length - 1, pe = g.length - 1, Bt, be, ue, Ie, re, ki; Ce >= j && pe >= U && (Ie = h[Ce], re = g[pe], Ie.key === re.key);) {
            if (Ie !== re) {
              v(m, Ie, re, I, E, O);
            }
            if (re.dom != null) {
              E = re.dom;
            }
            Ce--;
            pe--;
          }
          for (; Ce >= j && pe >= U && (be = h[j], ue = g[U], be.key === ue.key);) {
            j++;
            U++;
            if (be !== ue) {
              v(m, be, ue, I, _(h, j, E), O);
            }
          }
          for (; Ce >= j && pe >= U && !(U === pe || be.key !== re.key || Ie.key !== ue.key);) {
            ki = _(h, j, E);
            D(m, Ie, ki);
            if (Ie !== ue) {
              v(m, Ie, ue, I, ki, O);
            }
            if (++U <= --pe) {
              D(m, be, E);
            }
            if (be !== re) {
              v(m, be, re, I, E, O);
            }
            if (re.dom != null) {
              E = re.dom;
            }
            j++;
            Ce--;
            Ie = h[Ce];
            re = g[pe];
            be = h[j];
            ue = g[U];
          }
          for (; Ce >= j && pe >= U && Ie.key === re.key;) {
            if (Ie !== re) {
              v(m, Ie, re, I, E, O);
            }
            if (re.dom != null) {
              E = re.dom;
            }
            Ce--;
            pe--;
            Ie = h[Ce];
            re = g[pe];
          }
          if (U > pe) {
            K(m, h, j, Ce + 1);
          } else if (j > Ce) {
            c(m, g, U, pe + 1, I, E, O);
          } else {
            var Mt = E;
            var xi = pe - U + 1;
            var gt = new Array(xi);
            var Ht = 0;
            var fe = 0;
            var Lt = 2147483647;
            var nt = 0;
            var Bt;
            var Ft;
            for (fe = 0; fe < xi; fe++) {
              gt[fe] = -1;
            }
            for (fe = pe; fe >= U; fe--) {
              if (Bt == null) {
                Bt = M(h, j, Ce + 1);
              }
              re = g[fe];
              var st = Bt[re.key];
              if (st != null) {
                Lt = st < Lt ? st : -1;
                gt[fe - U] = st;
                Ie = h[st];
                h[st] = null;
                if (Ie !== re) {
                  v(m, Ie, re, I, E, O);
                }
                if (re.dom != null) {
                  E = re.dom;
                }
                nt++;
              }
            }
            E = Mt;
            if (nt !== Ce - j + 1) {
              K(m, h, j, Ce + 1);
            }
            if (nt === 0) {
              c(m, g, U, pe + 1, I, E, O);
            } else if (Lt === -1) {
              Ft = F(gt);
              Ht = Ft.length - 1;
              fe = pe;
              Ft = F(gt);
              Ht = Ft.length - 1;
              fe = pe;
              for (; fe >= U; fe--) {
                ue = g[fe];
                if (gt[fe - U] === -1) {
                  a(m, ue, I, O, E);
                } else if (Ft[Ht] === fe - U) {
                  Ht--;
                } else {
                  D(m, ue, E);
                }
                if (ue.dom != null) {
                  E = g[fe].dom;
                }
              }
            } else {
              for (fe = pe; fe >= U; fe--) {
                ue = g[fe];
                if (gt[fe - U] === -1) {
                  a(m, ue, I, O, E);
                }
                if (ue.dom != null) {
                  E = g[fe].dom;
                }
              }
            }
          }
        } else {
          var vi = h.length < g.length ? h.length : g.length;
          for (U = U < j ? U : j; U < vi; U++) {
            be = h[U];
            ue = g[U];
            if (!(be === ue || be == null && ue == null)) {
              if (be == null) {
                a(m, ue, I, O, _(h, U + 1, E));
              } else if (ue == null) {
                ie(m, be);
              } else {
                v(m, be, ue, I, _(h, U + 1, E), O);
              }
            }
          }
          if (h.length > vi) {
            K(m, h, U, h.length);
          }
          if (g.length > vi) {
            c(m, g, U, g.length, I, E, O);
          }
        }
      }
    }
  }
  function v(m, h, g, I, E, O) {
    var q = h.tag;
    var Z = g.tag;
    if (q === Z) {
      g.state = h.state;
      g.events = h.events;
      if (Ln(g, h)) {
        return;
      }
      if (typeof q == "string") {
        if (g.attrs != null) {
          wi(g.attrs, g, I);
        }
        switch (q) {
          case "#":
            S(h, g);
            break;
          case "<":
            R(m, h, g, O, E);
            break;
          case "[":
            G(m, h, g, I, E, O);
            break;
          default:
            X(h, g, I, O);
        }
      } else {
        W(m, h, g, I, E, O);
      }
    } else {
      ie(m, h);
      a(m, g, I, O, E);
    }
  }
  function S(m, h) {
    if (m.children.toString() !== h.children.toString()) {
      m.dom.nodeValue = h.children;
    }
    h.dom = m.dom;
  }
  function R(m, h, g, I, E) {
    if (h.children !== g.children) {
      ae(m, h);
      u(m, g, I, E);
    } else {
      g.dom = h.dom;
      g.domSize = h.domSize;
      g.instance = h.instance;
    }
  }
  function G(m, h, g, I, E, O) {
    $(m, h.children, g.children, I, E, O);
    var q = 0;
    var Z = g.children;
    g.dom = null;
    if (Z != null) {
      for (var U = 0; U < Z.length; U++) {
        var j = Z[U];
        if (j != null && j.dom != null) {
          if (g.dom == null) {
            g.dom = j.dom;
          }
          q += j.domSize || 1;
        }
      }
      if (q !== 1) {
        g.domSize = q;
      }
    }
  }
  function X(m, h, g, I) {
    var E = h.dom = m.dom;
    I = s(h) || I;
    if (h.tag === "textarea" && h.attrs == null) {
      h.attrs = {};
    }
    pt(h, m.attrs, h.attrs, I);
    if (!Y(h)) {
      $(E, m.children, h.children, g, null, I);
    }
  }
  function W(m, h, g, I, E, O) {
    g.instance = Zn.normalize(o.call(g.state.view, g));
    if (g.instance === g) {
      throw Error("A view cannot return the vnode it received as argument");
    }
    wi(g.state, g, I);
    if (g.attrs != null) {
      wi(g.attrs, g, I);
    }
    if (g.instance != null) {
      if (h.instance == null) {
        a(m, g.instance, I, O, E);
      } else {
        v(m, h.instance, g.instance, I, E, O);
      }
      g.dom = g.instance.dom;
      g.domSize = g.instance.domSize;
    } else if (h.instance != null) {
      ie(m, h.instance);
      g.dom = undefined;
      g.domSize = 0;
    } else {
      g.dom = h.dom;
      g.domSize = h.domSize;
    }
  }
  function M(m, h, g) {
    for (var I = Object.create(null); h < g; h++) {
      var E = m[h];
      if (E != null) {
        var O = E.key;
        if (O != null) {
          I[O] = h;
        }
      }
    }
    return I;
  }
  var V = [];
  function F(m) {
    for (var h = [0], g = 0, I = 0, E = 0, O = V.length = m.length, E = 0; E < O; E++) {
      V[E] = m[E];
    }
    for (var E = 0; E < O; ++E) {
      if (m[E] !== -1) {
        var q = h[h.length - 1];
        if (m[q] < m[E]) {
          V[E] = q;
          h.push(E);
          continue;
        }
        g = 0;
        I = h.length - 1;
        for (; g < I;) {
          var Z = (g >>> 1) + (I >>> 1) + (g & I & 1);
          if (m[h[Z]] < m[E]) {
            g = Z + 1;
          } else {
            I = Z;
          }
        }
        if (m[E] < m[h[g]]) {
          if (g > 0) {
            V[E] = h[g - 1];
          }
          h[g] = E;
        }
      }
    }
    g = h.length;
    I = h[g - 1];
    for (; g-- > 0;) {
      h[g] = I;
      I = V[I];
    }
    V.length = 0;
    return h;
  }
  function _(m, h, g) {
    for (; h < m.length; h++) {
      if (m[h] != null && m[h].dom != null) {
        return m[h].dom;
      }
    }
    return g;
  }
  function D(m, h, g) {
    var I = t.createDocumentFragment();
    z(m, I, h);
    N(m, I, g);
  }
  function z(m, h, g) {
    for (; g.dom != null && g.dom.parentNode === m;) {
      if (typeof g.tag != "string") {
        g = g.instance;
        if (g != null) {
          continue;
        }
      } else if (g.tag === "<") {
        for (var I = 0; I < g.instance.length; I++) {
          h.appendChild(g.instance[I]);
        }
      } else if (g.tag !== "[") {
        h.appendChild(g.dom);
      } else if (g.children.length === 1) {
        g = g.children[0];
        if (g != null) {
          continue;
        }
      } else {
        for (var I = 0; I < g.children.length; I++) {
          var E = g.children[I];
          if (E != null) {
            z(m, h, E);
          }
        }
      }
      break;
    }
  }
  function N(m, h, g) {
    if (g != null) {
      m.insertBefore(h, g);
    } else {
      m.appendChild(h);
    }
  }
  function Y(m) {
    if (m.attrs == null || m.attrs.contenteditable == null && m.attrs.contentEditable == null) {
      return false;
    }
    var h = m.children;
    if (h != null && h.length === 1 && h[0].tag === "<") {
      var g = h[0].children;
      if (m.dom.innerHTML !== g) {
        m.dom.innerHTML = g;
      }
    } else if (h != null && h.length !== 0) {
      throw new Error("Child node of a contenteditable must be trusted.");
    }
    return true;
  }
  function K(m, h, g, I) {
    for (var E = g; E < I; E++) {
      var O = h[E];
      if (O != null) {
        ie(m, O);
      }
    }
  }
  function ie(m, h) {
    var g = 0;
    var I = h.state;
    var E;
    var O;
    if (typeof h.tag != "string" && typeof h.state.onbeforeremove == "function") {
      var q = o.call(h.state.onbeforeremove, h);
      if (q != null && typeof q.then == "function") {
        g = 1;
        E = q;
      }
    }
    if (h.attrs && typeof h.attrs.onbeforeremove == "function") {
      var q = o.call(h.attrs.onbeforeremove, h);
      if (q != null && typeof q.then == "function") {
        g |= 2;
        O = q;
      }
    }
    r(h, I);
    if (!g) {
      Se(h);
      J(m, h);
    } else {
      if (E != null) {
        function Z() {
          if (g & 1) {
            g &= 2;
            if (!g) {
              U();
            }
          }
        }
        E.then(Z, Z);
      }
      if (O != null) {
        function Z() {
          if (g & 2) {
            g &= 1;
            if (!g) {
              U();
            }
          }
        }
        O.then(Z, Z);
      }
    }
    function U() {
      r(h, I);
      Se(h);
      J(m, h);
    }
  }
  function ae(m, h) {
    for (var g = 0; g < h.instance.length; g++) {
      m.removeChild(h.instance[g]);
    }
  }
  function J(m, h) {
    for (; h.dom != null && h.dom.parentNode === m;) {
      if (typeof h.tag != "string") {
        h = h.instance;
        if (h != null) {
          continue;
        }
      } else if (h.tag === "<") {
        ae(m, h);
      } else {
        if (h.tag !== "[" && (m.removeChild(h.dom), !Array.isArray(h.children))) {
          break;
        }
        if (h.children.length === 1) {
          h = h.children[0];
          if (h != null) {
            continue;
          }
        } else {
          for (var g = 0; g < h.children.length; g++) {
            var I = h.children[g];
            if (I != null) {
              J(m, I);
            }
          }
        }
      }
      break;
    }
  }
  function Se(m) {
    if (typeof m.tag != "string" && typeof m.state.onremove == "function") {
      o.call(m.state.onremove, m);
    }
    if (m.attrs && typeof m.attrs.onremove == "function") {
      o.call(m.attrs.onremove, m);
    }
    if (typeof m.tag != "string") {
      if (m.instance != null) {
        Se(m.instance);
      }
    } else {
      var h = m.children;
      if (Array.isArray(h)) {
        for (var g = 0; g < h.length; g++) {
          var I = h[g];
          if (I != null) {
            Se(I);
          }
        }
      }
    }
  }
  function zt(m, h, g) {
    if (m.tag === "input" && h.type != null) {
      m.dom.setAttribute("type", h.type);
    }
    var I = h != null && m.tag === "input" && h.type === "file";
    for (var E in h) {
      Ve(m, E, null, h[E], g, I);
    }
  }
  function Ve(m, h, g, I, E, O) {
    if (!(h === "key" || h === "is" || I == null || mt(h) || g === I && !ne(m, h) && typeof I != "object" || h === "type" && m.tag === "input")) {
      if (h[0] === "o" && h[1] === "n") {
        return gi(m, h, I);
      }
      if (h.slice(0, 6) === "xlink:") {
        m.dom.setAttributeNS("http://www.w3.org/1999/xlink", h.slice(6), I);
      } else if (h === "style") {
        pi(m.dom, g, I);
      } else if (Ne(m, h, E)) {
        if (h === "value") {
          if ((m.tag === "input" || m.tag === "textarea") && m.dom.value === "" + I && (O || m.dom === l()) || m.tag === "select" && g !== null && m.dom.value === "" + I || m.tag === "option" && g !== null && m.dom.value === "" + I) {
            return;
          }
          if (O && "" + I != "") {
            console.error("`value` is read-only on file inputs!");
            return;
          }
        }
        m.dom[h] = I;
      } else if (typeof I == "boolean") {
        if (I) {
          m.dom.setAttribute(h, "");
        } else {
          m.dom.removeAttribute(h);
        }
      } else {
        m.dom.setAttribute(h === "className" ? "class" : h, I);
      }
    }
  }
  function te(m, h, g, I) {
    if (!(h === "key" || h === "is" || g == null || mt(h))) {
      if (h[0] === "o" && h[1] === "n") {
        gi(m, h, undefined);
      } else if (h === "style") {
        pi(m.dom, g, null);
      } else if (Ne(m, h, I) && h !== "className" && h !== "title" && !(h === "value" && (m.tag === "option" || m.tag === "select" && m.dom.selectedIndex === -1 && m.dom === l())) && !(m.tag === "input" && h === "type")) {
        m.dom[h] = null;
      } else {
        var E = h.indexOf(":");
        if (E !== -1) {
          h = h.slice(E + 1);
        }
        if (g !== false) {
          m.dom.removeAttribute(h === "className" ? "class" : h);
        }
      }
    }
  }
  function Be(m, h) {
    if ("value" in h) {
      if (h.value === null) {
        if (m.dom.selectedIndex !== -1) {
          m.dom.value = null;
        }
      } else {
        var g = "" + h.value;
        if (m.dom.value !== g || m.dom.selectedIndex === -1) {
          m.dom.value = g;
        }
      }
    }
    if ("selectedIndex" in h) {
      Ve(m, "selectedIndex", null, h.selectedIndex, undefined);
    }
  }
  function pt(m, h, g, I) {
    if (h && h === g) {
      console.warn("Don't reuse attrs object, use new object for every redraw, this will throw in next major");
    }
    if (g != null) {
      if (m.tag === "input" && g.type != null) {
        m.dom.setAttribute("type", g.type);
      }
      var E = m.tag === "input" && g.type === "file";
      for (var O in g) {
        Ve(m, O, h && h[O], g[O], I, E);
      }
    }
    var q;
    if (h != null) {
      for (var O in h) {
        if ((q = h[O]) != null && (g == null || g[O] == null)) {
          te(m, O, q, I);
        }
      }
    }
  }
  function ne(m, h) {
    return h === "value" || h === "checked" || h === "selectedIndex" || h === "selected" && m.dom === l() || m.tag === "option" && m.dom.parentNode === t.activeElement;
  }
  function mt(m) {
    return m === "oninit" || m === "oncreate" || m === "onupdate" || m === "onremove" || m === "onbeforeremove" || m === "onbeforeupdate";
  }
  function Ne(m, h, g) {
    return g === undefined && (m.tag.indexOf("-") > -1 || m.attrs != null && m.attrs.is || h !== "href" && h !== "list" && h !== "form" && h !== "width" && h !== "height") && h in m.dom;
  }
  var it = /[A-Z]/g;
  function Ze(m) {
    return "-" + m.toLowerCase();
  }
  function se(m) {
    if (m[0] === "-" && m[1] === "-") {
      return m;
    } else if (m === "cssFloat") {
      return "float";
    } else {
      return m.replace(it, Ze);
    }
  }
  function pi(m, h, g) {
    if (h !== g) {
      if (g == null) {
        m.style.cssText = "";
      } else if (typeof g != "object") {
        m.style.cssText = g;
      } else if (h == null || typeof h != "object") {
        m.style.cssText = "";
        for (var I in g) {
          var E = g[I];
          if (E != null) {
            m.style.setProperty(se(I), String(E));
          }
        }
      } else {
        for (var I in g) {
          var E = g[I];
          if (E != null && (E = String(E)) !== String(h[I])) {
            m.style.setProperty(se(I), E);
          }
        }
        for (var I in h) {
          if (h[I] != null && g[I] == null) {
            m.style.removeProperty(se(I));
          }
        }
      }
    }
  }
  function mi() {
    this._ = i;
  }
  mi.prototype = Object.create(null);
  mi.prototype.handleEvent = function (m) {
    var h = this["on" + m.type];
    var g;
    if (typeof h == "function") {
      g = h.call(m.currentTarget, m);
    } else if (typeof h.handleEvent == "function") {
      h.handleEvent(m);
    }
    if (this._ && m.redraw !== false) {
      (0, this._)();
    }
    if (g === false) {
      m.preventDefault();
      m.stopPropagation();
    }
  };
  function gi(m, h, g) {
    if (m.events != null) {
      m.events._ = i;
      if (m.events[h] === g) {
        return;
      }
      if (g != null && (typeof g == "function" || typeof g == "object")) {
        if (m.events[h] == null) {
          m.dom.addEventListener(h.slice(2), m.events, false);
        }
        m.events[h] = g;
      } else {
        if (m.events[h] != null) {
          m.dom.removeEventListener(h.slice(2), m.events, false);
        }
        m.events[h] = undefined;
      }
    } else if (g != null && (typeof g == "function" || typeof g == "object")) {
      m.events = new mi();
      m.dom.addEventListener(h.slice(2), m.events, false);
      m.events[h] = g;
    }
  }
  function yi(m, h, g) {
    if (typeof m.oninit == "function") {
      o.call(m.oninit, h);
    }
    if (typeof m.oncreate == "function") {
      g.push(o.bind(m.oncreate, h));
    }
  }
  function wi(m, h, g) {
    if (typeof m.onupdate == "function") {
      g.push(o.bind(m.onupdate, h));
    }
  }
  function Ln(m, h) {
    do {
      if (m.attrs != null && typeof m.attrs.onbeforeupdate == "function") {
        var g = o.call(m.attrs.onbeforeupdate, m, h);
        if (g !== undefined && !g) {
          break;
        }
      }
      if (typeof m.tag != "string" && typeof m.state.onbeforeupdate == "function") {
        var g = o.call(m.state.onbeforeupdate, m, h);
        if (g !== undefined && !g) {
          break;
        }
      }
      return false;
    } while (false);
    m.dom = h.dom;
    m.domSize = h.domSize;
    m.instance = h.instance;
    m.attrs = h.attrs;
    m.children = h.children;
    m.text = h.text;
    return true;
  }
  var Tt;
  return function (m, h, g) {
    if (!m) {
      throw new TypeError("DOM element being rendered to does not exist.");
    }
    if (Tt != null && m.contains(Tt)) {
      throw new TypeError("Node is currently being rendered to and thus is locked.");
    }
    var I = i;
    var E = Tt;
    var O = [];
    var q = l();
    var Z = m.namespaceURI;
    Tt = m;
    i = typeof g == "function" ? g : undefined;
    try {
      if (m.vnodes == null) {
        m.textContent = "";
      }
      h = Zn.normalizeChildren(Array.isArray(h) ? h : [h]);
      $(m, m.vnodes, h, O, null, Z === "http://www.w3.org/1999/xhtml" ? undefined : Z);
      m.vnodes = h;
      if (q != null && l() !== q && typeof q.focus == "function") {
        q.focus();
      }
      for (var U = 0; U < O.length; U++) {
        O[U]();
      }
    } finally {
      i = I;
      Tt = E;
    }
  };
}
var ra = mu(typeof window !== "undefined" ? window : null);
var $r = It();
function gu(e, t, i) {
  var n = [];
  var s = false;
  var r = -1;
  function o() {
    for (r = 0; r < n.length; r += 2) {
      try {
        e(n[r], $r(n[r + 1]), l);
      } catch (a) {
        i.error(a);
      }
    }
    r = -1;
  }
  function l() {
    if (!s) {
      s = true;
      t(function () {
        s = false;
        o();
      });
    }
  }
  l.sync = o;
  function c(a, f) {
    if (f != null && f.view == null && typeof f != "function") {
      throw new TypeError("m.mount expects a component, not a vnode.");
    }
    var d = n.indexOf(a);
    if (d >= 0) {
      n.splice(d, 2);
      if (d <= r) {
        r -= 2;
      }
      e(a, []);
    }
    if (f != null) {
      n.push(a, f);
      e(a, $r(f), l);
    }
  }
  return {
    mount: c,
    redraw: l
  };
}
var yu = ra;
var Qs = gu(yu, typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : null, typeof console !== "undefined" ? console : null);
var Jn;
var Rr;
function oa() {
  if (!Rr) {
    Rr = 1;
    Jn = function (e) {
      if (Object.prototype.toString.call(e) !== "[object Object]") {
        return "";
      }
      var t = [];
      for (var i in e) {
        n(i, e[i]);
      }
      return t.join("&");
      function n(s, r) {
        if (Array.isArray(r)) {
          for (var o = 0; o < r.length; o++) {
            n(s + "[" + o + "]", r[o]);
          }
        } else if (Object.prototype.toString.call(r) === "[object Object]") {
          for (var o in r) {
            n(s + "[" + o + "]", r[o]);
          }
        } else {
          t.push(encodeURIComponent(s) + (r != null && r !== "" ? "=" + encodeURIComponent(r) : ""));
        }
      }
    };
  }
  return Jn;
}
var Qn;
var Ar;
function aa() {
  if (Ar) {
    return Qn;
  }
  Ar = 1;
  var e = Dn;
  Qn = Object.assign || function (t, i) {
    for (var n in i) {
      if (e.call(i, n)) {
        t[n] = i[n];
      }
    }
  };
  return Qn;
}
var jn;
var Dr;
function js() {
  if (Dr) {
    return jn;
  }
  Dr = 1;
  var e = oa();
  var t = aa();
  jn = function (i, n) {
    if (/:([^\/\.-]+)(\.{3})?:/.test(i)) {
      throw new SyntaxError("Template parameter names must be separated by either a '/', '-', or '.'.");
    }
    if (n == null) {
      return i;
    }
    var s = i.indexOf("?");
    var r = i.indexOf("#");
    var o = r < 0 ? i.length : r;
    var l = s < 0 ? o : s;
    var c = i.slice(0, l);
    var a = {};
    t(a, n);
    var f = c.replace(/:([^\/\.-]+)(\.{3})?/g, function ($, v, S) {
      delete a[v];
      if (n[v] == null) {
        return $;
      } else if (S) {
        return n[v];
      } else {
        return encodeURIComponent(String(n[v]));
      }
    });
    var d = f.indexOf("?");
    var u = f.indexOf("#");
    var p = u < 0 ? f.length : u;
    var w = d < 0 ? p : d;
    var x = f.slice(0, w);
    if (s >= 0) {
      x += i.slice(s, o);
    }
    if (d >= 0) {
      x += (s < 0 ? "?" : "&") + f.slice(d, p);
    }
    var b = e(a);
    if (b) {
      x += (s < 0 && d < 0 ? "?" : "&") + b;
    }
    if (r >= 0) {
      x += i.slice(r);
    }
    if (u >= 0) {
      x += (r < 0 ? "" : "&") + f.slice(u);
    }
    return x;
  };
  return jn;
}
var wu = js();
var Or = Dn;
function vu(e, t, i) {
  var n = 0;
  function s(l) {
    return new t(l);
  }
  s.prototype = t.prototype;
  s.__proto__ = t;
  function r(l) {
    return function (c, a) {
      if (typeof c != "string") {
        a = c;
        c = c.url;
      } else if (a == null) {
        a = {};
      }
      var f = new t(function (w, x) {
        l(wu(c, a.params), a, function (b) {
          if (typeof a.type == "function") {
            if (Array.isArray(b)) {
              for (var $ = 0; $ < b.length; $++) {
                b[$] = new a.type(b[$]);
              }
            } else {
              b = new a.type(b);
            }
          }
          w(b);
        }, x);
      });
      if (a.background === true) {
        return f;
      }
      var d = 0;
      function u() {
        if (--d === 0 && typeof i == "function") {
          i();
        }
      }
      return p(f);
      function p(w) {
        var x = w.then;
        w.constructor = s;
        w.then = function () {
          d++;
          var b = x.apply(w, arguments);
          b.then(u, function ($) {
            u();
            if (d === 0) {
              throw $;
            }
          });
          return p(b);
        };
        return w;
      }
    };
  }
  function o(l, c) {
    for (var a in l.headers) {
      if (Or.call(l.headers, a) && a.toLowerCase() === c) {
        return true;
      }
    }
    return false;
  }
  return {
    request: r(function (l, c, a, f) {
      var d = c.method != null ? c.method.toUpperCase() : "GET";
      var u = c.body;
      var p = (c.serialize == null || c.serialize === JSON.serialize) && !(u instanceof e.FormData || u instanceof e.URLSearchParams);
      var w = c.responseType || (typeof c.extract == "function" ? "" : "json");
      var x = new e.XMLHttpRequest();
      var b = false;
      var $ = false;
      var v = x;
      var S;
      var R = x.abort;
      x.abort = function () {
        b = true;
        R.call(this);
      };
      x.open(d, l, c.async !== false, typeof c.user == "string" ? c.user : undefined, typeof c.password == "string" ? c.password : undefined);
      if (p && u != null && !o(c, "content-type")) {
        x.setRequestHeader("Content-Type", "application/json; charset=utf-8");
      }
      if (typeof c.deserialize != "function" && !o(c, "accept")) {
        x.setRequestHeader("Accept", "application/json, text/*");
      }
      if (c.withCredentials) {
        x.withCredentials = c.withCredentials;
      }
      if (c.timeout) {
        x.timeout = c.timeout;
      }
      x.responseType = w;
      for (var G in c.headers) {
        if (Or.call(c.headers, G)) {
          x.setRequestHeader(G, c.headers[G]);
        }
      }
      x.onreadystatechange = function (X) {
        if (!b && X.target.readyState === 4) {
          try {
            var W = X.target.status >= 200 && X.target.status < 300 || X.target.status === 304 || /^file:\/\//i.test(l);
            var M = X.target.response;
            var V;
            if (w === "json") {
              if (!X.target.responseType && typeof c.extract != "function") {
                try {
                  M = JSON.parse(X.target.responseText);
                } catch {
                  M = null;
                }
              }
            } else if ((!w || w === "text") && M == null) {
              M = X.target.responseText;
            }
            if (typeof c.extract == "function") {
              M = c.extract(X.target, c);
              W = true;
            } else if (typeof c.deserialize == "function") {
              M = c.deserialize(M);
            }
            if (W) {
              a(M);
            } else {
              function F() {
                try {
                  V = X.target.responseText;
                } catch {
                  V = M;
                }
                var _ = new Error(V);
                _.code = X.target.status;
                _.response = M;
                f(_);
              }
              if (x.status === 0) {
                // TOLOOK
                setTimeout(function () {
                  if (!$) {
                    F();
                  }
                });
              } else {
                F();
              }
            }
          } catch (_) {
            f(_);
          }
        }
      };
      x.ontimeout = function (X) {
        $ = true;
        var W = new Error("Request timed out");
        W.code = X.target.status;
        f(W);
      };
      if (typeof c.config == "function") {
        x = c.config(x, c, l) || x;
        if (x !== v) {
          S = x.abort;
          x.abort = function () {
            b = true;
            S.call(this);
          };
        }
      }
      if (u == null) {
        x.send();
      } else if (typeof c.serialize == "function") {
        x.send(c.serialize(u));
      } else if (u instanceof e.FormData || u instanceof e.URLSearchParams) {
        x.send(u);
      } else {
        x.send(JSON.stringify(u));
      }
    }),
    jsonp: r(function (l, c, a, f) {
      var d = c.callbackName || "_mithril_" + Math.round(Math.random() * 10000000000000000) + "_" + n++;
      var u = e.document.createElement("script");
      e[d] = function (p) {
        delete e[d];
        u.parentNode.removeChild(u);
        a(p);
      };
      u.onerror = function () {
        delete e[d];
        u.parentNode.removeChild(u);
        f(new Error("JSONP request failed"));
      };
      u.src = l + (l.indexOf("?") < 0 ? "?" : "&") + encodeURIComponent(c.callbackKey || "callback") + "=" + encodeURIComponent(d);
      e.document.documentElement.appendChild(u);
    })
  };
}
var ku = sa;
var xu = Qs;
var bu = vu(typeof window !== "undefined" ? window : null, ku, xu.redraw);
var es;
var _r;
function la() {
  if (_r) {
    return es;
  }
  _r = 1;
  function e(t) {
    try {
      return decodeURIComponent(t);
    } catch {
      return t;
    }
  }
  es = function (t) {
    if (t === "" || t == null) {
      return {};
    }
    if (t.charAt(0) === "?") {
      t = t.slice(1);
    }
    for (var i = t.split("&"), n = {}, s = {}, r = 0; r < i.length; r++) {
      var o = i[r].split("=");
      var l = e(o[0]);
      var c = o.length === 2 ? e(o[1]) : "";
      if (c === "true") {
        c = true;
      } else if (c === "false") {
        c = false;
      }
      var a = l.split(/\]\[?|\[/);
      var f = s;
      if (l.indexOf("[") > -1) {
        a.pop();
      }
      for (var d = 0; d < a.length; d++) {
        var u = a[d];
        var p = a[d + 1];
        var w = p == "" || !isNaN(parseInt(p, 10));
        if (u === "") {
          var l = a.slice(0, d).join();
          if (n[l] == null) {
            n[l] = Array.isArray(f) ? f.length : 0;
          }
          u = n[l]++;
        } else if (u === "__proto__") {
          break;
        }
        if (d === a.length - 1) {
          f[u] = c;
        } else {
          var x = Object.getOwnPropertyDescriptor(f, u);
          if (x != null) {
            x = x.value;
          }
          if (x == null) {
            f[u] = x = w ? [] : {};
          }
          f = x;
        }
      }
    }
    return s;
  };
  return es;
}
var ts;
var zr;
function er() {
  if (zr) {
    return ts;
  }
  zr = 1;
  var e = la();
  ts = function (t) {
    var i = t.indexOf("?");
    var n = t.indexOf("#");
    var s = n < 0 ? t.length : n;
    var r = i < 0 ? s : i;
    var o = t.slice(0, r).replace(/\/{2,}/g, "/");
    if (o) {
      if (o[0] !== "/") {
        o = "/" + o;
      }
      if (o.length > 1 && o[o.length - 1] === "/") {
        o = o.slice(0, -1);
      }
    } else {
      o = "/";
    }
    return {
      path: o,
      params: i < 0 ? {} : e(t.slice(i + 1, s))
    };
  };
  return ts;
}
var is;
var Br;
function Su() {
  if (Br) {
    return is;
  }
  Br = 1;
  var e = er();
  is = function (t) {
    var i = e(t);
    var n = Object.keys(i.params);
    var s = [];
    var r = new RegExp("^" + i.path.replace(/:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, function (o, l, c) {
      if (l == null) {
        return "\\" + o;
      } else {
        s.push({
          k: l,
          r: c === "..."
        });
        if (c === "...") {
          return "(.*)";
        } else if (c === ".") {
          return "([^/]+)\\.";
        } else {
          return "([^/]+)" + (c || "");
        }
      }
    }) + "$");
    return function (o) {
      for (var l = 0; l < n.length; l++) {
        if (i.params[n[l]] !== o.params[n[l]]) {
          return false;
        }
      }
      if (!s.length) {
        return r.test(o.path);
      }
      var c = r.exec(o.path);
      if (c == null) {
        return false;
      }
      for (var l = 0; l < s.length; l++) {
        o.params[s[l].k] = s[l].r ? c[l + 1] : decodeURIComponent(c[l + 1]);
      }
      return true;
    };
  };
  return is;
}
var ns;
var Hr;
function ca() {
  if (Hr) {
    return ns;
  }
  Hr = 1;
  var e = Dn;
  var t = new RegExp("^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$");
  ns = function (i, n) {
    var s = {};
    if (n != null) {
      for (var r in i) {
        if (e.call(i, r) && !t.test(r) && n.indexOf(r) < 0) {
          s[r] = i[r];
        }
      }
    } else {
      for (var r in i) {
        if (e.call(i, r) && !t.test(r)) {
          s[r] = i[r];
        }
      }
    }
    return s;
  };
  return ns;
}
var ss;
var Lr;
function Iu() {
  if (Lr) {
    return ss;
  }
  Lr = 1;
  var e = It();
  var t = ia;
  var i = sa;
  var n = js();
  var s = er();
  var r = Su();
  var o = aa();
  var l = ca();
  var c = {};
  function a(f) {
    try {
      return decodeURIComponent(f);
    } catch {
      return f;
    }
  }
  ss = function (f, d) {
    var u = f == null ? null : typeof f.setImmediate == "function" ? f.setImmediate : f.setTimeout;
    var p = i.resolve();
    var w = false;
    var x = false;
    var b = 0;
    var $;
    var v;
    var S = c;
    var R;
    var G;
    var X;
    var W;
    var M = {
      onbeforeupdate: function () {
        b = b ? 2 : 1;
        return !(!b || c === S);
      },
      onremove: function () {
        f.removeEventListener("popstate", _, false);
        f.removeEventListener("hashchange", F, false);
      },
      view: function () {
        if (!(!b || c === S)) {
          var N = [e(R, G.key, G)];
          if (S) {
            N = S.render(N[0]);
          }
          return N;
        }
      }
    };
    var V = z.SKIP = {};
    function F() {
      w = false;
      var N = f.location.hash;
      if (z.prefix[0] !== "#") {
        N = f.location.search + N;
        if (z.prefix[0] !== "?") {
          N = f.location.pathname + N;
          if (N[0] !== "/") {
            N = "/" + N;
          }
        }
      }
      var Y = N.concat().replace(/(?:%[a-f89][a-f0-9])+/gim, a).slice(z.prefix.length);
      var K = s(Y);
      o(K.params, f.history.state);
      function ie(J) {
        console.error(J);
        D(v, null, {
          replace: true
        });
      }
      ae(0);
      function ae(J) {
        for (; J < $.length; J++) {
          if ($[J].check(K)) {
            var Se = $[J].component;
            var zt = $[J].route;
            var Ve = Se;
            var te = W = function (Be) {
              if (te === W) {
                if (Be === V) {
                  return ae(J + 1);
                }
                R = Be != null && (typeof Be.view == "function" || typeof Be == "function") ? Be : "div";
                G = K.params;
                X = Y;
                W = null;
                S = Se.render ? Se : null;
                if (b === 2) {
                  d.redraw();
                } else {
                  b = 2;
                  d.redraw.sync();
                }
              }
            };
            if (Se.view || typeof Se == "function") {
              Se = {};
              te(Ve);
            } else if (Se.onmatch) {
              p.then(function () {
                return Se.onmatch(K.params, Y, zt);
              }).then(te, Y === v ? null : ie);
            } else {
              te("div");
            }
            return;
          }
        }
        if (Y === v) {
          throw new Error("Could not resolve default route " + v + ".");
        }
        D(v, null, {
          replace: true
        });
      }
    }
    function _() {
      if (!w) {
        w = true;
        u(F);
      }
    }
    function D(N, Y, K) {
      N = n(N, Y);
      if (x) {
        _();
        var ie = K ? K.state : null;
        var ae = K ? K.title : null;
        if (K && K.replace) {
          f.history.replaceState(ie, ae, z.prefix + N);
        } else {
          f.history.pushState(ie, ae, z.prefix + N);
        }
      } else {
        f.location.href = z.prefix + N;
      }
    }
    function z(N, Y, K) {
      if (!N) {
        throw new TypeError("DOM element being rendered to does not exist.");
      }
      $ = Object.keys(K).map(function (ae) {
        if (ae[0] !== "/") {
          throw new SyntaxError("Routes must start with a '/'.");
        }
        if (/:([^\/\.-]+)(\.{3})?:/.test(ae)) {
          throw new SyntaxError("Route parameter names must be separated with either '/', '.', or '-'.");
        }
        return {
          route: ae,
          component: K[ae],
          check: r(ae)
        };
      });
      v = Y;
      if (Y != null) {
        var ie = s(Y);
        if (!$.some(function (ae) {
          return ae.check(ie);
        })) {
          throw new ReferenceError("Default route doesn't match any known routes.");
        }
      }
      if (typeof f.history.pushState == "function") {
        f.addEventListener("popstate", _, false);
      } else if (z.prefix[0] === "#") {
        f.addEventListener("hashchange", F, false);
      }
      x = true;
      d.mount(N, M);
      F();
    }
    z.set = function (N, Y, K) {
      if (W != null) {
        K = K || {};
        K.replace = true;
      }
      W = null;
      D(N, Y, K);
    };
    z.get = function () {
      return X;
    };
    z.prefix = "#!";
    z.Link = {
      view: function (N) {
        var Y = t(N.attrs.selector || "a", l(N.attrs, ["options", "params", "selector", "onclick"]), N.children);
        var K;
        var ie;
        var ae;
        if (Y.attrs.disabled = !!Y.attrs.disabled) {
          Y.attrs.href = null;
          Y.attrs["aria-disabled"] = "true";
        } else {
          K = N.attrs.options;
          ie = N.attrs.onclick;
          ae = n(Y.attrs.href, N.attrs.params);
          Y.attrs.href = z.prefix + ae;
          Y.attrs.onclick = function (J) {
            var Se;
            if (typeof ie == "function") {
              Se = ie.call(J.currentTarget, J);
            } else if (!(ie == null || typeof ie != "object")) {
              if (typeof ie.handleEvent == "function") {
                ie.handleEvent(J);
              }
            }
            if (Se !== false && !J.defaultPrevented && (J.button === 0 || J.which === 0 || J.which === 1) && (!J.currentTarget.target || J.currentTarget.target === "_self") && !J.ctrlKey && !J.metaKey && !J.shiftKey && !J.altKey) {
              J.preventDefault();
              J.redraw = false;
              z.set(ae, null, K);
            }
          };
        }
        return Y;
      }
    };
    z.param = function (N) {
      if (G && N != null) {
        return G[N];
      } else {
        return G;
      }
    };
    return z;
  };
  return ss;
}
var rs;
var Fr;
function Tu() {
  if (Fr) {
    return rs;
  }
  Fr = 1;
  var e = Qs;
  rs = Iu()(typeof window !== "undefined" ? window : null, e);
  return rs;
}
var On = pu;
var ha = bu;
var ua = Qs;
function Ae() {
  return On.apply(this, arguments);
}
Ae.m = On;
Ae.trust = On.trust;
Ae.fragment = On.fragment;
Ae.Fragment = "[";
Ae.mount = ua.mount;
Ae.route = Tu();
Ae.render = ra;
Ae.redraw = ua.redraw;
Ae.request = ha.request;
Ae.jsonp = ha.jsonp;
Ae.parseQueryString = la();
Ae.buildQueryString = oa();
Ae.parsePathname = er();
Ae.buildPathname = js();
Ae.vnode = It();
Ae.PromisePolyfill = na();
Ae.censor = ca();
var Mu = Ae;
const kt = An(Mu);
function ze(e, t, i, n, s) {
  this.debugLog = false;
  this.baseUrl = e;
  this.lobbySize = i;
  this.devPort = t;
  this.lobbySpread = n;
  this.rawIPs = !!s;
  this.server = undefined;
  this.gameIndex = undefined;
  this.callback = undefined;
  this.errorCallback = undefined;
}
ze.prototype.regionInfo = {
  0: {
    name: "Local",
    latitude: 0,
    longitude: 0
  },
  "us-east": {
    name: "Miami",
    latitude: 40.1393329,
    longitude: -75.8521818
  },
  miami: {
    name: "Miami",
    latitude: 40.1393329,
    longitude: -75.8521818
  },
  "us-west": {
    name: "Silicon Valley",
    latitude: 47.6149942,
    longitude: -122.4759879
  },
  siliconvalley: {
    name: "Silicon Valley",
    latitude: 47.6149942,
    longitude: -122.4759879
  },
  gb: {
    name: "London",
    latitude: 51.5283063,
    longitude: -0.382486
  },
  london: {
    name: "London",
    latitude: 51.5283063,
    longitude: -0.382486
  },
  "eu-west": {
    name: "Frankfurt",
    latitude: 50.1211273,
    longitude: 8.496137
  },
  frankfurt: {
    name: "Frankfurt",
    latitude: 50.1211273,
    longitude: 8.496137
  },
  au: {
    name: "Sydney",
    latitude: -33.8479715,
    longitude: 150.651084
  },
  sydney: {
    name: "Sydney",
    latitude: -33.8479715,
    longitude: 150.651084
  },
  saopaulo: {
    name: "São Paulo",
    latitude: 23.5558,
    longitude: 46.6396
  },
  sg: {
    name: "Singapore",
    latitude: 1.3147268,
    longitude: 103.7065876
  },
  singapore: {
    name: "Singapore",
    latitude: 1.3147268,
    longitude: 103.7065876
  }
};
ze.prototype.start = function (e, t, i, n) {
  this.callback = t;
  this.errorCallback = i;
  if (n) {
    return t();
  }
  const s = this.parseServerQuery(e);
  if (s && s.length > 0) {
    this.log("Found server in query.");
    this.password = s[3];
    this.connect(s[0], s[1], s[2]);
  } else {
    this.errorCallback("Unable to find server");
  }
};
ze.prototype.parseServerQuery = function (e) {
  const t = new URLSearchParams(location.search, true);
  const i = e || t.get("server");
  if (typeof i != "string") {
    return [];
  }
  const [n, s] = i.split(":");
  return [n, s, t.get("password")];
};
ze.prototype.findServer = function (e, t) {
  var i = this.servers[e];
  for (let n = 0; n < i.length; n++) {
    const s = i[n];
    if (s.name === t) {
      return s;
    }
  }
  console.warn("Could not find server in region " + e + " with serverName " + t + ".");
};
ze.prototype.seekServer = function (e, t, i) {
  if (i == null) {
    i = "random";
  }
  if (t == null) {
    t = false;
  }
  const n = ["random"];
  const s = this.lobbySize;
  const r = this.lobbySpread;
  const o = this.servers[e].flatMap(function (u) {
    let p = 0;
    return u.games.map(function (w) {
      const x = p++;
      return {
        region: u.region,
        index: u.index * u.games.length + x,
        gameIndex: x,
        gameCount: u.games.length,
        playerCount: w.playerCount,
        playerCapacity: w.playerCapacity,
        isPrivate: w.isPrivate
      };
    });
  }).filter(function (u) {
    return !u.isPrivate;
  }).filter(function (u) {
    if (t) {
      return u.playerCount == 0 && u.gameIndex >= u.gameCount / 2;
    } else {
      return true;
    }
  }).filter(function (u) {
    if (i == "random") {
      return true;
    } else {
      return n[u.index % n.length].key == i;
    }
  }).sort(function (u, p) {
    return p.playerCount - u.playerCount;
  }).filter(function (u) {
    return u.playerCount < s;
  });
  if (t) {
    o.reverse();
  }
  if (o.length == 0) {
    this.errorCallback("No open servers.");
    return;
  }
  const l = Math.min(r, o.length);
  var f = Math.floor(Math.random() * l);
  f = Math.min(f, o.length - 1);
  const c = o[f];
  const a = c.region;
  var f = Math.floor(c.index / c.gameCount);
  const d = c.index % c.gameCount;
  this.log("Found server.");
  return [a, f, d];
};
ze.prototype.connect = function (e, t, i) {
  if (this.connected) {
    return;
  }
  const n = this.findServer(e, t);
  if (n == null) {
    this.errorCallback("Failed to find server for region " + e + " and serverName " + t);
    return;
  }
  this.log("Connecting to server", n, "with game index", i);
  if (n.playerCount >= n.playerCapacity) {
    this.errorCallback("Server is already full.");
    return;
  }
  window.history.replaceState(document.title, document.title, this.generateHref(e, t, this.password));
  this.server = n;
  this.gameIndex = i;
  this.log("Calling callback with address", this.serverAddress(n), "on port", this.serverPort(n));
  this.callback(this.serverAddress(n), this.serverPort(n), i);
  if (_i) {
    clearInterval(_i);
  }
};
ze.prototype.switchServer = function (e, t) {
  this.switchingServers = true;
  window.location = this.generateHref(e, t, null);
};
ze.prototype.generateHref = function (e, t, i) {
  let n = window.location.href.split("?")[0];
  n += "?server=" + e + ":" + t;
  if (i) {
    n += "&password=" + encodeURIComponent(i);
  }
  return n;
};
ze.prototype.serverAddress = function (e) {
  if (e.region == 0) {
    return "localhost";
  } else {
    return e.key + "." + e.region + "." + this.baseUrl;
  }
};
ze.prototype.serverPort = function (e) {
  return e.port;
};
let _i;
function Eu(e) {
  e = e.filter(s => s.playerCount !== s.playerCapacity);
  const t = Math.min(...e.map(s => s.ping || Infinity));
  const i = e.filter(s => s.ping === t);
  if (!i.length > 0) {
    return null;
  } else {
    return i.reduce((s, r) => s.playerCount > r.playerCount ? s : r);
  }
}
ze.prototype.processServers = function (e) {
  if (_i) {
    clearInterval(_i);
  }
  return new Promise(t => {
    const i = {};
    const n = c => {
      const a = i[c];
      const f = a[0];
      let d = this.serverAddress(f);
      const u = this.serverPort(f);
      if (u) {
        d += `:${u}`;
      }
      const p = `https://${d}/ping`;
      const w = new Date().getTime();
      return Promise.race([fetch(p).then(() => {
        const x = new Date().getTime() - w;
        a.forEach(b => {
          b.pings = b.pings ?? [];
          b.pings.push(x);
          if (b.pings.length > 10) {
            b.pings.shift();
          }
          b.ping = Math.floor(b.pings.reduce(($, v) => $ + v, 0) / b.pings.length);
        });
      }).catch(() => {}), new Promise(x => // TOLOOK
      setTimeout(() => x(), 100))]);
    };
    const s = async () => {
      await Promise.all(Object.keys(i).map(n));
      if (!window.blockRedraw) {
        kt.redraw();
      }
    };
    e.forEach(c => {
      i[c.region] = i[c.region] || [];
      i[c.region].push(c);
    });
    for (const c in i) {
      i[c] = i[c].sort(function (a, f) {
        return f.playerCount - a.playerCount;
      });
    }
    this.servers = i;
    let r;
    const [o, l] = this.parseServerQuery();
    e.forEach(c => {
      if (o === c.region && l === c.name) {
        c.selected = true;
        r = c;
      }
    });
    s().then(s).then(() => {
      if (r) {
        return;
      }
      let c = Eu(e);
      if (!c) {
        c = e[0];
      }
      if (c) {
        c.selected = true;
        window.history.replaceState(document.title, document.title, this.generateHref(c.region, c.name, this.password));
      }
      if (!window.blockRedraw) {
        kt.redraw();
      }
    }).then(s).catch(c => {}).finally(t);
    _i = // TOLOOK
    setInterval(s, 5000);
  });
};
ze.prototype.ipToHex = function (e) {
  return e.split(".").map(i => ("00" + parseInt(i).toString(16)).substr(-2)).join("").toLowerCase();
};
ze.prototype.hashIP = function (e) {
  return tu(this.ipToHex(e));
};
ze.prototype.log = function () {
  if (this.debugLog) {
    return console.log.apply(undefined, arguments);
  }
  if (console.verbose) {
    return console.verbose.apply(undefined, arguments);
  }
};
ze.prototype.stripRegion = function (e) {
  if (e.startsWith("vultr:")) {
    e = e.slice(6);
  } else if (e.startsWith("do:")) {
    e = e.slice(3);
  }
  return e;
};
const Cu = function (e, t) {
  return e.concat(t);
};
const Pu = function (e, t) {
  return t.map(e).reduce(Cu, []);
};
Array.prototype.flatMap = function (e) {
  return Pu(e, this);
};
const hn = (e, t) => {
  const i = t.x - e.x;
  const n = t.y - e.y;
  return Math.sqrt(i * i + n * n);
};
const $u = (e, t) => {
  const i = t.x - e.x;
  const n = t.y - e.y;
  return Au(Math.atan2(n, i));
};
const Ru = (e, t, i) => {
  const n = {
    x: 0,
    y: 0
  };
  i = Cs(i);
  n.x = e.x - t * Math.cos(i);
  n.y = e.y - t * Math.sin(i);
  return n;
};
const Cs = e => e * (Math.PI / 180);
const Au = e => e * (180 / Math.PI);
const Du = e => isNaN(e.buttons) ? e.pressure !== 0 : e.buttons !== 0;
const os = new Map();
const Vr = e => {
  if (os.has(e)) {
    clearTimeout(os.get(e));
  }
  os.set(e, // TOLOOK
  setTimeout(e, 100));
};
const wn = (e, t, i) => {
  const n = t.split(/[ ,]+/g);
  let s;
  for (let r = 0; r < n.length; r += 1) {
    s = n[r];
    if (e.addEventListener) {
      e.addEventListener(s, i, false);
    } else if (e.attachEvent) {
      e.attachEvent(s, i);
    }
  }
};
const Nr = (e, t, i) => {
  const n = t.split(/[ ,]+/g);
  let s;
  for (let r = 0; r < n.length; r += 1) {
    s = n[r];
    if (e.removeEventListener) {
      e.removeEventListener(s, i);
    } else if (e.detachEvent) {
      e.detachEvent(s, i);
    }
  }
};
const fa = e => {
  e.preventDefault();
  if (e.type.match(/^touch/)) {
    return e.changedTouches;
  } else {
    return e;
  }
};
const Ur = () => {
  const e = window.pageXOffset !== undefined ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft;
  const t = window.pageYOffset !== undefined ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;
  return {
    x: e,
    y: t
  };
};
const Wr = (e, t) => {
  if (t.top || t.right || t.bottom || t.left) {
    e.style.top = t.top;
    e.style.right = t.right;
    e.style.bottom = t.bottom;
    e.style.left = t.left;
  } else {
    e.style.left = t.x + "px";
    e.style.top = t.y + "px";
  }
};
const tr = (e, t, i) => {
  const n = da(e);
  for (let s in n) {
    if (n.hasOwnProperty(s)) {
      if (typeof t == "string") {
        n[s] = t + " " + i;
      } else {
        let r = "";
        for (let o = 0, l = t.length; o < l; o += 1) {
          r += t[o] + " " + i + ", ";
        }
        n[s] = r.slice(0, -2);
      }
    }
  }
  return n;
};
const Ou = (e, t) => {
  const i = da(e);
  for (let n in i) {
    if (i.hasOwnProperty(n)) {
      i[n] = t;
    }
  }
  return i;
};
const da = e => {
  const t = {
    [e]: ""
  };
  ["webkit", "Moz", "o"].forEach(function (n) {
    t[n + e.charAt(0).toUpperCase() + e.slice(1)] = "";
  });
  return t;
};
const as = (e, t) => {
  for (let i in t) {
    if (t.hasOwnProperty(i)) {
      e[i] = t[i];
    }
  }
  return e;
};
const _u = (e, t) => {
  const i = {};
  for (let n in e) {
    if (e.hasOwnProperty(n) && t.hasOwnProperty(n)) {
      i[n] = t[n];
    } else if (e.hasOwnProperty(n)) {
      i[n] = e[n];
    }
  }
  return i;
};
const Ps = (e, t) => {
  if (e.length) {
    for (let i = 0, n = e.length; i < n; i += 1) {
      t(e[i]);
    }
  } else {
    t(e);
  }
};
const zu = (e, t, i) => ({
  x: Math.min(Math.max(e.x, t.x - i), t.x + i),
  y: Math.min(Math.max(e.y, t.y - i), t.y + i)
});
var Bu = ("ontouchstart" in window);
var Hu = !!window.PointerEvent;
var Lu = !!window.MSPointerEvent;
var Ci = {
  touch: {
    start: "touchstart",
    move: "touchmove",
    end: "touchend, touchcancel"
  },
  mouse: {
    start: "mousedown",
    move: "mousemove",
    end: "mouseup"
  },
  pointer: {
    start: "pointerdown",
    move: "pointermove",
    end: "pointerup, pointercancel"
  },
  MSPointer: {
    start: "MSPointerDown",
    move: "MSPointerMove",
    end: "MSPointerUp"
  }
};
var si;
var Wi = {};
if (Hu) {
  si = Ci.pointer;
} else if (Lu) {
  si = Ci.MSPointer;
} else if (Bu) {
  si = Ci.touch;
  Wi = Ci.mouse;
} else {
  si = Ci.mouse;
}
function dt() {}
dt.prototype.on = function (e, t) {
  var i = this;
  var n = e.split(/[ ,]+/g);
  var s;
  i._handlers_ = i._handlers_ || {};
  for (var r = 0; r < n.length; r += 1) {
    s = n[r];
    i._handlers_[s] = i._handlers_[s] || [];
    i._handlers_[s].push(t);
  }
  return i;
};
dt.prototype.off = function (e, t) {
  var i = this;
  i._handlers_ = i._handlers_ || {};
  if (e === undefined) {
    i._handlers_ = {};
  } else if (t === undefined) {
    i._handlers_[e] = null;
  } else if (i._handlers_[e] && i._handlers_[e].indexOf(t) >= 0) {
    i._handlers_[e].splice(i._handlers_[e].indexOf(t), 1);
  }
  return i;
};
dt.prototype.trigger = function (e, t) {
  var i = this;
  var n = e.split(/[ ,]+/g);
  var s;
  i._handlers_ = i._handlers_ || {};
  for (var r = 0; r < n.length; r += 1) {
    s = n[r];
    if (i._handlers_[s] && i._handlers_[s].length) {
      i._handlers_[s].forEach(function (o) {
        o.call(i, {
          type: s,
          target: i
        }, t);
      });
    }
  }
};
dt.prototype.config = function (e) {
  var t = this;
  t.options = t.defaults || {};
  if (e) {
    t.options = _u(t.options, e);
  }
};
dt.prototype.bindEvt = function (e, t) {
  var i = this;
  i._domHandlers_ = i._domHandlers_ || {};
  i._domHandlers_[t] = function () {
    if (typeof i["on" + t] == "function") {
      i["on" + t].apply(i, arguments);
    } else {
      console.warn("[WARNING] : Missing \"on" + t + "\" handler.");
    }
  };
  wn(e, si[t], i._domHandlers_[t]);
  if (Wi[t]) {
    wn(e, Wi[t], i._domHandlers_[t]);
  }
  return i;
};
dt.prototype.unbindEvt = function (e, t) {
  var i = this;
  i._domHandlers_ = i._domHandlers_ || {};
  Nr(e, si[t], i._domHandlers_[t]);
  if (Wi[t]) {
    Nr(e, Wi[t], i._domHandlers_[t]);
  }
  delete i._domHandlers_[t];
  return this;
};
function Ee(e, t) {
  this.identifier = t.identifier;
  this.position = t.position;
  this.frontPosition = t.frontPosition;
  this.collection = e;
  this.defaults = {
    size: 100,
    threshold: 0.1,
    color: "white",
    fadeTime: 250,
    dataOnly: false,
    restJoystick: true,
    restOpacity: 0.5,
    mode: "dynamic",
    zone: document.body,
    lockX: false,
    lockY: false,
    shape: "circle"
  };
  this.config(t);
  if (this.options.mode === "dynamic") {
    this.options.restOpacity = 0;
  }
  this.id = Ee.id;
  Ee.id += 1;
  this.buildEl().stylize();
  this.instance = {
    el: this.ui.el,
    on: this.on.bind(this),
    off: this.off.bind(this),
    show: this.show.bind(this),
    hide: this.hide.bind(this),
    add: this.addToDom.bind(this),
    remove: this.removeFromDom.bind(this),
    destroy: this.destroy.bind(this),
    setPosition: this.setPosition.bind(this),
    resetDirection: this.resetDirection.bind(this),
    computeDirection: this.computeDirection.bind(this),
    trigger: this.trigger.bind(this),
    position: this.position,
    frontPosition: this.frontPosition,
    ui: this.ui,
    identifier: this.identifier,
    id: this.id,
    options: this.options
  };
  return this.instance;
}
Ee.prototype = new dt();
Ee.constructor = Ee;
Ee.id = 0;
Ee.prototype.buildEl = function (e) {
  this.ui = {};
  if (this.options.dataOnly) {
    return this;
  } else {
    this.ui.el = document.createElement("div");
    this.ui.back = document.createElement("div");
    this.ui.front = document.createElement("div");
    this.ui.el.className = "nipple collection_" + this.collection.id;
    this.ui.back.className = "back";
    this.ui.front.className = "front";
    this.ui.el.setAttribute("id", "nipple_" + this.collection.id + "_" + this.id);
    this.ui.el.appendChild(this.ui.back);
    this.ui.el.appendChild(this.ui.front);
    return this;
  }
};
Ee.prototype.stylize = function () {
  if (this.options.dataOnly) {
    return this;
  }
  var e = this.options.fadeTime + "ms";
  var t = Ou("borderRadius", "50%");
  var i = tr("transition", "opacity", e);
  var n = {
    el: {
      position: "absolute",
      opacity: this.options.restOpacity,
      display: "block",
      zIndex: 999
    },
    back: {
      position: "absolute",
      display: "block",
      width: this.options.size + "px",
      height: this.options.size + "px",
      marginLeft: -this.options.size / 2 + "px",
      marginTop: -this.options.size / 2 + "px",
      background: this.options.color,
      opacity: ".5"
    },
    front: {
      width: this.options.size / 2 + "px",
      height: this.options.size / 2 + "px",
      position: "absolute",
      display: "block",
      marginLeft: -this.options.size / 4 + "px",
      marginTop: -this.options.size / 4 + "px",
      background: this.options.color,
      opacity: ".5",
      transform: "translate(0px, 0px)"
    }
  };
  as(n.el, i);
  if (this.options.shape === "circle") {
    as(n.back, t);
  }
  as(n.front, t);
  this.applyStyles(n);
  return this;
};
Ee.prototype.applyStyles = function (e) {
  for (var t in this.ui) {
    if (this.ui.hasOwnProperty(t)) {
      for (var i in e[t]) {
        this.ui[t].style[i] = e[t][i];
      }
    }
  }
  return this;
};
Ee.prototype.addToDom = function () {
  if (this.options.dataOnly || document.body.contains(this.ui.el)) {
    return this;
  } else {
    this.options.zone.appendChild(this.ui.el);
    return this;
  }
};
Ee.prototype.removeFromDom = function () {
  if (this.options.dataOnly || !document.body.contains(this.ui.el)) {
    return this;
  } else {
    this.options.zone.removeChild(this.ui.el);
    return this;
  }
};
Ee.prototype.destroy = function () {
  clearTimeout(this.removeTimeout);
  clearTimeout(this.showTimeout);
  clearTimeout(this.restTimeout);
  this.trigger("destroyed", this.instance);
  this.removeFromDom();
  this.off();
};
Ee.prototype.show = function (e) {
  var t = this;
  if (!t.options.dataOnly) {
    clearTimeout(t.removeTimeout);
    clearTimeout(t.showTimeout);
    clearTimeout(t.restTimeout);
    t.addToDom();
    t.restCallback();
    // TOLOOK
    setTimeout(function () {
      t.ui.el.style.opacity = 1;
    }, 0);
    t.showTimeout = // TOLOOK
    setTimeout(function () {
      t.trigger("shown", t.instance);
      if (typeof e == "function") {
        e.call(this);
      }
    }, t.options.fadeTime);
  }
  return t;
};
Ee.prototype.hide = function (e) {
  var t = this;
  if (t.options.dataOnly) {
    return t;
  }
  t.ui.el.style.opacity = t.options.restOpacity;
  clearTimeout(t.removeTimeout);
  clearTimeout(t.showTimeout);
  clearTimeout(t.restTimeout);
  t.removeTimeout = // TOLOOK
  setTimeout(function () {
    var i = t.options.mode === "dynamic" ? "none" : "block";
    t.ui.el.style.display = i;
    if (typeof e == "function") {
      e.call(t);
    }
    t.trigger("hidden", t.instance);
  }, t.options.fadeTime);
  if (t.options.restJoystick) {
    const i = t.options.restJoystick;
    const n = {
      x: i === true || i.x !== false ? 0 : t.instance.frontPosition.x,
      y: i === true || i.y !== false ? 0 : t.instance.frontPosition.y
    };
    t.setPosition(e, n);
  }
  return t;
};
Ee.prototype.setPosition = function (e, t) {
  var i = this;
  i.frontPosition = {
    x: t.x,
    y: t.y
  };
  var n = i.options.fadeTime + "ms";
  var s = {};
  s.front = tr("transition", ["transform"], n);
  var r = {
    front: {}
  };
  r.front = {
    transform: "translate(" + i.frontPosition.x + "px," + i.frontPosition.y + "px)"
  };
  i.applyStyles(s);
  i.applyStyles(r);
  i.restTimeout = // TOLOOK
  setTimeout(function () {
    if (typeof e == "function") {
      e.call(i);
    }
    i.restCallback();
  }, i.options.fadeTime);
};
Ee.prototype.restCallback = function () {
  var e = this;
  var t = {};
  t.front = tr("transition", "none", "");
  e.applyStyles(t);
  e.trigger("rested", e.instance);
};
Ee.prototype.resetDirection = function () {
  this.direction = {
    x: false,
    y: false,
    angle: false
  };
};
Ee.prototype.computeDirection = function (e) {
  var t = e.angle.radian;
  var i = Math.PI / 4;
  var n = Math.PI / 2;
  var s;
  var r;
  var o;
  if (t > i && t < i * 3 && !e.lockX) {
    s = "up";
  } else if (t > -i && t <= i && !e.lockY) {
    s = "left";
  } else if (t > -i * 3 && t <= -i && !e.lockX) {
    s = "down";
  } else if (!e.lockY) {
    s = "right";
  }
  if (!e.lockY) {
    if (t > -n && t < n) {
      r = "left";
    } else {
      r = "right";
    }
  }
  if (!e.lockX) {
    if (t > 0) {
      o = "up";
    } else {
      o = "down";
    }
  }
  if (e.force > this.options.threshold) {
    var l = {};
    var c;
    for (c in this.direction) {
      if (this.direction.hasOwnProperty(c)) {
        l[c] = this.direction[c];
      }
    }
    var a = {};
    this.direction = {
      x: r,
      y: o,
      angle: s
    };
    e.direction = this.direction;
    for (c in l) {
      if (l[c] === this.direction[c]) {
        a[c] = true;
      }
    }
    if (a.x && a.y && a.angle) {
      return e;
    }
    if (!a.x || !a.y) {
      this.trigger("plain", e);
    }
    if (!a.x) {
      this.trigger("plain:" + r, e);
    }
    if (!a.y) {
      this.trigger("plain:" + o, e);
    }
    if (!a.angle) {
      this.trigger("dir dir:" + s, e);
    }
  } else {
    this.resetDirection();
  }
  return e;
};
function ke(e, t) {
  var i = this;
  i.nipples = [];
  i.idles = [];
  i.actives = [];
  i.ids = [];
  i.pressureIntervals = {};
  i.manager = e;
  i.id = ke.id;
  ke.id += 1;
  i.defaults = {
    zone: document.body,
    multitouch: false,
    maxNumberOfNipples: 10,
    mode: "dynamic",
    position: {
      top: 0,
      left: 0
    },
    catchDistance: 200,
    size: 100,
    threshold: 0.1,
    color: "white",
    fadeTime: 250,
    dataOnly: false,
    restJoystick: true,
    restOpacity: 0.5,
    lockX: false,
    lockY: false,
    shape: "circle",
    dynamicPage: false,
    follow: false
  };
  i.config(t);
  if (i.options.mode === "static" || i.options.mode === "semi") {
    i.options.multitouch = false;
  }
  if (!i.options.multitouch) {
    i.options.maxNumberOfNipples = 1;
  }
  const n = getComputedStyle(i.options.zone.parentElement);
  if (n && n.display === "flex") {
    i.parentIsFlex = true;
  }
  i.updateBox();
  i.prepareNipples();
  i.bindings();
  i.begin();
  return i.nipples;
}
ke.prototype = new dt();
ke.constructor = ke;
ke.id = 0;
ke.prototype.prepareNipples = function () {
  var e = this;
  var t = e.nipples;
  t.on = e.on.bind(e);
  t.off = e.off.bind(e);
  t.options = e.options;
  t.destroy = e.destroy.bind(e);
  t.ids = e.ids;
  t.id = e.id;
  t.processOnMove = e.processOnMove.bind(e);
  t.processOnEnd = e.processOnEnd.bind(e);
  t.get = function (i) {
    if (i === undefined) {
      return t[0];
    }
    for (var n = 0, s = t.length; n < s; n += 1) {
      if (t[n].identifier === i) {
        return t[n];
      }
    }
    return false;
  };
};
ke.prototype.bindings = function () {
  var e = this;
  e.bindEvt(e.options.zone, "start");
  e.options.zone.style.touchAction = "none";
  e.options.zone.style.msTouchAction = "none";
};
ke.prototype.begin = function () {
  var e = this;
  var t = e.options;
  if (t.mode === "static") {
    var i = e.createNipple(t.position, e.manager.getIdentifier());
    i.add();
    e.idles.push(i);
  }
};
ke.prototype.createNipple = function (e, t) {
  var i = this;
  var n = i.manager.scroll;
  var s = {};
  var r = i.options;
  var o = {
    x: i.parentIsFlex ? n.x : n.x + i.box.left,
    y: i.parentIsFlex ? n.y : n.y + i.box.top
  };
  if (e.x && e.y) {
    s = {
      x: e.x - o.x,
      y: e.y - o.y
    };
  } else if (e.top || e.right || e.bottom || e.left) {
    var l = document.createElement("DIV");
    l.style.display = "hidden";
    l.style.top = e.top;
    l.style.right = e.right;
    l.style.bottom = e.bottom;
    l.style.left = e.left;
    l.style.position = "absolute";
    r.zone.appendChild(l);
    var c = l.getBoundingClientRect();
    r.zone.removeChild(l);
    s = e;
    e = {
      x: c.left + n.x,
      y: c.top + n.y
    };
  }
  var a = new Ee(i, {
    color: r.color,
    size: r.size,
    threshold: r.threshold,
    fadeTime: r.fadeTime,
    dataOnly: r.dataOnly,
    restJoystick: r.restJoystick,
    restOpacity: r.restOpacity,
    mode: r.mode,
    identifier: t,
    position: e,
    zone: r.zone,
    frontPosition: {
      x: 0,
      y: 0
    },
    shape: r.shape
  });
  if (!r.dataOnly) {
    Wr(a.ui.el, s);
    Wr(a.ui.front, a.frontPosition);
  }
  i.nipples.push(a);
  i.trigger("added " + a.identifier + ":added", a);
  i.manager.trigger("added " + a.identifier + ":added", a);
  i.bindNipple(a);
  return a;
};
ke.prototype.updateBox = function () {
  var e = this;
  e.box = e.options.zone.getBoundingClientRect();
};
ke.prototype.bindNipple = function (e) {
  var t = this;
  var i;
  function n(s, r) {
    i = s.type + " " + r.id + ":" + s.type;
    t.trigger(i, r);
  }
  e.on("destroyed", t.onDestroyed.bind(t));
  e.on("shown hidden rested dir plain", n);
  e.on("dir:up dir:right dir:down dir:left", n);
  e.on("plain:up plain:right plain:down plain:left", n);
};
ke.prototype.pressureFn = function (e, t, i) {
  var n = this;
  var s = 0;
  clearInterval(n.pressureIntervals[i]);
  n.pressureIntervals[i] = // TOLOOK
  setInterval(function () {
    var r = e.force || e.pressure || e.webkitForce || 0;
    if (r !== s) {
      t.trigger("pressure", r);
      n.trigger("pressure " + t.identifier + ":pressure", r);
      s = r;
    }
  }.bind(n), 100);
};
ke.prototype.onstart = function (e) {
  var t = this;
  var i = t.options;
  var n = e;
  e = fa(e);
  t.updateBox();
  function s(r) {
    if (t.actives.length < i.maxNumberOfNipples) {
      t.processOnStart(r);
    } else if (n.type.match(/^touch/)) {
      Object.keys(t.manager.ids).forEach(function (o) {
        if (Object.values(n.touches).findIndex(function (c) {
          return c.identifier === o;
        }) < 0) {
          var l = [e[0]];
          l.identifier = o;
          t.processOnEnd(l);
        }
      });
      if (t.actives.length < i.maxNumberOfNipples) {
        t.processOnStart(r);
      }
    }
  }
  Ps(e, s);
  t.manager.bindDocument();
  return false;
};
ke.prototype.processOnStart = function (e) {
  var t = this;
  var i = t.options;
  var n;
  var s = t.manager.getIdentifier(e);
  var r = e.force || e.pressure || e.webkitForce || 0;
  var o = {
    x: e.pageX,
    y: e.pageY
  };
  var l = t.getOrCreate(s, o);
  if (l.identifier !== s) {
    t.manager.removeIdentifier(l.identifier);
  }
  l.identifier = s;
  function c(f) {
    f.trigger("start", f);
    t.trigger("start " + f.id + ":start", f);
    f.show();
    if (r > 0) {
      t.pressureFn(e, f, f.identifier);
    }
    t.processOnMove(e);
  }
  if ((n = t.idles.indexOf(l)) >= 0) {
    t.idles.splice(n, 1);
  }
  t.actives.push(l);
  t.ids.push(l.identifier);
  if (i.mode !== "semi") {
    c(l);
  } else {
    var a = hn(o, l.position);
    if (a <= i.catchDistance) {
      c(l);
    } else {
      l.destroy();
      t.processOnStart(e);
      return;
    }
  }
  return l;
};
ke.prototype.getOrCreate = function (e, t) {
  var i = this;
  var n = i.options;
  var s;
  if (/(semi|static)/.test(n.mode)) {
    s = i.idles[0];
    if (s) {
      i.idles.splice(0, 1);
      return s;
    } else if (n.mode === "semi") {
      return i.createNipple(t, e);
    } else {
      console.warn("Coudln't find the needed nipple.");
      return false;
    }
  } else {
    s = i.createNipple(t, e);
    return s;
  }
};
ke.prototype.processOnMove = function (e) {
  var t = this;
  var i = t.options;
  var n = t.manager.getIdentifier(e);
  var s = t.nipples.get(n);
  var r = t.manager.scroll;
  if (!Du(e)) {
    this.processOnEnd(e);
    return;
  }
  if (!s) {
    console.error("Found zombie joystick with ID " + n);
    t.manager.removeIdentifier(n);
    return;
  }
  if (i.dynamicPage) {
    var o = s.el.getBoundingClientRect();
    s.position = {
      x: r.x + o.left,
      y: r.y + o.top
    };
  }
  s.identifier = n;
  var l = s.options.size / 2;
  var c = {
    x: e.pageX,
    y: e.pageY
  };
  if (i.lockX) {
    c.y = s.position.y;
  }
  if (i.lockY) {
    c.x = s.position.x;
  }
  var a = hn(c, s.position);
  var f = $u(c, s.position);
  var d = Cs(f);
  var u = a / l;
  var p = {
    distance: a,
    position: c
  };
  var w;
  var x;
  if (s.options.shape === "circle") {
    w = Math.min(a, l);
    x = Ru(s.position, w, f);
  } else {
    x = zu(c, s.position, l);
    w = hn(x, s.position);
  }
  if (i.follow) {
    if (a > l) {
      let S = c.x - x.x;
      let R = c.y - x.y;
      s.position.x += S;
      s.position.y += R;
      s.el.style.top = s.position.y - (t.box.top + r.y) + "px";
      s.el.style.left = s.position.x - (t.box.left + r.x) + "px";
      a = hn(c, s.position);
    }
  } else {
    c = x;
    a = w;
  }
  var b = c.x - s.position.x;
  var $ = c.y - s.position.y;
  s.frontPosition = {
    x: b,
    y: $
  };
  if (!i.dataOnly) {
    s.ui.front.style.transform = "translate(" + b + "px," + $ + "px)";
  }
  var v = {
    identifier: s.identifier,
    position: c,
    force: u,
    pressure: e.force || e.pressure || e.webkitForce || 0,
    distance: a,
    angle: {
      radian: d,
      degree: f
    },
    vector: {
      x: b / l,
      y: -$ / l
    },
    raw: p,
    instance: s,
    lockX: i.lockX,
    lockY: i.lockY
  };
  v = s.computeDirection(v);
  v.angle = {
    radian: Cs(180 - f),
    degree: 180 - f
  };
  s.trigger("move", v);
  t.trigger("move " + s.id + ":move", v);
};
ke.prototype.processOnEnd = function (e) {
  var t = this;
  var i = t.options;
  var n = t.manager.getIdentifier(e);
  var s = t.nipples.get(n);
  var r = t.manager.removeIdentifier(s.identifier);
  if (s) {
    if (!i.dataOnly) {
      s.hide(function () {
        if (i.mode === "dynamic") {
          s.trigger("removed", s);
          t.trigger("removed " + s.id + ":removed", s);
          t.manager.trigger("removed " + s.id + ":removed", s);
          s.destroy();
        }
      });
    }
    clearInterval(t.pressureIntervals[s.identifier]);
    s.resetDirection();
    s.trigger("end", s);
    t.trigger("end " + s.id + ":end", s);
    if (t.ids.indexOf(s.identifier) >= 0) {
      t.ids.splice(t.ids.indexOf(s.identifier), 1);
    }
    if (t.actives.indexOf(s) >= 0) {
      t.actives.splice(t.actives.indexOf(s), 1);
    }
    if (/(semi|static)/.test(i.mode)) {
      t.idles.push(s);
    } else if (t.nipples.indexOf(s) >= 0) {
      t.nipples.splice(t.nipples.indexOf(s), 1);
    }
    t.manager.unbindDocument();
    if (/(semi|static)/.test(i.mode)) {
      t.manager.ids[r.id] = r.identifier;
    }
  }
};
ke.prototype.onDestroyed = function (e, t) {
  var i = this;
  if (i.nipples.indexOf(t) >= 0) {
    i.nipples.splice(i.nipples.indexOf(t), 1);
  }
  if (i.actives.indexOf(t) >= 0) {
    i.actives.splice(i.actives.indexOf(t), 1);
  }
  if (i.idles.indexOf(t) >= 0) {
    i.idles.splice(i.idles.indexOf(t), 1);
  }
  if (i.ids.indexOf(t.identifier) >= 0) {
    i.ids.splice(i.ids.indexOf(t.identifier), 1);
  }
  i.manager.removeIdentifier(t.identifier);
  i.manager.unbindDocument();
};
ke.prototype.destroy = function () {
  var e = this;
  e.unbindEvt(e.options.zone, "start");
  e.nipples.forEach(function (i) {
    i.destroy();
  });
  for (var t in e.pressureIntervals) {
    if (e.pressureIntervals.hasOwnProperty(t)) {
      clearInterval(e.pressureIntervals[t]);
    }
  }
  e.trigger("destroyed", e.nipples);
  e.manager.unbindDocument();
  e.off();
};
function Re(e) {
  var t = this;
  t.ids = {};
  t.index = 0;
  t.collections = [];
  t.scroll = Ur();
  t.config(e);
  t.prepareCollections();
  function i() {
    var s;
    t.collections.forEach(function (r) {
      r.forEach(function (o) {
        s = o.el.getBoundingClientRect();
        o.position = {
          x: t.scroll.x + s.left,
          y: t.scroll.y + s.top
        };
      });
    });
  }
  wn(window, "resize", function () {
    Vr(i);
  });
  function n() {
    t.scroll = Ur();
  }
  wn(window, "scroll", function () {
    Vr(n);
  });
  return t.collections;
}
Re.prototype = new dt();
Re.constructor = Re;
Re.prototype.prepareCollections = function () {
  var e = this;
  e.collections.create = e.create.bind(e);
  e.collections.on = e.on.bind(e);
  e.collections.off = e.off.bind(e);
  e.collections.destroy = e.destroy.bind(e);
  e.collections.get = function (t) {
    var i;
    e.collections.every(function (n) {
      i = n.get(t);
      return !i;
    });
    return i;
  };
};
Re.prototype.create = function (e) {
  return this.createCollection(e);
};
Re.prototype.createCollection = function (e) {
  var t = this;
  var i = new ke(t, e);
  t.bindCollection(i);
  t.collections.push(i);
  return i;
};
Re.prototype.bindCollection = function (e) {
  var t = this;
  var i;
  function n(s, r) {
    i = s.type + " " + r.id + ":" + s.type;
    t.trigger(i, r);
  }
  e.on("destroyed", t.onDestroyed.bind(t));
  e.on("shown hidden rested dir plain", n);
  e.on("dir:up dir:right dir:down dir:left", n);
  e.on("plain:up plain:right plain:down plain:left", n);
};
Re.prototype.bindDocument = function () {
  var e = this;
  if (!e.binded) {
    e.bindEvt(document, "move").bindEvt(document, "end");
    e.binded = true;
  }
};
Re.prototype.unbindDocument = function (e) {
  var t = this;
  if (!Object.keys(t.ids).length || e === true) {
    t.unbindEvt(document, "move").unbindEvt(document, "end");
    t.binded = false;
  }
};
Re.prototype.getIdentifier = function (e) {
  var t;
  if (e) {
    t = e.identifier === undefined ? e.pointerId : e.identifier;
    if (t === undefined) {
      t = this.latest || 0;
    }
  } else {
    t = this.index;
  }
  if (this.ids[t] === undefined) {
    this.ids[t] = this.index;
    this.index += 1;
  }
  this.latest = t;
  return this.ids[t];
};
Re.prototype.removeIdentifier = function (e) {
  var t = {};
  for (var i in this.ids) {
    if (this.ids[i] === e) {
      t.id = i;
      t.identifier = this.ids[i];
      delete this.ids[i];
      break;
    }
  }
  return t;
};
Re.prototype.onmove = function (e) {
  var t = this;
  t.onAny("move", e);
  return false;
};
Re.prototype.onend = function (e) {
  var t = this;
  t.onAny("end", e);
  return false;
};
Re.prototype.oncancel = function (e) {
  var t = this;
  t.onAny("end", e);
  return false;
};
Re.prototype.onAny = function (e, t) {
  var i = this;
  var n;
  var s = "processOn" + e.charAt(0).toUpperCase() + e.slice(1);
  t = fa(t);
  function r(l, c, a) {
    if (a.ids.indexOf(c) >= 0) {
      a[s](l);
      l._found_ = true;
    }
  }
  function o(l) {
    n = i.getIdentifier(l);
    Ps(i.collections, r.bind(null, l, n));
    if (!l._found_) {
      i.removeIdentifier(n);
    }
  }
  Ps(t, o);
  return false;
};
Re.prototype.destroy = function () {
  var e = this;
  e.unbindDocument(true);
  e.ids = {};
  e.index = 0;
  e.collections.forEach(function (t) {
    t.destroy();
  });
  e.off();
};
Re.prototype.onDestroyed = function (e, t) {
  var i = this;
  if (i.collections.indexOf(t) < 0) {
    return false;
  }
  i.collections.splice(i.collections.indexOf(t), 1);
};
const Xr = new Re();
const qr = {
  create: function (e) {
    return Xr.create(e);
  },
  factory: Xr
};
let Gr = false;
const Fu = e => {
  if (Gr) {
    return;
  }
  Gr = true;
  const t = document.getElementById("touch-controls-left");
  const i = qr.create({
    zone: t
  });
  i.on("start", e.onStartMoving);
  i.on("end", e.onStopMoving);
  i.on("move", e.onRotateMoving);
  const n = document.getElementById("touch-controls-right");
  const s = qr.create({
    zone: n
  });
  s.on("start", e.onStartAttacking);
  s.on("end", e.onStopAttacking);
  s.on("move", e.onRotateAttacking);
  t.style.display = "block";
  n.style.display = "block";
};
const Vu = {
  enable: Fu
};
var Nu = Object.defineProperty;
var Uu = (e, t, i) => t in e ? Nu(e, t, {
  enumerable: true,
  configurable: true,
  writable: true,
  value: i
}) : e[t] = i;
var Ge = (e, t, i) => Uu(e, typeof t != "symbol" ? t + "" : t, i);
const pa = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IGY9bmV3IFRleHRFbmNvZGVyO2Z1bmN0aW9uIHAoZSl7cmV0dXJuWy4uLm5ldyBVaW50OEFycmF5KGUpXS5tYXAodD0+dC50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKS5qb2luKCIiKX1hc3luYyBmdW5jdGlvbiB3KGUsdCxyKXtyZXR1cm4gcChhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdChyLnRvVXBwZXJDYXNlKCksZi5lbmNvZGUoZSt0KSkpfWZ1bmN0aW9uIGIoZSx0LHI9IlNIQS0yNTYiLG49MWU2LHM9MCl7Y29uc3Qgbz1uZXcgQWJvcnRDb250cm9sbGVyLGE9RGF0ZS5ub3coKTtyZXR1cm57cHJvbWlzZTooYXN5bmMoKT0+e2ZvcihsZXQgYz1zO2M8PW47Yys9MSl7aWYoby5zaWduYWwuYWJvcnRlZClyZXR1cm4gbnVsbDtpZihhd2FpdCB3KHQsYyxyKT09PWUpcmV0dXJue251bWJlcjpjLHRvb2s6RGF0ZS5ub3coKS1hfX1yZXR1cm4gbnVsbH0pKCksY29udHJvbGxlcjpvfX1mdW5jdGlvbiBoKGUpe2NvbnN0IHQ9YXRvYihlKSxyPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylyW25dPXQuY2hhckNvZGVBdChuKTtyZXR1cm4gcn1mdW5jdGlvbiBnKGUsdD0xMil7Y29uc3Qgcj1uZXcgVWludDhBcnJheSh0KTtmb3IobGV0IG49MDtuPHQ7bisrKXJbbl09ZSUyNTYsZT1NYXRoLmZsb29yKGUvMjU2KTtyZXR1cm4gcn1hc3luYyBmdW5jdGlvbiBtKGUsdD0iIixyPTFlNixuPTApe2NvbnN0IHM9IkFFUy1HQ00iLG89bmV3IEFib3J0Q29udHJvbGxlcixhPURhdGUubm93KCksbD1hc3luYygpPT57Zm9yKGxldCB1PW47dTw9cjt1Kz0xKXtpZihvLnNpZ25hbC5hYm9ydGVkfHwhY3x8IXkpcmV0dXJuIG51bGw7dHJ5e2NvbnN0IGQ9YXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOnMsaXY6Zyh1KX0sYyx5KTtpZihkKXJldHVybntjbGVhclRleHQ6bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGQpLHRvb2s6RGF0ZS5ub3coKS1hfX1jYXRjaHt9fXJldHVybiBudWxsfTtsZXQgYz1udWxsLHk9bnVsbDt0cnl7eT1oKGUpO2NvbnN0IHU9YXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLGYuZW5jb2RlKHQpKTtjPWF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHUscywhMSxbImRlY3J5cHQiXSl9Y2F0Y2h7cmV0dXJue3Byb21pc2U6UHJvbWlzZS5yZWplY3QoKSxjb250cm9sbGVyOm99fXJldHVybntwcm9taXNlOmwoKSxjb250cm9sbGVyOm99fWxldCBpO29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3R7dHlwZTp0LHBheWxvYWQ6cixzdGFydDpuLG1heDpzfT1lLmRhdGE7bGV0IG89bnVsbDtpZih0PT09ImFib3J0IilpPT1udWxsfHxpLmFib3J0KCksaT12b2lkIDA7ZWxzZSBpZih0PT09IndvcmsiKXtpZigib2JmdXNjYXRlZCJpbiByKXtjb25zdHtrZXk6YSxvYmZ1c2NhdGVkOmx9PXJ8fHt9O289YXdhaXQgbShsLGEscyxuKX1lbHNle2NvbnN0e2FsZ29yaXRobTphLGNoYWxsZW5nZTpsLHNhbHQ6Y309cnx8e307bz1iKGwsYyxhLHMsbil9aT1vLmNvbnRyb2xsZXIsby5wcm9taXNlLnRoZW4oYT0+e3NlbGYucG9zdE1lc3NhZ2UoYSYmey4uLmEsd29ya2VyOiEwfSl9KX19fSkoKTsK";
const Wu = e => Uint8Array.from(atob(e), t => t.charCodeAt(0));
const Yr = typeof self !== "undefined" && self.Blob && new Blob([Wu(pa)], {
  type: "text/javascript;charset=utf-8"
});
function Xu(e) {
  let t;
  try {
    t = Yr && (self.URL || self.webkitURL).createObjectURL(Yr);
    if (!t) {
      throw "";
    }
    const i = new Worker(t, {
      name: e == null ? undefined : e.name
    });
    i.addEventListener("error", () => {
      (self.URL || self.webkitURL).revokeObjectURL(t);
    });
    return i;
  } catch {
    return new Worker("data:text/javascript;base64," + pa, {
      name: e == null ? undefined : e.name
    });
  } finally {
    if (t) {
      (self.URL || self.webkitURL).revokeObjectURL(t);
    }
  }
}
function vn() {}
function qu(e, t) {
  for (const i in t) {
    e[i] = t[i];
  }
  return e;
}
function ma(e) {
  return e();
}
function Kr() {
  return Object.create(null);
}
function Ji(e) {
  e.forEach(ma);
}
function ga(e) {
  return typeof e == "function";
}
function Gu(e, t) {
  if (e != e) {
    return t == t;
  } else {
    return e !== t || e && typeof e == "object" || typeof e == "function";
  }
}
function Yu(e) {
  return Object.keys(e).length === 0;
}
function Ku(e, t, i, n) {
  if (e) {
    const s = ya(e, t, i, n);
    return e[0](s);
  }
}
function ya(e, t, i, n) {
  if (e[1] && n) {
    return qu(i.ctx.slice(), e[1](n(t)));
  } else {
    return i.ctx;
  }
}
function Zu(e, t, i, n) {
  if (e[2] && n) {
    const s = e[2](n(i));
    if (t.dirty === undefined) {
      return s;
    }
    if (typeof s == "object") {
      const r = [];
      const o = Math.max(t.dirty.length, s.length);
      for (let l = 0; l < o; l += 1) {
        r[l] = t.dirty[l] | s[l];
      }
      return r;
    }
    return t.dirty | s;
  }
  return t.dirty;
}
function Ju(e, t, i, n, s, r) {
  if (s) {
    const o = ya(t, i, n, r);
    e.p(o, s);
  }
}
function Qu(e) {
  if (e.ctx.length > 32) {
    const t = [];
    const i = e.ctx.length / 32;
    for (let n = 0; n < i; n++) {
      t[n] = -1;
    }
    return t;
  }
  return -1;
}
function we(e, t) {
  e.appendChild(t);
}
function ju(e, t, i) {
  const n = ef(e);
  if (!n.getElementById(t)) {
    const s = Me("style");
    s.id = t;
    s.textContent = i;
    tf(n, s);
  }
}
function ef(e) {
  if (!e) {
    return document;
  }
  const t = e.getRootNode ? e.getRootNode() : e.ownerDocument;
  if (t && t.host) {
    return t;
  } else {
    return e.ownerDocument;
  }
}
function tf(e, t) {
  we(e.head || e, t);
  return t.sheet;
}
function He(e, t, i) {
  e.insertBefore(t, i || null);
}
function _e(e) {
  if (e.parentNode) {
    e.parentNode.removeChild(e);
  }
}
function Me(e) {
  return document.createElement(e);
}
function ht(e) {
  return document.createElementNS("http://www.w3.org/2000/svg", e);
}
function nf(e) {
  return document.createTextNode(e);
}
function rt() {
  return nf(" ");
}
function ls(e, t, i, n) {
  e.addEventListener(t, i, n);
  return () => e.removeEventListener(t, i, n);
}
function H(e, t, i) {
  if (i == null) {
    e.removeAttribute(t);
  } else if (e.getAttribute(t) !== i) {
    e.setAttribute(t, i);
  }
}
function sf(e) {
  return Array.from(e.childNodes);
}
function Zr(e, t, i) {
  e.classList.toggle(t, !!i);
}
function rf(e, t, {
  bubbles: i = false,
  cancelable: n = false
} = {}) {
  return new CustomEvent(e, {
    detail: t,
    bubbles: i,
    cancelable: n
  });
}
function of(e) {
  const t = {};
  e.childNodes.forEach(i => {
    t[i.slot || "default"] = true;
  });
  return t;
}
let Xi;
function zi(e) {
  Xi = e;
}
function ir() {
  if (!Xi) {
    throw new Error("Function called outside component initialization");
  }
  return Xi;
}
function af(e) {
  ir().$$.on_mount.push(e);
}
function lf(e) {
  ir().$$.on_destroy.push(e);
}
function cf() {
  const e = ir();
  return (t, i, {
    cancelable: n = false
  } = {}) => {
    const s = e.$$.callbacks[t];
    if (s) {
      const r = rf(t, i, {
        cancelable: n
      });
      s.slice().forEach(o => {
        o.call(e, r);
      });
      return !r.defaultPrevented;
    }
    return true;
  };
}
const Qt = [];
const kn = [];
let ci = [];
const Jr = [];
const wa = Promise.resolve();
let $s = false;
function va() {
  if (!$s) {
    $s = true;
    wa.then(ce);
  }
}
function hf() {
  va();
  return wa;
}
function Rs(e) {
  ci.push(e);
}
const cs = new Set();
let Xt = 0;
function ce() {
  if (Xt !== 0) {
    return;
  }
  const e = Xi;
  do {
    try {
      for (; Xt < Qt.length;) {
        const t = Qt[Xt];
        Xt++;
        zi(t);
        uf(t.$$);
      }
    } catch (t) {
      Qt.length = 0;
      Xt = 0;
      throw t;
    }
    zi(null);
    Qt.length = 0;
    Xt = 0;
    for (; kn.length;) {
      kn.pop()();
    }
    for (let t = 0; t < ci.length; t += 1) {
      const i = ci[t];
      if (!cs.has(i)) {
        cs.add(i);
        i();
      }
    }
    ci.length = 0;
  } while (Qt.length);
  for (; Jr.length;) {
    Jr.pop()();
  }
  $s = false;
  cs.clear();
  zi(e);
}
function uf(e) {
  if (e.fragment !== null) {
    e.update();
    Ji(e.before_update);
    const t = e.dirty;
    e.dirty = [-1];
    if (e.fragment) {
      e.fragment.p(e.ctx, t);
    }
    e.after_update.forEach(Rs);
  }
}
function ff(e) {
  const t = [];
  const i = [];
  ci.forEach(n => e.indexOf(n) === -1 ? t.push(n) : i.push(n));
  i.forEach(n => n());
  ci = t;
}
const un = new Set();
let df;
function ka(e, t) {
  if (e && e.i) {
    un.delete(e);
    e.i(t);
  }
}
function pf(e, t, i, n) {
  if (e && e.o) {
    if (un.has(e)) {
      return;
    }
    un.add(e);
    df.c.push(() => {
      un.delete(e);
    });
    e.o(t);
  }
}
function mf(e, t, i) {
  const {
    fragment: n,
    after_update: s
  } = e.$$;
  if (n) {
    n.m(t, i);
  }
  Rs(() => {
    const r = e.$$.on_mount.map(ma).filter(ga);
    if (e.$$.on_destroy) {
      e.$$.on_destroy.push(...r);
    } else {
      Ji(r);
    }
    e.$$.on_mount = [];
  });
  s.forEach(Rs);
}
function gf(e, t) {
  const i = e.$$;
  if (i.fragment !== null) {
    ff(i.after_update);
    Ji(i.on_destroy);
    if (i.fragment) {
      i.fragment.d(t);
    }
    i.on_destroy = i.fragment = null;
    i.ctx = [];
  }
}
function yf(e, t) {
  if (e.$$.dirty[0] === -1) {
    Qt.push(e);
    va();
    e.$$.dirty.fill(0);
  }
  e.$$.dirty[t / 31 | 0] |= 1 << t % 31;
}
function wf(e, t, i, n, s, r, o = null, l = [-1]) {
  const c = Xi;
  zi(e);
  const a = e.$$ = {
    fragment: null,
    ctx: [],
    props: r,
    update: vn,
    not_equal: s,
    bound: Kr(),
    on_mount: [],
    on_destroy: [],
    on_disconnect: [],
    before_update: [],
    after_update: [],
    context: new Map(t.context || (c ? c.$$.context : [])),
    callbacks: Kr(),
    dirty: l,
    skip_bound: false,
    root: t.target || c.$$.root
  };
  if (o) {
    o(a.root);
  }
  let f = false;
  a.ctx = i ? i(e, t.props || {}, (d, u, ...p) => {
    const w = p.length ? p[0] : u;
    if (a.ctx && s(a.ctx[d], a.ctx[d] = w)) {
      if (!a.skip_bound && a.bound[d]) {
        a.bound[d](w);
      }
      if (f) {
        yf(e, d);
      }
    }
    return u;
  }) : [];
  a.update();
  f = true;
  Ji(a.before_update);
  a.fragment = n ? n(a.ctx) : false;
  if (t.target) {
    if (t.hydrate) {
      const d = sf(t.target);
      if (a.fragment) {
        a.fragment.l(d);
      }
      d.forEach(_e);
    } else if (a.fragment) {
      a.fragment.c();
    }
    if (t.intro) {
      ka(e.$$.fragment);
    }
    mf(e, t.target, t.anchor);
    ce();
  }
  zi(c);
}
let xa;
if (typeof HTMLElement == "function") {
  xa = class extends HTMLElement {
    constructor(e, t, i) {
      super();
      Ge(this, "$$ctor");
      Ge(this, "$$s");
      Ge(this, "$$c");
      Ge(this, "$$cn", false);
      Ge(this, "$$d", {});
      Ge(this, "$$r", false);
      Ge(this, "$$p_d", {});
      Ge(this, "$$l", {});
      Ge(this, "$$l_u", new Map());
      this.$$ctor = e;
      this.$$s = t;
      if (i) {
        this.attachShadow({
          mode: "open"
        });
      }
    }
    addEventListener(e, t, i) {
      this.$$l[e] = this.$$l[e] || [];
      this.$$l[e].push(t);
      if (this.$$c) {
        const n = this.$$c.$on(e, t);
        this.$$l_u.set(t, n);
      }
      super.addEventListener(e, t, i);
    }
    removeEventListener(e, t, i) {
      super.removeEventListener(e, t, i);
      if (this.$$c) {
        const n = this.$$l_u.get(t);
        if (n) {
          n();
          this.$$l_u.delete(t);
        }
      }
      if (this.$$l[e]) {
        const n = this.$$l[e].indexOf(t);
        if (n >= 0) {
          this.$$l[e].splice(n, 1);
        }
      }
    }
    async connectedCallback() {
      this.$$cn = true;
      if (!this.$$c) {
        let e = function (s) {
          return () => {
            let r;
            return {
              c: function () {
                r = Me("slot");
                if (s !== "default") {
                  H(r, "name", s);
                }
              },
              m: function (o, l) {
                He(o, r, l);
              },
              d: function (o) {
                if (o) {
                  _e(r);
                }
              }
            };
          };
        };
        await Promise.resolve();
        if (!this.$$cn || this.$$c) {
          return;
        }
        const t = {};
        const i = of(this);
        for (const s of this.$$s) {
          if (s in i) {
            t[s] = [e(s)];
          }
        }
        for (const s of this.attributes) {
          const r = this.$$g_p(s.name);
          if (!(r in this.$$d)) {
            this.$$d[r] = fn(r, s.value, this.$$p_d, "toProp");
          }
        }
        for (const s in this.$$p_d) {
          if (!(s in this.$$d) && this[s] !== undefined) {
            this.$$d[s] = this[s];
            delete this[s];
          }
        }
        this.$$c = new this.$$ctor({
          target: this.shadowRoot || this,
          props: {
            ...this.$$d,
            $$slots: t,
            $$scope: {
              ctx: []
            }
          }
        });
        const n = () => {
          this.$$r = true;
          for (const s in this.$$p_d) {
            this.$$d[s] = this.$$c.$$.ctx[this.$$c.$$.props[s]];
            if (this.$$p_d[s].reflect) {
              const r = fn(s, this.$$d[s], this.$$p_d, "toAttribute");
              if (r == null) {
                this.removeAttribute(this.$$p_d[s].attribute || s);
              } else {
                this.setAttribute(this.$$p_d[s].attribute || s, r);
              }
            }
          }
          this.$$r = false;
        };
        this.$$c.$$.after_update.push(n);
        n();
        for (const s in this.$$l) {
          for (const r of this.$$l[s]) {
            const o = this.$$c.$on(s, r);
            this.$$l_u.set(r, o);
          }
        }
        this.$$l = {};
      }
    }
    attributeChangedCallback(e, t, i) {
      var n;
      if (!this.$$r) {
        e = this.$$g_p(e);
        this.$$d[e] = fn(e, i, this.$$p_d, "toProp");
        if (!((n = this.$$c) == null)) {
          n.$set({
            [e]: this.$$d[e]
          });
        }
      }
    }
    disconnectedCallback() {
      this.$$cn = false;
      Promise.resolve().then(() => {
        if (!this.$$cn && this.$$c) {
          this.$$c.$destroy();
          this.$$c = undefined;
        }
      });
    }
    $$g_p(e) {
      return Object.keys(this.$$p_d).find(t => this.$$p_d[t].attribute === e || !this.$$p_d[t].attribute && t.toLowerCase() === e) || e;
    }
  };
}
function fn(e, t, i, n) {
  var s;
  const r = (s = i[e]) == null ? undefined : s.type;
  t = r === "Boolean" && typeof t != "boolean" ? t != null : t;
  if (!n || !i[e]) {
    return t;
  }
  if (n === "toAttribute") {
    switch (r) {
      case "Object":
      case "Array":
        if (t == null) {
          return null;
        } else {
          return JSON.stringify(t);
        }
      case "Boolean":
        if (t) {
          return "";
        } else {
          return null;
        }
      case "Number":
        return t ?? null;
      default:
        return t;
    }
  } else {
    switch (r) {
      case "Object":
      case "Array":
        return t && JSON.parse(t);
      case "Boolean":
        return t;
      case "Number":
        if (t != null) {
          return +t;
        } else {
          return t;
        }
      default:
        return t;
    }
  }
}
function vf(e, t, i, n, s, r) {
  let o = class extends xa {
    constructor() {
      super(e, i, s);
      this.$$p_d = t;
    }
    static get observedAttributes() {
      return Object.keys(t).map(l => (t[l].attribute || l).toLowerCase());
    }
  };
  Object.keys(t).forEach(l => {
    Object.defineProperty(o.prototype, l, {
      get() {
        if (this.$$c && l in this.$$c) {
          return this.$$c[l];
        } else {
          return this.$$d[l];
        }
      },
      set(c) {
        var a;
        c = fn(l, c, t);
        this.$$d[l] = c;
        if (!((a = this.$$c) == null)) {
          a.$set({
            [l]: c
          });
        }
      }
    });
  });
  n.forEach(l => {
    Object.defineProperty(o.prototype, l, {
      get() {
        var c;
        if ((c = this.$$c) == null) {
          return undefined;
        } else {
          return c[l];
        }
      }
    });
  });
  e.element = o;
  return o;
}
class kf {
  constructor() {
    Ge(this, "$$");
    Ge(this, "$$set");
  }
  $destroy() {
    gf(this, 1);
    this.$destroy = vn;
  }
  $on(t, i) {
    if (!ga(i)) {
      return vn;
    }
    const n = this.$$.callbacks[t] || (this.$$.callbacks[t] = []);
    n.push(i);
    return () => {
      const s = n.indexOf(i);
      if (s !== -1) {
        n.splice(s, 1);
      }
    };
  }
  $set(t) {
    if (this.$$set && !Yu(t)) {
      this.$$.skip_bound = true;
      this.$$set(t);
      this.$$.skip_bound = false;
    }
  }
}
const xf = "4";
if (typeof window !== "undefined") {
  (window.__svelte || (window.__svelte = {
    v: new Set()
  })).v.add(xf);
}
const ba = new TextEncoder();
function bf(e) {
  return [...new Uint8Array(e)].map(t => t.toString(16).padStart(2, "0")).join("");
}
async function Sf(e, t = "SHA-256", i = 100000) {
  const n = Date.now().toString(16);
  if (!e) {
    e = Math.round(Math.random() * i);
  }
  const s = await Sa(n, e, t);
  return {
    algorithm: t,
    challenge: s,
    salt: n,
    signature: ""
  };
}
async function Sa(e, t, i) {
  return bf(await crypto.subtle.digest(i.toUpperCase(), ba.encode(e + t)));
}
function If(e, t, i = "SHA-256", n = 1000000, s = 0) {
  const r = new AbortController();
  const o = Date.now();
  return {
    promise: (async () => {
      for (let l = s; l <= n; l += 1) {
        if (r.signal.aborted) {
          return null;
        }
        if ((await Sa(t, l, i)) === e) {
          return {
            number: l,
            took: Date.now() - o
          };
        }
      }
      return null;
    })(),
    controller: r
  };
}
function Tf() {
  try {
    return Intl.DateTimeFormat().resolvedOptions().timeZone;
  } catch {}
}
function Mf(e) {
  const t = atob(e);
  const i = new Uint8Array(t.length);
  for (let n = 0; n < t.length; n++) {
    i[n] = t.charCodeAt(n);
  }
  return i;
}
function Ef(e, t = 12) {
  const i = new Uint8Array(t);
  for (let n = 0; n < t; n++) {
    i[n] = e % 256;
    e = Math.floor(e / 256);
  }
  return i;
}
async function Cf(e, t = "", i = 1000000, n = 0) {
  const s = "AES-GCM";
  const r = new AbortController();
  const o = Date.now();
  const l = async () => {
    for (let f = n; f <= i; f += 1) {
      if (r.signal.aborted || !c || !a) {
        return null;
      }
      try {
        const d = await crypto.subtle.decrypt({
          name: s,
          iv: Ef(f)
        }, c, a);
        if (d) {
          return {
            clearText: new TextDecoder().decode(d),
            took: Date.now() - o
          };
        }
      } catch {}
    }
    return null;
  };
  let c = null;
  let a = null;
  try {
    a = Mf(e);
    const f = await crypto.subtle.digest("SHA-256", ba.encode(t));
    c = await crypto.subtle.importKey("raw", f, s, false, ["decrypt"]);
  } catch {
    return {
      promise: Promise.reject(),
      controller: r
    };
  }
  return {
    promise: l(),
    controller: r
  };
}
var Q = (e => {
  e.ERROR = "error";
  e.VERIFIED = "verified";
  e.VERIFYING = "verifying";
  e.UNVERIFIED = "unverified";
  e.EXPIRED = "expired";
  return e;
})(Q || {});
function Pf(e) {
  ju(e, "svelte-ddsc3z", ".altcha.svelte-ddsc3z.svelte-ddsc3z{background:var(--altcha-color-base, transparent);border:var(--altcha-border-width, 1px) solid var(--altcha-color-border, #a0a0a0);border-radius:var(--altcha-border-radius, 3px);color:var(--altcha-color-text, currentColor);display:flex;flex-direction:column;max-width:var(--altcha-max-width, 260px);position:relative;text-align:left}.altcha.svelte-ddsc3z.svelte-ddsc3z:focus-within{border-color:var(--altcha-color-border-focus, currentColor)}.altcha[data-floating].svelte-ddsc3z.svelte-ddsc3z{background:var(--altcha-color-base, white);display:none;filter:drop-shadow(3px 3px 6px rgba(0, 0, 0, 0.2));left:-100%;position:fixed;top:-100%;width:var(--altcha-max-width, 260px);z-index:999999}.altcha[data-floating=top].svelte-ddsc3z .altcha-anchor-arrow.svelte-ddsc3z{border-bottom-color:transparent;border-top-color:var(--altcha-color-border, #a0a0a0);bottom:-12px;top:auto}.altcha[data-floating=bottom].svelte-ddsc3z.svelte-ddsc3z:focus-within::after{border-bottom-color:var(--altcha-color-border-focus, currentColor)}.altcha[data-floating=top].svelte-ddsc3z.svelte-ddsc3z:focus-within::after{border-top-color:var(--altcha-color-border-focus, currentColor)}.altcha[data-floating].svelte-ddsc3z.svelte-ddsc3z:not([data-state=unverified]){display:block}.altcha-anchor-arrow.svelte-ddsc3z.svelte-ddsc3z{border:6px solid transparent;border-bottom-color:var(--altcha-color-border, #a0a0a0);content:\"\";height:0;left:12px;position:absolute;top:-12px;width:0}.altcha-main.svelte-ddsc3z.svelte-ddsc3z{align-items:center;display:flex;gap:0.4rem;padding:0.7rem}.altcha-label.svelte-ddsc3z.svelte-ddsc3z{flex-grow:1}.altcha-label.svelte-ddsc3z label.svelte-ddsc3z{cursor:pointer}.altcha-logo.svelte-ddsc3z.svelte-ddsc3z{color:currentColor;opacity:0.3}.altcha-logo.svelte-ddsc3z.svelte-ddsc3z:hover{opacity:1}.altcha-error.svelte-ddsc3z.svelte-ddsc3z{color:var(--altcha-color-error-text, #f23939);display:flex;font-size:0.85rem;gap:0.3rem;padding:0 0.7rem 0.7rem}.altcha-footer.svelte-ddsc3z.svelte-ddsc3z{align-items:center;background-color:var(--altcha-color-footer-bg, transparent);display:flex;font-size:0.75rem;opacity:0.4;padding:0.2rem 0.7rem;text-align:right}.altcha-footer.svelte-ddsc3z.svelte-ddsc3z:hover{opacity:1}.altcha-footer.svelte-ddsc3z>.svelte-ddsc3z:first-child{flex-grow:1}.altcha-footer.svelte-ddsc3z a{color:currentColor}.altcha-checkbox.svelte-ddsc3z.svelte-ddsc3z{display:flex;align-items:center;height:24px;width:24px}.altcha-checkbox.svelte-ddsc3z input.svelte-ddsc3z{width:18px;height:18px;margin:0}.altcha-hidden.svelte-ddsc3z.svelte-ddsc3z{display:none}.altcha-spinner.svelte-ddsc3z.svelte-ddsc3z{animation:svelte-ddsc3z-altcha-spinner 0.75s infinite linear;transform-origin:center}@keyframes svelte-ddsc3z-altcha-spinner{100%{transform:rotate(360deg)}}");
}
function Qr(e) {
  let t;
  let i;
  let n;
  return {
    c() {
      t = ht("svg");
      i = ht("path");
      n = ht("path");
      H(i, "d", "M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z");
      H(i, "fill", "currentColor");
      H(i, "opacity", ".25");
      H(n, "d", "M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z");
      H(n, "fill", "currentColor");
      H(n, "class", "altcha-spinner svelte-ddsc3z");
      H(t, "width", "24");
      H(t, "height", "24");
      H(t, "viewBox", "0 0 24 24");
      H(t, "xmlns", "http://www.w3.org/2000/svg");
    },
    m(s, r) {
      He(s, t, r);
      we(t, i);
      we(t, n);
    },
    d(s) {
      if (s) {
        _e(t);
      }
    }
  };
}
function $f(e) {
  let t;
  let i = e[11].label + "";
  let n;
  return {
    c() {
      t = Me("label");
      H(t, "for", n = e[4] + "_checkbox");
      H(t, "class", "svelte-ddsc3z");
    },
    m(s, r) {
      He(s, t, r);
      t.innerHTML = i;
    },
    p(s, r) {
      if (r[0] & 2048 && i !== (i = s[11].label + "")) {
        t.innerHTML = i;
      }
      if (r[0] & 16 && n !== (n = s[4] + "_checkbox")) {
        H(t, "for", n);
      }
    },
    d(s) {
      if (s) {
        _e(t);
      }
    }
  };
}
function Rf(e) {
  let t;
  let i = e[11].verifying + "";
  return {
    c() {
      t = Me("span");
    },
    m(n, s) {
      He(n, t, s);
      t.innerHTML = i;
    },
    p(n, s) {
      if (s[0] & 2048 && i !== (i = n[11].verifying + "")) {
        t.innerHTML = i;
      }
    },
    d(n) {
      if (n) {
        _e(t);
      }
    }
  };
}
function Af(e) {
  let t;
  let i = e[11].verified + "";
  let n;
  let s;
  return {
    c() {
      t = Me("span");
      n = rt();
      s = Me("input");
      H(s, "type", "hidden");
      H(s, "name", e[4]);
      s.value = e[6];
    },
    m(r, o) {
      He(r, t, o);
      t.innerHTML = i;
      He(r, n, o);
      He(r, s, o);
    },
    p(r, o) {
      if (o[0] & 2048 && i !== (i = r[11].verified + "")) {
        t.innerHTML = i;
      }
      if (o[0] & 16) {
        H(s, "name", r[4]);
      }
      if (o[0] & 64) {
        s.value = r[6];
      }
    },
    d(r) {
      if (r) {
        _e(t);
        _e(n);
        _e(s);
      }
    }
  };
}
function jr(e) {
  let t;
  let i;
  let n;
  let s;
  let r;
  let o;
  let l;
  return {
    c() {
      t = Me("div");
      i = Me("a");
      n = ht("svg");
      s = ht("path");
      r = ht("path");
      o = ht("path");
      H(s, "d", "M2.33955 16.4279C5.88954 20.6586 12.1971 21.2105 16.4279 17.6604C18.4699 15.947 19.6548 13.5911 19.9352 11.1365L17.9886 10.4279C17.8738 12.5624 16.909 14.6459 15.1423 16.1284C11.7577 18.9684 6.71167 18.5269 3.87164 15.1423C1.03163 11.7577 1.4731 6.71166 4.8577 3.87164C8.24231 1.03162 13.2883 1.4731 16.1284 4.8577C16.9767 5.86872 17.5322 7.02798 17.804 8.2324L19.9522 9.01429C19.7622 7.07737 19.0059 5.17558 17.6604 3.57212C14.1104 -0.658624 7.80283 -1.21043 3.57212 2.33956C-0.658625 5.88958 -1.21046 12.1971 2.33955 16.4279Z");
      H(s, "fill", "currentColor");
      H(r, "d", "M3.57212 2.33956C1.65755 3.94607 0.496389 6.11731 0.12782 8.40523L2.04639 9.13961C2.26047 7.15832 3.21057 5.25375 4.8577 3.87164C8.24231 1.03162 13.2883 1.4731 16.1284 4.8577L13.8302 6.78606L19.9633 9.13364C19.7929 7.15555 19.0335 5.20847 17.6604 3.57212C14.1104 -0.658624 7.80283 -1.21043 3.57212 2.33956Z");
      H(r, "fill", "currentColor");
      H(o, "d", "M7 10H5C5 12.7614 7.23858 15 10 15C12.7614 15 15 12.7614 15 10H13C13 11.6569 11.6569 13 10 13C8.3431 13 7 11.6569 7 10Z");
      H(o, "fill", "currentColor");
      H(n, "width", "22");
      H(n, "height", "22");
      H(n, "viewBox", "0 0 20 20");
      H(n, "fill", "none");
      H(n, "xmlns", "http://www.w3.org/2000/svg");
      H(i, "href", Ia);
      H(i, "target", "_blank");
      H(i, "class", "altcha-logo svelte-ddsc3z");
      H(i, "aria-label", l = e[11].ariaLinkLabel);
    },
    m(c, a) {
      He(c, t, a);
      we(t, i);
      we(i, n);
      we(n, s);
      we(n, r);
      we(n, o);
    },
    p(c, a) {
      if (a[0] & 2048 && l !== (l = c[11].ariaLinkLabel)) {
        H(i, "aria-label", l);
      }
    },
    d(c) {
      if (c) {
        _e(t);
      }
    }
  };
}
function eo(e) {
  let t;
  let i;
  let n;
  let s;
  function r(c, a) {
    if (c[7] === Q.EXPIRED) {
      return Of;
    } else {
      return Df;
    }
  }
  let o = r(e);
  let l = o(e);
  return {
    c() {
      t = Me("div");
      i = ht("svg");
      n = ht("path");
      s = rt();
      l.c();
      H(n, "stroke-linecap", "round");
      H(n, "stroke-linejoin", "round");
      H(n, "d", "M6 18L18 6M6 6l12 12");
      H(i, "width", "14");
      H(i, "height", "14");
      H(i, "xmlns", "http://www.w3.org/2000/svg");
      H(i, "fill", "none");
      H(i, "viewBox", "0 0 24 24");
      H(i, "stroke-width", "1.5");
      H(i, "stroke", "currentColor");
      H(t, "class", "altcha-error svelte-ddsc3z");
    },
    m(c, a) {
      He(c, t, a);
      we(t, i);
      we(i, n);
      we(t, s);
      l.m(t, null);
    },
    p(c, a) {
      if (o === (o = r(c)) && l) {
        l.p(c, a);
      } else {
        l.d(1);
        l = o(c);
        if (l) {
          l.c();
          l.m(t, null);
        }
      }
    },
    d(c) {
      if (c) {
        _e(t);
      }
      l.d();
    }
  };
}
function Df(e) {
  let t;
  let i = e[11].error + "";
  return {
    c() {
      t = Me("div");
      H(t, "title", e[5]);
    },
    m(n, s) {
      He(n, t, s);
      t.innerHTML = i;
    },
    p(n, s) {
      if (s[0] & 2048 && i !== (i = n[11].error + "")) {
        t.innerHTML = i;
      }
      if (s[0] & 32) {
        H(t, "title", n[5]);
      }
    },
    d(n) {
      if (n) {
        _e(t);
      }
    }
  };
}
function Of(e) {
  let t;
  let i = e[11].expired + "";
  return {
    c() {
      t = Me("div");
      H(t, "title", e[5]);
    },
    m(n, s) {
      He(n, t, s);
      t.innerHTML = i;
    },
    p(n, s) {
      if (s[0] & 2048 && i !== (i = n[11].expired + "")) {
        t.innerHTML = i;
      }
      if (s[0] & 32) {
        H(t, "title", n[5]);
      }
    },
    d(n) {
      if (n) {
        _e(t);
      }
    }
  };
}
function to(e) {
  let t;
  let i;
  let n = e[11].footer + "";
  return {
    c() {
      t = Me("div");
      i = Me("div");
      H(i, "class", "svelte-ddsc3z");
      H(t, "class", "altcha-footer svelte-ddsc3z");
    },
    m(s, r) {
      He(s, t, r);
      we(t, i);
      i.innerHTML = n;
    },
    p(s, r) {
      if (r[0] & 2048 && n !== (n = s[11].footer + "")) {
        i.innerHTML = n;
      }
    },
    d(s) {
      if (s) {
        _e(t);
      }
    }
  };
}
function io(e) {
  let t;
  return {
    c() {
      t = Me("div");
      H(t, "class", "altcha-anchor-arrow svelte-ddsc3z");
    },
    m(i, n) {
      He(i, t, n);
      e[48](t);
    },
    p: vn,
    d(i) {
      if (i) {
        _e(t);
      }
      e[48](null);
    }
  };
}
function _f(e) {
  let t;
  let i;
  let n;
  let s;
  let r;
  let o;
  let l;
  let c;
  let a;
  let f;
  let d;
  let u;
  let p;
  let w;
  let x;
  let b;
  let $;
  const v = e[46].default;
  const S = Ku(v, e, e[45], null);
  let R = e[7] === Q.VERIFYING && Qr();
  function G(D, z) {
    if (D[7] === Q.VERIFIED) {
      return Af;
    } else if (D[7] === Q.VERIFYING) {
      return Rf;
    } else {
      return $f;
    }
  }
  let X = G(e);
  let W = X(e);
  let M = (e[3] !== true || e[12]) && jr(e);
  let V = (e[5] || e[7] === Q.EXPIRED) && eo(e);
  let F = e[11].footer && (e[2] !== true || e[12]) && to(e);
  let _ = e[1] && io(e);
  return {
    c() {
      if (S) {
        S.c();
      }
      t = rt();
      i = Me("div");
      n = Me("div");
      if (R) {
        R.c();
      }
      s = rt();
      r = Me("div");
      o = Me("input");
      a = rt();
      f = Me("div");
      W.c();
      d = rt();
      if (M) {
        M.c();
      }
      u = rt();
      if (V) {
        V.c();
      }
      p = rt();
      if (F) {
        F.c();
      }
      w = rt();
      if (_) {
        _.c();
      }
      H(o, "type", "checkbox");
      H(o, "id", l = e[4] + "_checkbox");
      o.required = c = e[0] !== "onsubmit" && (!e[1] || e[0] !== "off");
      H(o, "class", "svelte-ddsc3z");
      H(r, "class", "altcha-checkbox svelte-ddsc3z");
      Zr(r, "altcha-hidden", e[7] === Q.VERIFYING);
      H(f, "class", "altcha-label svelte-ddsc3z");
      H(n, "class", "altcha-main svelte-ddsc3z");
      H(i, "class", "altcha svelte-ddsc3z");
      H(i, "data-state", e[7]);
      H(i, "data-floating", e[1]);
    },
    m(D, z) {
      if (S) {
        S.m(D, z);
      }
      He(D, t, z);
      He(D, i, z);
      we(i, n);
      if (R) {
        R.m(n, null);
      }
      we(n, s);
      we(n, r);
      we(r, o);
      o.checked = e[8];
      we(n, a);
      we(n, f);
      W.m(f, null);
      we(n, d);
      if (M) {
        M.m(n, null);
      }
      we(i, u);
      if (V) {
        V.m(i, null);
      }
      we(i, p);
      if (F) {
        F.m(i, null);
      }
      we(i, w);
      if (_) {
        _.m(i, null);
      }
      e[49](i);
      x = true;
      if (!b) {
        $ = [ls(o, "change", e[47]), ls(o, "change", e[13]), ls(o, "invalid", e[14])];
        b = true;
      }
    },
    p(D, z) {
      if (S && S.p && (!x || z[1] & 16384)) {
        Ju(S, v, D, D[45], x ? Zu(v, D[45], z, null) : Qu(D[45]), null);
      }
      if (D[7] === Q.VERIFYING) {
        if (!R) {
          R = Qr();
          R.c();
          R.m(n, s);
        }
      } else if (R) {
        R.d(1);
        R = null;
      }
      if (!x || z[0] & 16 && l !== (l = D[4] + "_checkbox")) {
        H(o, "id", l);
      }
      if (!x || z[0] & 3 && c !== (c = D[0] !== "onsubmit" && (!D[1] || D[0] !== "off"))) {
        o.required = c;
      }
      if (z[0] & 256) {
        o.checked = D[8];
      }
      if (!x || z[0] & 128) {
        Zr(r, "altcha-hidden", D[7] === Q.VERIFYING);
      }
      if (X === (X = G(D)) && W) {
        W.p(D, z);
      } else {
        W.d(1);
        W = X(D);
        if (W) {
          W.c();
          W.m(f, null);
        }
      }
      if (D[3] !== true || D[12]) {
        if (M) {
          M.p(D, z);
        } else {
          M = jr(D);
          M.c();
          M.m(n, null);
        }
      } else if (M) {
        M.d(1);
        M = null;
      }
      if (D[5] || D[7] === Q.EXPIRED) {
        if (V) {
          V.p(D, z);
        } else {
          V = eo(D);
          V.c();
          V.m(i, p);
        }
      } else if (V) {
        V.d(1);
        V = null;
      }
      if (D[11].footer && (D[2] !== true || D[12])) {
        if (F) {
          F.p(D, z);
        } else {
          F = to(D);
          F.c();
          F.m(i, w);
        }
      } else if (F) {
        F.d(1);
        F = null;
      }
      if (D[1]) {
        if (_) {
          _.p(D, z);
        } else {
          _ = io(D);
          _.c();
          _.m(i, null);
        }
      } else if (_) {
        _.d(1);
        _ = null;
      }
      if (!x || z[0] & 128) {
        H(i, "data-state", D[7]);
      }
      if (!x || z[0] & 2) {
        H(i, "data-floating", D[1]);
      }
    },
    i(D) {
      if (!x) {
        ka(S, D);
        x = true;
      }
    },
    o(D) {
      pf(S, D);
      x = false;
    },
    d(D) {
      if (D) {
        _e(t);
        _e(i);
      }
      if (S) {
        S.d(D);
      }
      if (R) {
        R.d();
      }
      W.d();
      if (M) {
        M.d();
      }
      if (V) {
        V.d();
      }
      if (F) {
        F.d();
      }
      if (_) {
        _.d();
      }
      e[49](null);
      b = false;
      Ji($);
    }
  };
}
const no = "Visit Altcha.org";
const Ia = "https://altcha.org/";
function so(e) {
  return JSON.parse(e);
}
function zf(e, t, i) {
  var n;
  var s;
  let r;
  let o;
  let l;
  let c;
  let {
    $$slots: a = {},
    $$scope: f
  } = t;
  let {
    auto: d = undefined
  } = t;
  let {
    blockspam: u = undefined
  } = t;
  let {
    challengeurl: p = undefined
  } = t;
  let {
    challengejson: w = undefined
  } = t;
  let {
    debug: x = false
  } = t;
  let {
    delay: b = 0
  } = t;
  let {
    expire: $ = undefined
  } = t;
  let {
    floating: v = undefined
  } = t;
  let {
    floatinganchor: S = undefined
  } = t;
  let {
    floatingoffset: R = undefined
  } = t;
  let {
    hidefooter: G = false
  } = t;
  let {
    hidelogo: X = false
  } = t;
  let {
    name: W = "altcha"
  } = t;
  let {
    maxnumber: M = 1000000
  } = t;
  let {
    mockerror: V = false
  } = t;
  let {
    obfuscated: F = undefined
  } = t;
  let {
    plugins: _ = undefined
  } = t;
  let {
    refetchonexpire: D = true
  } = t;
  let {
    spamfilter: z = false
  } = t;
  let {
    strings: N = undefined
  } = t;
  let {
    test: Y = false
  } = t;
  let {
    verifyurl: K = undefined
  } = t;
  let {
    workers: ie = Math.min(16, navigator.hardwareConcurrency || 8)
  } = t;
  let {
    workerurl: ae = undefined
  } = t;
  const J = cf();
  const Se = ["SHA-256", "SHA-384", "SHA-512"];
  const zt = (s = (n = document.documentElement.lang) == null ? undefined : n.split("-")) == null ? undefined : s[0];
  let Ve = false;
  let te;
  let Be = null;
  let pt = null;
  let ne = null;
  let mt = null;
  let Ne = null;
  let it = null;
  let Ze = [];
  let se = Q.UNVERIFIED;
  lf(() => {
    mi();
    if (ne) {
      ne.removeEventListener("submit", Z);
      ne.removeEventListener("reset", U);
      ne.removeEventListener("focusin", q);
      ne = null;
    }
    if (Ne) {
      clearTimeout(Ne);
      Ne = null;
    }
    document.removeEventListener("click", I);
    document.removeEventListener("scroll", E);
    window.removeEventListener("resize", Ce);
  });
  af(() => {
    h("mounted", "1.0.6");
    h("workers", ie);
    m();
    h("plugins", Ze.length ? Ze.map(y => y.constructor.pluginName).join(", ") : "none");
    if (Y) {
      h("using test mode");
    }
    if ($) {
      be($);
    }
    if (d !== undefined) {
      h("auto", d);
    }
    if (v !== undefined) {
      ue(v);
    }
    ne = te.closest("form");
    if (ne) {
      ne.addEventListener("submit", Z, {
        capture: true
      });
      ne.addEventListener("reset", U);
      if (d === "onfocus") {
        ne.addEventListener("focusin", q);
      }
    }
    if (d === "onload") {
      if (F) {
        Mt();
      } else {
        yt();
      }
    }
    if (r && (G || X)) {
      h("Attributes hidefooter and hidelogo ignored because usage with free API Keys requires attribution.");
    }
    requestAnimationFrame(() => {
      J("load");
    });
  });
  function pi(y, B) {
    return (JSON.stringify({
      algorithm: y.algorithm,
      challenge: y.challenge,
      number: B.number,
      salt: y.salt,
      signature: y.signature,
      test: Y ? true : undefined,
      took: B.took
    }));
  }
  function mi() {
    for (const y of Ze) {
      y.destroy();
    }
  }
  function gi() {
    if (p && D && se === Q.VERIFIED) {
      yt();
    } else {
      nt(Q.EXPIRED, c.expired);
    }
  }
  async function yi() {
    var y;
    if (V) {
      h("mocking error");
      throw new Error("Mocked error.");
    }
    if (o) {
      h("using provided json data");
      return o;
    }
    if (Y) {
      h("generating test challenge", {
        test: Y
      });
      return Sf(typeof Y != "boolean" ? +Y : undefined);
    }
    {
      if (!p && ne) {
        const le = ne.getAttribute("action");
        if (le != null && le.includes("/form/")) {
          i(15, p = le + "/altcha");
        }
      }
      if (!p) {
        throw new Error("Attribute challengeurl not set.");
      }
      h("fetching challenge from", p);
      const B = await fetch(p, {
        headers: z ? {
          "x-altcha-spam-filter": "1"
        } : {}
      });
      if (B.status !== 200) {
        throw new Error(`Server responded with ${B.status}.`);
      }
      const ee = B.headers.get("Expires");
      const ve = B.headers.get("X-Altcha-Config");
      const Le = await B.json();
      const wt = new URLSearchParams((y = Le.salt.split("?")) == null ? undefined : y[1]);
      const Pe = wt.get("expires") || wt.get("expire");
      if (Pe) {
        const le = new Date(+Pe * 1000);
        const Xe = isNaN(le.getTime()) ? 0 : le.getTime() - Date.now();
        if (Xe > 0) {
          be(Xe);
        }
      }
      if (ve) {
        try {
          const le = JSON.parse(ve);
          if (le && typeof le == "object") {
            if (le.verifyurl) {
              le.verifyurl = new URL(le.verifyurl, new URL(p)).toString();
            }
            xi(le);
          }
        } catch (le) {
          h("unable to configure from X-Altcha-Config", le);
        }
      }
      if (!$ && ee != null && ee.length) {
        const le = Date.parse(ee);
        if (le) {
          const Xe = le - Date.now();
          if (Xe > 0) {
            be(Xe);
          }
        }
      }
      return Le;
    }
  }
  function wi(y) {
    var B;
    const ee = ne == null ? undefined : ne.querySelector(typeof y == "string" ? `input[name="${y}"]` : "input[type=\"email\"]:not([data-no-spamfilter])");
    return ((B = ee == null ? undefined : ee.value) == null ? undefined : B.slice(ee.value.indexOf("@"))) || undefined;
  }
  function Ln() {
    if (z === "ipAddress") {
      return {
        blockedCountries: undefined,
        classifier: undefined,
        disableRules: undefined,
        email: false,
        expectedCountries: undefined,
        expectedLanguages: undefined,
        fields: false,
        ipAddress: undefined,
        text: undefined,
        timeZone: undefined
      };
    } else if (typeof z == "object") {
      return z;
    } else {
      return {
        blockedCountries: undefined,
        classifier: undefined,
        disableRules: undefined,
        email: undefined,
        expectedCountries: undefined,
        expectedLanguages: undefined,
        fields: undefined,
        ipAddress: undefined,
        text: undefined,
        timeZone: undefined
      };
    }
  }
  function Tt(y) {
    return [...((ne == null ? undefined : ne.querySelectorAll(y != null && y.length ? y.map(B => `input[name="${B}"]`).join(", ") : "input[type=\"text\"]:not([data-no-spamfilter]), textarea:not([data-no-spamfilter])")) || [])].reduce((B, ee) => {
      const ve = ee.name;
      const Le = ee.value;
      if (ve && Le) {
        B[ve] = /\n/.test(Le) ? Le.replace(new RegExp("(?<!\\r)\\n", "g"), `\r
`) : Le;
      }
      return B;
    }, {});
  }
  function m() {
    const y = _ !== undefined ? _.split(",") : undefined;
    for (const B of globalThis.altchaPlugins) {
      if (!y || y.includes(B.pluginName)) {
        Ze.push(new B({
          el: te,
          clarify: Mt,
          dispatch: J,
          getConfiguration: gt,
          getFloatingAnchor: Ht,
          getState: Lt,
          log: h,
          reset: nt,
          solve: re,
          setState: st,
          setFloatingAnchor: Ft,
          verify: yt
        }));
      }
    }
  }
  function h(...y) {
    if (x || y.some(B => B instanceof Error)) {
      console[y[0] instanceof Error ? "error" : "log"]("ALTCHA", `[name=${W}]`, ...y);
    }
  }
  function g() {
    if ([Q.UNVERIFIED, Q.ERROR, Q.EXPIRED].includes(se)) {
      if (z && (ne == null ? undefined : ne.reportValidity()) === false) {
        i(8, Ve = false);
      } else if (F) {
        Mt();
      } else {
        yt();
      }
    } else {
      i(8, Ve = true);
    }
  }
  function I(y) {
    const B = y.target;
    if (v && B && !te.contains(B) && (se === Q.VERIFIED || d === "off" && se === Q.UNVERIFIED)) {
      i(9, te.style.display = "none", te);
    }
  }
  function E() {
    if (v && se !== Q.UNVERIFIED) {
      pe();
    }
  }
  function O(y) {
    for (const B of Ze) {
      if (typeof B.onErrorChange == "function") {
        B.onErrorChange(mt);
      }
    }
  }
  function q(y) {
    if (se === Q.UNVERIFIED) {
      yt();
    }
  }
  function Z(y) {
    if (ne && d === "onsubmit") {
      if (se === Q.UNVERIFIED) {
        y.preventDefault();
        y.stopPropagation();
        yt().then(() => {
          if (!(ne == null)) {
            ne.requestSubmit();
          }
        });
      } else if (se !== Q.VERIFIED) {
        y.preventDefault();
        y.stopPropagation();
        if (se === Q.VERIFYING) {
          j();
        }
      }
    } else if (ne && v && d === "off" && se === Q.UNVERIFIED) {
      y.preventDefault();
      y.stopPropagation();
      i(9, te.style.display = "block", te);
      pe();
    }
  }
  function U() {
    nt();
  }
  function j() {
    if (se === Q.VERIFYING && c.waitAlert) {
      alert(c.waitAlert);
    }
  }
  function vi(y) {
    for (const B of Ze) {
      if (typeof B.onStateChange == "function") {
        B.onStateChange(se);
      }
    }
    if (v && se !== Q.UNVERIFIED) {
      requestAnimationFrame(() => {
        pe();
      });
    }
    i(8, Ve = se === Q.VERIFIED);
  }
  function Ce() {
    if (v) {
      pe();
    }
  }
  function pe(y = 20) {
    if (te) {
      if (!pt) {
        pt = (S ? document.querySelector(S) : ne == null ? undefined : ne.querySelector("input[type=\"submit\"], button[type=\"submit\"], button:not([type=\"button\"]):not([type=\"reset\"])")) || ne;
      }
      if (pt) {
        const B = parseInt(R, 10) || 12;
        const ee = pt.getBoundingClientRect();
        const ve = te.getBoundingClientRect();
        const Le = document.documentElement.clientHeight;
        const wt = document.documentElement.clientWidth;
        const Pe = v === "auto" ? ee.bottom + ve.height + B + y > Le : v === "top";
        const le = Math.max(y, Math.min(wt - y - ve.width, ee.left + ee.width / 2 - ve.width / 2));
        if (Pe) {
          i(9, te.style.top = `${ee.top - (ve.height + B)}px`, te);
        } else {
          i(9, te.style.top = `${ee.bottom + B}px`, te);
        }
        i(9, te.style.left = `${le}px`, te);
        te.setAttribute("data-floating", Pe ? "top" : "bottom");
        if (Be) {
          const Xe = Be.getBoundingClientRect();
          i(10, Be.style.left = ee.left - le + ee.width / 2 - Xe.width / 2 + "px", Be);
        }
      } else {
        h("unable to find floating anchor element");
      }
    }
  }
  async function Bt(y) {
    if (!K) {
      throw new Error("Attribute verifyurl not set.");
    }
    h("requesting server verification from", K);
    const B = {
      payload: y
    };
    if (z) {
      const {
        blockedCountries: Le,
        classifier: wt,
        disableRules: Pe,
        email: le,
        expectedLanguages: Xe,
        expectedCountries: Fn,
        fields: bi,
        ipAddress: Si,
        text: ol,
        timeZone: wr
      } = Ln();
      B.blockedCountries = Le;
      B.classifier = wt;
      B.disableRules = Pe;
      B.email = le === false ? undefined : wi(le);
      B.expectedCountries = Fn;
      B.expectedLanguages = Xe || (zt ? [zt] : undefined);
      B.fields = bi === false ? undefined : Tt(bi);
      B.ipAddress = Si === false ? undefined : Si || "auto";
      B.text = ol;
      B.timeZone = wr === false ? undefined : wr || Tf();
    }
    const ee = await fetch(K, {
      body: JSON.stringify(B),
      headers: {
        "content-type": "application/json"
      },
      method: "POST"
    });
    if (ee.status !== 200) {
      throw new Error(`Server responded with ${ee.status}.`);
    }
    const ve = await ee.json();
    if (ve != null && ve.payload) {
      i(6, it = ve.payload);
    }
    J("serververification", ve);
    if (u && ve.classification === "BAD") {
      throw new Error("SpamFilter returned negative classification.");
    }
  }
  function be(y) {
    h("expire", y);
    if (Ne) {
      clearTimeout(Ne);
      Ne = null;
    }
    if (y < 1) {
      gi();
    } else {
      Ne = // TOLOOK
      setTimeout(gi, y);
    }
  }
  function ue(y) {
    h("floating", y);
    if (v !== y) {
      i(9, te.style.left = "", te);
      i(9, te.style.top = "", te);
    }
    i(1, v = y === true || y === "" ? "auto" : y === false || y === "false" ? undefined : v);
    if (v) {
      if (!d) {
        i(0, d = "onsubmit");
      }
      document.addEventListener("scroll", E);
      document.addEventListener("click", I);
      window.addEventListener("resize", Ce);
    } else if (d === "onsubmit") {
      i(0, d = undefined);
    }
  }
  function Ie(y) {
    if (!y.algorithm) {
      throw new Error("Invalid challenge. Property algorithm is missing.");
    }
    if (y.signature === undefined) {
      throw new Error("Invalid challenge. Property signature is missing.");
    }
    if (!Se.includes(y.algorithm.toUpperCase())) {
      throw new Error(`Unknown algorithm value. Allowed values: ${Se.join(", ")}`);
    }
    if (!y.challenge || y.challenge.length < 40) {
      throw new Error("Challenge is too short. Min. 40 chars.");
    }
    if (!y.salt || y.salt.length < 10) {
      throw new Error("Salt is too short. Min. 10 chars.");
    }
  }
  async function re(y) {
    let B = null;
    if ("Worker" in window) {
      try {
        B = await ki(y, y.maxnumber);
      } catch (ee) {
        h(ee);
      }
      if ((B == null ? undefined : B.number) !== undefined || "obfuscated" in y) {
        return {
          data: y,
          solution: B
        };
      }
    }
    if ("obfuscated" in y) {
      const ee = await Cf(y.obfuscated, y.key, y.maxnumber);
      return {
        data: y,
        solution: await ee.promise
      };
    }
    return {
      data: y,
      solution: await If(y.challenge, y.salt, y.algorithm, y.maxnumber || M).promise
    };
  }
  async function ki(y, B = typeof Y == "number" ? Y : M, ee = Math.ceil(ie)) {
    const ve = [];
    ee = Math.min(16, Math.max(1, ee));
    for (let Pe = 0; Pe < ee; Pe++) {
      ve.push(altchaCreateWorker(ae));
    }
    const Le = Math.ceil(B / ee);
    const wt = await Promise.all(ve.map((Pe, le) => {
      const Xe = le * Le;
      return new Promise(Fn => {
        Pe.addEventListener("message", bi => {
          if (bi.data) {
            for (const Si of ve) {
              if (Si !== Pe) {
                Si.postMessage({
                  type: "abort"
                });
              }
            }
          }
          Fn(bi.data);
        });
        Pe.postMessage({
          payload: y,
          max: Xe + Le,
          start: Xe,
          type: "work"
        });
      });
    }));
    for (const Pe of ve) {
      Pe.terminate();
    }
    return wt.find(Pe => !!Pe) || null;
  }
  async function Mt() {
    if (!F) {
      i(7, se = Q.ERROR);
      return;
    }
    const y = Ze.find(B => B.constructor.pluginName === "obfuscation");
    if (!y || !("clarify" in y)) {
      i(7, se = Q.ERROR);
      h("Plugin `obfuscation` not found. Import `altcha/plugins/obfuscation` to load it.");
      return;
    }
    if ("clarify" in y && typeof y.clarify == "function") {
      return y.clarify();
    }
  }
  function xi(y) {
    if (y.obfuscated !== undefined) {
      i(24, F = y.obfuscated);
    }
    if (y.auto !== undefined) {
      i(0, d = y.auto);
      if (d === "onload") {
        if (F) {
          Mt();
        } else {
          yt();
        }
      }
    }
    if (y.blockspam !== undefined) {
      i(16, u = !!y.blockspam);
    }
    if (y.floatinganchor !== undefined) {
      i(20, S = y.floatinganchor);
    }
    if (y.delay !== undefined) {
      i(18, b = y.delay);
    }
    if (y.floatingoffset !== undefined) {
      i(21, R = y.floatingoffset);
    }
    if (y.floating !== undefined) {
      ue(y.floating);
    }
    if (y.expire !== undefined) {
      be(y.expire);
      i(19, $ = y.expire);
    }
    if (y.challenge) {
      Ie(y.challenge);
      o = y.challenge;
    }
    if (y.challengeurl !== undefined) {
      i(15, p = y.challengeurl);
    }
    if (y.debug !== undefined) {
      i(17, x = !!y.debug);
    }
    if (y.hidefooter !== undefined) {
      i(2, G = !!y.hidefooter);
    }
    if (y.hidelogo !== undefined) {
      i(3, X = !!y.hidelogo);
    }
    if (y.maxnumber !== undefined) {
      i(22, M = +y.maxnumber);
    }
    if (y.mockerror !== undefined) {
      i(23, V = !!y.mockerror);
    }
    if (y.name !== undefined) {
      i(4, W = y.name);
    }
    if (y.refetchonexpire !== undefined) {
      i(25, D = !!y.refetchonexpire);
    }
    if (y.spamfilter !== undefined) {
      i(26, z = typeof y.spamfilter == "object" ? y.spamfilter : !!y.spamfilter);
    }
    if (y.strings) {
      i(44, l = y.strings);
    }
    if (y.test !== undefined) {
      i(27, Y = typeof y.test == "number" ? y.test : !!y.test);
    }
    if (y.verifyurl !== undefined) {
      i(28, K = y.verifyurl);
    }
    if (y.workers !== undefined) {
      i(29, ie = +y.workers);
    }
    if (y.workerurl !== undefined) {
      i(30, ae = y.workerurl);
    }
  }
  function gt() {
    return {
      auto: d,
      blockspam: u,
      challengeurl: p,
      debug: x,
      delay: b,
      expire: $,
      floating: v,
      floatinganchor: S,
      floatingoffset: R,
      hidefooter: G,
      hidelogo: X,
      name: W,
      maxnumber: M,
      mockerror: V,
      obfuscated: F,
      refetchonexpire: D,
      spamfilter: z,
      strings: c,
      test: Y,
      verifyurl: K,
      workers: ie,
      workerurl: ae
    };
  }
  function Ht() {
    return pt;
  }
  function fe(y) {
    return Ze.find(B => B.constructor.pluginName === y);
  }
  function Lt() {
    return se;
  }
  function nt(y = Q.UNVERIFIED, B = null) {
    if (Ne) {
      clearTimeout(Ne);
      Ne = null;
    }
    i(8, Ve = false);
    i(5, mt = B);
    i(6, it = null);
    i(7, se = y);
  }
  function Ft(y) {
    pt = y;
  }
  function st(y, B = null) {
    i(7, se = y);
    i(5, mt = B);
  }
  async function yt() {
    nt(Q.VERIFYING);
    await new Promise(y => // TOLOOK
    setTimeout(y, b || 0));
    return yi().then(y => {
      Ie(y);
      h("challenge", y);
      return re(y);
    }).then(({
      data: y,
      solution: B
    }) => {
      h("solution", B);
      if ("challenge" in y && B && !("clearText" in B)) {
        if ((B == null ? undefined : B.number) !== undefined) {
          if (K) {
            return Bt(pi(y, B));
          }
          i(6, it = pi(y, B));
          h("payload", it);
        } else {
          h("Unable to find a solution. Ensure that the 'maxnumber' attribute is greater than the randomly generated number.");
          throw new Error("Unexpected result returned.");
        }
      }
    }).then(() => {
      i(7, se = Q.VERIFIED);
      h("verified");
      hf().then(() => {
        J("verified", {
          payload: it
        });
      });
    }).catch(y => {
      h(y);
      i(7, se = Q.ERROR);
      i(5, mt = y.message);
    });
  }
  function nl() {
    Ve = this.checked;
    i(8, Ve);
  }
  function sl(y) {
    kn[y ? "unshift" : "push"](() => {
      Be = y;
      i(10, Be);
    });
  }
  function rl(y) {
    kn[y ? "unshift" : "push"](() => {
      te = y;
      i(9, te);
    });
  }
  e.$$set = y => {
    if ("auto" in y) {
      i(0, d = y.auto);
    }
    if ("blockspam" in y) {
      i(16, u = y.blockspam);
    }
    if ("challengeurl" in y) {
      i(15, p = y.challengeurl);
    }
    if ("challengejson" in y) {
      i(31, w = y.challengejson);
    }
    if ("debug" in y) {
      i(17, x = y.debug);
    }
    if ("delay" in y) {
      i(18, b = y.delay);
    }
    if ("expire" in y) {
      i(19, $ = y.expire);
    }
    if ("floating" in y) {
      i(1, v = y.floating);
    }
    if ("floatinganchor" in y) {
      i(20, S = y.floatinganchor);
    }
    if ("floatingoffset" in y) {
      i(21, R = y.floatingoffset);
    }
    if ("hidefooter" in y) {
      i(2, G = y.hidefooter);
    }
    if ("hidelogo" in y) {
      i(3, X = y.hidelogo);
    }
    if ("name" in y) {
      i(4, W = y.name);
    }
    if ("maxnumber" in y) {
      i(22, M = y.maxnumber);
    }
    if ("mockerror" in y) {
      i(23, V = y.mockerror);
    }
    if ("obfuscated" in y) {
      i(24, F = y.obfuscated);
    }
    if ("plugins" in y) {
      i(32, _ = y.plugins);
    }
    if ("refetchonexpire" in y) {
      i(25, D = y.refetchonexpire);
    }
    if ("spamfilter" in y) {
      i(26, z = y.spamfilter);
    }
    if ("strings" in y) {
      i(33, N = y.strings);
    }
    if ("test" in y) {
      i(27, Y = y.test);
    }
    if ("verifyurl" in y) {
      i(28, K = y.verifyurl);
    }
    if ("workers" in y) {
      i(29, ie = y.workers);
    }
    if ("workerurl" in y) {
      i(30, ae = y.workerurl);
    }
    if ("$$scope" in y) {
      i(45, f = y.$$scope);
    }
  };
  e.$$.update = () => {
    if (e.$$.dirty[0] & 32768) {
      i(12, r = !!(p != null && p.includes(".altcha.org")) && !!(p != null && p.includes("apiKey=ckey_")));
    }
    if (e.$$.dirty[1] & 1) {
      o = w ? so(w) : undefined;
    }
    if (e.$$.dirty[1] & 4) {
      i(44, l = N ? so(N) : {});
    }
    if (e.$$.dirty[1] & 8192) {
      i(11, c = {
        ariaLinkLabel: no,
        error: "Verification failed. Try again later.",
        expired: "Verification expired. Try again.",
        footer: `Protected by <a href="${Ia}" target="_blank" aria-label="${l.ariaLinkLabel || no}">ALTCHA</a>`,
        label: "I'm not a robot",
        verified: "Verified",
        verifying: "Verifying...",
        waitAlert: "Verifying... please wait.",
        ...l
      });
    }
    if (e.$$.dirty[0] & 192) {
      J("statechange", {
        payload: it,
        state: se
      });
    }
    if (e.$$.dirty[0] & 32) {
      O();
    }
    if (e.$$.dirty[0] & 128) {
      vi();
    }
  };
  return [d, v, G, X, W, mt, it, se, Ve, te, Be, c, r, g, j, p, u, x, b, $, S, R, M, V, F, D, z, Y, K, ie, ae, w, _, N, Mt, xi, gt, Ht, fe, Lt, nt, Ft, st, yt, l, f, a, nl, sl, rl];
}
class Bf extends kf {
  constructor(t) {
    super();
    wf(this, t, zf, _f, Gu, {
      auto: 0,
      blockspam: 16,
      challengeurl: 15,
      challengejson: 31,
      debug: 17,
      delay: 18,
      expire: 19,
      floating: 1,
      floatinganchor: 20,
      floatingoffset: 21,
      hidefooter: 2,
      hidelogo: 3,
      name: 4,
      maxnumber: 22,
      mockerror: 23,
      obfuscated: 24,
      plugins: 32,
      refetchonexpire: 25,
      spamfilter: 26,
      strings: 33,
      test: 27,
      verifyurl: 28,
      workers: 29,
      workerurl: 30,
      clarify: 34,
      configure: 35,
      getConfiguration: 36,
      getFloatingAnchor: 37,
      getPlugin: 38,
      getState: 39,
      reset: 40,
      setFloatingAnchor: 41,
      setState: 42,
      verify: 43
    }, Pf, [-1, -1, -1]);
  }
  get auto() {
    return this.$$.ctx[0];
  }
  set auto(t) {
    this.$$set({
      auto: t
    });
    ce();
  }
  get blockspam() {
    return this.$$.ctx[16];
  }
  set blockspam(t) {
    this.$$set({
      blockspam: t
    });
    ce();
  }
  get challengeurl() {
    return this.$$.ctx[15];
  }
  set challengeurl(t) {
    this.$$set({
      challengeurl: t
    });
    ce();
  }
  get challengejson() {
    return this.$$.ctx[31];
  }
  set challengejson(t) {
    this.$$set({
      challengejson: t
    });
    ce();
  }
  get debug() {
    return this.$$.ctx[17];
  }
  set debug(t) {
    this.$$set({
      debug: t
    });
    ce();
  }
  get delay() {
    return this.$$.ctx[18];
  }
  set delay(t) {
    this.$$set({
      delay: t
    });
    ce();
  }
  get expire() {
    return this.$$.ctx[19];
  }
  set expire(t) {
    this.$$set({
      expire: t
    });
    ce();
  }
  get floating() {
    return this.$$.ctx[1];
  }
  set floating(t) {
    this.$$set({
      floating: t
    });
    ce();
  }
  get floatinganchor() {
    return this.$$.ctx[20];
  }
  set floatinganchor(t) {
    this.$$set({
      floatinganchor: t
    });
    ce();
  }
  get floatingoffset() {
    return this.$$.ctx[21];
  }
  set floatingoffset(t) {
    this.$$set({
      floatingoffset: t
    });
    ce();
  }
  get hidefooter() {
    return this.$$.ctx[2];
  }
  set hidefooter(t) {
    this.$$set({
      hidefooter: t
    });
    ce();
  }
  get hidelogo() {
    return this.$$.ctx[3];
  }
  set hidelogo(t) {
    this.$$set({
      hidelogo: t
    });
    ce();
  }
  get name() {
    return this.$$.ctx[4];
  }
  set name(t) {
    this.$$set({
      name: t
    });
    ce();
  }
  get maxnumber() {
    return this.$$.ctx[22];
  }
  set maxnumber(t) {
    this.$$set({
      maxnumber: t
    });
    ce();
  }
  get mockerror() {
    return this.$$.ctx[23];
  }
  set mockerror(t) {
    this.$$set({
      mockerror: t
    });
    ce();
  }
  get obfuscated() {
    return this.$$.ctx[24];
  }
  set obfuscated(t) {
    this.$$set({
      obfuscated: t
    });
    ce();
  }
  get plugins() {
    return this.$$.ctx[32];
  }
  set plugins(t) {
    this.$$set({
      plugins: t
    });
    ce();
  }
  get refetchonexpire() {
    return this.$$.ctx[25];
  }
  set refetchonexpire(t) {
    this.$$set({
      refetchonexpire: t
    });
    ce();
  }
  get spamfilter() {
    return this.$$.ctx[26];
  }
  set spamfilter(t) {
    this.$$set({
      spamfilter: t
    });
    ce();
  }
  get strings() {
    return this.$$.ctx[33];
  }
  set strings(t) {
    this.$$set({
      strings: t
    });
    ce();
  }
  get test() {
    return this.$$.ctx[27];
  }
  set test(t) {
    this.$$set({
      test: t
    });
    ce();
  }
  get verifyurl() {
    return this.$$.ctx[28];
  }
  set verifyurl(t) {
    this.$$set({
      verifyurl: t
    });
    ce();
  }
  get workers() {
    return this.$$.ctx[29];
  }
  set workers(t) {
    this.$$set({
      workers: t
    });
    ce();
  }
  get workerurl() {
    return this.$$.ctx[30];
  }
  set workerurl(t) {
    this.$$set({
      workerurl: t
    });
    ce();
  }
  get clarify() {
    return this.$$.ctx[34];
  }
  get configure() {
    return this.$$.ctx[35];
  }
  get getConfiguration() {
    return this.$$.ctx[36];
  }
  get getFloatingAnchor() {
    return this.$$.ctx[37];
  }
  get getPlugin() {
    return this.$$.ctx[38];
  }
  get getState() {
    return this.$$.ctx[39];
  }
  get reset() {
    return this.$$.ctx[40];
  }
  get setFloatingAnchor() {
    return this.$$.ctx[41];
  }
  get setState() {
    return this.$$.ctx[42];
  }
  get verify() {
    return this.$$.ctx[43];
  }
}
window.loadedScript = true;
const Hf = location.hostname !== "localhost" && location.hostname !== "127.0.0.1" && !location.hostname.startsWith("192.168.");
const Ta = location.hostname === "sandbox-dev.moomoo.io" || location.hostname === "sandbox.moomoo.io";
const Lf = location.hostname === "dev.moomoo.io" || location.hostname === "dev2.moomoo.io";
const As = new Ih();
let $i;
let dn;
let pn;
const xn = location.hostname === "localhost" || location.hostname === "127.0.0.1";
const Ff = false;
const nr = xn || Ff;
if (Ta) {
  dn = "https://api-sandbox.moomoo.io";
  pn = "moomoo.io";
} else if (Lf) {
  dn = "https://api-dev.moomoo.io";
  pn = "moomoo.io";
} else {
  dn = "https://api.moomoo.io";
  pn = "moomoo.io";
}
const Vf = !nr;
const xt = new ze(pn, 443, T.maxPlayers, 5, Vf);
xt.debugLog = false;
const Ye = {
  animationTime: 0,
  land: null,
  lava: null,
  x: T.volcanoLocationX,
  y: T.volcanoLocationY
};
function Nf() {
  let e = false;
  (function (t) {
    if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(t) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0, 4))) {
      e = true;
    }
  })(navigator.userAgent || navigator.vendor || window.opera);
  return e;
}
const Ma = Nf();
let bn = false;
let Ds = false;
function ro() {
  if (!(!cr || Ds)) {
    Ds = true;
    if (Hf || nr) {
      if ($i) {
        hs("alt:" + $i);
      }
    } else if ($i) {
      hs("alt:" + $i);
    } else {
      hs();
    }
  }
}
let Os = false;
function hs(e) {
  xt.start(In, function (t, i, n) {
    let r = "wss://" + t;
    if (xn) {
      r = "wss://localhost:3000";
    }
    if (e) {
      r += "?token=" + encodeURIComponent(e);
    }
    me.connect(r, function (o) {
      if (Os) {
        Os = false;
        return;
      }
      el();
      if (o) {
        gs(o);
      } else {
        bn = true;
        Pn();
      }
    }, {
      A: jf,
      B: gs,
      C: _d,
      D: ap,
      E: lp,
      a: fp,
      G: Vd,
      H: jd,
      I: rp,
      J: sp,
      K: Wd,
      L: ep,
      M: tp,
      N: hp,
      O: up,
      P: Bd,
      Q: Ld,
      R: Hd,
      S: cp,
      T: Ya,
      U: Ga,
      V: La,
      X: ip,
      Y: np,
      Z: mp,
      g: cd,
      1: fd,
      2: ld,
      3: hd,
      4: ud,
      5: xd,
      6: Md,
      7: yd,
      8: zd,
      9: md,
      0: pp
    });
  }, function (t) {
    console.error("Vultr error:", t);
    alert(`Error:
` + t);
    gs("disconnected");
  }, xn);
}
function sr() {
  return me.connected;
}
function Uf() {
  const t = prompt("party key", In);
  if (t) {
    window.onbeforeunload = undefined;
    window.location.href = "/?server=" + t;
  }
}
const Wf = new Th(T);
const Ea = Math.PI;
const Rt = Ea * 2;
Math.lerpAngle = function (e, t, i) {
  if (Math.abs(t - e) > Ea) {
    if (e > t) {
      t += Rt;
    } else {
      e += Rt;
    }
  }
  const s = t + (e - t) * i;
  if (s >= 0 && s <= Rt) {
    return s;
  } else {
    return s % Rt;
  }
};
CanvasRenderingContext2D.prototype.roundRect = function (e, t, i, n, s) {
  if (i < s * 2) {
    s = i / 2;
  }
  if (n < s * 2) {
    s = n / 2;
  }
  if (s < 0) {
    s = 0;
  }
  this.beginPath();
  this.moveTo(e + s, t);
  this.arcTo(e + i, t, e + i, t + n, s);
  this.arcTo(e + i, t + n, e, t + n, s);
  this.arcTo(e, t + n, e, t, s);
  this.arcTo(e, t, e + i, t, s);
  this.closePath();
  return this;
};
let rr;
if (typeof Storage !== "undefined") {
  rr = true;
}
function _n(e, t) {
  if (rr) {
    localStorage.setItem(e, t);
  }
}
function Bi(e) {
  if (rr) {
    return localStorage.getItem(e);
  } else {
    return null;
  }
}
let Sn = Bi("moofoll");
function Xf() {
  if (!Sn) {
    Sn = true;
    _n("moofoll", 1);
  }
}
let Ca;
let Et;
let jt = 1;
let Fe;
let hi;
let us;
let oo = Date.now();
var ut;
let Ke;
const Oe = [];
const oe = [];
let tt = [];
const Dt = [];
const ui = [];
const Pa = new Ch(Zh, ui, oe, Oe, $e, L, T, A);
const ao = new Ph(Oe, $h, oe, L, null, T, A);
let P;
let $a;
let k;
let qt = 1;
let fs = 0;
let Ra = 0;
let Aa = 0;
let ot;
let at;
let lo;
let or = 0;
const ge = T.maxScreenWidth;
const ye = T.maxScreenHeight;
let ei;
let ti;
let qi = false;
document.getElementById("ad-container");
const zn = document.getElementById("mainMenu");
const Hi = document.getElementById("enterGame");
const ds = document.getElementById("promoImg");
document.getElementById("partyButton");
const ps = document.getElementById("joinPartyButton");
const _s = document.getElementById("settingsButton");
const co = _s.getElementsByTagName("span")[0];
const ho = document.getElementById("allianceButton");
const uo = document.getElementById("storeButton");
const fo = document.getElementById("chatButton");
const ri = document.getElementById("gameCanvas");
const C = ri.getContext("2d");
var qf = document.getElementById("serverBrowser");
const zs = document.getElementById("nativeResolution");
const ms = document.getElementById("showPing");
document.getElementById("playMusic");
const Gi = document.getElementById("pingDisplay");
const po = document.getElementById("shutdownDisplay");
const Yi = document.getElementById("menuCardHolder");
const Li = document.getElementById("guideCard");
const fi = document.getElementById("loadingText");
const ar = document.getElementById("gameUI");
const mo = document.getElementById("actionBar");
const Gf = document.getElementById("scoreDisplay");
const Yf = document.getElementById("foodDisplay");
const Kf = document.getElementById("woodDisplay");
const Zf = document.getElementById("stoneDisplay");
const Jf = document.getElementById("killCounter");
const go = document.getElementById("leaderboardData");
const Ki = document.getElementById("nameInput");
const vt = document.getElementById("itemInfoHolder");
const yo = document.getElementById("ageText");
const wo = document.getElementById("ageBarBody");
const Gt = document.getElementById("upgradeHolder");
const tn = document.getElementById("upgradeCounter");
const We = document.getElementById("allianceMenu");
const nn = document.getElementById("allianceHolder");
const sn = document.getElementById("allianceManager");
const De = document.getElementById("mapDisplay");
const Fi = document.getElementById("diedText");
const Qf = document.getElementById("skinColorHolder");
const Te = De.getContext("2d");
De.width = 300;
De.height = 300;
const bt = document.getElementById("storeMenu");
const vo = document.getElementById("storeHolder");
const Yt = document.getElementById("noticationDisplay");
const Vi = Zo.hats;
const Ni = Zo.accessories;
var $e = new Eh(Rh, Dt, A, T);
const Zi = "#525252";
const ko = "#3d3f42";
const St = 5.5;
T.DAY_INTERVAL / 24;
T.DAY_INTERVAL / 2;
function jf(e) {
  tt = e.teams;
}
let lr = true;
var cr = false;
if (!nr || xn) {
  cr = true;
}
window.onblur = function () {
  lr = false;
};
window.onfocus = function () {
  lr = true;
  if (P && P.alive) {
    gr();
  }
};
window.captchaCallbackHook = function () {
  cr = true;
};
if (window.captchaCallbackComplete) {
  window.captchaCallbackHook();
}
window.addEventListener("keydown", function (e) {
  if (e.keyCode == 32 && e.target == document.body) {
    e.preventDefault();
  }
});
ri.oncontextmenu = function () {
  return false;
};
["touch-controls-left", "touch-controls-right", "touch-controls-fullscreen", "storeMenu"].forEach(e => {
  if (document.getElementById(e)) {
    document.getElementById(e).oncontextmenu = function (t) {
      t.preventDefault();
    };
  }
});
function gs(e) {
  bn = false;
  me.close();
  hr(e);
}
function hr(e, t) {
  zn.style.display = "block";
  ar.style.display = "none";
  Yi.style.display = "none";
  Fi.style.display = "none";
  fi.style.display = "block";
  fi.innerHTML = e + (t ? "<a href='javascript:window.location.href=window.location.href' class='ytLink'>reload</a>" : "");
}
function ed() {
  Gi.hidden = true;
  fi.style.display = "none";
  zn.style.display = "block";
  Yi.style.display = "block";
  bd();
  id();
  Fd();
  fi.style.display = "none";
  Yi.style.display = "block";
  let e = Bi("moo_name") || "";
  if (!e.length && FRVR.profile) {
    e = FRVR.profile.name();
    if (e) {
      e += Math.floor(Math.random() * 90) + 9;
    }
  }
  Ki.value = e || "";
}
function td(e) {
  var t;
  if (((t = e == null ? undefined : e.detail) == null ? undefined : t.state) === "verified") {
    $i = e.detail.payload, document.getElementById("altcha").remove(), document.getElementById("enterGame").innerText = "Enter Game";;
    Hi.classList.remove("disabled");
  }
}
window.addEventListener("load", () => {
document.getElementById("altcha_checkbox").click();
document.getElementById("enterGame").innerText = "Auto Verify Shit";
  const e = document.getElementById("altcha");
  if (!(e == null)) {
    e.addEventListener("statechange", td);
  }
});
let rn = false;
function id() {
  Hi.onclick = A.checkTrusted(function () {
    if (!Hi.classList.contains("disabled")) {
      hr("Connecting...");
      if (sr()) {
        if (rn) {
          FRVR.ads.show("interstitial").catch(console.error).finally(Pn);
        } else {
          Pn();
          rn = true;
        }
      } else if (rn) {
        FRVR.ads.show("interstitial").catch(console.error).finally(ro);
      } else {
        ro();
        rn = true;
      }
    }
  });
  A.hookTouchEvents(Hi);
  if (ds) {
    ds.onclick = A.checkTrusted(function () {
      il("https://krunker.io/?play=SquidGame_KB");
    });
    A.hookTouchEvents(ds);
  }
  if (ps) {
    ps.onclick = A.checkTrusted(function () {
      // TOLOOK
      setTimeout(function () {
        Uf();
      }, 10);
    });
    A.hookTouchEvents(ps);
  }
  _s.onclick = A.checkTrusted(function () {
    Id();
  });
  A.hookTouchEvents(_s);
  ho.onclick = A.checkTrusted(function () {
    dd();
  });
  A.hookTouchEvents(ho);
  uo.onclick = A.checkTrusted(function () {
    kd();
  });
  A.hookTouchEvents(uo);
  fo.onclick = A.checkTrusted(function () {
    Va();
  });
  A.hookTouchEvents(fo);
  De.onclick = A.checkTrusted(function () {
    Xa();
  });
  A.hookTouchEvents(De);
}
let In;
const nd = {
  view: () => {
    if (!xt.servers) {
      return;
    }
    let e = 0;
    const t = Object.keys(xt.servers).map(i => {
      const n = xt.regionInfo[i].name;
      let s = 0;
      const r = xt.servers[i].map(o => {
        var u;
        s += o.playerCount;
        const l = o.selected;
        let c = n + " " + o.name + " [" + Math.min(o.playerCount, o.playerCapacity) + "/" + o.playerCapacity + "]";
        const a = o.name;
        const f = l ? "selected" : "";
        if (o.ping && ((u = o.pings) == null ? undefined : u.length) >= 2) {
          c += ` [${Math.floor(o.ping)}ms]`;
        } else if (!l) {
          c += " [?]";
        }
        let d = {
          value: i + ":" + a
        };
        if (f) {
          In = i + ":" + a;
          d.selected = true;
        }
        return kt("option", d, c);
      });
      e += s;
      return [kt("option[disabled]", `${n} - ${s} players`), r, kt("option[disabled]")];
    });
    return kt("select", {
      value: In,
      onfocus: () => {
        window.blockRedraw = true;
      },
      onblur: () => {
        window.blockRedraw = false;
      },
      onchange: od
    }, [t, kt("option[disabled]", `All Servers - ${e} players`)]);
  }
};
kt.mount(qf, nd);
var Bs;
var Hs;
if (location.hostname == "sandbox.moomoo.io") {
  Bs = "Back to MooMoo";
  Hs = "//moomoo.io/";
} else {
  Bs = "Try the sandbox";
  Hs = "//sandbox.moomoo.io/";
}
document.getElementById("altServer").innerHTML = "<a href='" + Hs + "'>" + Bs + "<i class='material-icons' style='font-size:10px;vertical-align:middle'>arrow_forward_ios</i></a>";
const sd = `${dn}/servers?v=1.26`;
const Da = async () => fetch(sd).then(e => e.json()).then(async e => xt.processServers(e)).catch(e => {
  console.error("Failed to load server data with status code:", e);
});
const rd = () => Da().then(ed).catch(e => {
  console.error("Failed to load.");
});
window.frvrSdkInitPromise.then(() => window.FRVR.bootstrapper.complete()).then(() => rd());
const od = e => {
  window.blockRedraw = false;
  if (FRVR.channelCharacteristics.allowNavigation) {
    const [t, i] = e.target.value.split(":");
    xt.switchServer(t, i);
  } else if (bn) {
    bn = false;
    Ds = false;
    Os = true;
    $n = true;
    me.close();
  }
};
document.getElementById("pre-content-container");
function ad() {
  FRVR.ads.show("interstitial", Pn);
}
window.showPreAd = ad;
function Ue(e, t, i) {
  if (P && e) {
    A.removeAllChildren(vt);
    vt.classList.add("visible");
    A.generateElement({
      id: "itemInfoName",
      text: A.capitalizeFirst(e.name),
      parent: vt
    });
    A.generateElement({
      id: "itemInfoDesc",
      text: e.desc,
      parent: vt
    });
    if (!i) {
      if (t) {
        A.generateElement({
          class: "itemInfoReq",
          text: e.type ? "secondary" : "primary",
          parent: vt
        });
      } else {
        for (let s = 0; s < e.req.length; s += 2) {
          A.generateElement({
            class: "itemInfoReq",
            html: e.req[s] + "<span class='itemInfoReqVal'> x" + e.req[s + 1] + "</span>",
            parent: vt
          });
        }
        const n = Ta ? e.group.sandboxLimit || Math.max(e.group.limit * 3, 99) : e.group.limit;
        if (e.group.limit) {
          A.generateElement({
            class: "itemInfoLmt",
            text: (P.itemCounts[e.group.id] || 0) + "/" + n,
            parent: vt
          });
        }
      }
    }
  } else {
    vt.classList.remove("visible");
  }
}
let di = [];
let ii = [];
function ld(e, t) {
  di.push({
    sid: e,
    name: t
  });
  ur();
}
function ur() {
  if (di[0]) {
    const e = di[0];
    A.removeAllChildren(Yt);
    Yt.style.display = "block";
    A.generateElement({
      class: "notificationText",
      text: e.name,
      parent: Yt
    });
    A.generateElement({
      class: "notifButton",
      html: "<i class='material-icons' style='font-size:28px;color:#cc5151;'>&#xE14C;</i>",
      parent: Yt,
      onclick: function () {
        Fs(0);
      },
      hookTouch: true
    });
    A.generateElement({
      class: "notifButton",
      html: "<i class='material-icons' style='font-size:28px;color:#8ecc51;'>&#xE876;</i>",
      parent: Yt,
      onclick: function () {
        Fs(1);
      },
      hookTouch: true
    });
  } else {
    Yt.style.display = "none";
  }
}
function cd(e) {
  tt.push(e);
  if (We.style.display == "block") {
    Qi();
  }
}
function hd(e, t) {
  if (P) {
    P.team = e;
    P.isOwner = t;
    if (We.style.display == "block") {
      Qi();
    }
  }
}
function ud(e) {
  ii = e;
  if (We.style.display == "block") {
    Qi();
  }
}
function fd(e) {
  for (let t = tt.length - 1; t >= 0; t--) {
    if (tt[t].sid == e) {
      tt.splice(t, 1);
    }
  }
  if (We.style.display == "block") {
    Qi();
  }
}
function dd() {
  gr();
  if (We.style.display != "block") {
    Qi();
  } else {
    Ls();
  }
}
function Ls() {
  if (We.style.display == "block") {
    We.style.display = "none";
  }
}
function Qi() {
  if (P && P.alive) {
    Bn();
    bt.style.display = "none";
    We.style.display = "block";
    A.removeAllChildren(nn);
    if (P.team) {
      for (var e = 0; e < ii.length; e += 2) {
        (function (t) {
          const i = A.generateElement({
            class: "allianceItem",
            style: "color:" + (ii[t] == P.sid ? "#fff" : "rgba(255,255,255,0.6)"),
            text: ii[t + 1],
            parent: nn
          });
          if (P.isOwner && ii[t] != P.sid) {
            A.generateElement({
              class: "joinAlBtn",
              text: "Kick",
              onclick: function () {
                Oa(ii[t]);
              },
              hookTouch: true,
              parent: i
            });
          }
        })(e);
      }
    } else if (tt.length) {
      for (var e = 0; e < tt.length; ++e) {
        (function (i) {
          const n = A.generateElement({
            class: "allianceItem",
            style: "color:" + (tt[i].sid == P.team ? "#fff" : "rgba(255,255,255,0.6)"),
            text: tt[i].sid,
            parent: nn
          });
          A.generateElement({
            class: "joinAlBtn",
            text: "Join",
            onclick: function () {
              _a(i);
            },
            hookTouch: true,
            parent: n
          });
        })(e);
      }
    } else {
      A.generateElement({
        class: "allianceItem",
        text: "No Tribes Yet",
        parent: nn
      });
    }
    A.removeAllChildren(sn);
    if (P.team) {
      A.generateElement({
        class: "allianceButtonM",
        style: "width: 360px",
        text: P.isOwner ? "Delete Tribe" : "Leave Tribe",
        onclick: function () {
          za();
        },
        hookTouch: true,
        parent: sn
      });
    } else {
      A.generateElement({
        tag: "input",
        type: "text",
        id: "allianceInput",
        maxLength: 7,
        placeholder: "unique name",
        onchange: t => {
          t.target.value = (t.target.value || "").slice(0, 7);
        },
        onkeypress: t => {
          if (t.key === "Enter") {
            t.preventDefault();
            Vs();
            return false;
          }
        },
        parent: sn
      });
      A.generateElement({
        tag: "div",
        class: "allianceButtonM",
        style: "width: 140px;",
        text: "Create",
        onclick: function () {
          Vs();
        },
        hookTouch: true,
        parent: sn
      });
    }
  }
}
function Fs(e) {
  me.send("P", di[0].sid, e);
  di.splice(0, 1);
  ur();
}
function Oa(e) {
  me.send("Q", e);
}
function _a(e) {
  me.send("b", tt[e].sid);
}
function Vs() {
  me.send("L", document.getElementById("allianceInput").value);
}
function za() {
  di = [];
  ur();
  me.send("N");
}
let mn;
let Ri;
let At;
const oi = [];
let Pt;
function pd() {
  this.init = function (e, t) {
    this.scale = 0;
    this.x = e;
    this.y = t;
    this.active = true;
  };
  this.update = function (e, t) {
    if (this.active) {
      this.scale += t * 0.05;
      if (this.scale >= T.mapPingScale) {
        this.active = false;
      } else {
        e.globalAlpha = 1 - Math.max(0, this.scale / T.mapPingScale);
        e.beginPath();
        e.arc(this.x / T.mapScale * De.width, this.y / T.mapScale * De.width, this.scale, 0, Math.PI * 2);
        e.stroke();
      }
    }
  };
}
function md(e, t) {
  for (let i = 0; i < oi.length; ++i) {
    if (!oi[i].active) {
      Pt = oi[i];
      break;
    }
  }
  if (!Pt) {
    Pt = new pd();
    oi.push(Pt);
  }
  Pt.init(e, t);
}
function gd() {
  if (!At) {
    At = {};
  }
  At.x = P.x;
  At.y = P.y;
}
function yd(e) {
  Ri = e;
}
function wd(e) {
  if (P && P.alive) {
    Te.clearRect(0, 0, De.width, De.height);
    Te.strokeStyle = "#fff";
    Te.lineWidth = 4;
    for (var t = 0; t < oi.length; ++t) {
      Pt = oi[t];
      Pt.update(Te, e);
    }
    Te.globalAlpha = 1;
    Te.fillStyle = "#fff";
    he(P.x / T.mapScale * De.width, P.y / T.mapScale * De.height, 7, Te, true);
    Te.fillStyle = "rgba(255,255,255,0.35)";
    if (P.team && Ri) {
      for (var t = 0; t < Ri.length;) {
        he(Ri[t] / T.mapScale * De.width, Ri[t + 1] / T.mapScale * De.height, 7, Te, true);
        t += 2;
      }
    }
    if (mn) {
      Te.fillStyle = "#fc5553";
      Te.font = "34px Hammersmith One";
      Te.textBaseline = "middle";
      Te.textAlign = "center";
      Te.fillText("x", mn.x / T.mapScale * De.width, mn.y / T.mapScale * De.height);
    }
    if (At) {
      Te.fillStyle = "#fff";
      Te.font = "34px Hammersmith One";
      Te.textBaseline = "middle";
      Te.textAlign = "center";
      Te.fillText("x", At.x / T.mapScale * De.width, At.y / T.mapScale * De.height);
    }
  }
}
let Ns = 0;
function vd(e) {
  if (Ns != e) {
    Ns = e;
    fr();
  }
}
function kd() {
  if (bt.style.display != "block") {
    bt.style.display = "block";
    We.style.display = "none";
    Bn();
    fr();
  } else {
    Us();
  }
}
function Us() {
  if (bt.style.display == "block") {
    bt.style.display = "none";
    Ue();
  }
}
function xd(e, t, i) {
  if (i) {
    if (e) {
      P.tailIndex = t;
    } else {
      P.tails[t] = 1;
    }
  } else if (e) {
    P.skinIndex = t;
  } else {
    P.skins[t] = 1;
  }
  if (bt.style.display == "block") {
    fr();
  }
}
function fr() {
  if (P) {
    A.removeAllChildren(vo);
    const e = Ns;
    const t = e ? Ni : Vi;
    for (let i = 0; i < t.length; ++i) {
      if (!t[i].dontSell) {
        (function (n) {
          const s = A.generateElement({
            id: "storeDisplay" + n,
            class: "storeItem",
            onmouseout: function () {
              Ue();
            },
            onmouseover: function () {
              Ue(t[n], false, true);
            },
            parent: vo
          });
          A.hookTouchEvents(s, true);
          A.generateElement({
            tag: "img",
            class: "hatPreview",
            src: "./img/" + (e ? "accessories/access_" : "hats/hat_") + t[n].id + (t[n].topSprite ? "_p" : "") + ".png",
            parent: s
          });
          A.generateElement({
            tag: "span",
            text: t[n].name,
            parent: s
          });
          if (e ? !P.tails[t[n].id] : !P.skins[t[n].id]) {
            A.generateElement({
              class: "joinAlBtn",
              style: "margin-top: 5px",
              text: "Buy",
              onclick: function () {
                Ba(t[n].id, e);
              },
              hookTouch: true,
              parent: s
            });
            A.generateElement({
              tag: "span",
              class: "itemPrice",
              text: t[n].price,
              parent: s
            });
          } else if ((e ? P.tailIndex : P.skinIndex) == t[n].id) {
            A.generateElement({
              class: "joinAlBtn",
              style: "margin-top: 5px",
              text: "Unequip",
              onclick: function () {
                Ws(0, e);
              },
              hookTouch: true,
              parent: s
            });
          } else {
            A.generateElement({
              class: "joinAlBtn",
              style: "margin-top: 5px",
              text: "Equip",
              onclick: function () {
                Ws(t[n].id, e);
              },
              hookTouch: true,
              parent: s
            });
          }
        })(i);
      }
    }
  }
}
function Ws(e, t) {
  me.send("c", 0, e, t);
}
function Ba(e, t) {
  me.send("c", 1, e, t);
}
function Ha() {
  bt.style.display = "none";
  We.style.display = "none";
  Bn();
}
function bd() {
  const e = Bi("native_resolution");
  ys(e ? e == "true" : typeof cordova !== "undefined");
  Et = Bi("show_ping") == "true";
  Gi.hidden = !Et || !qi;
  Bi("moo_moosic");
  // TOLOOK
  setInterval(function () {
    if (window.cordova) {
      document.getElementById("downloadButtonContainer").classList.add("cordova");
      document.getElementById("mobileDownloadButtonContainer").classList.add("cordova");
    }
  }, 1000);
  Fa();
  A.removeAllChildren(mo);
  for (var t = 0; t < L.weapons.length + L.list.length; ++t) {
    (function (i) {
      A.generateElement({
        id: "actionBarItem" + i,
        class: "actionBarItem",
        style: "display:none",
        onmouseout: function () {
          Ue();
        },
        parent: mo
      });
    })(t);
  }
  for (var t = 0; t < L.list.length + L.weapons.length; ++t) {
    (function (n) {
      const s = document.createElement("canvas");
      s.width = s.height = 66;
      const r = s.getContext("2d");
      r.translate(s.width / 2, s.height / 2);
      r.imageSmoothingEnabled = false;
      r.webkitImageSmoothingEnabled = false;
      r.mozImageSmoothingEnabled = false;
      if (L.weapons[n]) {
        r.rotate(Math.PI / 4 + Math.PI);
        var o = new Image();
        Gs[L.weapons[n].src] = o;
        o.onload = function () {
          this.isLoaded = true;
          const c = 1 / (this.height / this.width);
          const a = L.weapons[n].iPad || 1;
          r.drawImage(this, -(s.width * a * T.iconPad * c) / 2, -(s.height * a * T.iconPad) / 2, s.width * a * c * T.iconPad, s.height * a * T.iconPad);
          r.fillStyle = "rgba(0, 0, 70, 0.1)";
          r.globalCompositeOperation = "source-atop";
          r.fillRect(-s.width / 2, -s.height / 2, s.width, s.height);
          document.getElementById("actionBarItem" + n).style.backgroundImage = "url(" + s.toDataURL() + ")";
        };
        o.src = "./img/weapons/" + L.weapons[n].src + ".png";
        var l = document.getElementById("actionBarItem" + n);
        l.onmouseover = A.checkTrusted(function () {
          Ue(L.weapons[n], true);
        });
        l.onclick = A.checkTrusted(function () {
          Ui(n, true);
        });
        A.hookTouchEvents(l);
      } else {
        var o = yr(L.list[n - L.weapons.length], true);
        const a = Math.min(s.width - T.iconPadding, o.width);
        r.globalAlpha = 1;
        r.drawImage(o, -a / 2, -a / 2, a, a);
        r.fillStyle = "rgba(0, 0, 70, 0.1)";
        r.globalCompositeOperation = "source-atop";
        r.fillRect(-a / 2, -a / 2, a, a);
        document.getElementById("actionBarItem" + n).style.backgroundImage = "url(" + s.toDataURL() + ")";
        var l = document.getElementById("actionBarItem" + n);
        l.onmouseover = A.checkTrusted(function () {
          Ue(L.list[n - L.weapons.length]);
        });
        l.onclick = A.checkTrusted(function () {
          Ui(n - L.weapons.length);
        });
        A.hookTouchEvents(l);
      }
    })(t);
  }
  Ki.onchange = i => {
    i.target.value = (i.target.value || "").slice(0, 15);
  };
  Ki.onkeypress = i => {
    if (i.key === "Enter") {
      i.preventDefault();
      Hi.onclick(i);
      return false;
    }
  };
  zs.checked = Ca;
  zs.onchange = A.checkTrusted(function (i) {
    ys(i.target.checked);
  });
  ms.checked = Et;
  ms.onchange = A.checkTrusted(function (i) {
    Et = ms.checked;
    Gi.hidden = !Et;
    _n("show_ping", Et ? "true" : "false");
  });
}
function La(e, t) {
  if (e) {
    if (t) {
      P.weapons = e;
    } else {
      P.items = e;
    }
  }
  for (var i = 0; i < L.list.length; ++i) {
    const n = L.weapons.length + i;
    document.getElementById("actionBarItem" + n).style.display = P.items.indexOf(L.list[i].id) >= 0 ? "inline-block" : "none";
  }
  for (var i = 0; i < L.weapons.length; ++i) {
    document.getElementById("actionBarItem" + i).style.display = P.weapons[L.weapons[i].type] == L.weapons[i].id ? "inline-block" : "none";
  }
}
function ys(e) {
  Ca = e;
  jt = e && window.devicePixelRatio || 1;
  zs.checked = e;
  _n("native_resolution", e.toString());
  dr();
}
function Sd() {
  if (ji) {
    Li.classList.add("touch");
  } else {
    Li.classList.remove("touch");
  }
}
function Id() {
  if (Li.classList.contains("showing")) {
    Li.classList.remove("showing");
    co.innerText = "Settings";
  } else {
    Li.classList.add("showing");
    co.innerText = "Close";
  }
}
function Fa() {
  let e = "";
  for (let t = 0; t < T.skinColors.length; ++t) {
    if (t == or) {
      e += "<div class='skinColorItem activeSkin' style='background-color:" + T.skinColors[t] + "' onclick='selectSkinColor(" + t + ")'></div>";
    } else {
      e += "<div class='skinColorItem' style='background-color:" + T.skinColors[t] + "' onclick='selectSkinColor(" + t + ")'></div>";
    }
  }
  Qf.innerHTML = e;
}
function Td(e) {
  or = e;
  Fa();
}
const Ai = document.getElementById("chatBox");
const Tn = document.getElementById("chatHolder");
function Va() {
  if (ji) {
    // TOLOOK
    setTimeout(function () {
      const e = prompt("chat message");
      if (e) {
        xo(e);
      }
    }, 1);
  } else if (Tn.style.display == "block") {
    if (Ai.value) {
      xo(Ai.value);
    }
    Bn();
  } else {
    bt.style.display = "none";
    We.style.display = "none";
    Tn.style.display = "block";
    Ai.focus();
    gr();
  }
  Ai.value = "";
}
function xo(e) {
  me.send("6", e.slice(0, 30));
}
function Bn() {
  Ai.value = "";
  Tn.style.display = "none";
}
function Md(e, t) {
  const i = Hn(e);
  if (i) {
    i.chatMessage = t;
    i.chatCountdown = T.chatCountdown;
  }
}
window.addEventListener("resize", A.checkTrusted(dr));
function dr() {
  ei = window.innerWidth;
  ti = window.innerHeight;
  const e = Math.max(ei / ge, ti / ye) * jt;
  ri.width = ei * jt;
  ri.height = ti * jt;
  ri.style.width = ei + "px";
  ri.style.height = ti + "px";
  C.setTransform(e, 0, 0, e, (ei * jt - ge * e) / 2, (ti * jt - ye * e) / 2);
}
dr();
let ji;
Ot(false);
function Ot(e) {
  ji = e;
  Sd();
}
window.setUsingTouch = Ot;
let Ed = document.getElementById("leaderboardButton");
let Na = document.getElementById("leaderboard");
Ed.addEventListener("touchstart", () => {
  Na.classList.add("is-showing");
});
const pr = () => {
  Na.classList.remove("is-showing");
};
document.body.addEventListener("touchend", pr);
document.body.addEventListener("touchleave", pr);
document.body.addEventListener("touchcancel", pr);
if (!Ma) {
  let t = function (s) {
    s.preventDefault();
    s.stopPropagation();
    Ot(false);
    Ra = s.clientX;
    Aa = s.clientY;
  };
  let i = function (s) {
    Ot(false);
    if (Ke != 1) {
      Ke = 1;
      _t();
    }
  };
  let n = function (s) {
    Ot(false);
    if (Ke != 0) {
      Ke = 0;
      _t();
    }
  };
  var gp = t;
  var yp = i;
  var wp = n;
  const e = document.getElementById("touch-controls-fullscreen");
  e.style.display = "block";
  e.addEventListener("mousemove", t, false);
  e.addEventListener("mousedown", i, false);
  e.addEventListener("mouseup", n, false);
}
let Xs = false;
let Ua;
function Cd() {
  let e = 0;
  let t = 0;
  let i;
  if (ji) {
    if (!Xs) {
      return;
    }
    i = Ua;
  }
  for (const n in En) {
    const s = En[n];
    e += !!ut[n] * s[0];
    t += !!ut[n] * s[1];
  }
  if (e != 0 || t != 0) {
    i = Math.atan2(t, e);
  }
  if (i !== undefined) {
    return A.fixTo(i, 2);
  }
}
let Mn;
function mr() {
  if (P) {
    if (!P.lockDir && !ji) {
      Mn = Math.atan2(Aa - ti / 2, Ra - ei / 2);
    }
    return A.fixTo(Mn || 0, 2);
  } else {
    return 0;
  }
}
var ut = {};
var En = {
  87: [0, -1],
  38: [0, -1],
  83: [0, 1],
  40: [0, 1],
  65: [-1, 0],
  37: [-1, 0],
  68: [1, 0],
  39: [1, 0]
};
function gr() {
  ut = {};
  me.send("e");
}
function Wa() {
  return We.style.display != "block" && Tn.style.display != "block";
}
function Pd(e) {
  const t = e.which || e.keyCode || 0;
  if (t == 27) {
    Ha();
  } else if (P && P.alive && Wa()) {
    if (!ut[t]) {
      ut[t] = 1;
      if (t == 69) {
        Ad();
      } else if (t == 67) {
        gd();
      } else if (t == 88) {
        Rd();
      } else if (P.weapons[t - 49] != null) {
        Ui(P.weapons[t - 49], true);
      } else if (P.items[t - 49 - P.weapons.length] != null) {
        Ui(P.items[t - 49 - P.weapons.length]);
      } else if (t == 81) {
        Ui(P.items[0]);
      } else if (t == 82) {
        Xa();
      } else if (En[t]) {
        Cn();
      } else if (t == 32) {
        Ke = 1;
        _t();
      }
    }
  }
}
window.addEventListener("keydown", A.checkTrusted(Pd));
function $d(e) {
  if (P && P.alive) {
    const t = e.which || e.keyCode || 0;
    if (t == 13) {
      if (We.style.display === "block") {
        return;
      }
      Va();
    } else if (Wa() && ut[t]) {
      ut[t] = 0;
      if (En[t]) {
        Cn();
      } else if (t == 32) {
        Ke = 0;
        _t();
      }
    }
  }
}
window.addEventListener("keyup", A.checkTrusted($d));
function _t() {
  if (P && P.alive) {
    me.send("F", Ke, P.buildIndex >= 0 ? mr() : null);
  }
}
let ws1;
function Cn() {
  const e = Cd();
  if (ws1 == null || e == null || Math.abs(e - ws1) > 0.3) {
    me.send("9", e);
    ws1 = e;
  }
}
function Rd() {
  P.lockDir = P.lockDir ? 0 : 1;
  me.send("K", 0);
}
function Xa() {
  me.send("S", 1);
}
function Ad() {
  me.send("K", 1);
}
function Ui(e, t) {
  me.send("z", e, t);
}
function Pn() {
  Gi.hidden = !Et;
  window.onbeforeunload = function (e) {
    return "Are you sure?";
  };
  if (window.FRVR) {
    window.FRVR.tracker.levelStart("game_start");
  }
  _n("moo_name", Ki.value);
  if (!qi && sr()) {
    qi = true;
    Wf.stop("menu");
    hr("Loading...");
    me.send("M", {
      name: Ki.value,
      moofoll: Sn,
      skin: or
    });
  }
  Dd();
}
function Dd() {
  var e = document.getElementById("ot-sdk-btn-floating");
  if (e) {
    e.style.display = "none";
  }
}
function Od() {
  var e = document.getElementById("ot-sdk-btn-floating");
  if (e) {
    e.style.display = "block";
  }
}
let $n = true;
let vs = false;
function _d(e) {
  fi.style.display = "none";
  Yi.style.display = "block";
  zn.style.display = "none";
  ut = {};
  $a = e;
  Ke = 0;
  qi = true;
  if ($n) {
    $n = false;
    Dt.length = 0;
  }
  if (Ma) {
    Vu.enable({
      onStartMoving: () => {
        Us();
        Ls();
        Ot(true);
        Xs = true;
      },
      onStopMoving: () => {
        Xs = false;
        Cn();
      },
      onRotateMoving: (t, i) => {
        if (!(i.force < 0.25)) {
          Ua = -i.angle.radian;
          Cn();
          if (!vs) {
            Mn = -i.angle.radian;
          }
        }
      },
      onStartAttacking: () => {
        Us();
        Ls();
        Ot(true);
        vs = true;
        if (P.buildIndex < 0) {
          Ke = 1;
          _t();
        }
      },
      onStopAttacking: () => {
        if (P.buildIndex >= 0) {
          Ke = 1;
          _t();
        }
        Ke = 0;
        _t();
        vs = false;
      },
      onRotateAttacking: (t, i) => {
        if (!(i.force < 0.25)) {
          Mn = -i.angle.radian;
        }
      }
    });
  }
}
function zd(e, t, i, n) {
  if (n === -1) {
    As.showText(e, t, 50, 0.18, 500, i, "#ee5551");
  } else {
    As.showText(e, t, 50, 0.18, 500, Math.abs(i), i >= 0 ? "#fff" : "#8ecc51");
  }
}
let gn = 99999;
function Bd() {
  qi = false;
  Od();
  try {
    factorem.refreshAds([2], true);
  } catch {}
  ar.style.display = "none";
  Ha();
  mn = {
    x: P.x,
    y: P.y
  };
  fi.style.display = "none";
  Fi.style.display = "block";
  Fi.style.fontSize = "0px";
  gn = 0;
  // TOLOOK
  setTimeout(function () {
    Yi.style.display = "block";
    zn.style.display = "block";
    Fi.style.display = "none";
  }, T.deathFadeout);
  Da();
}
function Hd(e) {
  if (P) {
    $e.removeAllItems(e);
  }
}
function Ld(e) {
  $e.disableBySid(e);
}
function qa() {
  Gf.innerText = P.points;
  Yf.innerText = P.food;
  Kf.innerText = P.wood;
  Zf.innerText = P.stone;
  Jf.innerText = P.kills;
}
const Di = {};
const ks = ["crown", "skull"];
function Fd() {
  for (let e = 0; e < ks.length; ++e) {
    const t = new Image();
    t.onload = function () {
      this.isLoaded = true;
    };
    t.src = "./img/icons/" + ks[e] + ".png";
    Di[ks[e]] = t;
  }
}
const Kt = [];
function Ga(e, t) {
  P.upgradePoints = e;
  P.upgrAge = t;
  if (e > 0) {
    Kt.length = 0;
    A.removeAllChildren(Gt);
    for (var i = 0; i < L.weapons.length; ++i) {
      if (L.weapons[i].age == t && (L.weapons[i].pre == null || P.weapons.indexOf(L.weapons[i].pre) >= 0)) {
        var n = A.generateElement({
          id: "upgradeItem" + i,
          class: "actionBarItem",
          onmouseout: function () {
            Ue();
          },
          parent: Gt
        });
        n.style.backgroundImage = document.getElementById("actionBarItem" + i).style.backgroundImage;
        Kt.push(i);
      }
    }
    for (var i = 0; i < L.list.length; ++i) {
      if (L.list[i].age == t && (L.list[i].pre == null || P.items.indexOf(L.list[i].pre) >= 0)) {
        const r = L.weapons.length + i;
        var n = A.generateElement({
          id: "upgradeItem" + r,
          class: "actionBarItem",
          onmouseout: function () {
            Ue();
          },
          parent: Gt
        });
        n.style.backgroundImage = document.getElementById("actionBarItem" + r).style.backgroundImage;
        Kt.push(r);
      }
    }
    for (var i = 0; i < Kt.length; i++) {
      (function (r) {
        const o = document.getElementById("upgradeItem" + r);
        o.onmouseover = function () {
          if (L.weapons[r]) {
            Ue(L.weapons[r], true);
          } else {
            Ue(L.list[r - L.weapons.length]);
          }
        };
        o.onclick = A.checkTrusted(function () {
          me.send("H", r);
        });
        A.hookTouchEvents(o);
      })(Kt[i]);
    }
    if (Kt.length) {
      Gt.style.display = "block";
      tn.style.display = "block";
      tn.innerHTML = "SELECT ITEMS (" + e + ")";
    } else {
      Gt.style.display = "none";
      tn.style.display = "none";
      Ue();
    }
  } else {
    Gt.style.display = "none";
    tn.style.display = "none";
    Ue();
  }
}
function Ya(e, t, i) {
  if (e != null) {
    P.XP = e;
  }
  if (t != null) {
    P.maxXP = t;
  }
  if (i != null) {
    P.age = i;
  }
  if (i == T.maxAge) {
    yo.innerHTML = "MAX AGE";
    wo.style.width = "100%";
  } else {
    yo.innerHTML = "AGE " + P.age;
    wo.style.width = P.XP / P.maxXP * 100 + "%";
  }
}
function Vd(e) {
  A.removeAllChildren(go);
  let t = 1;
  for (let i = 0; i < e.length; i += 3) {
    (function (n) {
      A.generateElement({
        class: "leaderHolder",
        parent: go,
        children: [A.generateElement({
          class: "leaderboardItem",
          style: "color:" + (e[n] == $a ? "#fff" : "rgba(255,255,255,0.6)"),
          text: t + ". " + (e[n + 1] != "" ? e[n + 1] : "unknown")
        }), A.generateElement({
          class: "leaderScore",
          text: A.kFormat(e[n + 2]) || "0"
        })]
      });
    })(i);
    t++;
  }
}
let bo = null;
function Nd() {
  {
    if (P && (!us || hi - us >= 1000 / T.clientSendRate)) {
      us = hi;
      const a = mr();
      if (bo !== a) {
        bo = a;
        me.send("D", a);
      }
    }
    if (gn < 120) {
      gn += Fe * 0.1;
      Fi.style.fontSize = Math.min(Math.round(gn), 120) + "px";
    }
    if (P) {
      const a = A.getDistance(ot, at, P.x, P.y);
      const f = A.getDirection(P.x, P.y, ot, at);
      const d = Math.min(a * 0.01 * Fe, a);
      if (a > 0.05) {
        ot += d * Math.cos(f);
        at += d * Math.sin(f);
      } else {
        ot = P.x;
        at = P.y;
      }
    } else {
      ot = T.mapScale / 2;
      at = T.mapScale / 2;
    }
    const o = hi - 1000 / T.serverUpdateRate;
    for (var e, t = 0; t < oe.length + Oe.length; ++t) {
      k = oe[t] || Oe[t - oe.length];
      if (k && k.visible) {
        if (k.forcePos) {
          k.x = k.x2;
          k.y = k.y2;
          k.dir = k.d2;
        } else {
          const a = k.t2 - k.t1;
          const d = (o - k.t1) / a;
          const u = 170;
          k.dt += Fe;
          const p = Math.min(1.7, k.dt / u);
          var e = k.x2 - k.x1;
          k.x = k.x1 + e * p;
          e = k.y2 - k.y1;
          k.y = k.y1 + e * p;
          k.dir = Math.lerpAngle(k.d2, k.d1, Math.min(1.2, d));
        }
      }
    }
    const l = ot - ge / 2;
    const c = at - ye / 2;
    if (T.snowBiomeTop - c <= 0 && T.mapScale - T.snowBiomeTop - c >= ye) {
      C.fillStyle = "#b6db66";
      C.fillRect(0, 0, ge, ye);
    } else if (T.mapScale - T.snowBiomeTop - c <= 0) {
      C.fillStyle = "#dbc666";
      C.fillRect(0, 0, ge, ye);
    } else if (T.snowBiomeTop - c >= ye) {
      C.fillStyle = "#fff";
      C.fillRect(0, 0, ge, ye);
    } else if (T.snowBiomeTop - c >= 0) {
      C.fillStyle = "#fff";
      C.fillRect(0, 0, ge, T.snowBiomeTop - c);
      C.fillStyle = "#b6db66";
      C.fillRect(0, T.snowBiomeTop - c, ge, ye - (T.snowBiomeTop - c));
    } else {
      C.fillStyle = "#b6db66";
      C.fillRect(0, 0, ge, T.mapScale - T.snowBiomeTop - c);
      C.fillStyle = "#dbc666";
      C.fillRect(0, T.mapScale - T.snowBiomeTop - c, ge, ye - (T.mapScale - T.snowBiomeTop - c));
    }
    if (!$n) {
      qt += fs * T.waveSpeed * Fe;
      if (qt >= T.waveMax) {
        qt = T.waveMax;
        fs = -1;
      } else if (qt <= 1) {
        qt = fs = 1;
      }
      C.globalAlpha = 1;
      C.fillStyle = "#dbc666";
      To(l, c, C, T.riverPadding);
      C.fillStyle = "#91b2db";
      To(l, c, C, (qt - 1) * 250);
    }
    /*C.lineWidth = 4;
    C.strokeStyle = "#000";
    C.globalAlpha = 0.06;
    C.beginPath();
    for (var i = -ot; i < ge; i += ye / 18) {
      if (i > 0) {
        C.moveTo(i, 0);
        C.lineTo(i, ye);
      }
    }
    for (let a = -at; a < ye; a += ye / 18) {
      if (i > 0) {
        C.moveTo(0, a);
        C.lineTo(ge, a);
      }
    }
    C.stroke();
    C.globalAlpha = 1;
    C.strokeStyle = Zi;*/
    Pi(-1, l, c);
    C.globalAlpha = 1;
    C.lineWidth = St;
    So(0, l, c);
    Mo(l, c, 0);
    C.globalAlpha = 1;
    for (var t = 0; t < Oe.length; ++t) {
      k = Oe[t];
      if (k.active && k.visible) {
        k.animate(Fe);
        C.save();
        C.translate(k.x - l, k.y - c);
        C.rotate(k.dir + k.dirPlus - Math.PI / 2);
        op(k, C);
        C.restore();
      }
    }
    Pi(0, l, c);
    So(1, l, c);
    Pi(1, l, c);
    Mo(l, c, 1);
    Pi(2, l, c);
    Pi(3, l, c);
    C.fillStyle = "#000";
    C.globalAlpha = 0.09;
    if (l <= 0) {
      C.fillRect(0, 0, -l, ye);
    }
    if (T.mapScale - l <= ge) {
      var n = Math.max(0, -c);
      C.fillRect(T.mapScale - l, n, ge - (T.mapScale - l), ye - n);
    }
    if (c <= 0) {
      C.fillRect(-l, 0, ge + l, -c);
    }
    if (T.mapScale - c <= ye) {
      var s = Math.max(0, -l);
      let a = 0;
      if (T.mapScale - l <= ge) {
        a = ge - (T.mapScale - l);
      }
      C.fillRect(s, T.mapScale - c, ge - s - a, ye - (T.mapScale - c));
    }
    C.globalAlpha = 1;
    C.fillStyle = "rgba(0, 0, 70, 0.35)";
    C.fillRect(0, 0, ge, ye);
    C.strokeStyle = ko;
    for (var t = 0; t < oe.length + Oe.length; ++t) {
      k = oe[t] || Oe[t - oe.length];
      if (k.visible && (k.skinIndex != 10 || k == P || k.team && k.team == P.team)) {
        const f = (k.team ? "[" + k.team + "] " : "") + (k.name || "");
        if (f != "") {
          C.font = (k.nameScale || 30) + "px Hammersmith One";
          C.fillStyle = "#fff";
          C.textBaseline = "middle";
          C.textAlign = "center";
          C.lineWidth = k.nameScale ? 11 : 8;
          C.lineJoin = "round";
          C.strokeText(f, k.x - l, k.y - c - k.scale - T.nameY);
          C.fillText(f, k.x - l, k.y - c - k.scale - T.nameY);
          if (k.isLeader && Di.crown.isLoaded) {
            var r = T.crownIconScale;
            var s = k.x - l - r / 2 - C.measureText(f).width / 2 - T.crownPad;
            C.drawImage(Di.crown, s, k.y - c - k.scale - T.nameY - r / 2 - 5, r, r);
          }
          if (k.iconIndex == 1 && Di.skull.isLoaded) {
            var r = T.crownIconScale;
            var s = k.x - l - r / 2 + C.measureText(f).width / 2 + T.crownPad;
            C.drawImage(Di.skull, s, k.y - c - k.scale - T.nameY - r / 2 - 5, r, r);
          }
        }
        if (k.health > 0) {
          T.healthBarWidth;
          C.fillStyle = ko;
          C.roundRect(k.x - l - T.healthBarWidth - T.healthBarPad, k.y - c + k.scale + T.nameY, T.healthBarWidth * 2 + T.healthBarPad * 2, 17, 8);
          C.fill();
          C.fillStyle = k == P || k.team && k.team == P.team ? "#8ecc51" : "#cc5151";
          C.roundRect(k.x - l - T.healthBarWidth, k.y - c + k.scale + T.nameY + T.healthBarPad, T.healthBarWidth * 2 * (k.health / k.maxHealth), 17 - T.healthBarPad * 2, 7);
          C.fill();
        }
      }
    }
    As.update(Fe, C, l, c);
    for (var t = 0; t < oe.length; ++t) {
      k = oe[t];
      if (k.visible && k.chatCountdown > 0) {
        k.chatCountdown -= Fe;
        if (k.chatCountdown <= 0) {
          k.chatCountdown = 0;
        }
        C.font = "32px Hammersmith One";
        const f = C.measureText(k.chatMessage);
        C.textBaseline = "middle";
        C.textAlign = "center";
        var s = k.x - l;
        var n = k.y - k.scale - c - 90;
        const p = 47;
        const w = f.width + 17;
        C.fillStyle = "rgba(0,0,0,0.2)";
        C.roundRect(s - w / 2, n - p / 2, w, p, 6);
        C.fill();
        C.fillStyle = "#fff";
        C.fillText(k.chatMessage, s, n);
      }
    }
  }
  wd(Fe);
}
function So(e, t, i) {
  for (let n = 0; n < ui.length; ++n) {
    k = ui[n];
    if (k.active && k.layer == e) {
      k.update(Fe);
      if (k.active && Za(k.x - t, k.y - i, k.scale)) {
        C.save();
        C.translate(k.x - t, k.y - i);
        C.rotate(k.dir);
        qs(0, 0, k, C);
        C.restore();
      }
    }
  }
}
const Io = {};
function qs(e, t, i, n, s) {
  if (i.src) {
    const r = L.projectiles[i.indx].src;
    let o = Io[r];
    if (!o) {
      o = new Image();
      o.onload = function () {
        this.isLoaded = true;
      };
      o.src = "./img/weapons/" + r + ".png";
      Io[r] = o;
    }
    if (o.isLoaded) {
      n.drawImage(o, e - i.scale / 2, t - i.scale / 2, i.scale, i.scale);
    }
  } else if (i.indx == 1) {
    n.fillStyle = "#939393";
    he(e, t, i.scale, n);
  }
}
function Ud() {
  const e = ot - ge / 2;
  const t = at - ye / 2;
  Ye.animationTime += Fe;
  Ye.animationTime %= T.volcanoAnimationDuration;
  const i = T.volcanoAnimationDuration / 2;
  const n = 1.7 + Math.abs(i - Ye.animationTime) / i * 0.3;
  const s = T.innerVolcanoScale * n;
  C.drawImage(Ye.land, Ye.x - T.volcanoScale - e, Ye.y - T.volcanoScale - t, T.volcanoScale * 2, T.volcanoScale * 2);
  C.drawImage(Ye.lava, Ye.x - s - e, Ye.y - s - t, s * 2, s * 2);
}
function To(e, t, i, n) {
  const s = T.riverWidth + n;
  const r = T.mapScale / 2 - t - s / 2;
  if (r < ye && r + s > 0) {
    i.fillRect(0, r, ge, s);
  }
}
function Pi(e, t, i) {
  let n;
  let s;
  let r;
  for (let o = 0; o < Dt.length; ++o) {
    k = Dt[o];
    if (k.active) {
      s = k.x + k.xWiggle - t;
      r = k.y + k.yWiggle - i;
      if (e == 0) {
        k.update(Fe);
      }
      if (k.layer == e && Za(s, r, k.scale + (k.blocker || 0))) {
        C.globalAlpha = k.hideFromEnemy ? 0.6 : 1;
        if (k.isItem) {
          n = yr(k);
          C.save();
          C.translate(s, r);
          C.rotate(k.dir);
          C.drawImage(n, -(n.width / 2), -(n.height / 2));
          if (k.blocker) {
            C.strokeStyle = "#db6e6e";
            C.globalAlpha = 0.3;
            C.lineWidth = 6;
            he(0, 0, k.blocker, C, false, true);
          }
          C.restore();
        } else if (k.type === 4) {
          Ud();
        } else {
          n = Gd(k);
          C.drawImage(n, s - n.width / 2, r - n.height / 2);
        }
      }
    }
  }
}
function Wd(e, t, i) {
  k = Hn(e);
  if (k) {
    k.startAnim(t, i);
  }
}
function Mo(e, t, i) {
  C.globalAlpha = 1;
  for (let n = 0; n < oe.length; ++n) {
    k = oe[n];
    if (k.zIndex == i) {
      k.animate(Fe);
      if (k.visible) {
        k.skinRot += Fe * 0.002;
        lo = (k == P ? mr() : k.dir) + k.dirPlus;
        C.save();
        C.translate(k.x - e, k.y - t);
        C.rotate(lo);
        Xd(k, C);
        C.restore();
      }
    }
  }
}
function Xd(e, t) {
  t = t || C;
  t.lineWidth = St;
  t.lineJoin = "miter";
  const i = Math.PI / 4 * (L.weapons[e.weaponIndex].armS || 1);
  const n = e.buildIndex < 0 && L.weapons[e.weaponIndex].hndS || 1;
  const s = e.buildIndex < 0 && L.weapons[e.weaponIndex].hndD || 1;
  if (e.tailIndex > 0) {
    qd(e.tailIndex, t, e);
  }
  if (e.buildIndex < 0 && !L.weapons[e.weaponIndex].aboveHand) {
    Ro(L.weapons[e.weaponIndex], T.weaponVariants[e.weaponVariant].src, e.scale, 0, t);
    if (L.weapons[e.weaponIndex].projectile != null && !L.weapons[e.weaponIndex].hideProjectile) {
      qs(e.scale, 0, L.projectiles[L.weapons[e.weaponIndex].projectile], C);
    }
  }
  t.fillStyle = T.skinColors[e.skinColor];
  he(e.scale * Math.cos(i), e.scale * Math.sin(i), 14);
  he(e.scale * s * Math.cos(-i * n), e.scale * s * Math.sin(-i * n), 14);
  if (e.buildIndex < 0 && L.weapons[e.weaponIndex].aboveHand) {
    Ro(L.weapons[e.weaponIndex], T.weaponVariants[e.weaponVariant].src, e.scale, 0, t);
    if (L.weapons[e.weaponIndex].projectile != null && !L.weapons[e.weaponIndex].hideProjectile) {
      qs(e.scale, 0, L.projectiles[L.weapons[e.weaponIndex].projectile], C);
    }
  }
  if (e.buildIndex >= 0) {
    const r = yr(L.list[e.buildIndex]);
    t.drawImage(r, e.scale - L.list[e.buildIndex].holdOffset, -r.width / 2);
  }
  he(0, 0, e.scale, t);
  if (e.skinIndex > 0) {
    t.rotate(Math.PI / 2);
    Ka(e.skinIndex, t, null, e);
  }
}
const Eo = {};
const Co = {};
let et;
function Ka(e, t, i, n) {
  et = Eo[e];
  if (!et) {
    const r = new Image();
    r.onload = function () {
      this.isLoaded = true;
      this.onload = null;
    };
    r.src = "./img/hats/hat_" + e + ".png";
    Eo[e] = r;
    et = r;
  }
  let s = i || Co[e];
  if (!s) {
    for (let r = 0; r < Vi.length; ++r) {
      if (Vi[r].id == e) {
        s = Vi[r];
        break;
      }
    }
    Co[e] = s;
  }
  if (et.isLoaded) {
    t.drawImage(et, -s.scale / 2, -s.scale / 2, s.scale, s.scale);
  }
  if (!i && s.topSprite) {
    t.save();
    t.rotate(n.skinRot);
    Ka(e + "_top", t, s, n);
    t.restore();
  }
}
const Po = {};
const $o = {};
function qd(e, t, i) {
  et = Po[e];
  if (!et) {
    const s = new Image();
    s.onload = function () {
      this.isLoaded = true;
      this.onload = null;
    };
    s.src = "./img/accessories/access_" + e + ".png";
    Po[e] = s;
    et = s;
  }
  let n = $o[e];
  if (!n) {
    for (let s = 0; s < Ni.length; ++s) {
      if (Ni[s].id == e) {
        n = Ni[s];
        break;
      }
    }
    $o[e] = n;
  }
  if (et.isLoaded) {
    t.save();
    t.translate(-20 - (n.xOff || 0), 0);
    if (n.spin) {
      t.rotate(i.skinRot);
    }
    t.drawImage(et, -(n.scale / 2), -(n.scale / 2), n.scale, n.scale);
    t.restore();
  }
}
var Gs = {};
function Ro(e, t, i, n, s) {
  const r = e.src + (t || "");
  let o = Gs[r];
  if (!o) {
    o = new Image();
    o.onload = function () {
      this.isLoaded = true;
    };
    o.src = "./img/weapons/" + r + ".png";
    Gs[r] = o;
  }
  if (o.isLoaded) {
    s.drawImage(o, i + e.xOff - e.length / 2, n + e.yOff - e.width / 2, e.length, e.width);
  }
}
const Ao = {};
function Gd(e) {
  const t = e.y >= T.mapScale - T.snowBiomeTop ? 2 : e.y <= T.snowBiomeTop ? 1 : 0;
  const i = e.type + "_" + e.scale + "_" + t;
  let n = Ao[i];
  if (!n) {
    const r = document.createElement("canvas");
    r.width = r.height = e.scale * 2.1 + St;
    const o = r.getContext("2d");
    o.translate(r.width / 2, r.height / 2);
    o.rotate(A.randFloat(0, Math.PI));
    o.strokeStyle = Zi;
    o.lineWidth = St;
    if (e.type == 0) {
      let l;
      for (var s = 0; s < 2; ++s) {
        l = k.scale * (s ? 0.5 : 1);
        qe(o, k.sid % 2 === 0 ? 5 : 7, l, l * 0.7);
        o.fillStyle = t ? s ? "#fff" : "#e3f1f4" : s ? "#b4db62" : "#9ebf57";
        o.fill();
        if (!s) {
          o.stroke();
        }
      }
    } else if (e.type == 1) {
      if (t == 2) {
        o.fillStyle = "#606060";
        qe(o, 6, e.scale * 0.3, e.scale * 0.71);
        o.fill();
        o.stroke();
        o.fillStyle = "#89a54c";
        he(0, 0, e.scale * 0.55, o);
        o.fillStyle = "#a5c65b";
        he(0, 0, e.scale * 0.3, o, true);
      } else {
        Zd(o, 6, k.scale, k.scale * 0.7);
        o.fillStyle = t ? "#e3f1f4" : "#89a54c";
        o.fill();
        o.stroke();
        o.fillStyle = t ? "#6a64af" : "#c15555";
        let l;
        const c = 4;
        const a = Rt / c;
        for (var s = 0; s < c; ++s) {
          l = A.randInt(k.scale / 3.5, k.scale / 2.3);
          he(l * Math.cos(a * s), l * Math.sin(a * s), A.randInt(10, 12), o);
        }
      }
    } else if (e.type == 2 || e.type == 3) {
      o.fillStyle = e.type == 2 ? t == 2 ? "#938d77" : "#939393" : "#e0c655";
      qe(o, 3, e.scale, e.scale);
      o.fill();
      o.stroke();
      o.fillStyle = e.type == 2 ? t == 2 ? "#b2ab90" : "#bcbcbc" : "#ebdca3";
      qe(o, 3, e.scale * 0.55, e.scale * 0.65);
      o.fill();
    }
    n = r;
    Ao[i] = n;
  }
  return n;
}
function Do(e, t, i) {
  const n = e.lineWidth || 0;
  i /= 2;
  e.beginPath();
  let s = Math.PI * 2 / t;
  for (let r = 0; r < t; r++) {
    e.lineTo(i + (i - n / 2) * Math.cos(s * r), i + (i - n / 2) * Math.sin(s * r));
  }
  e.closePath();
}
function Yd() {
  const t = T.volcanoScale * 2;
  const i = document.createElement("canvas");
  i.width = t;
  i.height = t;
  const n = i.getContext("2d");
  n.strokeStyle = "#3e3e3e";
  n.lineWidth = St * 2;
  n.fillStyle = "#7f7f7f";
  Do(n, 10, t);
  n.fill();
  n.stroke();
  Ye.land = i;
  const s = document.createElement("canvas");
  const r = T.innerVolcanoScale * 2;
  s.width = r;
  s.height = r;
  const o = s.getContext("2d");
  o.strokeStyle = Zi;
  o.lineWidth = St * 1.6;
  o.fillStyle = "#f54e16";
  o.strokeStyle = "#f56f16";
  Do(o, 10, r);
  o.fill();
  o.stroke();
  Ye.lava = s;
}
Yd();
const Oo = [];
function yr(e, t) {
  let i = Oo[e.id];
  if (!i || t) {
    const c = document.createElement("canvas");
    c.width = c.height = e.scale * 2.5 + St + (L.list[e.id].spritePadding || 0);
    const a = c.getContext("2d");
    a.translate(c.width / 2, c.height / 2);
    a.rotate(t ? 0 : Math.PI / 2);
    a.strokeStyle = Zi;
    a.lineWidth = St * (t ? c.width / 81 : 1);
    if (e.name == "apple") {
      a.fillStyle = "#c15555";
      he(0, 0, e.scale, a);
      a.fillStyle = "#89a54c";
      const f = -(Math.PI / 2);
      Kd(e.scale * Math.cos(f), e.scale * Math.sin(f), 25, f + Math.PI / 2, a);
    } else if (e.name == "cookie") {
      a.fillStyle = "#cca861";
      he(0, 0, e.scale, a);
      a.fillStyle = "#937c4b";
      for (var n = 4, s = Rt / n, r, o = 0; o < n; ++o) {
        r = A.randInt(e.scale / 2.5, e.scale / 1.7);
        he(r * Math.cos(s * o), r * Math.sin(s * o), A.randInt(4, 5), a, true);
      }
    } else if (e.name == "cheese") {
      a.fillStyle = "#f4f3ac";
      he(0, 0, e.scale, a);
      a.fillStyle = "#c3c28b";
      for (var n = 4, s = Rt / n, r, o = 0; o < n; ++o) {
        r = A.randInt(e.scale / 2.5, e.scale / 1.7);
        he(r * Math.cos(s * o), r * Math.sin(s * o), A.randInt(4, 5), a, true);
      }
    } else if (e.name == "wood wall" || e.name == "stone wall" || e.name == "castle wall") {
      a.fillStyle = e.name == "castle wall" ? "#83898e" : e.name == "wood wall" ? "#a5974c" : "#939393";
      const f = e.name == "castle wall" ? 4 : 3;
      qe(a, f, e.scale * 1.1, e.scale * 1.1);
      a.fill();
      a.stroke();
      a.fillStyle = e.name == "castle wall" ? "#9da4aa" : e.name == "wood wall" ? "#c9b758" : "#bcbcbc";
      qe(a, f, e.scale * 0.65, e.scale * 0.65);
      a.fill();
    } else if (e.name == "spikes" || e.name == "greater spikes" || e.name == "poison spikes" || e.name == "spinning spikes") {
      a.fillStyle = e.name == "poison spikes" ? "#7b935d" : "#939393";
      var l = e.scale * 0.6;
      qe(a, e.name == "spikes" ? 5 : 6, e.scale, l);
      a.fill();
      a.stroke();
      a.fillStyle = "#a5974c";
      he(0, 0, l, a);
      a.fillStyle = "#c9b758";
      he(0, 0, l / 2, a, true);
    } else if (e.name == "windmill" || e.name == "faster windmill" || e.name == "power mill") {
      a.fillStyle = "#a5974c";
      he(0, 0, e.scale, a);
      a.fillStyle = "#c9b758";
      xs(0, 0, e.scale * 1.5, 29, 4, a);
      a.fillStyle = "#a5974c";
      he(0, 0, e.scale * 0.5, a);
    } else if (e.name == "mine") {
      a.fillStyle = "#939393";
      qe(a, 3, e.scale, e.scale);
      a.fill();
      a.stroke();
      a.fillStyle = "#bcbcbc";
      qe(a, 3, e.scale * 0.55, e.scale * 0.65);
      a.fill();
    } else if (e.name == "sapling") {
      for (var o = 0; o < 2; ++o) {
        var l = e.scale * (o ? 0.5 : 1);
        qe(a, 7, l, l * 0.7);
        a.fillStyle = o ? "#b4db62" : "#9ebf57";
        a.fill();
        if (!o) {
          a.stroke();
        }
      }
    } else if (e.name == "pit trap") {
      a.fillStyle = "#a5974c";
      qe(a, 3, e.scale * 1.1, e.scale * 1.1);
      a.fill();
      a.stroke();
      a.fillStyle = Zi;
      qe(a, 3, e.scale * 0.65, e.scale * 0.65);
      a.fill();
    } else if (e.name == "boost pad") {
      a.fillStyle = "#7e7f82";
      ni(0, 0, e.scale * 2, e.scale * 2, a);
      a.fill();
      a.stroke();
      a.fillStyle = "#dbd97d";
      Jd(e.scale * 1, a);
    } else if (e.name == "turret") {
      a.fillStyle = "#a5974c";
      he(0, 0, e.scale, a);
      a.fill();
      a.stroke();
      a.fillStyle = "#939393";
      const f = 50;
      ni(0, -f / 2, e.scale * 0.9, f, a);
      he(0, 0, e.scale * 0.6, a);
      a.fill();
      a.stroke();
    } else if (e.name == "platform") {
      a.fillStyle = "#cebd5f";
      const f = 4;
      const d = e.scale * 2;
      const u = d / f;
      let p = -(e.scale / 2);
      for (var o = 0; o < f; ++o) {
        ni(p - u / 2, 0, u, e.scale * 2, a);
        a.fill();
        a.stroke();
        p += d / f;
      }
    } else if (e.name == "healing pad") {
      a.fillStyle = "#7e7f82";
      ni(0, 0, e.scale * 2, e.scale * 2, a);
      a.fill();
      a.stroke();
      a.fillStyle = "#db6e6e";
      xs(0, 0, e.scale * 0.65, 20, 4, a, true);
    } else if (e.name == "spawn pad") {
      a.fillStyle = "#7e7f82";
      ni(0, 0, e.scale * 2, e.scale * 2, a);
      a.fill();
      a.stroke();
      a.fillStyle = "#71aad6";
      he(0, 0, e.scale * 0.6, a);
    } else if (e.name == "blocker") {
      a.fillStyle = "#7e7f82";
      he(0, 0, e.scale, a);
      a.fill();
      a.stroke();
      a.rotate(Math.PI / 4);
      a.fillStyle = "#db6e6e";
      xs(0, 0, e.scale * 0.65, 20, 4, a, true);
    } else if (e.name == "teleporter") {
      a.fillStyle = "#7e7f82";
      he(0, 0, e.scale, a);
      a.fill();
      a.stroke();
      a.rotate(Math.PI / 4);
      a.fillStyle = "#d76edb";
      he(0, 0, e.scale * 0.5, a, true);
    }
    i = c;
    if (!t) {
      Oo[e.id] = i;
    }
  }
  return i;
}
function Kd(e, t, i, n, s) {
  const r = e + i * Math.cos(n);
  const o = t + i * Math.sin(n);
  const l = i * 0.4;
  s.moveTo(e, t);
  s.beginPath();
  s.quadraticCurveTo((e + r) / 2 + l * Math.cos(n + Math.PI / 2), (t + o) / 2 + l * Math.sin(n + Math.PI / 2), r, o);
  s.quadraticCurveTo((e + r) / 2 - l * Math.cos(n + Math.PI / 2), (t + o) / 2 - l * Math.sin(n + Math.PI / 2), e, t);
  s.closePath();
  s.fill();
  s.stroke();
}
function he(e, t, i, n, s, r) {
  n = n || C;
  n.beginPath();
  n.arc(e, t, i, 0, Math.PI * 2);
  if (!r) {
    n.fill();
  }
  if (!s) {
    n.stroke();
  }
}
function qe(e, t, i, n) {
  let s = Math.PI / 2 * 3;
  let r;
  let o;
  const l = Math.PI / t;
  e.beginPath();
  e.moveTo(0, -i);
  for (let c = 0; c < t; c++) {
    r = Math.cos(s) * i;
    o = Math.sin(s) * i;
    e.lineTo(r, o);
    s += l;
    r = Math.cos(s) * n;
    o = Math.sin(s) * n;
    e.lineTo(r, o);
    s += l;
  }
  e.lineTo(0, -i);
  e.closePath();
}
function ni(e, t, i, n, s, r) {
  s.fillRect(e - i / 2, t - n / 2, i, n);
  if (!r) {
    s.strokeRect(e - i / 2, t - n / 2, i, n);
  }
}
function xs(e, t, i, n, s, r, o) {
  r.save();
  r.translate(e, t);
  s = Math.ceil(s / 2);
  for (let l = 0; l < s; l++) {
    ni(0, 0, i * 2, n, r, o);
    r.rotate(Math.PI / s);
  }
  r.restore();
}
function Zd(e, t, i, n) {
  let s = Math.PI / 2 * 3;
  const r = Math.PI / t;
  let o;
  e.beginPath();
  e.moveTo(0, -n);
  for (let l = 0; l < t; l++) {
    o = A.randInt(i + 0.9, i * 1.2);
    e.quadraticCurveTo(Math.cos(s + r) * o, Math.sin(s + r) * o, Math.cos(s + r * 2) * n, Math.sin(s + r * 2) * n);
    s += r * 2;
  }
  e.lineTo(0, -n);
  e.closePath();
}
function Jd(e, t) {
  t = t || C;
  const i = e * (Math.sqrt(3) / 2);
  t.beginPath();
  t.moveTo(0, -i / 2);
  t.lineTo(-e / 2, i / 2);
  t.lineTo(e / 2, i / 2);
  t.lineTo(0, -i / 2);
  t.fill();
  t.closePath();
}
function Qd() {
  const e = T.mapScale / 2;
  $e.add(0, e, e + 200, 0, T.treeScales[3], 0);
  $e.add(1, e, e - 480, 0, T.treeScales[3], 0);
  $e.add(2, e + 300, e + 450, 0, T.treeScales[3], 0);
  $e.add(3, e - 950, e - 130, 0, T.treeScales[2], 0);
  $e.add(4, e - 750, e - 400, 0, T.treeScales[3], 0);
  $e.add(5, e - 700, e + 400, 0, T.treeScales[2], 0);
  $e.add(6, e + 800, e - 200, 0, T.treeScales[3], 0);
  $e.add(7, e - 260, e + 340, 0, T.bushScales[3], 1);
  $e.add(8, e + 760, e + 310, 0, T.bushScales[3], 1);
  $e.add(9, e - 800, e + 100, 0, T.bushScales[3], 1);
  $e.add(10, e - 800, e + 300, 0, L.list[4].scale, L.list[4].id, L.list[10]);
  $e.add(11, e + 650, e - 390, 0, L.list[4].scale, L.list[4].id, L.list[10]);
  $e.add(12, e - 400, e - 450, 0, T.rockScales[2], 2);
}
function jd(e) {
  for (let t = 0; t < e.length;) {
    $e.add(e[t], e[t + 1], e[t + 2], e[t + 3], e[t + 4], e[t + 5], L.list[e[t + 6]], true, e[t + 7] >= 0 ? {
      sid: e[t + 7]
    } : null);
    t += 8;
  }
}
function ep(e, t) {
  k = Qa(t);
  if (k) {
    k.xWiggle += T.gatherWiggle * Math.cos(e);
    k.yWiggle += T.gatherWiggle * Math.sin(e);
  }
}
function tp(e, t) {
  k = Qa(e);
  if (k) {
    k.dir = t;
    k.xWiggle += T.gatherWiggle * Math.cos(t + Math.PI);
    k.yWiggle += T.gatherWiggle * Math.sin(t + Math.PI);
  }
}
function ip(e, t, i, n, s, r, o, l) {
  if (lr) {
    Pa.addProjectile(e, t, i, n, s, r, null, null, o).sid = l;
  }
}
function np(e, t) {
  for (let i = 0; i < ui.length; ++i) {
    if (ui[i].sid == e) {
      ui[i].range = t;
    }
  }
}
function sp(e) {
  k = Ja(e);
  if (k) {
    k.startAnim();
  }
}
function rp(e) {
  for (var t = 0; t < Oe.length; ++t) {
    Oe[t].forcePos = !Oe[t].visible;
    Oe[t].visible = false;
  }
  if (e) {
    const i = Date.now();
    for (var t = 0; t < e.length;) {
      k = Ja(e[t]);
      if (k) {
        k.index = e[t + 1];
        k.t1 = k.t2 === undefined ? i : k.t2;
        k.t2 = i;
        k.x1 = k.x;
        k.y1 = k.y;
        k.x2 = e[t + 2];
        k.y2 = e[t + 3];
        k.d1 = k.d2 === undefined ? e[t + 4] : k.d2;
        k.d2 = e[t + 4];
        k.health = e[t + 5];
        k.dt = 0;
        k.visible = true;
      } else {
        k = ao.spawn(e[t + 2], e[t + 3], e[t + 4], e[t + 1]);
        k.x2 = k.x;
        k.y2 = k.y;
        k.d2 = k.dir;
        k.health = e[t + 5];
        if (!ao.aiTypes[e[t + 1]].name) {
          k.name = T.cowNames[e[t + 6]];
        }
        k.forcePos = true;
        k.sid = e[t];
        k.visible = true;
      }
      t += 7;
    }
  }
}
const _o = {};
function op(e, t) {
  const i = e.index;
  let n = _o[i];
  if (!n) {
    const s = new Image();
    s.onload = function () {
      this.isLoaded = true;
      this.onload = null;
    };
    s.src = "./img/animals/" + e.src + ".png";
    n = s;
    _o[i] = n;
  }
  if (n.isLoaded) {
    const s = e.scale * 1.2 * (e.spriteMlt || 1);
    t.drawImage(n, -s, -s, s * 2, s * 2);
  }
}
function Za(e, t, i) {
  return e + i >= 0 && e - i <= ge && t + i >= 0 && t - i <= ye;
}
function ap(e, t) {
  let i = dp(e[0]);
  if (!i) {
    i = new Gh(e[0], e[1], T, A, Pa, $e, oe, Oe, L, Vi, Ni);
    oe.push(i);
  }
  i.spawn(t ? Sn : null);
  i.visible = false;
  i.x2 = undefined;
  i.y2 = undefined;
  i.setData(e);
  if (t) {
    P = i;
    ot = P.x;
    at = P.y;
    La();
    qa();
    Ya();
    Ga(0);
    ar.style.display = "block";
  }
}
function lp(e) {
  for (let t = 0; t < oe.length; t++) {
    if (oe[t].id == e) {
      oe.splice(t, 1);
      break;
    }
  }
}
function cp(e, t) {
  if (P) {
    P.itemCounts[e] = t;
  }
}
function hp(e, t, i) {
  if (P) {
    P[e] = t;
    if (i) {
      qa();
    }
  }
}
function up(e, t) {
  k = Hn(e);
  if (k) {
    k.health = t;
  }
}
function fp(e) {
  const t = Date.now();
  for (var i = 0; i < oe.length; ++i) {
    oe[i].forcePos = !oe[i].visible;
    oe[i].visible = false;
  }
  for (var i = 0; i < e.length;) {
    k = Hn(e[i]);
    if (k) {
      k.t1 = k.t2 === undefined ? t : k.t2;
      k.t2 = t;
      k.x1 = k.x;
      k.y1 = k.y;
      k.x2 = e[i + 1];
      k.y2 = e[i + 2];
      k.d1 = k.d2 === undefined ? e[i + 3] : k.d2;
      k.d2 = e[i + 3];
      k.dt = 0;
      k.buildIndex = e[i + 4];
      k.weaponIndex = e[i + 5];
      k.weaponVariant = e[i + 6];
      k.team = e[i + 7];
      k.isLeader = e[i + 8];
      k.skinIndex = e[i + 9];
      k.tailIndex = e[i + 10];
      k.iconIndex = e[i + 11];
      k.zIndex = e[i + 12];
      k.visible = true;
    }
    i += 13;
  }
}
function dp(e) {
  for (let t = 0; t < oe.length; ++t) {
    if (oe[t].id == e) {
      return oe[t];
    }
  }
  return null;
}
function Hn(e) {
  for (let t = 0; t < oe.length; ++t) {
    if (oe[t].sid == e) {
      return oe[t];
    }
  }
  return null;
}
function Ja(e) {
  for (let t = 0; t < Oe.length; ++t) {
    if (Oe[t].sid == e) {
      return Oe[t];
    }
  }
  return null;
}
function Qa(e) {
  for (let t = 0; t < Dt.length; ++t) {
    if (Dt[t].sid == e) {
      return Dt[t];
    }
  }
  return null;
}
let ja = -1;
function pp() {
  const e = Date.now() - ja;
  window.pingTime = e;
  Gi.innerText = "Ping: " + e + "Â ms";
}
let bs;
function el() {
  if (bs) {
    clearTimeout(bs);
  }
  if (sr()) {
    ja = Date.now();
    me.send("0");
  }
  bs = // TOLOOK
  setTimeout(el, 2500);
}
function mp(e) {
  if (e < 0) {
    return;
  }
  const t = Math.floor(e / 60);
  let i = e % 60;
  i = ("0" + i).slice(-2);
  po.innerText = "Server restarting in " + t + ":" + i;
  po.hidden = false;
}
window.requestAnimFrame = function () {
  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function (e) {
    window.setTimeout(e, 1000 / 60);
  };
}();
function tl() {
  hi = Date.now();
  Fe = hi - oo;
  oo = hi;
  Nd();
  requestAnimFrame(tl);
}
Qd();
tl();
function il(e) {
  window.open(e, "_blank");
}
window.openLink = il;
window.aJoinReq = Fs;
window.follmoo = Xf;
window.kickFromClan = Oa;
window.sendJoin = _a;
window.leaveAlliance = za;
window.createAlliance = Vs;
window.storeBuy = Ba;
window.storeEquip = Ws;
window.showItemInfo = Ue;
window.selectSkinColor = Td;
window.changeStoreIndex = vd;
window.config = T;