From 79eb20bcca35d0cad3591c695144ddd64bf41f8d Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Wed, 29 Mar 2023 19:55:22 -0400 Subject: [PATCH] v1.0.1 --- CHANGELOG.md | 5 +++ README.md | 13 ++++---- assets/popup.png | Bin 50620 -> 43120 bytes extension/moodle-gpt.js | 6 ++-- extension/moodle-gpt.js.map | 2 +- extension/popup/index.html | 25 ++++++++++----- extension/popup/index.js | 54 +++++++++++++++++++++++++++++---- extension/popup/style.css | 9 ++++++ package.json | 2 +- src/core/get-response.ts | 3 +- src/core/normalize-question.ts | 6 +--- src/types/config.d.ts | 1 - 12 files changed, 91 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0321e9a..5c17867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## v1.0.1 + +- Removed langage +- Added a button next to model to get the last ChatGPT version + ## v1.0.0 - Initial commit diff --git a/README.md b/README.md index bb6dd8b..a0d4bd7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ href="https://www.flaticon.com/free-icons/mortarboard" target="_blank" rel="noopener noreferrer" title="Mortarboard icons created by itim2101 - Flaticon" >Mortarboard icons created by itim2101 - Flaticon

-# Moodle-gpt +# Moodle-gpt v1.0.1 This extension allows you to hide CHAT-GPT in a Moodle quiz. You just need to enter the code configured in the extension on the keyboard and then click on the question you want to solve, and CHAT-GPT will automatically provide the answer. However, one needs to be careful because as we know, CHAT-GPT can make errors especially in calculations. @@ -36,22 +36,21 @@ Type back the code on the keyboard and the code will be removed from the Popup

