(() => {
    if (window.aituInitiated !== undefined) return;

    window.aituInitiated = false;

    const STORAGE_KEY = "aituPassword";

    async function decrypt(encryptedText, password) {
        const encryptedDataWithIv = new Uint8Array(atob(encryptedText).split("").map(char => char.charCodeAt(0)));

        const iv = encryptedDataWithIv.slice(0, 16);
        const encryptedData = encryptedDataWithIv.slice(16);

        const encoder = new TextEncoder();

        const baseKey = await crypto.subtle.importKey(
            "raw",
            encoder.encode(password),
            { name: "PBKDF2" },
            false,
            ["deriveKey"]
        );

        const keyObj = await crypto.subtle.deriveKey(
            {
                name: "PBKDF2",
                salt: iv,
                iterations: 100000,
                hash: "SHA-256"
            },
            baseKey,
            { name: "AES-CBC", length: 256 },
            false,
            ["decrypt"]
        );

        const decryptedData = await crypto.subtle.decrypt(
            { name: "AES-CBC", iv: iv },
            keyObj,
            encryptedData
        );

        const decoder = new TextDecoder();

        return decoder.decode(decryptedData);
    };

    const encryptedBlob = "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";

    (async () => {
        let password = localStorage.getItem(STORAGE_KEY);
        let decryptedCode;

        while (true) {
            if (!password) {
                password = prompt("Enter password:");

                if (!password) {
                    alert("Decryption cancelled.");

                    return;
                }
            }

            try {
                decryptedCode = await decrypt(encryptedBlob, password);
                localStorage.setItem(STORAGE_KEY, password);

                break;

            } catch (err) {
                localStorage.removeItem(STORAGE_KEY);
                password = undefined;
            }
        }

        window.aituInitiated = true;
        console.log("Started");
        eval("(" + decryptedCode.slice(0, decryptedCode.length - 1) + ")")();
    })();
})();
