Rahul2298 commited on
Commit
099bdab
·
verified ·
1 Parent(s): 37148a6

Upload 7 files

Browse files
src/backend/config.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // SPDX-FileCopyrightText: Hadad <hadad@linuxmail.org>
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ //
5
+
6
+ // Server port.
7
+ export const PORT = process.env.PORT;
8
+ // API endpoint.
9
+ export const OPENAI_API_BASE_URL = process.env.OPENAI_API_BASE_URL;
10
+ // API key.
11
+ export const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
src/backend/request.js ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // SPDX-FileCopyrightText: Hadad <hadad@linuxmail.org>
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ //
5
+
6
+ import { WebSocketServer } from "ws";
7
+ import fetch from "node-fetch";
8
+ import {
9
+ OPENAI_API_BASE_URL,
10
+ OPENAI_API_KEY
11
+ } from "./config.js";
12
+
13
+ export default function attachWss(server) {
14
+ const wss = new WebSocketServer({ server });
15
+
16
+ // Handle WebSocket connections.
17
+ wss.on("connection", (ws) => {
18
+ let currentAbortController = null;
19
+
20
+ // Send messages to client.
21
+ const sendToClient = (type, payload) => {
22
+ ws.send(JSON.stringify({ type, ...payload }));
23
+ };
24
+
25
+ // Send logs to client.
26
+ const sendError = (message) => {
27
+ sendToClient("error", { error: message });
28
+ };
29
+
30
+ // Make a request.
31
+ const streamRequest = async (messages, retries = 3) => {
32
+ for (let attempt = 1; attempt <= retries; attempt++) {
33
+ currentAbortController = new AbortController();
34
+ const signal = currentAbortController.signal;
35
+
36
+ try {
37
+ const response = await fetch(OPENAI_API_BASE_URL, {
38
+ method: "POST",
39
+ headers: {
40
+ "Content-Type": "application/json",
41
+ "Authorization": `Bearer ${OPENAI_API_KEY}`,
42
+ },
43
+ body: JSON.stringify({
44
+ model: "gpt-4.1-nano",
45
+ messages,
46
+ stream: true,
47
+ private: true,
48
+ isPrivate: true
49
+ }),
50
+ signal
51
+ });
52
+
53
+ if (response.status === 502) {
54
+ if (attempt === retries) {
55
+ sendError(
56
+ "The server is currently busy. Please wait a moment or try again later."
57
+ );
58
+ return;
59
+ }
60
+ continue;
61
+ }
62
+
63
+ if (!response.ok) {
64
+ const errText = await response.text();
65
+ sendError(`HTTP ${response.status}: ${response.statusText} - ${errText}`);
66
+ return;
67
+ }
68
+
69
+ if (!response.body) {
70
+ sendError("Response body is empty.");
71
+ return;
72
+ }
73
+
74
+ let buffer = "";
75
+ for await (const chunk of response.body) {
76
+ if (signal.aborted) {
77
+ sendToClient("end", {});
78
+ return;
79
+ }
80
+ buffer += chunk.toString();
81
+ let idx;
82
+ while ((idx = buffer.indexOf("\n")) !== -1) {
83
+ const line = buffer.slice(0, idx).trim();
84
+ buffer = buffer.slice(idx + 1);
85
+ if (line.startsWith("data: ")) {
86
+ const dataStr = line.substring(6).trim();
87
+ if (!dataStr || dataStr === "[DONE]") continue;
88
+ try {
89
+ const parsed = JSON.parse(dataStr);
90
+ const part = parsed?.choices?.[0]?.delta?.content;
91
+ if (part) sendToClient("chunk", { chunk: part });
92
+ } catch (err) {
93
+ sendError(`Parse error: ${err.message}`);
94
+ }
95
+ }
96
+ }
97
+ }
98
+
99
+ sendToClient("end", {});
100
+ return;
101
+ } catch (err) {
102
+ if (signal.aborted) {
103
+ sendToClient("end", {});
104
+ return;
105
+ }
106
+ if (attempt === retries) {
107
+ sendError(err.message || "Unknown error.");
108
+ }
109
+ }
110
+ }
111
+ };
112
+
113
+ // Handle messages from client.
114
+ ws.on("message", async (msg) => {
115
+ try {
116
+ const data = JSON.parse(msg.toString());
117
+
118
+ if (data.type === "stop") {
119
+ if (currentAbortController) currentAbortController.abort();
120
+ sendToClient("end", {});
121
+ return;
122
+ }
123
+
124
+ const message = data.message;
125
+ const history = data.history || [];
126
+ const setupMessages = [...history, { role: "user", content: message }];
127
+ await streamRequest(setupMessages);
128
+
129
+ } catch (err) {
130
+ sendError(err.message || "An unknown error occurred.");
131
+ if (currentAbortController) currentAbortController.abort();
132
+ }
133
+ });
134
+
135
+ // Abort on WebSocket close.
136
+ ws.on("close", () => {
137
+ if (currentAbortController) currentAbortController.abort();
138
+ });
139
+ });
140
+ }
src/crawlers/robots.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ User-agent: *
2
+ Allow: /
3
+
4
+ Sitemap: https://umint-ai.hf.space/sitemap.xml
src/crawlers/sitemap.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ SPDX-FileCopyrightText: Hadad <hadad@linuxmail.org>
4
+ SPDX-License-Identifier: Apache-2.0
5
+ -->
6
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
7
+ <url>
8
+ <loc>https://umint-ai.hf.space</loc>
9
+ <changefreq>daily</changefreq>
10
+ <priority>1.0</priority>
11
+ </url>
12
+ </urlset>
src/frontend/loader.html ADDED
@@ -0,0 +1,350 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--
2
+ SPDX-FileCopyrightText: Hadad <hadad@linuxmail.org>
3
+ SPDX-License-Identifier: Apache-2.0
4
+ -->
5
+
6
+ <!DOCTYPE html>
7
+ <html lang="en" class="dark-theme">
8
+ <head>
9
+ <meta charset="UTF-8" />
10
+ <meta name="viewport"
11
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
12
+ user-scalable=no, viewport-fit=cover" />
13
+ <meta name="robots" content="index, follow" />
14
+ <title>UltimaX Intelligence</title>
15
+
16
+ <link rel="sitemap" type="application/xml" title="Sitemap" href="/sitemap.xml" />
17
+
18
+ <meta name="author" content="Hadad Darajat" />
19
+ <meta name="description"
20
+ content="UltimaX Intelligence is a free AI platform unifying multiple
21
+ premium AI models with an intuitive ChatGPT-like interface.
22
+ Powered by Pollinations open-source AI and integrated with
23
+ OpenWebUI, it offers advanced features, no cost, no
24
+ registration, and ensures user privacy with temporary,
25
+ unsaved conversations." />
26
+ <meta name="keywords"
27
+ content="UltimaX Intelligence, free AI platform, premium AI models,
28
+ Pollinations AI, open-source AI, Open-WebUI integration,
29
+ ChatGPT alternative, AI tools free, no registration AI,
30
+ AI privacy, temporary AI conversations, AI platform no login,
31
+ advanced AI features, AI community powered,
32
+ seamless AI experience" />
33
+
34
+ <!-- Open Graph -->
35
+ <meta property="og:domain" content="umint-ai.hf.space" />
36
+ <meta property="og:url" content="https://umint-ai.hf.space" />
37
+ <meta property="og:title" content="UltimaX Intelligence" />
38
+ <meta property="og:description"
39
+ content="UltimaX Intelligence is a free AI platform unifying multiple
40
+ premium AI models with an intuitive ChatGPT-like interface.
41
+ Powered by Pollinations open-source AI and integrated with
42
+ OpenWebUI, it offers advanced features, no cost, no
43
+ registration, and ensures user privacy with temporary,
44
+ unsaved conversations." />
45
+ <meta property="og:image"
46
+ content="https://cdn-uploads.huggingface.co/production/uploads/686e28b405d4ddcdd96adeb2/i9iufR3L-rgj39mk_B9QW.jpeg" />
47
+
48
+ <!-- Twitter -->
49
+ <meta name="twitter:card" content="summary_large_image" />
50
+ <meta name="twitter:domain" content="umint-ai.hf.space" />
51
+ <meta name="twitter:url" content="https://umint-ai.hf.space" />
52
+ <meta name="twitter:title" content="UltimaX Intelligence" />
53
+ <meta name="twitter:description"
54
+ content="UltimaX Intelligence is a free AI platform unifying multiple
55
+ premium AI models with an intuitive ChatGPT-like interface.
56
+ Powered by Pollinations open-source AI and integrated with
57
+ OpenWebUI, it offers advanced features, no cost, no
58
+ registration, and ensures user privacy with temporary,
59
+ unsaved conversations." />
60
+ <meta name="twitter:image"
61
+ content="https://cdn-uploads.huggingface.co/production/uploads/686e28b405d4ddcdd96adeb2/i9iufR3L-rgj39mk_B9QW.jpeg" />
62
+
63
+ <!-- Favicon -->
64
+ <link rel="icon" href="/assets/images/favicon.ico" type="image/x-icon" />
65
+
66
+ <!-- Fonts & Styles -->
67
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
68
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap"
69
+ rel="stylesheet" />
70
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
71
+ rel="stylesheet" />
72
+ <script src="https://cdn.tailwindcss.com"></script>
73
+
74
+ <!-- Markdown & Syntax Highlight -->
75
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
76
+ <link rel="stylesheet"
77
+ href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" />
78
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
79
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
80
+
81
+ <!-- Animations -->
82
+ <script src="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.js"></script>
83
+ <link href="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.css" rel="stylesheet" />
84
+
85
+ <!-- Carousel -->
86
+ <script src="https://cdn.jsdelivr.net/npm/@splidejs/splide@4.1.4/dist/js/splide.min.js"></script>
87
+ <link rel="stylesheet"
88
+ href="https://cdn.jsdelivr.net/npm/@splidejs/splide@4.1.4/dist/css/splide.min.css" />
89
+
90
+ <!-- Smooth Scroll -->
91
+ <script src="https://cdn.jsdelivr.net/npm/locomotive-scroll@4.1.4/dist/locomotive-scroll.min.js"></script>
92
+ <link rel="stylesheet"
93
+ href="https://cdn.jsdelivr.net/npm/locomotive-scroll@4.1.4/dist/locomotive-scroll.min.css" />
94
+
95
+ <!-- Styles -->
96
+ <link rel="stylesheet" href="/assets/css/animation/style.css" />
97
+ <link rel="stylesheet" href="/assets/css/button.css" />
98
+ <link rel="stylesheet" href="/assets/css/chat/bubble.css" />
99
+ <link rel="stylesheet" href="/assets/css/chat/markdown.css" />
100
+ <link rel="stylesheet" href="/assets/css/chat/style.css" />
101
+ <link rel="stylesheet" href="/assets/css/footer.css" />
102
+ <link rel="stylesheet" href="/assets/css/header.css" />
103
+ <link rel="stylesheet" href="/assets/css/icon.css" />
104
+ <link rel="stylesheet" href="/assets/css/input.css" />
105
+ <link rel="stylesheet" href="/assets/css/logo.css" />
106
+ <link rel="stylesheet" href="/assets/css/prompts.css" />
107
+ <link rel="stylesheet" href="/assets/css/screen/1200.css" />
108
+ <link rel="stylesheet" href="/assets/css/screen/2000.css" />
109
+ <link rel="stylesheet" href="/assets/css/screen/320.css" />
110
+ <link rel="stylesheet" href="/assets/css/screen/360.css" />
111
+ <link rel="stylesheet" href="/assets/css/screen/3840.css" />
112
+ <link rel="stylesheet" href="/assets/css/screen/480.css" />
113
+ <link rel="stylesheet" href="/assets/css/screen/720.css" />
114
+ <link rel="stylesheet" href="/assets/css/screen/7680.css" />
115
+ <link rel="stylesheet" href="/assets/css/screen/common.css" />
116
+ <link rel="stylesheet" href="/assets/css/style.css" />
117
+ <link rel="stylesheet" href="/assets/css/webkit.css" />
118
+ </head>
119
+ <body>
120
+ <!-- Header -->
121
+ <header class="main-header" id="mainHeader">
122
+ <div class="logo d-flex align-items-center">
123
+ <a id="toggleLink"
124
+ class="icon-btn"
125
+ aria-label="LinkedIn"
126
+ title="Hadad Darajat"
127
+ href="https://linkedin.com/in/hadadrjt"
128
+ target="_blank"
129
+ rel="noopener noreferrer">
130
+ <span class="linkedin"></span>
131
+ </a>
132
+ </div>
133
+ </header>
134
+
135
+ <!-- Chat Header -->
136
+ <header class="chat-header" id="chatHeader" aria-hidden="true">
137
+ <button id="homeBtn"
138
+ class="icon-btn"
139
+ aria-label="Back to Home"
140
+ title="Back to Home">
141
+ <svg width="20" height="20"
142
+ viewBox="0 0 24 24"
143
+ fill="none"
144
+ stroke="currentColor"
145
+ stroke-width="1.8"
146
+ stroke-linecap="round"
147
+ stroke-linejoin="round"
148
+ xmlns="http://www.w3.org/2000/svg">
149
+ <path d="M3 11.5L12 4l9 7.5" />
150
+ <path d="M5 21V11.5h14V21" />
151
+ </svg>
152
+ </button>
153
+
154
+ <div class="chat-title" id="chatTitle">Demo Playground</div>
155
+
156
+ <div class="chat-controls">
157
+ <button id="clearBtn"
158
+ class="icon-btn"
159
+ aria-label="Clear All Messages"
160
+ title="Clear All Messages">
161
+ <svg width="20" height="20"
162
+ viewBox="0 0 24 24"
163
+ fill="none"
164
+ stroke="currentColor"
165
+ stroke-width="1.6"
166
+ stroke-linecap="round"
167
+ stroke-linejoin="round"
168
+ xmlns="http://www.w3.org/2000/svg">
169
+ <path d="M3 6h18" />
170
+ <path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
171
+ <path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" />
172
+ <path d="M10 11v6" />
173
+ <path d="M14 11v6" />
174
+ </svg>
175
+ </button>
176
+
177
+ <a href="https://umint-openwebui.hf.space"
178
+ target="_blank"
179
+ rel="noopener noreferrer"
180
+ class="icon-btn"
181
+ aria-label="OpenWebUI"
182
+ title="OpenWebUI">
183
+ <svg width="20" height="20"
184
+ viewBox="0 0 24 24"
185
+ fill="none"
186
+ stroke="currentColor"
187
+ stroke-width="1.8"
188
+ stroke-linecap="round"
189
+ stroke-linejoin="round"
190
+ xmlns="http://www.w3.org/2000/svg">
191
+ <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
192
+ <path d="M15 3h6v6" />
193
+ <path d="M10 14 21 3" />
194
+ </svg>
195
+ </a>
196
+ </div>
197
+ </header>
198
+
199
+ <!-- Main Content -->
200
+ <main>
201
+ <div class="flex-1 flex flex-col h-full max-w-screen-xl w-full mx-auto">
202
+ <div id="chatArea" class="flex-1" aria-live="polite">
203
+ <div id="initialContent"
204
+ class="flex flex-col items-center justify-center text-center"
205
+ style="width:100%; height:100%;">
206
+ <div class="title mb-4 gradient-text">
207
+ How can I help you today?
208
+ </div>
209
+
210
+ <!-- Prompts -->
211
+ <div class="prompts w-full max-w-md mx-auto grid gap-2"
212
+ style="width:100%;">
213
+ <div class="prompt-item"
214
+ data-prompt="How far away is the sun from Earth?"
215
+ style="word-break: break-word;">
216
+ <svg class="icon"
217
+ viewBox="0 0 24 24"
218
+ fill="none"
219
+ stroke="currentColor">
220
+ <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M18.66 18.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M18.66 5.34l1.41-1.41"
221
+ stroke-width="2"
222
+ stroke-linecap="round"
223
+ stroke-linejoin="round" />
224
+ <circle cx="12" cy="12" r="4" stroke-width="2" />
225
+ </svg>
226
+ <span>How far away is the sun from Earth?</span>
227
+ </div>
228
+
229
+ <div class="prompt-item"
230
+ data-prompt="Create complex python code, anything."
231
+ style="word-break: break-word;">
232
+ <svg class="icon"
233
+ viewBox="0 0 24 24"
234
+ fill="none"
235
+ stroke="currentColor">
236
+ <path d="M4 7h16M4 12h16M4 17h16"
237
+ stroke-width="2"
238
+ stroke-linecap="round"
239
+ stroke-linejoin="round" />
240
+ </svg>
241
+ <span>Create complex python code.</span>
242
+ </div>
243
+
244
+ <div class="prompt-item"
245
+ data-prompt="How many R’s are in strawberry?"
246
+ style="word-break: break-word;">
247
+ <svg class="icon"
248
+ viewBox="0 0 24 24"
249
+ fill="none"
250
+ stroke="currentColor">
251
+ <path d="M3 12h18M12 3v18"
252
+ stroke-width="2"
253
+ stroke-linecap="round"
254
+ stroke-linejoin="round" />
255
+ </svg>
256
+ <span>How many R’s are in strawberry?</span>
257
+ </div>
258
+
259
+ <div class="prompt-item"
260
+ data-prompt="Suggest a random prompt."
261
+ style="word-break: break-word;">
262
+ <svg class="icon"
263
+ viewBox="0 0 24 24"
264
+ fill="none"
265
+ stroke="currentColor">
266
+ <path d="M12 3v18M7 12h10"
267
+ stroke-width="2"
268
+ stroke-linecap="round"
269
+ stroke-linejoin="round" />
270
+ </svg>
271
+ <span>Suggest a random prompt.</span>
272
+ </div>
273
+ </div>
274
+
275
+ <p class="system"
276
+ style="word-wrap:break-word;">
277
+ Demo only!
278
+ <a href="https://umint-openwebui.hf.space"
279
+ style="color: #3b82f6;"
280
+ target="_blank">Click here</a>
281
+ to continue.<br>
282
+ Please read the
283
+ <a href="https://huggingface.co/spaces/umint/ai/discussions"
284
+ style="color: #3b82f6;"
285
+ target="_blank">discussions</a>
286
+ before you go.<br>
287
+ Premium AI, all in one tools, and website builder.<br>
288
+ Free, no cost at all.
289
+ </p>
290
+ </div>
291
+ </div>
292
+
293
+ <div id="chatBox"
294
+ class="hidden flex-col"
295
+ aria-live="polite"></div>
296
+
297
+ <!-- Footer Form -->
298
+ <form id="footerForm"
299
+ class="flex p-3 bg-transparent"
300
+ autocomplete="off"
301
+ style="position: relative; margin-top: auto; width: 100%;">
302
+ <div id="inputContainer">
303
+ <input type="text"
304
+ id="userInput"
305
+ placeholder="Ask anything..."
306
+ required
307
+ style="word-break:break-word;" />
308
+ <div id="rightIconGroup">
309
+ <button type="submit"
310
+ id="sendBtn"
311
+ disabled
312
+ aria-label="Send">
313
+ <svg id="sendIcon"
314
+ xmlns="http://www.w3.org/2000/svg"
315
+ fill="none"
316
+ viewBox="0 0 24 24"
317
+ stroke="currentColor">
318
+ <path stroke-linecap="round"
319
+ stroke-linejoin="round"
320
+ stroke-width="2"
321
+ d="M14 5l7 7-7 7M3 12h11" />
322
+ </svg>
323
+ </button>
324
+ <button id="stopBtn"
325
+ class="icon-btn"
326
+ aria-label="Stop"
327
+ title="Stop">
328
+ <svg width="20"
329
+ height="20"
330
+ viewBox="0 0 24 24"
331
+ fill="white"
332
+ xmlns="http://www.w3.org/2000/svg">
333
+ <rect x="6" y="6"
334
+ width="12"
335
+ height="12"
336
+ rx="2"
337
+ fill="white" />
338
+ </svg>
339
+ </button>
340
+ </div>
341
+ </div>
342
+ </form>
343
+ </div>
344
+ </main>
345
+
346
+ <!-- Plugins -->
347
+ <script src="/assets/plugins/loader.js"></script>
348
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
349
+ </body>
350
+ </html>
src/webmasters/bing.xml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <users>
3
+ <user>6F0E69E47393F89FAEEEE8B9212EBAE4</user>
4
+ </users>
src/webmasters/google.html ADDED
@@ -0,0 +1 @@
 
 
1
+ google-site-verification: google15aba15fe250d693.html