-- Api key\*: the openai api key. -- Code\*: code that you will need to inject/remove the code. -- Langage: the langage you want chatgpt reply (if it's not set it will take the question langage). -- GPT Model: the gpt model you want to use (by default it's "gpt-3.5-turbo"). +- Api key: the openai api key. +- Code: code that you will need to inject/remove the code. +- GPT Model: the gpt model you want to use (by default it's "gpt-3.5-turbo"). You can click on the reload button to get the latest version of available gpt model for your account but you need to enter the api key first. - Cursor indication: show a pointer cursor and a hourglass to know when the request is finished. - Title indication: show some informations into the title to know for example if the code have been injected.
![Injected](./assets/title-injected.png) - Console logs: show logs into the console.
Logs -- Request timeout: If the request is too long it will be abort after 10seconds. +- Request timeout: if the request is too long it will be abort after 10seconds. - Typing effect: create a typing effect for text. Type any text and it will be replaced by the correct one. If you want to stop it press Backspace key.
![Typing](./assets/typing.gif) - Mouseover effect: you will need to hover (or click for select) the question response to complete it automaticaly.
![Mouseover](./assets/mouseover.gif)
![Mouseover2](./assets/mouseover2.gif) -- Table formatting: Format table from the question to make it more readable for CHAT-GPT but cost most tokens (so if the question is too large it will make an error). Example of formatted table: +- Table formatting: format table from the question to make it more readable for CHAT-GPT but cost most tokens (so if the question is too large it will make an error). Example of formatted table: ``` | id | name | birthDate | cars | diff --git a/assets/popup.png b/assets/popup.png index 1f109d0bd85ee878465fa218a7717b58e3e9ea4d..0348af315cb6303f0252ea29cfbe638886e84763 100644 GIT binary patch literal 43120 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ν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 literal 50620 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

I>`i4NMC0AjSD!l3ww8X~UY;%IredjuiDaZg#i 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 I@ip-O0Bs7JzyJUM diff --git a/extension/moodle-gpt.js b/extension/moodle-gpt.js index 874a7e0..26016f0 100644 --- a/extension/moodle-gpt.js +++ b/extension/moodle-gpt.js @@ -87,7 +87,7 @@ }, signal: config.timeout ? controller.signal : null, body: JSON.stringify({ - model: config.model && config.model !== "" ? config.model : "gpt-3.5-turbo", + model: config.model, messages: [{ role: "user", content: question }], temperature: 0.8, top_p: 1.0, @@ -147,9 +147,7 @@ question = question.replace(table.textContent, "\n" + htmlTableToString(table) + "\n"); } } - const finalQuestion = `Give a short response as possible for this question, reply in ${config.langage && config.langage !== "" - ? 'this langage "' + config.langage + '"' - : "the following question langage"} and only show the result: + const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: ${question} (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; return normalizeText(finalQuestion); diff --git a/extension/moodle-gpt.js.map b/extension/moodle-gpt.js.map index 45116c8..20a739e 100644 --- a/extension/moodle-gpt.js.map +++ b/extension/moodle-gpt.js.map @@ -1 +1 @@ -{"version":3,"file":"moodle-gpt.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/normalize-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/g, \"\\n\")\r\n .replace(/[ \\t]+/g, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 10000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model:\r\n config.model && config.model !== \"\" ? config.model : \"gpt-3.5-turbo\",\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map(\r\n (content, index) => content.padEnd(maxColumnsLength[index], \"\\u00A0\") //for no matching with \\s\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction normalizeQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.textContent;\r\n\r\n if (config.table) {\r\n //make table more readable for chat-gpt\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.textContent,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in ${\r\n config.langage && config.langage !== \"\"\r\n ? 'this langage \"' + config.langage + '\"'\r\n : \"the following question langage\"\r\n } and only show the result: \r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default normalizeQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n //if it's a put in order\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n //end put in order\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n //put the cursor at the end\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport normalizeQuestion from \"./normalize-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n form.querySelector(\".accesshide\")?.remove();\r\n\r\n const question = normalizeQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor = config.infinite ? \"pointer\" : \"initial\";\r\n\r\n if (typeof response === \"object\" && \"error\" in response) {\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n handleClipboard(config, response);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n //removing events\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n //injection\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = Array.from(document.querySelectorAll(\".formulation\"));\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n const fn = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn });\r\n hiddenButton.addEventListener(\"click\", fn, { once: !config.infinite });\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport default codeListener;\r\n","import codeListener from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":";;;;;EAAA;;;EAGG;EACH,SAAS,gBAAgB,CAAC,IAAY,EAAA;EACpC,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;EACjC,IAAA,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;EACtB,IAAA,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;EACvD;;ECRA;EACA;AACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAoGA;EACO,SAAS,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE;EAC7D,IAAI,SAAS,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;EAChH,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM,EAAE;EAC/D,QAAQ,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACnG,QAAQ,SAAS,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACtG,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;EACtH,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EAC9E,KAAK,CAAC,CAAC;EACP;;EC1HA,MAAM,IAAI,CAAA;MACR,OAAO,QAAQ,CAAC,IAAY,EAAA;UAC1B,MAAM,GAAG,GAAG,aAAa,CAAC;UAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;EAED,IAAA,OAAO,WAAW,CAAC,IAAY,EAAE,MAAe,EAAA;EAC9C,QAAA,MAAM,GAAG,GAAG,SAAS,IAAI,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC;UACnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;MAED,OAAO,KAAK,CAAC,GAAc,EAAA;EACzB,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;OACjC;MAED,OAAO,QAAQ,CAAC,IAAY,EAAA;EAC1B,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;OACnB;EACF;;EClBD;;;EAGG;EACH,SAAS,aAAa,CAAC,IAAY,EAAA;EACjC,IAAA,OAAO,IAAI;EACR,SAAA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;EACrB,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;EACvB,SAAA,WAAW,EAAE;EACb,SAAA,IAAI,EAAE;EACN,SAAA,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;EAC7B,SAAA,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;EACtC;;ECTA;;;;;EAKG;EACH,SAAe,kBAAkB,CAC/B,MAAc,EACd,QAAgB,EAAA;;EAEhB,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;EACzC,QAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;EACrE,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,4CAA4C,EAAE;EACpE,YAAA,MAAM,EAAE,MAAM;EACd,YAAA,OAAO,EAAE;EACP,gBAAA,cAAc,EAAE,kBAAkB;EAClC,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,MAAM,CAAC,MAAM,CAAE,CAAA;EACzC,aAAA;EACD,YAAA,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI;EACjD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;EACnB,gBAAA,KAAK,EACH,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,eAAe;kBACtE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;EAC/C,gBAAA,WAAW,EAAE,GAAG;EAChB,gBAAA,KAAK,EAAE,GAAG;EACV,gBAAA,gBAAgB,EAAE,GAAG;EACrB,gBAAA,IAAI,EAAE,IAAI;eACX,CAAC;EACH,SAAA,CAAC,CAAC;UACH,YAAY,CAAC,gBAAgB,CAAC,CAAC;EAC/B,QAAA,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;EAC7B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;EAChD,QAAA,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;OAChC,CAAA,CAAA;EAAA;;ECpCD;;;;EAIG;EACH,SAAS,iBAAiB,CAAC,KAAuB,EAAA;MAChD,MAAM,GAAG,GAAe,EAAE,CAAC;EAC3B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;MACvD,MAAM,gBAAgB,GAAa,EAAE,CAAC;EACtC,IAAA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;EACjB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;UAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;;cAC7C,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,IAAI,EAAE,CAAC;cACzC,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAChC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAC5B,OAAO,CAAC,MAAM,IAAI,CAAC,CACpB,CAAC;EACF,YAAA,OAAO,OAAO,CAAC;EACjB,SAAC,CAAC,CAAC;EACH,QAAA,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;EACzB,KAAC,CAAC,CAAC;EAEH,IAAA,MAAM,kBAAkB,GACtB,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;MACnE,MAAM,cAAc,GAClB,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;MAE7D,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;UACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;WACtE,CAAC;UACF,OAAO,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;EAC9C,KAAC,CAAC,CAAC;EACH,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;MAC/B,OAAO,IAAI,GAAG,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EACtD;;EC/BA;;;;;EAKG;EACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,iBAA8B,EAAA;EACvE,IAAA,IAAI,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC;MAE7C,IAAI,MAAM,CAAC,KAAK,EAAE;;UAEhB,MAAM,MAAM,GACV,iBAAiB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;EACrD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;EAC1B,YAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,KAAK,CAAC,WAAW,EACjB,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CACvC,CAAC;EACH,SAAA;EACF,KAAA;MAED,MAAM,aAAa,GAAG,CAAA,8DAAA,EACpB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE;AACrC,UAAE,gBAAgB,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG;AACzC,UAAE,gCACN,CAAA;QACM,QAAQ,CAAA;sJACsI,CAAC;EACrJ,IAAA,OAAO,aAAa,CAAC,aAAa,CAAC,CAAC;EACtC;;EC7BA;;;;;EAKG;EACH,SAAS,sBAAsB,CAC7B,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;MAEhB,MAAM,KAAK,GAAG,SAAS,KAAT,IAAA,IAAA,SAAS,uBAAT,SAAS,CAAG,CAAC,CAAqB,CAAC;EAEjD,IAAA,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;EACjE,QAAA,OAAO,KAAK,CAAC;EAEf,IAAA,KAAK,MAAM,KAAK,IAAI,SAAyC,EAAE;UAC7D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;UAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;UAC1C,IAAI,MAAM,CAAC,IAAI;EAAE,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,QAAA,IAAI,MAAM,EAAE;cACV,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,gBAAA,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE;EAChE,oBAAA,IAAI,EAAE,IAAI;EACX,iBAAA,CAAC,CAAC;EACJ,aAAA;EAAM,iBAAA;EACL,gBAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;EACtB,aAAA;EACF,SAAA;EACF,KAAA;EACD,IAAA,OAAO,IAAI,CAAC;EACd;;EC/BA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;EAEhB,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;MAE9E,IAAI,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACnC,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;EAC7D,QAAA,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;MAEhC,IAAI,MAAM,CAAC,IAAI;EAAE,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;EAErC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;UACzC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;EAExD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;cAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;cAClD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;;cAG5C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE;EAC7B,gBAAA,MAAM,OAAO,GAAG,aAAa,CAC1B,MAAM,CAAC,UAA0B;uBAC/B,OAAO,CAAC,IAAI,CAAC;EACb,qBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,CACtC,CAAC;kBACF,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;sBACpC,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;sBACnC,IAAI,MAAM,CAAC,IAAI;EAAE,wBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,oBAAA,OAAO,MAAM,CAAC;EAChB,iBAAC,CAAC,CAAC;EACH,gBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;sBAChB,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,wBAAA,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CACnD,OAAO,EACP,YAAA;8BACE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EAClD,yBAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;EACH,qBAAA;EAAM,yBAAA;0BACL,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EACjD,qBAAA;sBACD,MAAM;EACP,iBAAA;EACF,aAAA;;cAGD,IAAI,MAAM,CAAC,IAAI;EAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAEnD,YAAA,IAAI,MAAM,EAAE;kBACV,IAAI,MAAM,CAAC,SAAS,EAAE;sBACpB,MAAM;2BACH,OAAO,CAAC,QAAQ,CAAC;EACjB,yBAAA,gBAAgB,CAAC,OAAO,EAAE,OAAO,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;EACzD,wBAAA,IAAI,EAAE,IAAI;EACX,qBAAA,CAAC,CAAC;EACN,iBAAA;EAAM,qBAAA;EACL,oBAAA,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;EACxB,iBAAA;kBACD,MAAM;EACP,aAAA;EACF,SAAA;EACF,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EC5EA;;;;;;EAMG;EACH,SAAS,aAAa,CACpB,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;EAEhB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;EAErE,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;WACrB,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;EAEvD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EAC3D,YAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM;kBAAE,OAAO;cACpC,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EAC3C,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC;EACxB,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EChCA;;;;;;;EAOG;EACH,SAAS,eAAe,CAAC,MAAc,EAAE,QAAgB,EAAA;MACvD,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;EAC1D,IAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;EAC1C;;ECZA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;;EAEhB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;MAErE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;MAEpE,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,0CAAG,CAAC,CAAC,0CAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAE1E,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,OAAO,KAAK,CAAC;MAE1B,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;EACzD,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM;kBAAE,OAAO;cAClC,KAAK,CAAC,cAAc,EAAE,CAAC;cACvB,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;EAAE,gBAAA,EAAE,KAAK,CAAC;EACpD,YAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EACzC,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;EACtB,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EClCA,SAAS,qBAAqB,CAC5B,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;EAEhB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;EAE3B,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;EACtB,QAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,MAAM;EAEhD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EAC3D,YAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM;kBAAE,OAAO;cACpC,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;cAG/C,KAAK,CAAC,KAAK,EAAE,CAAC;EACd,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;EACrC,YAAA,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;EAChC,YAAA,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EACtB,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;cACxC,SAAS,CAAC,eAAe,EAAE,CAAC;EAC5B,YAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EAC5B,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;EAC9B,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EC1BA;;;;;;;EAOG;EACH,SAAe,KAAK,CAClB,MAAc,EACd,YAAyB,EACzB,IAAiB,EACjB,KAAa,EAAA;;;UAEb,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;UAEtD,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,EAAE,CAAC;UAE5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;UACjD,MAAM,SAAS,GAA4B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;EAExE,QAAA,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAC/D,CAAC,KAAK,MAAM;cACV,KAAK;EACN,SAAA,CAAC,CACH,CAAC;UAEF,IAAI,MAAM,CAAC,MAAM;EACf,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;UAEtE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAQ,EAAE;EACvD,YAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;cAC9B,OAAO;EACR,SAAA;UAED,IAAI,MAAM,CAAC,IAAI,EAAE;EACf,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;EACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;EACzB,SAAA;EAED,QAAA,MAAM,QAAQ,GAAG;cACf,qBAAqB;cACrB,aAAa;cACb,YAAY;cACZ,YAAY;cACZ,sBAAsB;WACvB,CAAC;EAEF,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;EAC9B,YAAA,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;kBAAE,OAAO;EAClD,SAAA;EAED,QAAA,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;;EACnC;;EC5DD,MAAM,WAAW,GAAa,EAAE,CAAC;EACjC,MAAM,SAAS,GAGT,EAAE,CAAC;EAET;;;EAGG;EACH,SAAS,YAAY,CAAC,MAAc,EAAA;MAClC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAK,EAAA;EACvD,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;UAC5B,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM;cAAE,WAAW,CAAC,KAAK,EAAE,CAAC;UACjE,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE;EACxC,YAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;cACvB,cAAc,CAAC,MAAM,CAAC,CAAC;EACxB,SAAA;EACH,KAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;EAIG;EACH,SAAS,cAAc,CAAC,MAAc,EAAA;;EAEpC,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;EACxB,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;cAChC,IAAI,MAAM,CAAC,MAAM;kBAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;cAC7D,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;EAC5D,SAAA;UACD,IAAI,MAAM,CAAC,KAAK;cAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;EAC9C,QAAA,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;UACrB,OAAO;EACR,KAAA;;MAGD,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;WACvD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,YAAA,EAAe,CAAC,CAAA,EAAA,CAAI,CAAC;WAChC,IAAI,CAAC,GAAG,CAAC,CAAC;EACb,IAAA,MAAM,KAAK,GAAG,UAAU,GAAG,uCAAuC,CAAC;EACnE,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;EAEpE,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;UACxB,MAAM,YAAY,GAAgB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;UAE/D,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;EACzD,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;UAC/D,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;EAC9C,QAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;EACxE,KAAA;MAED,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;EACjD;;ECzDA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,OAAO,EAAA;EAC3D,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;EAEjC,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;MAE9E,YAAY,CAAC,MAAM,CAAC,CAAC;EACvB,CAAC,CAAC;;;;;;","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"moodle-gpt.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/normalize-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/g, \"\\n\")\r\n .replace(/[ \\t]+/g, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 10000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map(\r\n (content, index) => content.padEnd(maxColumnsLength[index], \"\\u00A0\") //for no matching with \\s\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction normalizeQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.textContent;\r\n\r\n if (config.table) {\r\n //make table more readable for chat-gpt\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.textContent,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: \r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default normalizeQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n //if it's a put in order\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n //end put in order\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n //put the cursor at the end\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport normalizeQuestion from \"./normalize-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n form.querySelector(\".accesshide\")?.remove();\r\n\r\n const question = normalizeQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor = config.infinite ? \"pointer\" : \"initial\";\r\n\r\n if (typeof response === \"object\" && \"error\" in response) {\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n handleClipboard(config, response);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n //removing events\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n //injection\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = Array.from(document.querySelectorAll(\".formulation\"));\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n const fn = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn });\r\n hiddenButton.addEventListener(\"click\", fn, { once: !config.infinite });\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport default codeListener;\r\n","import codeListener from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":";;;;;EAAA;;;EAGG;EACH,SAAS,gBAAgB,CAAC,IAAY,EAAA;EACpC,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;EACjC,IAAA,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;EACtB,IAAA,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;EACvD;;ECRA;EACA;AACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAoGA;EACO,SAAS,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE;EAC7D,IAAI,SAAS,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;EAChH,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM,EAAE;EAC/D,QAAQ,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACnG,QAAQ,SAAS,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACtG,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;EACtH,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EAC9E,KAAK,CAAC,CAAC;EACP;;EC1HA,MAAM,IAAI,CAAA;MACR,OAAO,QAAQ,CAAC,IAAY,EAAA;UAC1B,MAAM,GAAG,GAAG,aAAa,CAAC;UAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;EAED,IAAA,OAAO,WAAW,CAAC,IAAY,EAAE,MAAe,EAAA;EAC9C,QAAA,MAAM,GAAG,GAAG,SAAS,IAAI,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC;UACnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;MAED,OAAO,KAAK,CAAC,GAAc,EAAA;EACzB,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;OACjC;MAED,OAAO,QAAQ,CAAC,IAAY,EAAA;EAC1B,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;OACnB;EACF;;EClBD;;;EAGG;EACH,SAAS,aAAa,CAAC,IAAY,EAAA;EACjC,IAAA,OAAO,IAAI;EACR,SAAA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;EACrB,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;EACvB,SAAA,WAAW,EAAE;EACb,SAAA,IAAI,EAAE;EACN,SAAA,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;EAC7B,SAAA,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;EACtC;;ECTA;;;;;EAKG;EACH,SAAe,kBAAkB,CAC/B,MAAc,EACd,QAAgB,EAAA;;EAEhB,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;EACzC,QAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;EACrE,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,4CAA4C,EAAE;EACpE,YAAA,MAAM,EAAE,MAAM;EACd,YAAA,OAAO,EAAE;EACP,gBAAA,cAAc,EAAE,kBAAkB;EAClC,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,MAAM,CAAC,MAAM,CAAE,CAAA;EACzC,aAAA;EACD,YAAA,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI;EACjD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;kBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;kBACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;EAC/C,gBAAA,WAAW,EAAE,GAAG;EAChB,gBAAA,KAAK,EAAE,GAAG;EACV,gBAAA,gBAAgB,EAAE,GAAG;EACrB,gBAAA,IAAI,EAAE,IAAI;eACX,CAAC;EACH,SAAA,CAAC,CAAC;UACH,YAAY,CAAC,gBAAgB,CAAC,CAAC;EAC/B,QAAA,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;EAC7B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;EAChD,QAAA,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;OAChC,CAAA,CAAA;EAAA;;ECnCD;;;;EAIG;EACH,SAAS,iBAAiB,CAAC,KAAuB,EAAA;MAChD,MAAM,GAAG,GAAe,EAAE,CAAC;EAC3B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;MACvD,MAAM,gBAAgB,GAAa,EAAE,CAAC;EACtC,IAAA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;EACjB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;UAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;;cAC7C,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,IAAI,EAAE,CAAC;cACzC,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAChC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAC5B,OAAO,CAAC,MAAM,IAAI,CAAC,CACpB,CAAC;EACF,YAAA,OAAO,OAAO,CAAC;EACjB,SAAC,CAAC,CAAC;EACH,QAAA,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;EACzB,KAAC,CAAC,CAAC;EAEH,IAAA,MAAM,kBAAkB,GACtB,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;MACnE,MAAM,cAAc,GAClB,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;MAE7D,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;UACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;WACtE,CAAC;UACF,OAAO,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;EAC9C,KAAC,CAAC,CAAC;EACH,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;MAC/B,OAAO,IAAI,GAAG,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EACtD;;EC/BA;;;;;EAKG;EACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,iBAA8B,EAAA;EACvE,IAAA,IAAI,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC;MAE7C,IAAI,MAAM,CAAC,KAAK,EAAE;;UAEhB,MAAM,MAAM,GACV,iBAAiB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;EACrD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;EAC1B,YAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,KAAK,CAAC,WAAW,EACjB,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CACvC,CAAC;EACH,SAAA;EACF,KAAA;EAED,IAAA,MAAM,aAAa,GAAG,CAAA;QAChB,QAAQ,CAAA;sJACsI,CAAC;EACrJ,IAAA,OAAO,aAAa,CAAC,aAAa,CAAC,CAAC;EACtC;;ECzBA;;;;;EAKG;EACH,SAAS,sBAAsB,CAC7B,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;MAEhB,MAAM,KAAK,GAAG,SAAS,KAAT,IAAA,IAAA,SAAS,uBAAT,SAAS,CAAG,CAAC,CAAqB,CAAC;EAEjD,IAAA,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;EACjE,QAAA,OAAO,KAAK,CAAC;EAEf,IAAA,KAAK,MAAM,KAAK,IAAI,SAAyC,EAAE;UAC7D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;UAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;UAC1C,IAAI,MAAM,CAAC,IAAI;EAAE,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,QAAA,IAAI,MAAM,EAAE;cACV,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,gBAAA,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE;EAChE,oBAAA,IAAI,EAAE,IAAI;EACX,iBAAA,CAAC,CAAC;EACJ,aAAA;EAAM,iBAAA;EACL,gBAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;EACtB,aAAA;EACF,SAAA;EACF,KAAA;EACD,IAAA,OAAO,IAAI,CAAC;EACd;;EC/BA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;EAEhB,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;MAE9E,IAAI,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACnC,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;EAC7D,QAAA,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;MAEhC,IAAI,MAAM,CAAC,IAAI;EAAE,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;EAErC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;UACzC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;EAExD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;cAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;cAClD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;;cAG5C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE;EAC7B,gBAAA,MAAM,OAAO,GAAG,aAAa,CAC1B,MAAM,CAAC,UAA0B;uBAC/B,OAAO,CAAC,IAAI,CAAC;EACb,qBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,CACtC,CAAC;kBACF,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;sBACpC,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;sBACnC,IAAI,MAAM,CAAC,IAAI;EAAE,wBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,oBAAA,OAAO,MAAM,CAAC;EAChB,iBAAC,CAAC,CAAC;EACH,gBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;sBAChB,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,wBAAA,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CACnD,OAAO,EACP,YAAA;8BACE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EAClD,yBAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;EACH,qBAAA;EAAM,yBAAA;0BACL,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EACjD,qBAAA;sBACD,MAAM;EACP,iBAAA;EACF,aAAA;;cAGD,IAAI,MAAM,CAAC,IAAI;EAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAEnD,YAAA,IAAI,MAAM,EAAE;kBACV,IAAI,MAAM,CAAC,SAAS,EAAE;sBACpB,MAAM;2BACH,OAAO,CAAC,QAAQ,CAAC;EACjB,yBAAA,gBAAgB,CAAC,OAAO,EAAE,OAAO,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;EACzD,wBAAA,IAAI,EAAE,IAAI;EACX,qBAAA,CAAC,CAAC;EACN,iBAAA;EAAM,qBAAA;EACL,oBAAA,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;EACxB,iBAAA;kBACD,MAAM;EACP,aAAA;EACF,SAAA;EACF,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EC5EA;;;;;;EAMG;EACH,SAAS,aAAa,CACpB,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;EAEhB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;EAErE,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;WACrB,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;EAEvD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EAC3D,YAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM;kBAAE,OAAO;cACpC,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EAC3C,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC;EACxB,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EChCA;;;;;;;EAOG;EACH,SAAS,eAAe,CAAC,MAAc,EAAE,QAAgB,EAAA;MACvD,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;EAC1D,IAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;EAC1C;;ECZA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;;EAEhB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;MAErE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;MAEpE,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,0CAAG,CAAC,CAAC,0CAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAE1E,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,OAAO,KAAK,CAAC;MAE1B,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;EACzD,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM;kBAAE,OAAO;cAClC,KAAK,CAAC,cAAc,EAAE,CAAC;cACvB,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;EAAE,gBAAA,EAAE,KAAK,CAAC;EACpD,YAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EACzC,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;EACtB,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EClCA,SAAS,qBAAqB,CAC5B,MAAc,EACd,SAAkC,EAClC,QAAgB,EAAA;EAEhB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;EAE3B,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;EACtB,QAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,MAAM;EAEhD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EAC3D,YAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM;kBAAE,OAAO;cACpC,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;cAG/C,KAAK,CAAC,KAAK,EAAE,CAAC;EACd,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;EACrC,YAAA,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;EAChC,YAAA,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EACtB,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;cACxC,SAAS,CAAC,eAAe,EAAE,CAAC;EAC5B,YAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EAC5B,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;EAC9B,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EC1BA;;;;;;;EAOG;EACH,SAAe,KAAK,CAClB,MAAc,EACd,YAAyB,EACzB,IAAiB,EACjB,KAAa,EAAA;;;UAEb,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;UAEtD,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,EAAE,CAAC;UAE5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;UACjD,MAAM,SAAS,GAA4B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;EAExE,QAAA,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAC/D,CAAC,KAAK,MAAM;cACV,KAAK;EACN,SAAA,CAAC,CACH,CAAC;UAEF,IAAI,MAAM,CAAC,MAAM;EACf,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;UAEtE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAQ,EAAE;EACvD,YAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;cAC9B,OAAO;EACR,SAAA;UAED,IAAI,MAAM,CAAC,IAAI,EAAE;EACf,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;EACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;EACzB,SAAA;EAED,QAAA,MAAM,QAAQ,GAAG;cACf,qBAAqB;cACrB,aAAa;cACb,YAAY;cACZ,YAAY;cACZ,sBAAsB;WACvB,CAAC;EAEF,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;EAC9B,YAAA,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;kBAAE,OAAO;EAClD,SAAA;EAED,QAAA,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;;EACnC;;EC5DD,MAAM,WAAW,GAAa,EAAE,CAAC;EACjC,MAAM,SAAS,GAGT,EAAE,CAAC;EAET;;;EAGG;EACH,SAAS,YAAY,CAAC,MAAc,EAAA;MAClC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAK,EAAA;EACvD,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;UAC5B,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM;cAAE,WAAW,CAAC,KAAK,EAAE,CAAC;UACjE,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE;EACxC,YAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;cACvB,cAAc,CAAC,MAAM,CAAC,CAAC;EACxB,SAAA;EACH,KAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;EAIG;EACH,SAAS,cAAc,CAAC,MAAc,EAAA;;EAEpC,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;EACxB,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;cAChC,IAAI,MAAM,CAAC,MAAM;kBAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;cAC7D,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;EAC5D,SAAA;UACD,IAAI,MAAM,CAAC,KAAK;cAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;EAC9C,QAAA,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;UACrB,OAAO;EACR,KAAA;;MAGD,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;WACvD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,YAAA,EAAe,CAAC,CAAA,EAAA,CAAI,CAAC;WAChC,IAAI,CAAC,GAAG,CAAC,CAAC;EACb,IAAA,MAAM,KAAK,GAAG,UAAU,GAAG,uCAAuC,CAAC;EACnE,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;EAEpE,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;UACxB,MAAM,YAAY,GAAgB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;UAE/D,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;EACzD,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;UAC/D,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;EAC9C,QAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;EACxE,KAAA;MAED,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;EACjD;;ECzDA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,OAAO,EAAA;EAC3D,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;EAEjC,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;MAE9E,YAAY,CAAC,MAAM,CAAC,CAAC;EACvB,CAAC,CAAC;;;;;;","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/extension/popup/index.html b/extension/popup/index.html index d4971c8..da3c28b 100644 --- a/extension/popup/index.html +++ b/extension/popup/index.html @@ -8,6 +8,13 @@ +

@@ -20,20 +27,22 @@ />

MoodleGPT

- - + +
- +
-
- - -
- + +
diff --git a/extension/popup/index.js b/extension/popup/index.js index 3a64487..ececaed 100644 --- a/extension/popup/index.js +++ b/extension/popup/index.js @@ -1,7 +1,7 @@ const saveBtn = document.querySelector(".save"); const message = document.querySelector("#message"); -const inputsText = ["apiKey", "code", "langage", "model"]; +const inputsText = ["apiKey", "code", "model"]; const inputsCheckbox = [ "logs", "title", @@ -22,7 +22,7 @@ function showMessage(messageTxt, valide) { //save the configuration saveBtn.addEventListener("click", function () { - const [apiKey, code, langage, model] = inputsText.map((selector) => + const [apiKey, code, model] = inputsText.map((selector) => document.querySelector("#" + selector).value.trim() ); const [logs, title, cursor, typing, mouseover, infinite, table, timeout] = @@ -30,7 +30,7 @@ saveBtn.addEventListener("click", function () { (selector) => document.querySelector("#" + selector).checked ); - if (!apiKey || !code) { + if (!apiKey || !code || !model) { showMessage("Please comple all the form"); return; } @@ -44,7 +44,6 @@ saveBtn.addEventListener("click", function () { moodleGPT: { apiKey, code, - langage, model, logs, title, @@ -64,11 +63,54 @@ saveBtn.addEventListener("click", function () { chrome.storage.sync.get(["moodleGPT"]).then(function (storage) { if (storage.moodleGPT) { const config = storage.moodleGPT; - inputsText.forEach( - (key) => (document.querySelector("#" + key).value = config[key] || "") + inputsText.forEach((key) => + config[key] + ? (document.querySelector("#" + key).value = config[key]) + : null ); inputsCheckbox.forEach( (key) => (document.querySelector("#" + key).checked = config[key] || "") ); } + + //getting the last chatgpt version + const apiKeySelector = document.querySelector("#apiKey"); + const reloadModel = document.querySelector("#reloadModel"); + + let apiKey = apiKeySelector.value; + + function checkFileldApiKey() { + if (apiKey) { + reloadModel.removeAttribute("disabled"); + reloadModel.setAttribute("title", "Get last ChatGPT version"); + return; + } + + reloadModel.setAttribute("disabled", true); + reloadModel.setAttribute("title", "Provide an api key first"); + } + + checkFileldApiKey(); + + apiKeySelector.addEventListener("change", function (event) { + apiKey = apiKeySelector.value.trim(); + checkFileldApiKey(); + }); + + reloadModel.addEventListener("click", async function () { + if (!apiKey) return; + try { + const req = await fetch("https://api.openai.com/v1/models", { + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }); + const rep = await req.json(); + const model = rep.data.find((model) => model.id.includes("gpt")); + document.querySelector("#model").value = model.root; + } catch (err) { + console.error(err); + showMessage("Failed to fetch last ChatGPT version"); + } + }); }); diff --git a/extension/popup/style.css b/extension/popup/style.css index 64ea098..ecf51c8 100644 --- a/extension/popup/style.css +++ b/extension/popup/style.css @@ -103,3 +103,12 @@ a { margin-top: 0.75rem; margin-bottom: -0.25rem; } + +#reloadModel { + cursor: pointer; +} + +#reloadModel[disabled] { + cursor: not-allowed; + opacity: 0.75; +} diff --git a/package.json b/package.json index 05a8e00..d5acdf9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moodle-gpt", - "version": "1.0.0", + "version": "1.0.1", "description": "This extension allows you to hide CHAT-GPT in a Moodle quiz.", "scripts": { "build": "rollup -c" diff --git a/src/core/get-response.ts b/src/core/get-response.ts index 43decad..56275d3 100644 --- a/src/core/get-response.ts +++ b/src/core/get-response.ts @@ -21,8 +21,7 @@ async function getChatGPTResponse( }, signal: config.timeout ? controller.signal : null, body: JSON.stringify({ - model: - config.model && config.model !== "" ? config.model : "gpt-3.5-turbo", + model: config.model, messages: [{ role: "user", content: question }], temperature: 0.8, top_p: 1.0, diff --git a/src/core/normalize-question.ts b/src/core/normalize-question.ts index c712fd3..1be2239 100644 --- a/src/core/normalize-question.ts +++ b/src/core/normalize-question.ts @@ -23,11 +23,7 @@ function normalizeQuestion(config: Config, questionContainer: HTMLElement) { } } - const finalQuestion = `Give a short response as possible for this question, reply in ${ - config.langage && config.langage !== "" - ? 'this langage "' + config.langage + '"' - : "the following question langage" - } and only show the result: + const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: ${question} (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; return normalizeText(finalQuestion); diff --git a/src/types/config.d.ts b/src/types/config.d.ts index 2f53194..d913f2e 100644 --- a/src/types/config.d.ts +++ b/src/types/config.d.ts @@ -1,7 +1,6 @@ type Config = { apiKey: string; code: string; - langage?: string; model?: string; infinite?: boolean; typing?: boolean;