-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathloader-buttonsAndMessages.js
More file actions
54 lines (52 loc) · 293 KB
/
loader-buttonsAndMessages.js
File metadata and controls
54 lines (52 loc) · 293 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(function () {
window.mainImportModules = window.importModules;
var importableModules = JSON.parse("{\"buttonsAndMessages_resp\":{\"content\":\"(function() {\\r\\n\\r\\n'use strict';\\r\\n\\r\\n/*\\r\\n * Implementation of the displayHelper API.\\r\\n *\\r\\n * Copyright (c) 2012 Association France-ioi, MIT License http://opensource.org/licenses/MIT\\r\\n *\\r\\n * See documentation for more information.\\r\\n */\\r\\n\\r\\nwindow.displayHelper = {\\r\\n loaded: false,\\r\\n timeLoaded: 0,\\r\\n checkAnswerInterval: null,\\r\\n prevAnswer: '',\\r\\n readOnly: false,\\r\\n savedAnswer: '',\\r\\n submittedAnswer: '',\\r\\n submittedScore: 0,\\r\\n hasAnswerChanged: true,\\r\\n taskSelector: '#task',\\r\\n hideValidateButton: false,\\r\\n hideRestartButton: false,\\r\\n hideSolutionButton: false,\\r\\n confirmRestartAll: true,\\r\\n showScore: false,\\r\\n refreshMessages: true,\\r\\n stoppedShowingResult: false,\\r\\n previousMessages: {},\\r\\n popupMessageShown: false,\\r\\n\\r\\n thresholds: {},\\r\\n // Legacy settings for old tasks ; new ones are expected to use thresholds\\r\\n thresholdEasy: 60,\\r\\n thresholdMedium: 120,\\r\\n\\r\\n timeoutMinutes: 5,\\r\\n avatarType: \\\"beoi\\\",\\r\\n bUseFullWidth: false,\\r\\n responsive: false,\\r\\n mobileMode: false, \\r\\n toggle_task: false,\\r\\n headerH: 71, // in resp mode\\r\\n versionHeaderH: [93,93,85,48], // in resp mode\\r\\n altVersionHeaderH: [60,60,51,49], // in resp mode when nbLevels = 1\\r\\n footerH: 50, // in resp mode\\r\\n availableH: null, // height for zone_2 in responsive mode\\r\\n availableW: null, // width for zone_2 in responsive mode\\r\\n layout: 0, // in resp mode\\r\\n taskW: 770,\\r\\n taskH: 300,\\r\\n newTaskW: 0,\\r\\n newTaskH: 0,\\r\\n minTaskW: 500,\\r\\n maxTaskW: 800,\\r\\n verticalScroll: false,\\r\\n horizontalScroll: false,\\r\\n scaleFactor: 1,\\r\\n prevScaleFactor: 1,\\r\\n sideZoneEnabled: false,\\r\\n updateLayoutCallbackStart: null,\\r\\n compactMode: false, // for tabs & footer in responsive layout 3\\r\\n\\r\\n hasLevels: false,\\r\\n pointsAsStars: true, // TODO: false as default\\r\\n unlockedLevels: 4,\\r\\n forceNextTaskAfter: -1,\\r\\n neverHadHard: false,\\r\\n showMultiversionNotice: false,\\r\\n taskLevel: '',\\r\\n\\r\\n // Defaults\\r\\n levels: ['easy', 'medium', 'hard'],\\r\\n levelsIdx: { easy: 0, medium: 1, hard: 2 },\\r\\n maxStars: 4,\\r\\n popupMessageHandler: null,\\r\\n\\r\\n formatTranslation: function(s, args) { return s.replace(/\\\\{([^}]+)\\\\}/g, function(_, match){ return args[match]; }); },\\r\\n\\r\\n languageStrings: {\\r\\n fr: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"version facile\\\",\\r\\n levelVersionName_medium: \\\"version moyenne\\\",\\r\\n levelVersionName_hard: \\\"version difficile\\\",\\r\\n levelVersionName_easy_stars: \\\"version à 2 étoiles\\\",\\r\\n levelVersionName_medium_stars: \\\"version à 3 étoiles\\\",\\r\\n levelVersionName_hard_stars: \\\"version à 4 étoiles\\\",\\r\\n levelName_easy: \\\"Facile\\\",\\r\\n levelName_medium: \\\"Moyen\\\",\\r\\n levelName_hard: \\\"Difficile\\\",\\r\\n warningTimeout: \\\"<p>Attention, cela fait plus de {0} minutes que vous êtes sur cette question.</p><p>Vous devriez sans doute changer de sujet, en cliquant sur le bouton tout en haut à droite.</p>\\\",\\r\\n alright: \\\"D'accord\\\",\\r\\n moveOn: \\\"Passer à la suite\\\",\\r\\n solvedMoveOn: \\\"Vous avez entièrement résolu cette question, passez à une autre question.\\\",\\r\\n confirmRestart: \\\"Êtes-vous certain de vouloir recommencer cette version ?\\\",\\r\\n yes: \\\"Oui\\\",\\r\\n no: \\\"Non\\\",\\r\\n tryHardLevel: \\\"Nous vous proposons d'essayer la version 4 étoiles.\\\",\\r\\n tryMediumLevel: \\\"Nous vous proposons d'essayer la version 3 étoiles.\\\",\\r\\n tryNextTask: \\\"Nous vous proposons de passer à un autre sujet. S'il vous reste du temps, vous reviendrez plus tard essayer la version suivante.\\\",\\r\\n yourScoreIsNow: \\\"Votre score est maintenant :\\\",\\r\\n worseScoreStays: \\\"C'est moins bien qu'avant ; votre score reste :\\\",\\r\\n scoreStays: \\\"Votre score reste le même :\\\",\\r\\n score: \\\"Score :\\\",\\r\\n noPointsForLevel: \\\"Vous n'avez pas encore de points sur cette version.\\\",\\r\\n outOf: \\\" sur \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Essayez de faire encore mieux, ou passez à une autre question.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Essayez de faire encore mieux, ou passez à une version plus difficile.\\\",\\r\\n bestPossibleScoreCongrats: \\\"C'est le meilleur score possible sur ce sujet ; félicitations !\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Pour obtenir plus de points, passez à une version plus difficile.\\\",\\r\\n youDidBetterBefore: \\\"Vous aviez fait mieux avant.\\\",\\r\\n scoreStays2: \\\"Votre score reste le même.\\\",\\r\\n reloadBestAnswer: \\\"Rechargez votre meilleure réponse.\\\",\\r\\n noAnswerSaved: \\\"Aucune réponse actuellement enregistrée pour cette version.\\\",\\r\\n validate: \\\"Valider\\\",\\r\\n restart: \\\"Recommencer\\\",\\r\\n harderLevelSolved: \\\"Attention : vous avez déjà résolu une version plus difficile. Vous ne pourrez pas gagner de points supplémentaires avec cette version.\\\",\\r\\n showLevelAnyway: \\\"Voir quand même\\\",\\r\\n scoreObtained: \\\"Score obtenu :\\\",\\r\\n hardVersionTakesTime: \\\"Résoudre une {0} peut vous prendre beaucoup de temps ; songez en priorité à répondre aux questions en {1} pour gagner des points rapidement.\\\",\\r\\n illKeepThatInMind: \\\"J'y prendrai garde\\\",\\r\\n harderLevelAvailable: \\\"Notez que pour cette question, vous pouvez résoudre directement une version plus difficile que celle-ci.\\\",\\r\\n lockedLevel: \\\"Cette version est verrouillée. Résolvez la précédente pour l'afficher !\\\",\\r\\n lockedLevelDev: \\\"Cette version est normalement verrouillée, et la précédente doit être résolue avant de pouvoir afficher cette version. Comme vous avez chargé ce sujet en local, vous pouvez néanmoins la voir.\\\",\\r\\n gradeThisAnswer: \\\"Évaluer cette réponse\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Enregistrer votre réponse\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Votre réponse a été enregistrée. Vous pouvez la modifier, ou bien {0} et recommencer.\\\",\\r\\n cancelIt: \\\"l'annuler\\\",\\r\\n warningDifferentAnswerSaved: \\\"Attention : une réponse différente est enregistrée.\\\",\\r\\n youMay: \\\"Vous pouvez {0}.\\\",\\r\\n reloadIt: \\\"la recharger\\\",\\r\\n saveThisNewAnswer: \\\"Enregistrer cette nouvelle réponse\\\",\\r\\n\\r\\n gradingInProgress: \\\"Évaluation en cours\\\",\\r\\n scoreIs: \\\"Votre score est de :\\\",\\r\\n point: \\\"point\\\",\\r\\n points: \\\"points\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Le concours étant terminé, votre réponse n'est pas enregistrée et votre score reste de :\\\",\\r\\n scoreWouldBecome: \\\"Avec cette réponse, votre score serait :\\\",\\r\\n reloadValidAnswer: \\\"Rechargez la réponse validée.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Le concours est terminé : votre réponse n'est pas enregistrée.\\\",\\r\\n scoreWouldStay: \\\"Avec cette réponse, votre score resterait le même :\\\",\\r\\n answerNotSavedContestOver: \\\"Le concours étant terminé, votre réponse n'a pas été enregistrée. Vous pouvez {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"recharger la réponse que vous avez soumise\\\",\\r\\n difficultyWarning: \\\"<strong>Attention :</strong> résoudre cette version prend du temps.<br/>Vous pourrez résoudre bien plus rapidement les versions 2 et 3 étoiles d'autres sujets.\\\",\\r\\n enemyWarning: \\\"<strong>Attention :</strong> dans ce défi, l'ordinateur vous empêchera de trouver la solution par hasard.\\\"\\r\\n },\\r\\n en: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"easy version\\\",\\r\\n levelVersionName_medium: \\\"medium version\\\",\\r\\n levelVersionName_hard: \\\"hard version\\\",\\r\\n levelVersionName_easy_stars: \\\"2 stars version\\\",\\r\\n levelVersionName_medium_stars: \\\"3 stars version\\\",\\r\\n levelVersionName_hard_stars: \\\"4 stars version\\\",\\r\\n levelName_easy: \\\"Easy\\\",\\r\\n levelName_medium: \\\"Medium\\\",\\r\\n levelName_hard: \\\"Hard\\\",\\r\\n warningTimeout: \\\"<p>Warning, it has been more than {0} minutes since you started working on this task.</p><p>You should probably switch to a diffrent task, by clicking on the button on the top-right.</p>\\\",\\r\\n alright: \\\"Alright\\\",\\r\\n moveOn: \\\"Move on\\\",\\r\\n solvedMoveOn: \\\"You solved this task completely, move on to another task.\\\",\\r\\n confirmRestart: \\\"Are you sure you want to restart this version?\\\",\\r\\n yes: \\\"Yes\\\",\\r\\n no: \\\"No\\\",\\r\\n tryHardLevel: \\\"We suggest you try the 4 stars version.\\\",\\r\\n tryMediumLevel: \\\"We suggest you try the 3 stars version.\\\",\\r\\n tryNextTask: \\\"We suggest you try the next task. If you still have time, come back later and try the next version of this task.\\\",\\r\\n yourScoreIsNow: \\\"Your score is now:\\\",\\r\\n worseScoreStays: \\\"This is not as good as before. Your score stays:\\\",\\r\\n scoreStays: \\\"Your score stays the same:\\\",\\r\\n score: \\\"Score:\\\",\\r\\n noPointsForLevel: \\\"You have not received any points yet on this version.\\\",\\r\\n outOf: \\\" out of \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Try to do even better, or move on to another task.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Try to do even better, or move on to a more difficult version.\\\",\\r\\n bestPossibleScoreCongrats: \\\"This is the best possible score on this task, congratulations!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"To obtain more points, move on to a harder version of this task.\\\",\\r\\n youDidBetterBefore: \\\"You did better before.\\\",\\r\\n scoreStays2: \\\"Your score stays the same.\\\",\\r\\n reloadBestAnswer: \\\"Reload your best answer.\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"Validate\\\",\\r\\n restart: \\\"Restart\\\",\\r\\n harderLevelSolved: \\\"Warning: you already solved a harder version of this task. You won't be able to obtain extra points with this version.\\\",\\r\\n showLevelAnyway: \\\"Show it to me anyways.\\\",\\r\\n scoreObtained: \\\"Obtained score:\\\",\\r\\n hardVersionTakesTime: \\\"Solving a {0} can take a lot of time. Consider working on the {1} to gain points quickly.\\\",\\r\\n illKeepThatInMind: \\\"I'll consider it.\\\",\\r\\n harderLevelAvailable: \\\"Note that for this task, you may try to directly work on a harder version than this one.\\\",\\r\\n lockedLevel: \\\"This version is locked. Solve the previous version to display it!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Grade this answer\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Save this answer\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Your answer has been saved. You can modify it, or {0} and restart.\\\",\\r\\n cancelIt: \\\"cancel it\\\",\\r\\n warningDifferentAnswerSaved: \\\"Warning: a different answer was saved before.\\\",\\r\\n youMay: \\\"You may {0}.\\\",\\r\\n reloadIt: \\\"reload it\\\",\\r\\n saveThisNewAnswer: \\\"Save this new answer\\\",\\r\\n\\r\\n gradingInProgress: \\\"Grading in process\\\",\\r\\n scoreIs: \\\"Your score is:\\\",\\r\\n point: \\\"point\\\",\\r\\n points: \\\"points\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"The contest being over, your new answer was not saved and your score stays:\\\",\\r\\n scoreWouldBecome: \\\"With this answer, your score would be:\\\",\\r\\n reloadValidAnswer: \\\"Reload the validated answer.\\\",\\r\\n contestOverAnswerNotSaved: \\\"The contest being over, your new answer was not saved.\\\",\\r\\n scoreWouldStay: \\\"With this answer, your score would stay the same:\\\",\\r\\n answerNotSavedContestOver: \\\"The contest being over, your answer was not saved. You may {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"reload the validated answer\\\",\\r\\n difficultyWarning: \\\"<strong>Warning:</strong> solving this version takes time.<br/>You would solve the 2 or 3 star versions of other tasks more quickly.\\\",\\r\\n enemyWarning: \\\"<strong>Warning:</strong> in this challenge, the computer will make sure you don't find the solution by chance.\\\"\\r\\n },\\r\\n sv: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"lätt version\\\",\\r\\n levelVersionName_medium: \\\"medelsvår version\\\",\\r\\n levelVersionName_hard: \\\"svår version\\\",\\r\\n levelVersionName_easy_stars: \\\"2-stjärnig version\\\",\\r\\n levelVersionName_medium_stars: \\\"3-stjärnig version\\\",\\r\\n levelVersionName_hard_stars: \\\"4-stjärnig version\\\",\\r\\n levelName_easy: \\\"Lätt\\\",\\r\\n levelName_medium: \\\"Medelsvår\\\",\\r\\n levelName_hard: \\\"Svår\\\",\\r\\n warningTimeout: \\\"<p>Varning: det har gått mer än {0} minuter sedan du började med den här uppgiften. </p><p>Du borde kanske byta till en annan uppgift, genom att klicka på knappen uppe till höger.</p>\\\",\\r\\n alright: \\\"Okej\\\",\\r\\n moveOn: \\\"Gå vidare\\\",\\r\\n solvedMoveOn: \\\"Du löste uppgiften helt! Gå nu vidare till en annan uppgift.\\\",\\r\\n confirmRestart: \\\"Är du säker på att du vill börja om med den här versionen?\\\",\\r\\n yes: \\\"Ja\\\",\\r\\n no: \\\"Nej\\\",\\r\\n tryHardLevel: \\\"Vi föreslår att du provar den 4-stjärniga versionen.\\\",\\r\\n tryMediumLevel: \\\"Vi föreslår att du provar den 3-stjärniga versionen.\\\",\\r\\n tryNextTask: \\\"Vi föreslår att du provar nästa uppgift. Kom tillbaka senare och prova en svårare version av den här uppgiften.\\\",\\r\\n yourScoreIsNow: \\\"Din poäng är nu:\\\",\\r\\n worseScoreStays: \\\"Det är inte lika bra som tidigare. Poängen fortfarande:\\\",\\r\\n scoreStays: \\\"Din poäng är fortfarande:\\\",\\r\\n score: \\\"Poäng:\\\",\\r\\n noPointsForLevel: \\\"Du har inte fått några poäng än på den här versionen.\\\",\\r\\n outOf: \\\" utav \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Försök klara det ännu bättre, eller gå vidare till en annan uppgift.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Försök klara det ännu bättre, eller gå vidare till en svårare version.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Detta är högsta möjliga poäng på den här uppgiften. Grattis!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"För att få mer poäng, gå vidare till en svårare version av den här uppgiften.\\\",\\r\\n youDidBetterBefore: \\\"Det gick bättre tidigare.\\\",\\r\\n scoreStays2: \\\"Din poäng ändras inte.\\\",\\r\\n reloadBestAnswer: \\\"Ladda in ditt bästa svar.\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"Kontrollera svaret\\\",\\r\\n restart: \\\"Börja om\\\",\\r\\n harderLevelSolved: \\\"Varning: du har redan löst en svårare version av den här uppgiften. Du kommer inte kunna få mer poäng med den här versionen.\\\",\\r\\n showLevelAnyway: \\\"Visa den ändå.\\\",\\r\\n scoreObtained: \\\"Uppnådd poäng:\\\",\\r\\n hardVersionTakesTime: \\\"Att lösa en {0} kan ta lång tid. Fundera på om du ska jobba med en {1} för att tjäna poäng snabbare.\\\",\\r\\n illKeepThatInMind: \\\"Jag ska tänka på det.\\\",\\r\\n harderLevelAvailable: \\\"Notera att på den här uppgiften kan du direkt försöka med en svårare version än denna.\\\",\\r\\n lockedLevel: \\\"Den här versionen är låst. Lös den föregående nivån för att visa den!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Bedöm svaret\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Spara svaret\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Ditt svar har sparats. Du kan ändra det, eller {0} och börja om.\\\",\\r\\n cancelIt: \\\"avbryta det\\\",\\r\\n warningDifferentAnswerSaved: \\\"Varning: ett annat svar finns redan sparat.\\\",\\r\\n youMay: \\\"Du kan {0}.\\\",\\r\\n reloadIt: \\\"ladda in det på nytt\\\",\\r\\n saveThisNewAnswer: \\\"Spara det här nya svaret\\\",\\r\\n\\r\\n gradingInProgress: \\\"Rättning pågår\\\",\\r\\n scoreIs: \\\"Din poäng är:\\\",\\r\\n point: \\\"poäng\\\",\\r\\n points: \\\"poäng\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Eftersom tävlingen är över sparas inte ditt svar och din poäng ändras inte.\\\",\\r\\n scoreWouldBecome: \\\"Med det här svaret, skulle din poäng vara:\\\",\\r\\n reloadValidAnswer: \\\"Ladda in det kontrollerade svaret.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Eftersom tävlingen är över sparas inte ditt svar.\\\",\\r\\n scoreWouldStay: \\\"Med det här svaret, skulle din poäng inte ändras:\\\",\\r\\n answerNotSavedContestOver: \\\"Eftersom tävlingen är över sparas inte ditt svar. Du kan {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"ladda in det kontrollerade svaret på nytt\\\",\\r\\n difficultyWarning: \\\"<strong>Varning:</strong> att lösa den här versionen tar lång tid.<br/>Det kan gå snabbare att lösa 2- eller 3-stjärniga versioner av andra uppgifter.\\\",\\r\\n enemyWarning: \\\"<strong>Varning:</strong> i den här utmaningen kommer datorn se till att du inte hittar lösningen av en slump.\\\"\\r\\n },\\r\\n fi: {\\r\\n version: \\\"Versio \\\",\\r\\n levelVersionName_easy: \\\"helppo versio\\\",\\r\\n levelVersionName_medium: \\\"hieman vaikeampi versio\\\",\\r\\n levelVersionName_hard: \\\"vaikea versio\\\",\\r\\n levelVersionName_easy_stars: \\\"2 tähden versio\\\",\\r\\n levelVersionName_medium_stars: \\\"3 tähden versio\\\",\\r\\n levelVersionName_hard_stars: \\\"4 tähden versio\\\",\\r\\n levelName_easy: \\\"Helppo\\\",\\r\\n levelName_medium: \\\"Hieman vaikeampi\\\",\\r\\n levelName_hard: \\\"Vaikea\\\",\\r\\n warningTimeout: \\\"<p>Huomio: on kulunut jo yli {0} minuuttia siitä, kun aloit tekemään tätä tehtävää.</p><p>Sinun mahdollisesti kannattaisi siirtyä yrittämään jotain toista tehtävää klikkaamalla oikean yläkulman nappia.</p>\\\",\\r\\n alright: \\\"Ok\\\",\\r\\n moveOn: \\\"Siirry eteenpäin\\\",\\r\\n solvedMoveOn: \\\"Ratkaisit tämän tehtävän kokonaan, siirry nyt seuraavaan tehtävään.\\\",\\r\\n confirmRestart: \\\"Oletko varma, että haluat aloittaa tämän version alusta?\\\",\\r\\n yes: \\\"Kyllä\\\",\\r\\n no: \\\"Ei\\\",\\r\\n tryHardLevel: \\\"Ehdotamme, että kokeilet 4 tähden versiota.\\\",\\r\\n tryMediumLevel: \\\"Ehdotamme, että kokeilet 3 tähden versiota.\\\",\\r\\n tryNextTask: \\\"Ehdotamme, että kokeilet seuraavaa tehtävää. Jos sinulle jää vielä aikaa, voit myöhemmin palata takaisin tämän tehtävän pariin.\\\",\\r\\n yourScoreIsNow: \\\"Pisteesi nyt:\\\",\\r\\n worseScoreStays: \\\"Tämä on aiempaa alhaisempi. Pistemääränäsi säilyy:\\\",\\r\\n scoreStays: \\\"Pistemääränäsi sailyy:\\\",\\r\\n score: \\\"Pisteet:\\\",\\r\\n noPointsForLevel: \\\"Et ole vielä saanut pisteitä tästä versiosta.\\\",\\r\\n outOf: \\\" / \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Yritä saada vielä paremmat pisteet tai siirry toiseen tehtävään.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Yritä saada vielä paremmat pisteet tai siirry saman tehtävän vaikeampaan versioon.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Onnittelut: saavutit tehtävän maksimipistemäärän!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Siirry tehtävän vaikeampaan versioon saadaksesi enemmän pisteitä.\\\",\\r\\n youDidBetterBefore: \\\"Sait aiemmin enemmän pisteitä.\\\",\\r\\n scoreStays2: \\\"Pistemääräsi säilyy samana.\\\",\\r\\n reloadBestAnswer: \\\"Palauta paras aiempi vastauksesi.\\\",\\r\\n noAnswerSaved: \\\"Tähän versioon ei ole vielä tallennettu vastausta.\\\",\\r\\n validate: \\\"Tarkista vastaus\\\",\\r\\n restart: \\\"Aloita alusta\\\",\\r\\n harderLevelSolved: \\\"Varoitus: olet jo ratkaissut vaikeamman version tästä tehtävästä. Tämän helpomman version ratkaiseminen ei voi korottaa pistemäärääsi.\\\",\\r\\n showLevelAnyway: \\\"Siirry joka tapauksessa.\\\",\\r\\n scoreObtained: \\\"Saatu pistemäärä:\\\",\\r\\n hardVersionTakesTime: \\\"{0} voi viedä runsaasti aikaa. {1} voi tuottaa pisteitä nopeammin.\\\",\\r\\n illKeepThatInMind: \\\"Ymmärrän tämän.\\\",\\r\\n harderLevelAvailable: \\\"Huomaa, että voit myös suoraan koittaa ratkaista vaikeampaa versiota tästä tehtävästä.\\\",\\r\\n lockedLevel: \\\"Tämä versio on vielä lukittu: ratkaise ensin helpompi versio!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Tarkista vastaus\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Tallenna vastaus\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Vastauksesi on tallennettu. Voit muokata sitä tai {0} ja aloittaa uudelleen alusta.\\\",\\r\\n cancelIt: \\\"perua sen\\\",\\r\\n warningDifferentAnswerSaved: \\\"Varoitus: toisenlainen vastaus on tallennettu jo aiemmin.\\\",\\r\\n youMay: \\\"Voit {0}.\\\",\\r\\n reloadIt: \\\"ladata sen uudelleen\\\",\\r\\n saveThisNewAnswer: \\\"tallentaa tämän uuden vastauksen\\\",\\r\\n\\r\\n gradingInProgress: \\\"Pisteytystä suoritetaan\\\",\\r\\n scoreIs: \\\"Pistemääräsi on:\\\",\\r\\n point: \\\"piste\\\",\\r\\n points: \\\"pisteet\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Kilpailu on jo päättynyt, joten uutta vastaustasi ei enää tallennettu ja pistemääränäsi säilyy:\\\",\\r\\n scoreWouldBecome: \\\"Jos tämäkin vastaus huomioitaisiin, pistemääräsi olisi:\\\",\\r\\n reloadValidAnswer: \\\"Palauta aiemmin hyväksytty vastaus.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Kilpailu on jo päättynyt, joten uutta vastaustasi ei enää tallennettu.\\\",\\r\\n scoreWouldStay: \\\"Jos tämäkin vastaus huomioitaisiin, pistemääräsi olisi yhä:\\\",\\r\\n answerNotSavedContestOver: \\\"Kilpailu on jo päättynyt, joten uutta vastaustasi ei enää tallennettu. Voit {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"palauttaa aiemmin lähetetyn vastauksen\\\",\\r\\n difficultyWarning: \\\"<strong>Varoitus:</strong> tämän version ratkaiseminen vie aikaa.<br/>Saat luultavasti ratkaistua 2 tai 3 tähden version nopeammin.\\\",\\r\\n enemyWarning: \\\"<strong>Huomio:</strong> tässä tehtävässä tietokone pyrkii varmistamaan, ettet voi löytää ratkaisua sattumalta.\\\"\\r\\n },\\r\\n nl: {\\r\\n version: \\\"Versie\\\",\\r\\n levelVersionName_easy: \\\"gemakkelijke versie\\\",\\r\\n levelVersionName_medium: \\\"gemiddelde versie\\\",\\r\\n levelVersionName_hard: \\\"moeilijke versie\\\",\\r\\n levelVersionName_easy_stars: \\\"versie met 2 sterren\\\",\\r\\n levelVersionName_medium_stars: \\\"versie met 3 sterren\\\",\\r\\n levelVersionName_hard_stars: \\\"versie met 4 sterren\\\",\\r\\n levelName_easy: \\\"Gemakkelijk\\\",\\r\\n levelName_medium: \\\"Gemiddeld\\\",\\r\\n levelName_hard: \\\"Moeilijk\\\",\\r\\n warningTimeout: \\\"<p>Let op, je bent al meer dan {0} minuten bezig met deze vraag.</p><p>Misschien moet je van onderwerp veranderen, door te klikken op de knop rechtsboven.</p>\\\",\\r\\n alright: \\\"Akkoord\\\",\\r\\n moveOn: \\\"Ga naar de volgende\\\",\\r\\n solvedMoveOn: \\\"Je hebt deze vraag helemaal opgelost, ga verder met een andere vraag.\\\",\\r\\n confirmRestart: \\\"Ben je zeker dat je deze versie wilt herbeginnen?\\\",\\r\\n yes: \\\"Ja\\\",\\r\\n no: \\\"Nee\\\",\\r\\n tryHardLevel: \\\"We stellen voor dat je de versie met 4 sterren probeert.\\\",\\r\\n tryMediumLevel: \\\"We stellen voor dat je de versie met 3 sterren probeert.\\\",\\r\\n tryNextTask: \\\"We stellen voor dat je met de volgende vraag begint. Als je tijd over hebt, kan je later terugkomen voor de volgende versie.\\\",\\r\\n yourScoreIsNow: \\\"Jouw score is nu:\\\",\\r\\n worseScoreStays: \\\"Dit is minder dan voordien; jouw score blijft:\\\",\\r\\n scoreStays: \\\"Jouw score blijft hetzelfde:\\\",\\r\\n score: \\\"Score:\\\",\\r\\n noPointsForLevel: \\\"Je hebt nog geen punten behaald op deze vraag.\\\",\\r\\n outOf: \\\" op \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Probeer om nog beter te doen, of ga verder met een andere vraag.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Probeer om nog beter te doen, of ga verder naar een moeilijkere versie.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Dit is de best mogelijke score op deze vraag; proficiat!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Ga verder naar een moeilijkere versie om meer punten te behalen.\\\",\\r\\n youDidBetterBefore: \\\"Je hebt eerder al beter gedaan.\\\",\\r\\n scoreStays2: \\\"Je score blijft hetzelfde.\\\",\\r\\n reloadBestAnswer: \\\"Herlaad je beste antwoord.\\\",\\r\\n noAnswerSaved: \\\"Nog geen antwoord opgeslagen voor deze versie.\\\",\\r\\n validate: \\\"Valideren\\\",\\r\\n restart: \\\"Herbeginnen\\\",\\r\\n harderLevelSolved: \\\"Let op: je hebt al een moeilijkere versie opgelost. Je kan met deze versie geen extra punten halen.\\\",\\r\\n showLevelAnyway: \\\"Toon het mij toch\\\",\\r\\n scoreObtained: \\\"Behaalde score:\\\",\\r\\n hardVersionTakesTime: \\\"Het oplossen van {0} kan je veel tijd kosten; overweeg om eerst de vragen in {1} op te lossen om snel punten te halen.\\\",\\r\\n illKeepThatInMind: \\\"Ik zal er aan denken\\\",\\r\\n harderLevelAvailable: \\\"Merk op dat je voor deze vraag nu al een moeilijkere versie dan deze mag oplossen.\\\",\\r\\n lockedLevel: \\\"Deze versie is nog geblokkeerd. Los de vorige versie op om ze te ontsluiten!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Evalueer dit antwoord\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Bewaar jouw antwoord\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Jouw antwoord is bewaard. Je kan het aanpassen, of {0} en herbeginnen.\\\",\\r\\n cancelIt: \\\"het annuleren\\\",\\r\\n warningDifferentAnswerSaved: \\\"Let op: er is een verschillend antwoord bewaard.\\\",\\r\\n youMay: \\\"Je kan {0}.\\\",\\r\\n reloadIt: \\\"het herladen\\\",\\r\\n saveThisNewAnswer: \\\"Bewaar dit nieuwe antwoord\\\",\\r\\n\\r\\n gradingInProgress: \\\"Bezig met evalueren\\\",\\r\\n scoreIs: \\\"Jouw score is:\\\",\\r\\n point: \\\"punt\\\",\\r\\n points: \\\"punten\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"De wedstrijd is reeds afgelopen, jouw antwoord is dus niet bewaard en jouw score blijft:\\\",\\r\\n scoreWouldBecome: \\\"Met dit antwoord zou dit jouw score zijn:\\\",\\r\\n reloadValidAnswer: \\\"Herlaad het gevalideerde antwoord.\\\",\\r\\n contestOverAnswerNotSaved: \\\"De wedstrijd is afgelopen: jouw antwoord is niet bewaard.\\\",\\r\\n scoreWouldStay: \\\"Met dit antwoord, zou jouw score hetzelfde zijn gebleven:\\\",\\r\\n answerNotSavedContestOver: \\\"De wedstrijd is reeds afgelopen, je antwoord werd niet bewaard. Je kan {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"het antwoord herlanden dat je hebt ingediend\\\",\\r\\n difficultyWarning: \\\"<strong>Let op</strong>: deze versie oplossen kan wat tijd kosten.<br/>Je kan waarschijnlijk sneller de 2 of 3 sterren-versies van andere vragen oplossen.\\\",\\r\\n enemyWarning: \\\"<strong>Let op :</strong> in deze opdracht zorgt de computer ervoor dat je de oplossing niet per toeval kan vinden.\\\"\\r\\n },\\r\\n de: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"leichte Version\\\",\\r\\n levelVersionName_medium: \\\"mittlere Version\\\",\\r\\n levelVersionName_hard: \\\"schwere Version\\\",\\r\\n levelVersionName_easy_stars: \\\"2-Sterne-Version\\\",\\r\\n levelVersionName_medium_stars: \\\"3-Sterne-Version\\\",\\r\\n levelVersionName_hard_stars: \\\"4-Sterne-Version\\\",\\r\\n levelName_easy: \\\"Leicht\\\",\\r\\n levelName_medium: \\\"Mittel\\\",\\r\\n levelName_hard: \\\"Schwer\\\",\\r\\n warningTimeout: \\\"<p>Achtung, du bist schon seit {0} Minuten bei dieser Frage.</p><p>Du solltest jetzt zu einer anderen Aufgabe wechseln.</p>\\\",\\r\\n alright: \\\"OK\\\",\\r\\n moveOn: \\\"Fortfahren\\\",\\r\\n solvedMoveOn: \\\"Du hast diese Frage bereits vollständig gelöst. Wähle eine andere Frage zum Bearbeiten aus.\\\",\\r\\n confirmRestart: \\\"Bist du sicher, dass du diese Version neustarten möchtest?\\\",\\r\\n yes: \\\"Ja\\\",\\r\\n no: \\\"Nein\\\",\\r\\n tryHardLevel: \\\"Wir schlagen dir vor, die 4-Sterne-Version zu bearbeiten.\\\",\\r\\n tryMediumLevel: \\\"Wir schlagen dir vor, die 3-Sterne-Version zu bearbeiten\\\",\\r\\n tryNextTask: \\\"Wir schlagen dir vor, die nächste Aufgabe zu bearbeiten. Wenn du am Ende noch Zeit hast, kannst du hierher zurückkehren und die schwerere Version bearbeiten.\\\",\\r\\n yourScoreIsNow: \\\"Dein Punktestand ist jetzt:\\\",\\r\\n worseScoreStays: \\\"Das ist weniger als vorher; dein Punktestand bleibt:\\\",\\r\\n scoreStays: \\\"Dein Punktestand bleibt gleich:\\\",\\r\\n score: \\\"Punktestand:\\\",\\r\\n noPointsForLevel: \\\"Du hast noch keine Punkte für diese Version erhalten.\\\",\\r\\n outOf: \\\" von \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Versuche, dich zu verbessern oder wähle eine andere Frage.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Versuche, dich zu verbessern oder wähle schwierigere Version.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Das ist die bestmögliche Punktzahl für diese Aufgabe. Glückwunsch!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Wähle eine schwerere Version aus, um noch mehr Punkte zu bekommen.\\\",\\r\\n youDidBetterBefore: \\\"Du hast dich verbessern.\\\",\\r\\n scoreStays2: \\\"Dein Punktestand bleibt gleich.\\\",\\r\\n reloadBestAnswer: \\\"Deine beste Antwort wieder laden.\\\",\\r\\n noAnswerSaved: \\\"Bisher noch keine Antwort für diese Version gespeichert.\\\",\\r\\n validate: \\\"Erstellen\\\",\\r\\n restart: \\\"Neustarten\\\",\\r\\n harderLevelSolved: \\\"Achtung: Du hast schon eine schwerere Version gelöst. Du kannst mit dieser Version keine zusätzlichen Punkte bekommen.\\\",\\r\\n showLevelAnyway: \\\"Trotzdem anzeigen\\\",\\r\\n scoreObtained: \\\"Erhaltene Punkte:\\\",\\r\\n hardVersionTakesTime: \\\"Eine {0} zu lösen kann dich viel Zeit kosten; Denke zunächst daran, die Fragen in {1} zu beantworten, um schnell Punkte zu bekommen.\\\",\\r\\n illKeepThatInMind: \\\"Ich hab das verstanden\\\",\\r\\n harderLevelAvailable: \\\"Beachte, dass du bei dieser Frage direkt zu einer schwereren Version gehen kannst.\\\",\\r\\n lockedLevel: \\\"Diese Version ist noch gesperrt. Löse die vorherige um diese freizuschalten.\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Diese Antwort auswerten\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Antwort speichern\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Deine Antwort wurde eingereicht. Du kannst sie noch bearbeiten, oder {0} und neu beginnen.\\\",\\r\\n cancelIt: \\\"Abbrechen\\\",\\r\\n warningDifferentAnswerSaved: \\\"Achtung: Eine andere Antwort ist bereits gespeichert!\\\",\\r\\n youMay: \\\"Du kannst {0}.\\\",\\r\\n reloadIt: \\\"Neu laden\\\",\\r\\n saveThisNewAnswer: \\\"Diese Antwort speichern\\\",\\r\\n\\r\\n gradingInProgress: \\\"Das Ergebnis wird ausgewertet …\\\",\\r\\n scoreIs: \\\"Dein Punktestand beträgt:\\\",\\r\\n point: \\\"Punkt\\\",\\r\\n points: \\\"Punkte\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Der Contest ist vorbei, deine Antwort wurde nicht eingereicht und deine Punktestand bleibt:\\\",\\r\\n scoreWouldBecome: \\\"Mit dieser Antwort wäre dein Punktestand:\\\",\\r\\n reloadValidAnswer: \\\"Die gültige Antwort neu laden.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Der Contest ist vorbei, deine Antwort wurde nicht eingereicht.\\\",\\r\\n scoreWouldStay: \\\"Mit dieser Antwort bliebe dein Punktestand gleich:\\\",\\r\\n answerNotSavedContestOver: \\\"Der Contest ist vorbei, deine Antwort wurde nicht eingereicht. Du kannst {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"Lade die Lösung, die du eingereicht hast\\\",\\r\\n difficultyWarning: \\\"<strong>Achtung:</strong> diese Version zu lösen kann einige Zeit in Anspruch nehmen.<br/>Die 2- und 3-Stern Version von anderen Aufgaben lassen sich schneller lösen.\\\",\\r\\n enemyWarning: \\\"<strong>Attention :</strong> dans ce défi, l'ordinateur vous empêchera de trouver la solution par hasard.\\\"\\r\\n },\\r\\n ar: {\\r\\n version: \\\"المستوى\\\",\\r\\n levelVersionName_easy: \\\"المستوى السهل\\\",\\r\\n levelVersionName_medium: \\\"المستوى المتوسط\\\",\\r\\n levelVersionName_hard: \\\"المستوى الصعب\\\",\\r\\n levelVersionName_easy_stars: \\\"المستوى الأول\\\",\\r\\n levelVersionName_medium_stars: \\\"المستوى الثاني\\\",\\r\\n levelVersionName_hard_stars: \\\"المستوى الثالث\\\",\\r\\n levelName_easy: \\\"سهل\\\",\\r\\n levelName_medium: \\\"متوسط\\\",\\r\\n levelName_hard: \\\"صعب\\\",\\r\\n warningTimeout: \\\"<p>لقد مر وقت طويل منذ أن بدأت في هذه المسألة, من الأفضل أن تبدأ في مسألة أخرى حتى لا يضيع الوقت</p>\\\",\\r\\n alright: \\\"حسناً\\\",\\r\\n moveOn: \\\"استمر\\\",\\r\\n solvedMoveOn: \\\"لقد أجبت على هذا السؤال بالكامل. ابدأ في سؤال أخر\\\",\\r\\n confirmRestart: \\\"هل ترغب في بدء هذا سؤال من جديد؟\\\",\\r\\n yes: \\\"نعم\\\",\\r\\n no: \\\"لا\\\",\\r\\n tryHardLevel: \\\"نقترح أن تبدأ في المستوى الثالث للسؤال\\\",\\r\\n tryMediumLevel: \\\"نقترح أن تبدأ في المستوى الثاني للسؤال\\\",\\r\\n tryNextTask: \\\"نقترح أن تبدأ في المسألة التالية, وإذا تبقى عندك وقت يمكنك حل المستوى الأصعب في هذه المسألة لاحقاً\\\",\\r\\n yourScoreIsNow: \\\"مجموع نقاطك:\\\",\\r\\n worseScoreStays: \\\"هذا ليس جيداً. ما زالت نقاطك:\\\",\\r\\n scoreStays: \\\"نقاطك ما زالت كما هي:\\\",\\r\\n score: \\\"النقاط\\\",\\r\\n noPointsForLevel: \\\"لم تحقق أي نقاط في هذا المستوى\\\",\\r\\n outOf: \\\"من\\\",\\r\\n tryToDoBetterOrChangeTask: \\\"حاول في مسألة أخرى\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"حاول في المستوى الأصعب\\\",\\r\\n bestPossibleScoreCongrats: \\\"مبروك ... لقد حصلت على أعلى درجة في هذا السؤال\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"للحصول على المزيد من النقاط جاوب على المستوى الأصعب\\\",\\r\\n youDidBetterBefore: \\\"لقد قمت بها أفضل من هذا في وقت سابق\\\",\\r\\n scoreStays2: \\\"ما زالت نقاطك كما هي\\\",\\r\\n reloadBestAnswer: \\\"اعد تحميل إجابتك الأفضل\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"تحقق\\\",\\r\\n restart: \\\"ابدأ من جديد\\\",\\r\\n harderLevelSolved: \\\"لقد قمت بحل المستوى الأصعب في هذا السؤال, لن تتمكن من الحصول على درجات أعلى في هذا السؤال\\\",\\r\\n showLevelAnyway: \\\"اظهرها لي على أي حال\\\",\\r\\n scoreObtained: \\\"النقاط المكتسبة:\\\",\\r\\n hardVersionTakesTime: \\\"Solving a {0} can take a lot of time. Consider working on the {1} to gain points quickly.\\\",\\r\\n illKeepThatInMind: \\\"I'll consider it.\\\",\\r\\n harderLevelAvailable: \\\"تنبيه: يمكنك حل المستوى الأصعب في هذه المسألة مباشرة\\\",\\r\\n lockedLevel: \\\"هذا المستوى مغلق. يجب عليك حل المستوى السابق أولا\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"قيم هذه الإجابة\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"احفظ هذه الإجابة\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"تم حفظ إجابتك, يمكنك تعديلها أو بدأها من جديد\\\",\\r\\n cancelIt: \\\"احذفها\\\",\\r\\n warningDifferentAnswerSaved: \\\"تنبيه: يوجد اجابة أخرى محفوظة سابقاً\\\",\\r\\n youMay: \\\"You may {0}.\\\",\\r\\n reloadIt: \\\"حملها من جديد\\\",\\r\\n saveThisNewAnswer: \\\"احفظ الإجابة الجديدة\\\",\\r\\n\\r\\n gradingInProgress: \\\"نقوم بالتقييم\\\",\\r\\n scoreIs: \\\"مجموع نقاطك:\\\",\\r\\n point: \\\"نقطة\\\",\\r\\n points: \\\"نقاط\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"المسابقة انتهت. إجابتك الجديدة لم تحفظ ومجموع نقاطك ما زال:\\\",\\r\\n scoreWouldBecome: \\\" مع تلك الإجابة، مجموع نقاطك أصبح:\\\",\\r\\n reloadValidAnswer: \\\"اعد تحميل الإجابة المحققة\\\",\\r\\n contestOverAnswerNotSaved: \\\"المسابقة إنتهت ولم يتم حفظ إجاباتك الجديدة\\\",\\r\\n scoreWouldStay: \\\"بهذه الإجابة سوف يظل مجموع نقاطك كما هو\\\",\\r\\n answerNotSavedContestOver: \\\"The contest being over, your answer was not saved. You may {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"اعد تحميل الإجابة المحققة\\\",\\r\\n difficultyWarning: \\\"تنبيه: حل هذه النسخة سوف يستغرق وقت كثير. الإفضل أن تبدأ في حل مسائل أخرى\\\",\\r\\n enemyWarning: \\\"تحذير: في هذه المسألة سيمنعك الكمبيوتر من إيجاد الحل عن طريق الصدفة. فكر جيداً\\\"\\r\\n },\\r\\n es: {\\r\\n version: \\\"Versión\\\",\\r\\n levelVersionName_easy: \\\"versión fácil\\\",\\r\\n levelVersionName_medium: \\\"versión moderada\\\",\\r\\n levelVersionName_hard: \\\"versión difícil\\\",\\r\\n levelVersionName_easy_stars: \\\"versión de 2 estrellas\\\",\\r\\n levelVersionName_medium_stars: \\\"versión de 3 estrellas\\\",\\r\\n levelVersionName_hard_stars: \\\"versión de 4 estrellas\\\",\\r\\n levelName_easy: \\\"Fácil\\\",\\r\\n levelName_medium: \\\"Moderado\\\",\\r\\n levelName_hard: \\\"Difícil\\\",\\r\\n warningTimeout: \\\"<p>Atención, ya llevas {0} minutos en esta pregunta.</p><p>Te recomendamos cambiar de tema haciendo click sobre el botón de arriba a la derecha.</p>\\\",\\r\\n alright: \\\"De acuerdo\\\",\\r\\n moveOn: \\\"Pasar a la siguiente\\\",\\r\\n solvedMoveOn: \\\"Has resuelto completamente esta pregunta. Pasa a otra pregunta.\\\",\\r\\n confirmRestart: \\\"¿Estás seguro que deseas volver a iniciar esta versión?\\\",\\r\\n yes: \\\"Sí\\\",\\r\\n no: \\\"No\\\",\\r\\n tryHardLevel: \\\"Te recomendamos intentar la versión de 4 estrellas.\\\",\\r\\n tryMediumLevel: \\\"Te recomendamos intentar la versión de 3 estrellas.\\\",\\r\\n tryNextTask: \\\"Te recomendamos que pases a la siguiente pregunta. Si tienes tiempo, puedes volver más tarde para probar la siguiente versión\\\",\\r\\n yourScoreIsNow: \\\"Tu puntuación es ahora :\\\",\\r\\n worseScoreStays: \\\"Esto no está tan bien como antes; tu puntuación se mantiene en :\\\",\\r\\n scoreStays: \\\"tu puntuación se mantiene igual :\\\",\\r\\n score: \\\"Puntuación :\\\",\\r\\n noPointsForLevel: \\\"Aún no has recibido puntos en esta versión.\\\",\\r\\n outOf: \\\" de \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Intenta nuevamente para obtener una mejor puntuación, o pasa a la siguiente pregunta.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Intenta nuevamente para obtener una mejor puntuación, o pasa a una versión más difícil.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Esta es la mejor puntuación posible en este problema, ¡felicitaciones!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Para obtener más puntos, pasa a una versión más difícil.\\\",\\r\\n youDidBetterBefore: \\\"Realizaste un mejor trabajo antes.\\\",\\r\\n scoreStays2: \\\"Tu puntuación se mantiene igual.\\\",\\r\\n reloadBestAnswer: \\\"Recargar tu mejor respuesta.\\\",\\r\\n noAnswerSaved: \\\"Aún no hay respuesta guardada para esta versión.\\\",\\r\\n validate: \\\"Validar\\\",\\r\\n restart: \\\"Reiniciar\\\",\\r\\n harderLevelSolved: \\\"Atención: ya has resuelto una versión más difícil. No puedes ganar puntos extra con esta versión.\\\",\\r\\n showLevelAnyway: \\\"Mostrar el nivel de igual manera\\\",\\r\\n scoreObtained: \\\"Puntuación obtenida:\\\",\\r\\n hardVersionTakesTime: \\\"Resolver una {0} puede tomar mucho tiempo; te aconsejamos priorizar el resolver las preguntas en {1} para ganar puntos más rápidamente.\\\",\\r\\n illKeepThatInMind: \\\"Lo tendré en mente\\\",\\r\\n harderLevelAvailable: \\\"Nota que para esta pregunta, puedes resolver directamente una versión más difícil que esta.\\\",\\r\\n lockedLevel: \\\"Esta versión está bloqueada. Resuelve la version anterior para verla.\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Evaluar esta respuesta\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Guardar tu respuesta\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Tu respuesta fue guardada. Puedes modificarla, o bien {0} y reiniciar.\\\",\\r\\n cancelIt: \\\"cancelarla\\\",\\r\\n warningDifferentAnswerSaved: \\\"Atención: una respuesta diferente ha sido guardada.\\\",\\r\\n youMay: \\\"Tú puedes {0}.\\\",\\r\\n reloadIt: \\\"recargarla\\\",\\r\\n saveThisNewAnswer: \\\"Guardar esta nueva respuesta\\\",\\r\\n\\r\\n gradingInProgress: \\\"Evaluación en curso\\\",\\r\\n scoreIs: \\\"Tu puntuación es:\\\",\\r\\n point: \\\"punto\\\",\\r\\n points: \\\"puntos\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"La actividad está terminando, tu respuesta no ha sido guardada y tu puntuación se mantiene en:\\\",\\r\\n scoreWouldBecome: \\\"Con esta respuesta, tu puntuación será :\\\",\\r\\n reloadValidAnswer: \\\"Volver a cargar la respuesta válida.\\\",\\r\\n contestOverAnswerNotSaved: \\\"La actividad ha terminado: tu respuesta no fue guardada.\\\",\\r\\n scoreWouldStay: \\\"Con esta respuesta, tu puntuación será la misma:\\\",\\r\\n answerNotSavedContestOver: \\\"La actividad está terminando y tu respuesta no ha sido guardada. Tú puedes {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"recargar la respuesta que ha enviado\\\",\\r\\n difficultyWarning: \\\"<strong>Advertencia:</strong> resolver esta versión toma tiempo.<br/>Puedes resolver más rápidamente las versiones de 2 y 3 estrellas de otros problemas.\\\",\\r\\n enemyWarning: \\\"<strong>Advertencia:</strong> en este desafío, la computadora se asegurará que no encuentres la respuesta por casualidad.\\\"\\r\\n },\\r\\n it: {\\r\\n version: \\\"Versione\\\",\\r\\n levelVersionName_easy: \\\"versione facile\\\",\\r\\n levelVersionName_medium: \\\"versione media\\\",\\r\\n levelVersionName_hard: \\\"versione difficile\\\",\\r\\n levelVersionName_easy_stars: \\\"versione a 2 stelle\\\",\\r\\n levelVersionName_medium_stars: \\\"versione a 3 stelle\\\",\\r\\n levelVersionName_hard_stars: \\\"versione a 4 stelle\\\",\\r\\n levelName_easy: \\\"Facile\\\",\\r\\n levelName_medium: \\\"Medio\\\",\\r\\n levelName_hard: \\\"Difficile\\\",\\r\\n warningTimeout: \\\"<p>Attenzione, sono più di {0} minuti che sei su questa domanda.</p><p>Dovresti cambiare argomento, cliccando sul pulsante in alto a destra.</p>\\\",\\r\\n alright: \\\"Va bene\\\",\\r\\n moveOn: \\\"Vai avanti\\\",\\r\\n solvedMoveOn: \\\"Hai risolto completamente questo quesito, passa a un'altra domanda.\\\",\\r\\n confirmRestart: \\\"Sei sicuro di voler ricominciare questa versione ?\\\",\\r\\n yes: \\\"Sì\\\",\\r\\n no: \\\"No\\\",\\r\\n tryHardLevel: \\\"Ti proponiamo di provare la versione 4 stelle.\\\",\\r\\n tryMediumLevel: \\\"Ti proponiamo di provare la versione 3 stelle.\\\",\\r\\n tryNextTask: \\\"Ti proponiamo di passare all'argomento successivo. Se ti resta del tempo, potrai riprovare più tardi la seguente versione.\\\",\\r\\n yourScoreIsNow: \\\"Adesso il tuo punteggio è :\\\",\\r\\n worseScoreStays: \\\"Non è buono come prima ; il tuo punteggio rimane :\\\",\\r\\n scoreStays: \\\"Il tuo punteggio resta lo stesso :\\\",\\r\\n score: \\\"Score :\\\",\\r\\n noPointsForLevel: \\\"Non hai ancora punti su questa versione.\\\",\\r\\n outOf: \\\" sur \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Prova a fare di meglio, o passa ad un'altra domanda.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Prova a fare di meglio, o passa a una versione più difficile.\\\",\\r\\n bestPossibleScoreCongrats: \\\"E' il miglior punteggio possibile su quest'argomento ; congratulazioni !\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Per ottenere più punti, passa a una versione più difficile.\\\",\\r\\n youDidBetterBefore: \\\"Sei andato meglio prima.\\\",\\r\\n scoreStays2: \\\"Il tuo punteggio resta lo stesso.\\\",\\r\\n reloadBestAnswer: \\\"Ricarica la tua miglior risposta.\\\",\\r\\n noAnswerSaved: \\\"Nessuna risposta salvata per questa versione.\\\",\\r\\n validate: \\\"Convalida\\\",\\r\\n restart: \\\"Ricomincia\\\",\\r\\n harderLevelSolved: \\\"Attenzione : hai già risolto una versione più difficile. Non potrai più ottenere punti supplementari con questa versione.\\\",\\r\\n showLevelAnyway: \\\"Vedi lo stesso\\\",\\r\\n scoreObtained: \\\"Score ottenuto :\\\",\\r\\n hardVersionTakesTime: \\\"Risolvere una {0} ti può prendere molto tempo ; dai priorità alle risposte alle domande in {1} per guadagnare rapidamente punti.\\\",\\r\\n illKeepThatInMind: \\\"Me lo ricorderò\\\",\\r\\n harderLevelAvailable: \\\"Si noti che per questa domanda è possibile risolvere direttamente una versione più difficile di questa.\\\",\\r\\n lockedLevel: \\\"Questa versione è bloccata. Risolvi la precedente per visualizzarla !\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Valuta questa risposta\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Salva la tua risposta\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"La sua risposta è stata registrata. Puoi cambiarla, oppure {0} e ricominciare da capo.\\\",\\r\\n cancelIt: \\\"annullarla\\\",\\r\\n warningDifferentAnswerSaved: \\\"Attenzione : è salvata una risposta diversa.\\\",\\r\\n youMay: \\\"Puoi {0}.\\\",\\r\\n reloadIt: \\\"ricaricala\\\",\\r\\n saveThisNewAnswer: \\\"Salva questa nuova risposta\\\",\\r\\n\\r\\n gradingInProgress: \\\"Valutazione in corso\\\",\\r\\n scoreIs: \\\"Il tuo punteggio è di :\\\",\\r\\n point: \\\"punto\\\",\\r\\n points: \\\"punti\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Il concorso è terminato, la tua risposta non è stata salvata e il tuo punteggio è di :\\\",\\r\\n scoreWouldBecome: \\\"Con questa risposta, il tuo punteggio sarà :\\\",\\r\\n reloadValidAnswer: \\\"Ricarica la risposta convalidata.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Il concorso è terminato : la tua risposta non è stata salvata.\\\",\\r\\n scoreWouldStay: \\\"Con questa risposta, il tuo punteggio resterà lo stesso :\\\",\\r\\n answerNotSavedContestOver: \\\"Il concorso è terminato, la tua risposta non è stata salvata. Puoi {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"ricarica la risposta che hai inviato\\\",\\r\\n difficultyWarning: \\\"<strong>Attenzione :</strong> risolvere questa versione richiede del tempo.<br/>Potresti risolvere molto più rapidamente le versioni 2 e 3 stelle di altri argomenti.\\\",\\r\\n enemyWarning: \\\"<strong>Attenzione </strong> in questa sfida, il computer ti impedirà di trovare la soluzione per caso.\\\"\\r\\n },\\r\\n sl: {\\r\\n version: \\\"Stopnja\\\",\\r\\n levelVersionName_easy: \\\"enostavna stopnja\\\",\\r\\n levelVersionName_medium: \\\"srednja stopnja\\\",\\r\\n levelVersionName_hard: \\\"težka stopnja\\\",\\r\\n levelVersionName_easy_stars: \\\"stopnja 2 zvezdici\\\",\\r\\n levelVersionName_medium_stars: \\\"stopnja 3 zvezdice\\\",\\r\\n levelVersionName_hard_stars: \\\"stopnja 4 zvezdice\\\",\\r\\n levelName_easy: \\\"Enostavno\\\",\\r\\n levelName_medium: \\\"Srednje\\\",\\r\\n levelName_hard: \\\"Težko\\\",\\r\\n warningTimeout: \\\"<p>Opozorilo: Odkar rešuješ to nalogo, je minilo že več kot {0} minut.</p><p>Najbolje, da izbereš drugo nalogo, tako da klikneš gumb v zgornjem desnem kotu.</p>\\\",\\r\\n alright: \\\"V redu\\\",\\r\\n moveOn: \\\"Nadaljuj\\\",\\r\\n solvedMoveOn: \\\"Ta naloga je dokončana, nadaljuj z naslednjo nalogo.\\\",\\r\\n confirmRestart: \\\"Ali res želiš znova začeti to stopnjo?\\\",\\r\\n yes: \\\"Da\\\",\\r\\n no: \\\"Ne\\\",\\r\\n tryHardLevel: \\\"Predlagamo, da poizkusiš stopnjo s 4 zvezdicami.\\\",\\r\\n tryMediumLevel: \\\"Predlagamo, da poizkusiš stopnjo s 3 zvezdicami.\\\",\\r\\n tryNextTask: \\\"Prdlagamo, da poizkusiš naslednjo nalogo. Če bo ostalo dovolj časa, se vrni in poizkusi naslednjo stopnjo te naloge.\\\",\\r\\n yourScoreIsNow: \\\"Tvoj rezultat je:\\\",\\r\\n worseScoreStays: \\\"Rešitev ni tako dobra, kot prejšnja. Tvoj rezultat ostaja:\\\",\\r\\n scoreStays: \\\"Tvoj rezultat ostaja enak:\\\",\\r\\n score: \\\"Rezultat:\\\",\\r\\n noPointsForLevel: \\\"Na tej stopnji nisi dobil(-a) še nobene točke.\\\",\\r\\n outOf: \\\" od \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Poskusi nalogo rešiti še bolje ali se premakni na naslednjo nalogo.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Poskusi nalogo rešiti še bolje ali se premakni na težjo stopnjo.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Čestitamo, to je najboljši možni rezultat te naloge!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Če želiš dobiti še več točk, se premakni na težjo stopnjo te naloge.\\\",\\r\\n youDidBetterBefore: \\\"Rešitev je boljša od prejšnje.\\\",\\r\\n scoreStays2: \\\"Tvoj rezultat ostaja enak.\\\",\\r\\n reloadBestAnswer: \\\"Znova naloži najboljšo rešitev.\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"Preveri\\\",\\r\\n restart: \\\"Začni znova\\\",\\r\\n harderLevelSolved: \\\"Opozorilo: Rešil(-a) si že težjo stopnjo te naloge. S to stopnjo ne boš dobil(-a) dodatnih točk.\\\",\\r\\n showLevelAnyway: \\\"Vseeno mi pokaži stopnjo.\\\",\\r\\n scoreObtained: \\\"Dobljeni rezultat:\\\",\\r\\n hardVersionTakesTime: \\\"Reševanje {0} lahko traja veliko časa. Razmisli o reševanju {1}, da boš hitro dobil(-a) točke.\\\",\\r\\n illKeepThatInMind: \\\"Razmislil(-a) bom.\\\",\\r\\n harderLevelAvailable: \\\"Ne pozabi, da lahko to nalogo rešuješ na težji stopnji kot je ta.\\\",\\r\\n lockedLevel: \\\"Ta stopnja je zaklenjena! Za pikaz moraš najprej rešiti prejšnjo stopnjo!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Oceni ta odgovor\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Shrani ta odgovor\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Tvoj odgovor je bil shranjen. Lahko ga spremeniš ali {0} in začneš znova.\\\",\\r\\n cancelIt: \\\"prekličeš\\\",\\r\\n warningDifferentAnswerSaved: \\\"Opozorilo: Prej je bil shranjen drugačen odgovor.\\\",\\r\\n youMay: \\\"Lahko ga {0}.\\\",\\r\\n reloadIt: \\\"naložiš znova\\\",\\r\\n saveThisNewAnswer: \\\"Shrani ta nov odgovor\\\",\\r\\n\\r\\n gradingInProgress: \\\"Ocenjevanje poteka\\\",\\r\\n scoreIs: \\\"Tvoj rezultat je:\\\",\\r\\n point: \\\"točka\\\",\\r\\n points: \\\"točk\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Ker je tekmovanja konec, tvoj novi odgovor ni bil shranjen in rezultat bo ostal:\\\",\\r\\n scoreWouldBecome: \\\"S to rešitvijo bi bil tvoj rezultat:\\\",\\r\\n reloadValidAnswer: \\\"Znova naloži preverjeno rešitev.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Ker je tekmovanja konec, tvoj novi odgovor ni bil shranjen.\\\",\\r\\n scoreWouldStay: \\\"S to rešitvijo bi tvoj rezultat ostal enak:\\\",\\r\\n answerNotSavedContestOver: \\\"Ker je tekmovanja konec, tvoj novi odgovor ni bil shranjen. Lahko {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"znova naložiš preverjeno rešitev\\\",\\r\\n difficultyWarning: \\\"<strong>Opozorilo:</strong> Reševanje te stopnje lahko traja veliko časa. <br/>Hitreje lahko rešiš stopnje z 2 ali s 3 zvezdicami drugih nalog.\\\",\\r\\n enemyWarning: \\\"<strong>Opozorilo:</strong> Pri tej nalogi ti bo računalnik preprečil naključno rešitev.\\\"\\r\\n },\\r\\n },\\r\\n initLanguage: function() {\\r\\n if (window.stringsLanguage == undefined) {\\r\\n window.stringsLanguage = 'fr';\\r\\n }\\r\\n this.strings = this.languageStrings[window.stringsLanguage];\\r\\n },\\r\\n /***********************************************\\r\\n * Initialization functions called by the task *\\r\\n ***********************************************/\\r\\n load: function(views) {\\r\\n this.initLanguage();\\r\\n var self = this;\\r\\n this.showScore = (typeof views.grader !== 'undefined' && views.grader === true);\\r\\n window.platform.getTaskParams(null, null, function(taskParams) {\\r\\n self.taskParams = taskParams;\\r\\n self.readOnly = (self.taskParams.readonly === true || self.taskParams.readOnly == 'true');\\r\\n self.graderScore = +self.taskParams.noScore;\\r\\n self.savedAnswer = '';\\r\\n\\r\\n $(\\\"#difficultyWarning\\\").html(self.strings.difficultyWarning).addClass(\\\"warningHeader\\\");\\r\\n $(\\\"#enemyWarning\\\").html(self.strings.enemyWarning).addClass(\\\"warningHeader\\\");\\r\\n if(!self.responsive){\\r\\n var addTaskHTML = '<div id=\\\"displayHelperAnswering\\\" class=\\\"contentCentered\\\">';\\r\\n }else{\\r\\n var addTaskHTML = '<div id=\\\"displayHelperAnswering\\\">';\\r\\n }\\r\\n // Place button placements at the end of HTML if they don't already exist\\r\\n if(!self.responsive){\\r\\n var placementNames = ['graderMessage', 'validate', 'cancel', 'saved'];\\r\\n }else{\\r\\n var placementNames = ['graderMessage', 'cancel', 'validate', 'saved'];\\r\\n }\\r\\n for (var iPlacement = 0; iPlacement < placementNames.length; iPlacement++) {\\r\\n var placement = 'displayHelper_' + placementNames[iPlacement];\\r\\n if ($('#' + placement).length === 0) {\\r\\n addTaskHTML += '<div id=\\\"' + placement + '\\\"></div>';\\r\\n }\\r\\n }\\r\\n addTaskHTML += '</div>';\\r\\n if (!document.getElementById('displayHelperAnswering')) {\\r\\n $(self.taskSelector).append(addTaskHTML);\\r\\n }\\r\\n self.loaded = true;\\r\\n self.timeLoaded = new Date().getTime();\\r\\n if (self.popupMessageShown) {\\r\\n $('#displayHelperAnswering').hide();\\r\\n }\\r\\n\\r\\n var taskDelayWarning = function() {\\r\\n if (self.popupMessageShown) {\\r\\n self.taskDelayWarningTimeout = setTimeout(taskDelayWarning, 5000);\\r\\n } else {\\r\\n self.showPopupMessage(self.formatTranslation(self.strings.warningTimeout, [self.timeoutMinutes]), 'blanket', self.strings.alright, null, null, \\\"warning\\\");\\r\\n self.taskDelayWarningTimeout = null;\\r\\n }\\r\\n };\\r\\n if (self.timeoutMinutes > 0) {\\r\\n self.taskDelayWarningTimeout = setTimeout(taskDelayWarning, self.timeoutMinutes * 60 * 1000);\\r\\n }\\r\\n });\\r\\n\\r\\n if(this.responsive){\\r\\n $('#displayHelperAnswering').appendTo($('#zone_3'));\\r\\n $('#zone_3').prepend($('<div id=\\\"resp_switch_1\\\"><i class=\\\"far fa-file-alt\\\"></i><span>ÉNONCÉ</span></div><div id=\\\"resp_switch_2\\\"><i class=\\\"fas fa-pen\\\"></i><span>EXERCICE</span></div>'));\\r\\n $('#zone_3').append($('<div id=\\\"showExercice\\\" class=\\\"selected\\\"><i class=\\\"fas fa-pen\\\"></i><span>EXERCICE</span></div>'));\\r\\n $('#zone_3').append($('<div id=\\\"showSolution\\\"><i class=\\\"fas fa-file-signature\\\"></i><span>SOLUTION</span></div>'));\\r\\n\\r\\n $('#zone_012').append($('<div id=\\\"scroll_arr_up\\\"><i class=\\\"fas fa-chevron-up\\\"></i></div>'));\\r\\n $('#zone_012').append($('<div id=\\\"scroll_arr_down\\\"><i class=\\\"fas fa-chevron-down\\\"></i></div>'));\\r\\n $('#zone_012').append($('<div id=\\\"scroll_arr_left\\\"><i class=\\\"fas fa-chevron-left\\\"></i></div>'));\\r\\n $('#zone_012').append($('<div id=\\\"scroll_arr_right\\\"><i class=\\\"fas fa-chevron-right\\\"></i></div>'));\\r\\n\\r\\n if(!views.solution || this.hideSolutionButton){\\r\\n $('#showExercice, #showSolution').hide();\\r\\n $('#zone_3').addClass('noSolution');\\r\\n }\\r\\n\\r\\n $('#showExercice').click(function(ev) {\\r\\n if($(this).hasClass('selected')){\\r\\n return\\r\\n }\\r\\n displayHelper.showSolution(false);\\r\\n });\\r\\n \\r\\n $('#showSolution').click(function(ev) {\\r\\n if($(this).hasClass('selected')){\\r\\n displayHelper.showSolution(false);\\r\\n }else{\\r\\n displayHelper.showSolution(true);\\r\\n }\\r\\n });\\r\\n\\r\\n /* switch task in mobile mode */\\r\\n $('#resp_switch_1, #resp_switch_2').on('click', function(event) {\\r\\n if(!displayHelper.responsive || !displayHelper.mobileMode){\\r\\n return\\r\\n }\\r\\n var id = $(this).attr('id');\\r\\n if(id == 'resp_switch_1' && displayHelper.toggle_task){\\r\\n displayHelper.toggle_task = false;\\r\\n }else if(id == 'resp_switch_2' && !displayHelper.toggle_task){\\r\\n displayHelper.toggle_task = true;\\r\\n }\\r\\n displayHelper.toggleTask();\\r\\n });\\r\\n\\r\\n $(window).scroll(displayHelper.updateScrollArrows);\\r\\n $('#zone_12').scroll(displayHelper.updateScrollArrows);\\r\\n $(window).on({\\r\\n // 'touchmove': displayHelper.updateScrollArrows\\r\\n // function(e) {\\r\\n // console.log(e.target)\\r\\n // }\\r\\n });\\r\\n\\r\\n /* scroll with arrows */\\r\\n $('[id^=scroll_arr_]').click(function(ev) {\\r\\n var animTime = 200;\\r\\n var step = 500;\\r\\n var id = $(this).attr('id');\\r\\n // console.log(id)\\r\\n switch(id){\\r\\n case 'scroll_arr_down':\\r\\n var scrollObj = { scrollTop: $(window).scrollTop() + step};\\r\\n break;\\r\\n case 'scroll_arr_up':\\r\\n var scrollObj = { scrollTop: $(window).scrollTop() - step};\\r\\n break;\\r\\n case 'scroll_arr_left':\\r\\n var scrollObj = { scrollLeft: $(window).scrollLeft() - step};\\r\\n break;\\r\\n case 'scroll_arr_right':\\r\\n var scrollObj = { scrollLeft: $(window).scrollLeft() + step};\\r\\n\\r\\n }\\r\\n $('html, body, #zone_12').animate( scrollObj, animTime );\\r\\n });\\r\\n\\r\\n if($('.consigne #example').length == 0){\\r\\n $('.consigne').addClass('no_example');\\r\\n }\\r\\n }else{\\r\\n $('#zone_0 > *').prependTo($('#task'));\\r\\n $('#task #tabsContainer').after($('<div id=\\\"taskContent\\\"></div>'));\\r\\n $('#zone_1, #zone_2').appendTo($('#taskContent'));\\r\\n $('#taskCont > *').prependTo($('#zone_2'));\\r\\n $('#zone_012, #zone_12, #zone_3, #taskCont').remove();\\r\\n } \\r\\n // $('#tabsContainer').after('<div id=\\\"popupMessage\\\"></div>');\\r\\n $('#task').append('<div id=\\\"popupMessage\\\"></div>');\\r\\n\\r\\n // console.log(views)\\r\\n },\\r\\n unload: function() {\\r\\n if (this.taskDelayWarningTimeout) {\\r\\n this.taskDelayWarningTimeout = clearTimeout(this.taskDelayWarningTimeout);\\r\\n }\\r\\n clearInterval(this.checkAnswerInterval);\\r\\n this.checkAnswerInterval = null;\\r\\n this.loaded = false;\\r\\n this.prevAnswer = '';\\r\\n this.readOnly = false;\\r\\n this.savedAnswer = '';\\r\\n this.submittedAnswer = '';\\r\\n this.submittedScore = 0;\\r\\n this.hasAnswerChanged = true;\\r\\n this.hideValidateButton = false;\\r\\n this.hideRestartButton = false;\\r\\n this.showScore = false;\\r\\n this.refreshMessages = true;\\r\\n this.stoppedShowingResult = false;\\r\\n this.previousMessages = {};\\r\\n this.popupMessageShown = false;\\r\\n this.hasLevels = false;\\r\\n this.pointsAsStars = true; // TODO: false as default\\r\\n this.unlockedLevels = 4;\\r\\n this.neverHadHard = false;\\r\\n this.showMultiversionNotice = false;\\r\\n this.taskLevel = '';\\r\\n this.initLevelVars();\\r\\n return true;\\r\\n },\\r\\n\\r\\n showSolution: function(show) {\\r\\n if(show){\\r\\n $('#solution').show();\\r\\n $('#showSolution').addClass('selected');\\r\\n $('#showExercice').removeClass('selected');\\r\\n }else{\\r\\n $('#solution').hide();\\r\\n $('#showSolution').removeClass('selected');\\r\\n $('#showExercice').addClass('selected');\\r\\n }\\r\\n },\\r\\n\\r\\n initLevelVars: function() {\\r\\n var defaultLevelsRanks = { basic: 1, easy: 2, medium: 3, hard: 4 };\\r\\n this.taskLevel = '';\\r\\n this.levelsRanks = {};\\r\\n this.levelsScores = {};\\r\\n this.prevLevelsScores = {};\\r\\n for(var i=0; i < this.levels.length; i++) {\\r\\n var levelName = this.levels[i];\\r\\n if(typeof this.levelsRanks[levelName] == 'undefined') {\\r\\n if(i == this.levels.length - 1) {\\r\\n // The highest level always gets the max stars\\r\\n this.levelsRanks[levelName] = this.maxStars;\\r\\n } else {\\r\\n this.levelsRanks[levelName] = defaultLevelsRanks[levelName];\\r\\n }\\r\\n }\\r\\n this.levelsScores[levelName] = 0;\\r\\n this.prevLevelsScores[levelName] = 0;\\r\\n }\\r\\n },\\r\\n\\r\\n setupLevels: function(initLevel, reloadWithCallbacks, levels) {\\r\\n this.reloadWithCallbacks = reloadWithCallbacks;\\r\\n this.initLanguage();\\r\\n if(levels) {\\r\\n this.levels = levels;\\r\\n this.levelsIdx = {};\\r\\n for(var i = 0; i < this.levels.length; i++) {\\r\\n this.levelsIdx[this.levels[i]] = i;\\r\\n }\\r\\n }\\r\\n this.initLevelVars();\\r\\n\\r\\n var self = this;\\r\\n function callSetupLevels() {\\r\\n if(!initLevel) {\\r\\n initLevel = self.taskParams.options.difficulty ? self.taskParams.options.difficulty : \\\"easy\\\";\\r\\n }\\r\\n self.doSetupLevels(initLevel);\\r\\n };\\r\\n if (!this.taskParams) {\\r\\n window.platform.getTaskParams(null, null, function(taskParams) {\\r\\n self.taskParams = taskParams;\\r\\n callSetupLevels();\\r\\n });\\r\\n } else {\\r\\n callSetupLevels();\\r\\n }\\r\\n },\\r\\n doSetupLevels: function(initLevel) {\\r\\n // TODO To fix: levelWrapper-1 does not work correctly without this part,\\r\\n // so the level is loaded twice initially (once here, and once below).\\r\\n if(!this.reloadWithCallbacks) {\\r\\n task.reloadStateObject(task.getDefaultStateObject(), true);\\r\\n task.reloadAnswerObject(task.getDefaultAnswerObject());\\r\\n }\\r\\n\\r\\n this.setupParams();\\r\\n if (!document.getElementById('popupMessage')) {\\r\\n this.setupLevelsTabs();\\r\\n\\r\\n if(!this.responsive){\\r\\n $('#tabsMenu .li').on('click', function(event) {\\r\\n event.preventDefault();\\r\\n var newLevel = $(this).children().attr('href').split('#')[1];\\r\\n displayHelper.setLevel(newLevel);\\r\\n });\\r\\n }else{\\r\\n $('#tabsMenu .li').on('click', function(event) {\\r\\n // console.log(\\\"click compact\\\",displayHelper.compactMode)\\r\\n if(displayHelper.layout == 3 && displayHelper.compactMode){\\r\\n return\\r\\n }\\r\\n if(displayHelper.responsive && displayHelper.layout == 4){\\r\\n $('.layout_4 #tabsMenuAlt').show();\\r\\n return\\r\\n }\\r\\n event.preventDefault();\\r\\n var newLevel = $(this).children().attr('href').split('#')[1];\\r\\n displayHelper.setLevel(newLevel);\\r\\n if(displayHelper.layout == 3 && !displayHelper.compactMode){\\r\\n displayHelper.toggle_task = false; // change level => display new instructions\\r\\n displayHelper.toggleTask();\\r\\n }\\r\\n });\\r\\n /* version arrows in mobile mode */\\r\\n $('#tabsMenu .resp_version_arr').on('click', function(event) {\\r\\n if(!displayHelper.responsive || !displayHelper.mobileMode){\\r\\n return\\r\\n }\\r\\n event.preventDefault();\\r\\n var newLevel = $(this).attr('href').split('#')[1];\\r\\n displayHelper.setLevel(newLevel);\\r\\n displayHelper.toggle_task = false; // change level => display new instructions\\r\\n displayHelper.toggleTask();\\r\\n });\\r\\n /* click version in resp layout4 */\\r\\n $('#tabsMenuAlt [id^=stars_menu_]').click(function() {\\r\\n var newLevel = $(this).attr('id').split('stars_menu_')[1];\\r\\n $('.layout_4 #tabsMenuAlt').hide();\\r\\n displayHelper.setLevel(newLevel);\\r\\n displayHelper.toggle_task = false; // change level => display new instructions\\r\\n displayHelper.toggleTask();\\r\\n });\\r\\n }\\r\\n }\\r\\n\\r\\n this.setLevel(initLevel);\\r\\n\\r\\n if (this.unlockedLevels > 1 && this.showMultiversionNotice) {\\r\\n this.showPopupMessage(this.strings.harderLevelAvailable, 'blanket', this.strings.alright,\\r\\n function() {\\r\\n this.showMultiversionNotice = false;\\r\\n }\\r\\n );\\r\\n }\\r\\n },\\r\\n setupParams: function() {\\r\\n var taskParams = this.taskParams;\\r\\n\\r\\n this.hasLevels = true;\\r\\n var paramNames = ['pointsAsStars', 'unlockedLevels', 'neverHadHard', 'showMultiversionNotice'];\\r\\n for (var iParam = 0; iParam < paramNames.length; iParam++) {\\r\\n var param = paramNames[iParam];\\r\\n if (taskParams[param] !== undefined) {\\r\\n this[param] = taskParams[param];\\r\\n }\\r\\n }\\r\\n\\r\\n var maxScore = taskParams.maxScore !== undefined ? taskParams.maxScore : 40;\\r\\n this.levelsMaxScores = {};\\r\\n for(var i=0; i < this.levels.length; i++) {\\r\\n var levelName = this.levels[i];\\r\\n var levelMaxScore = maxScore * this.levelsRanks[levelName] / this.maxStars;\\r\\n this.levelsMaxScores[levelName] = this.pointsAsStars ? levelMaxScore : Math.round(levelMaxScore);\\r\\n }\\r\\n },\\r\\n setupLevelsTabs: function() {\\r\\n var scoreHTML;\\r\\n var maxScores = this.levelsMaxScores;\\r\\n if (this.pointsAsStars) {\\r\\n var titleStarContainers = [];\\r\\n scoreHTML = '<span></span><span id=\\\"titleStars\\\"></span>';\\r\\n $('#task h1').append(scoreHTML);\\r\\n drawStars('titleStars', this.maxStars, 24, 0, 'normal');\\r\\n } else {\\r\\n // Disabled: doesn't work with new tabs layout.\\r\\n //scoreHTML = '<div class=\\\"bestScore\\\">Score retenu : <span id=\\\"bestScore\\\">0</span> sur ' + maxScores.hard + '</div>';\\r\\n //$('#tabsContainer').append(scoreHTML);\\r\\n }\\r\\n\\r\\n var tabsStarContainers = [];\\r\\n var curLevel;\\r\\n // We only render the tabs if there is more than one level ; but we\\r\\n // keep tabsMenu as some interfaces depend on that\\r\\n var tabsInnerHTML = '';\\r\\n var nbLevels = 0;\\r\\n var levelNames = [];\\r\\n for(var iLevel = 0; iLevel < this.levels.length; iLevel++) {\\r\\n var curLevel = this.levels[iLevel];\\r\\n nbLevels++;\\r\\n levelNames.push(curLevel);\\r\\n tabsInnerHTML += '<span class=\\\"li ';\\r\\n if(iLevel == 0){\\r\\n tabsInnerHTML += 'first';\\r\\n }else if(iLevel == this.levels.length - 1){\\r\\n tabsInnerHTML += 'last';\\r\\n }\\r\\n tabsInnerHTML += '\\\" id=\\\"tab_' + curLevel + '\\\"><a href=\\\"#' + curLevel + '\\\">';\\r\\n if (this.pointsAsStars) {\\r\\n tabsInnerHTML += '<span class=\\\"levelLabel\\\">' + this.strings.version.toUpperCase() + '</span><span id=\\\"stars_' + this.levelsRanks[curLevel] + '\\\"></span>';\\r\\n } else {\\r\\n tabsInnerHTML += this.strings[\\\"levelName_\\\" + curLevel] + ' — ' +\\r\\n '<span id=\\\"tabScore_' + curLevel + '\\\">0</span> / ' + maxScores[curLevel];\\r\\n }\\r\\n tabsInnerHTML += '</a></span>';\\r\\n }\\r\\n if(nbLevels < 2) { \\r\\n tabsInnerHTML = ''; \\r\\n this.versionHeaderH = this.altVersionHeaderH;\\r\\n }\\r\\n var tabsHTML = '<div id=\\\"tabsMenu\\\">' + tabsInnerHTML + '</div>';\\r\\n $('#tabsContainer').append(tabsHTML);\\r\\n\\r\\n var self = this;\\r\\n setTimeout(function() {\\r\\n for (var iLevel = 0; iLevel < self.levels.length; iLevel++) {\\r\\n curLevel = self.levels[iLevel];\\r\\n if (iLevel >= self.unlockedLevels) {\\r\\n $('#tab_' + curLevel).addClass('lockedLevel');\\r\\n }\\r\\n self.updateStarsAtLevel(curLevel);\\r\\n }\\r\\n self.updateLayout();\\r\\n }, 100);\\r\\n\\r\\n \\r\\n if(this.responsive){\\r\\n var tabsMenuAlt = '<div id=\\\"tabsMenuAlt\\\"><span>'+this.strings.version+' :</span>';\\r\\n for (var iLevel = 0; iLevel < levelNames.length; iLevel++) { // responsive tabs\\r\\n var curLevel = levelNames[iLevel];\\r\\n var tabHTML = '<div class=\\\"resp_tabs\\\">';\\r\\n if (this.pointsAsStars) {\\r\\n tabHTML += '<span class=\\\"levelVersionCont\\\">';\\r\\n tabHTML += '<span class=\\\"levelLabel\\\">' + this.strings.version.toUpperCase() + '</span><span id=\\\"stars_resp_' + this.levelsRanks[curLevel] + '\\\"></span>';\\r\\n tabHTML += '<div id=\\\"stars_resp_alt_' + this.levelsRanks[curLevel] + '\\\"></div>';\\r\\n tabHTML += '</span>';\\r\\n // tabsMenuAlt += '<div id=\\\"stars_menu_' + this.levelsRanks[curLevel] + '\\\"></div>';\\r\\n tabsMenuAlt += '<div id=\\\"stars_menu_' + curLevel + '\\\"></div>';\\r\\n } else {\\r\\n tabHTML += this.strings[\\\"levelName_\\\" + curLevel] + ' — ' +\\r\\n '<span id=\\\"tabScore_' + curLevel + '\\\">0</span> / ' + maxScores[curLevel];\\r\\n }\\r\\n tabHTML += '</div>';\\r\\n $('#tab_'+curLevel).append(tabHTML);\\r\\n if(iLevel > 0){\\r\\n $('#tab_'+curLevel+' .resp_tabs').prepend($('<a href=\\\"#' + levelNames[iLevel - 1]+'\\\" class=\\\"resp_version_arr resp_left_arr\\\"><i class=\\\"fas fa-chevron-left\\\"></i></a>'));\\r\\n }\\r\\n if(iLevel < levelNames.length - 1){\\r\\n $('#tab_'+curLevel+' .resp_tabs').append($('<a href=\\\"#' + levelNames[iLevel + 1]+'\\\" class=\\\"resp_version_arr resp_right_arr\\\"><i class=\\\"fas fa-chevron-right\\\"></i></a>'));\\r\\n }\\r\\n }\\r\\n tabsMenuAlt += '</div>';\\r\\n $(\\\"#tabsContainer\\\").prepend(tabsMenuAlt);\\r\\n\\r\\n this.toggleTask();\\r\\n }\\r\\n },\\r\\n toggleTask: function() {\\r\\n if(!this.responsive || !this.mobileMode){\\r\\n $('#zone_1').show();\\r\\n $('#zone_2').show();\\r\\n return\\r\\n }\\r\\n if(!this.toggle_task){\\r\\n $('#resp_switch_1').addClass('selected');\\r\\n $('#resp_switch_2').removeClass('selected');\\r\\n $('#zone_1').css(\\\"overflow\\\",\\\"visible\\\");\\r\\n $('#zone_1').css(\\\"height\\\",this.availableH+'px');\\r\\n $('#zone_2').css(\\\"overflow\\\",\\\"hidden\\\");\\r\\n $('#zone_2').css(\\\"min-height\\\",0);\\r\\n $('#zone_2').css(\\\"height\\\",0);\\r\\n $('#zone_3').addClass('hideButtons');\\r\\n this.centerInstructions();\\r\\n }else{\\r\\n $('#resp_switch_2').addClass('selected');\\r\\n $('#resp_switch_1').removeClass('selected');\\r\\n $('#zone_2').css(\\\"overflow\\\",\\\"visible\\\");\\r\\n $('#zone_2').css(\\\"height\\\",\\\"auto\\\");\\r\\n $('#zone_2').css(\\\"min-height\\\",this.availableH+'px');\\r\\n $('#zone_1').css(\\\"overflow\\\",\\\"hidden\\\");\\r\\n $('#zone_1').css(\\\"height\\\",0);\\r\\n $('#zone_3').removeClass('hideButtons');\\r\\n }\\r\\n this.updateScrollArrows();\\r\\n },\\r\\n\\r\\n updateStarsAtLevel: function(level) {\\r\\n var rate = this.levelsScores[level] / this.levelsMaxScores[level];\\r\\n var iLevel = this.levelsIdx[level];\\r\\n var starsIdx = this.levelsRanks[level];\\r\\n var mode = 'normal';\\r\\n if (iLevel >= this.unlockedLevels) {\\r\\n mode = 'locked';\\r\\n }\\r\\n if (this.graderScore > this.levelsMaxScores[level]) {\\r\\n mode = 'useless';\\r\\n }\\r\\n drawStars('stars_' + starsIdx, starsIdx, 14, rate, mode);\\r\\n if(this.responsive){\\r\\n drawStars('stars_resp_' + starsIdx, starsIdx, 14, rate, mode);\\r\\n drawStars('stars_resp_alt_' + starsIdx, starsIdx, 18, rate, mode,true);\\r\\n drawStars('stars_menu_' + level, starsIdx, 18, rate, mode,true);\\r\\n }\\r\\n },\\r\\n\\r\\n updateLayout: function() {\\r\\n if(this.updateLayoutCallbackStart){\\r\\n this.updateLayoutCallbackStart();\\r\\n }\\r\\n if (!this.bUseFullWidth) {\\r\\n return\\r\\n }\\r\\n var layout1Breakpoint = 1200;\\r\\n if(!this.responsive){\\r\\n $('#valider').appendTo($('#displayHelper_validate'));\\r\\n if(window.innerWidth >= 1200) {\\r\\n $('#task').addClass('largeScreen');\\r\\n $('#displayHelperAnswering').appendTo($('#zone_1'));\\r\\n }\\r\\n else {\\r\\n $('#task').removeClass('largeScreen');\\r\\n if ($('#showSolutionButton')) {\\r\\n $('#displayHelperAnswering').insertBefore($('#showSolutionButton'));\\r\\n }\\r\\n else {\\r\\n $('#displayHelperAnswering').appendTo($('#task'));\\r\\n }\\r\\n }\\r\\n }else{\\r\\n var w = Math.floor(window.innerWidth - this.getScrollbarWidth());\\r\\n var h = Math.floor(window.innerHeight);\\r\\n\\r\\n var headerH = $('#main_header').length ? this.headerH : 0;\\r\\n\\r\\n $('#task, #main_header').removeClass();\\r\\n $('#task').css(\\\"height\\\",(h - headerH)+'px');\\r\\n $('#task').css(\\\"margin-top\\\",headerH+'px');\\r\\n $('#task').css(\\\"overflow\\\", \\\"auto\\\");\\r\\n $('#zone_1').css(\\\"overflow\\\",\\\"visible\\\");\\r\\n $('#zone_2').css(\\\"overflow\\\",\\\"visible\\\");\\r\\n $('#zone_0').css(\\\"max-height\\\", this.versionHeaderH[this.layout - 1]);\\r\\n if(!$('#zone_0 #tabsContainer').length){\\r\\n $('#zone_0 h1').after($('#tabsContainer'));\\r\\n }\\r\\n if(w >= layout1Breakpoint) {\\r\\n this.mobileMode = false;\\r\\n this.layout = 1;\\r\\n this.availableH = h - headerH - this.versionHeaderH[this.layout - 1] - this.footerH;\\r\\n this.availableW = Math.floor(w*0.7);\\r\\n $('#zone_1').height(this.availableH);\\r\\n $('#zone_12').css(\\\"overflow-x\\\",\\\"initial\\\");\\r\\n if(this.sideZoneEnabled){\\r\\n $('#side_zone').addClass('show');\\r\\n }\\r\\n }else if(w >= 800){\\r\\n this.mobileMode = false;\\r\\n this.layout = 2;\\r\\n this.availableW = w;\\r\\n $('#zone_1').height('auto');\\r\\n }else if(w/h < 1){\\r\\n this.mobileMode = true;\\r\\n this.layout = 3;\\r\\n this.availableH = h - headerH - this.versionHeaderH[this.layout - 1] - this.footerH;\\r\\n this.availableW = w;\\r\\n $('#zone_1').height('auto');\\r\\n if(w <= 650){\\r\\n $(\\\"#zone_3\\\").addClass(\\\"compact\\\");\\r\\n $(\\\"#tabsMenu\\\").addClass(\\\"compact\\\");\\r\\n this.compactMode = true;\\r\\n }else{\\r\\n $(\\\"#zone_3\\\").removeClass(\\\"compact\\\");\\r\\n $(\\\"#tabsMenu\\\").removeClass(\\\"compact\\\");\\r\\n this.compactMode = false;\\r\\n }\\r\\n }else{\\r\\n this.mobileMode = true;\\r\\n this.layout = 4;\\r\\n this.availableH = h - headerH - this.versionHeaderH[this.layout - 1];\\r\\n this.availableW = w - 50;\\r\\n if(!$('#zone_3 #tabsContainer').length){\\r\\n $('#tabsContainer').prependTo($('#zone_3'));\\r\\n }\\r\\n }\\r\\n if(w < layout1Breakpoint && this.sideZoneEnabled){\\r\\n $('#side_zone').removeClass('show');\\r\\n }\\r\\n if (this.layout !== 1) {\\r\\n $('#zone_12').css(\\\"overflow-x\\\", \\\"auto\\\");\\r\\n if (displayHelper.verticalScroll && $(window).scrollTop() < displayHelper.newTaskH - displayHelper.availableH - 1) {\\r\\n $('#zone_12').css(\\\"overflow-y\\\", \\\"auto\\\");\\r\\n } else {\\r\\n $('#zone_12').css(\\\"overflow-y\\\", \\\"hidden\\\");\\r\\n }\\r\\n }\\r\\n $('#task, #main_header').addClass('layout_'+this.layout);\\r\\n if(this.layout == 2){ // bug fix\\r\\n var zone1H = $('#zone_1').height();\\r\\n this.availableH = h - headerH - this.versionHeaderH[this.layout - 1] - this.footerH - zone1H;\\r\\n }\\r\\n\\r\\n this.updateTaskDimensions();\\r\\n this.toggleTask();\\r\\n }\\r\\n setTimeout(function() {\\r\\n $('html').hide(0).show(0);\\r\\n }, 100);\\r\\n setTimeout(function() {\\r\\n $('html').hide(0).show(0);\\r\\n }, 200);\\r\\n setTimeout(function() {\\r\\n $('html').hide(0).show(0);\\r\\n }, 500);\\r\\n // $(\\\"html\\\").css(\\\"overflow-y\\\",\\\"auto\\\");\\r\\n if(this.scaleFactor != this.prevScaleFactor){\\r\\n this.prevScaleFactor = this.scaleFactor;\\r\\n // this.updateTaskDimensions();\\r\\n // task.displayedSubTask.resetDisplay();\\r\\n // console.log(task)\\r\\n }\\r\\n },\\r\\n\\r\\n getScrollbarWidth: function () {\\r\\n // Creating invisible container\\r\\n var outer = document.createElement('div');\\r\\n outer.style.width = '200px';\\r\\n outer.style.visibility = 'hidden';\\r\\n outer.style.overflow = 'scroll'; // forcing scrollbar to appear\\r\\n outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps\\r\\n document.body.appendChild(outer);\\r\\n\\r\\n // Creating inner element and placing it in the container\\r\\n var inner = document.createElement('div');\\r\\n outer.appendChild(inner);\\r\\n\\r\\n // Calculating difference between container's full width and the child width\\r\\n var scrollbarWidth = (outer.offsetWidth - inner.offsetWidth);\\r\\n\\r\\n // Removing temporary elements from the DOM\\r\\n outer.parentNode.removeChild(outer);\\r\\n\\r\\n return scrollbarWidth;\\r\\n },\\r\\n\\r\\n updateTaskDimensions: function() {\\r\\n $('#zone_2').css('min-height',this.availableH);\\r\\n var availableRatio = this.availableW/this.availableH;\\r\\n var taskRatio = this.taskW/this.taskH;\\r\\n if(availableRatio > taskRatio){\\r\\n /* H limiting factor */\\r\\n var limitingFactor = \\\"H\\\";\\r\\n var availableLength = this.availableH;\\r\\n var taskLength = this.taskH;\\r\\n }else{\\r\\n /* W limiting factor */\\r\\n var limitingFactor = \\\"W\\\";\\r\\n var availableLength = this.availableW;\\r\\n var taskLength = this.taskW;\\r\\n }\\r\\n\\r\\n this.scaleFactor = availableLength/taskLength;\\r\\n\\r\\n if(limitingFactor == \\\"W\\\"){\\r\\n this.newTaskW = Math.max(Math.min(this.taskW,this.availableW),this.taskW*this.scaleFactor);\\r\\n }else{\\r\\n this.newTaskW = this.taskW*this.scaleFactor;\\r\\n }\\r\\n if(this.newTaskW < this.minTaskW){\\r\\n this.newTaskW = this.minTaskW;\\r\\n }\\r\\n if(this.newTaskW > this.maxTaskW){\\r\\n this.newTaskW = this.maxTaskW;\\r\\n }\\r\\n this.scaleFactor = this.newTaskW/this.taskW;\\r\\n this.newTaskH = this.taskH*this.scaleFactor;\\r\\n this.updateTaskCSS(this.scaleFactor,limitingFactor);\\r\\n\\r\\n if(Math.floor(this.newTaskH) > Math.ceil(this.availableH)){\\r\\n $('#zone_3').addClass('vertical_scroll');\\r\\n this.verticalScroll = true;\\r\\n // console.log(limitingFactor);\\r\\n if(this.layout != 1 && limitingFactor == 'H' && this.newTaskW < this.maxTaskW){\\r\\n this.newTaskW = Math.min(this.availableW,this.maxTaskW);\\r\\n this.scaleFactor = this.newTaskW/this.taskW;\\r\\n this.newTaskH = this.taskH*this.scaleFactor;\\r\\n this.updateTaskCSS(this.scaleFactor,limitingFactor);\\r\\n }\\r\\n }else{\\r\\n $('#zone_3').removeClass('vertical_scroll');\\r\\n this.verticalScroll = false;\\r\\n }\\r\\n if(Math.floor(this.newTaskW) > Math.ceil(this.availableW)){\\r\\n this.horizontalScroll = true;\\r\\n }else{\\r\\n $('#zone_3').removeClass('vertical_scroll');\\r\\n this.horizontalScroll = false;\\r\\n }\\r\\n this.updateScrollArrows();\\r\\n this.centerInstructions();\\r\\n // console.log('vertical_scroll :', this.verticalScroll,this.availableH)\\r\\n },\\r\\n\\r\\n centerInstructions: function() {\\r\\n if(this.layout != 2){\\r\\n $('#zone_1 > .consigne #text').css('max-width','');\\r\\n if(this.sideZoneEnabled && this.layout == 1){\\r\\n $('#zone_1').css({\\r\\n display: 'flex',\\r\\n 'flex-direction': 'column',\\r\\n 'justify-content': 'space-around'\\r\\n\\r\\n });\\r\\n return\\r\\n }\\r\\n\\r\\n var zone1H = $('#zone_1').height();\\r\\n var consigneH = $('#zone_1 > .consigne').height();\\r\\n if(zone1H > consigneH){\\r\\n $('#zone_1 > .consigne').css('margin-top',(zone1H - consigneH)/2);\\r\\n }else{\\r\\n $('#zone_1 > .consigne').css('margin-top','20px');\\r\\n }\\r\\n }else{\\r\\n $('#zone_1 > .consigne').css('margin-top','20px');\\r\\n if($(\\\"#zone_1 .consigne #example\\\").length > 0){ // fix example bug in layout 2\\r\\n var exW = $(\\\"#zone_1 .consigne #example\\\").outerWidth();\\r\\n var w = window.innerWidth;\\r\\n $('#zone_1 .consigne #text').css('max-width',(w - 80 - exW)+'px');\\r\\n }\\r\\n }\\r\\n if(this.layout == 1){ // so that instructions and task are displayed with 3 equal margins\\r\\n var taskMarginR = $(\\\"#taskCont\\\").css(\\\"marginRight\\\");\\r\\n taskMarginR = taskMarginR.replace(\\\"px\\\",\\\"\\\");\\r\\n taskMarginR = Math.round(taskMarginR) + $(\\\"#taskCont\\\").position().left;\\r\\n $('#zone_1 > .consigne').css('margin-right','0px');\\r\\n $('#zone_1 > .consigne').css('margin-left',Math.max(20,taskMarginR)+'px');\\r\\n }else{\\r\\n $('#zone_1 > .consigne').css('margin-right','');\\r\\n $('#zone_1 > .consigne').css('margin-left','');\\r\\n }\\r\\n },\\r\\n\\r\\n updateTaskCSS: function(scaleFactor,limitingFactor) {\\r\\n $('#taskCont').width(this.taskW);\\r\\n // $('#taskCont').height(newTaskH);\\r\\n var fixingOffset = 0; // unnecessary?\\r\\n $('#taskCont').css('transform','scale('+scaleFactor+')');\\r\\n if(scaleFactor >= 1){\\r\\n if(this.availableH > this.taskH){\\r\\n $('#taskCont').css('margin-top',(this.availableH - this.taskH)/2 - fixingOffset);\\r\\n }else{\\r\\n if(this.verticalScroll){\\r\\n $('#taskCont').css('margin-top',(this.newTaskH - this.taskH)/2 - fixingOffset);\\r\\n }else{\\r\\n $('#taskCont').css('margin-top',0);\\r\\n }\\r\\n }\\r\\n if(limitingFactor == 'W'){\\r\\n $('#taskCont').css('margin-left','auto');\\r\\n }else{\\r\\n if(this.verticalScroll){\\r\\n $('#taskCont').css('margin-left','auto');\\r\\n }else{\\r\\n // $('#taskCont').css('margin-left',(this.availableW - this.taskW)*scaleFactor/2);\\r\\n $('#taskCont').css('margin-left','auto'); // cf. alkindi 2017 01\\r\\n }\\r\\n }\\r\\n }else{\\r\\n // console.log('scale < 1')\\r\\n if(this.availableH > this.taskH){\\r\\n $('#taskCont').css('margin-top',(this.availableH - this.taskH/**scaleFactor*/)/2);\\r\\n }else{\\r\\n if(limitingFactor == 'W'){\\r\\n // console.log('cas qui nous occupe',this.taskH < this.availableH);\\r\\n if(this.taskH < this.availableH){\\r\\n $('#taskCont').css('margin-top',0);\\r\\n }else{\\r\\n // console.log('cas qui nous occupe');\\r\\n $('#taskCont').css('margin-top',-this.newTaskH*(1 - scaleFactor)/2 - fixingOffset);\\r\\n }\\r\\n }else{\\r\\n $('#taskCont').css('margin-top',-this.taskH*(1 - scaleFactor)/2 - fixingOffset);\\r\\n }\\r\\n }\\r\\n // if(this.availableW < this.taskW){\\r\\n if(this.availableW < this.taskW){\\r\\n // console.log(\\\"check\\\",limitingFactor)*scaleFactor\\r\\n if(limitingFactor == \\\"W\\\"){\\r\\n $('#taskCont').css('margin-left',-this.taskW*(1 - scaleFactor)/2 );\\r\\n }else{\\r\\n var marginLeft = (this.availableW - this.taskW)/2;\\r\\n $('#taskCont').css('margin-left',marginLeft);\\r\\n }\\r\\n }else{\\r\\n $('#taskCont').css('margin-left','auto');\\r\\n }\\r\\n }\\r\\n $('#zone_2').height(Math.max(this.availableH,this.verticalScroll ? this.newTaskH + 60 : this.newTaskH));\\r\\n $('#zone_2').width(Math.max(this.availableW,this.newTaskW));\\r\\n if(this.layout != 1){\\r\\n $('#zone_0').width('100%');\\r\\n $('#zone_1').width(Math.max(this.availableW,this.newTaskW));\\r\\n }else{\\r\\n $('#zone_0').width('100%');\\r\\n if(this.newTaskW < this.availableW){\\r\\n var w = Math.floor(window.innerWidth - this.getScrollbarWidth());\\r\\n var zone2Perc = 100*this.newTaskW/w;\\r\\n var zone1Perc = 100 - zone2Perc;\\r\\n if(zone2Perc < 60){\\r\\n zone2Perc = 60;\\r\\n zone1Perc = 40;\\r\\n }\\r\\n $('#taskCont').css('margin-left','auto');\\r\\n }else{\\r\\n var zone2Perc = 70;\\r\\n var zone1Perc = 30;\\r\\n }\\r\\n $('#zone_1').width(zone1Perc+'%');\\r\\n $('#zone_2').width(zone2Perc+'%');\\r\\n }\\r\\n if(this.layout == 4 && this.availableW < this.newTaskW){\\r\\n $('#zone_2').width(this.newTaskW + 50);\\r\\n $('#zone_1').css('padding-right',50);\\r\\n }else{\\r\\n $('#zone_1').css('padding-right',0);\\r\\n }\\r\\n },\\r\\n\\r\\n updateScrollArrows: function() {\\r\\n // console.log('updateScrollArrows')\\r\\n // console.log($('body').scrollLeft())\\r\\n var layout = displayHelper.layout;\\r\\n var topThreshold = displayHelper.versionHeaderH[layout - 1];\\r\\n if(layout == 2){\\r\\n topThreshold += $('#zone_1').height();\\r\\n }\\r\\n if(layout >= 3 && $('#resp_switch_1').hasClass('selected')){\\r\\n $('[id^=scroll_arr_]').hide();\\r\\n return\\r\\n }\\r\\n if(displayHelper.verticalScroll && $(window).scrollTop() > 0){\\r\\n $('#scroll_arr_up').show();\\r\\n }else{\\r\\n $('#scroll_arr_up').hide();\\r\\n }\\r\\n // console.log($(window).scrollTop(), displayHelper.newTaskH - displayHelper.availableH)\\r\\n if(displayHelper.verticalScroll && $(window).scrollTop() < displayHelper.newTaskH - displayHelper.availableH - 1){\\r\\n $('#scroll_arr_down').show();\\r\\n }else{\\r\\n $('#scroll_arr_down').hide();\\r\\n }\\r\\n // console.log(displayHelper.horizontalScroll,$('#zone_12').scrollLeft())\\r\\n if(displayHelper.horizontalScroll && $('#zone_12').scrollLeft() > 0){\\r\\n $('#scroll_arr_left').show();\\r\\n }else{\\r\\n $('#scroll_arr_left').hide();\\r\\n }\\r\\n if(displayHelper.horizontalScroll && $('#zone_12').scrollLeft() < displayHelper.newTaskW - displayHelper.availableW){\\r\\n $('#scroll_arr_right').show();\\r\\n }else{\\r\\n $('#scroll_arr_right').hide();\\r\\n }\\r\\n },\\r\\n\\r\\n useFullWidth: function() {\\r\\n // TODO: find a clean way to do this\\r\\n try {\\r\\n $('#question-iframe', window.parent.document).css('width', '100%');\\r\\n } catch(e) {\\r\\n }\\r\\n $('body').css('width', '100%');\\r\\n // This try is probably not needed but avoid breaking just in case\\r\\n try {\\r\\n $(document).ready(function () {\\r\\n displayHelper.updateLayout();\\r\\n });\\r\\n $(window).resize(function () {\\r\\n displayHelper.updateLayout();\\r\\n // task.displayedSubTask.resetDisplay();\\r\\n });\\r\\n this.bUseFullWidth = true;\\r\\n } catch(e) {\\r\\n }\\r\\n },\\r\\n\\r\\n // Deprecated: use directly levelsMaxScores instead\\r\\n getLevelsMaxScores: function() {\\r\\n return this.levelsMaxScores;\\r\\n },\\r\\n\\r\\n displayLevel: function(newLevel, calledFromSet) {\\r\\n // Only displays a level, without requesting a level change to the task\\r\\n if(!calledFromSet) {\\r\\n this.taskLevel = newLevel;\\r\\n }\\r\\n\\r\\n if (this.popupMessageShown) {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n this.popupMessageShown = false;\\r\\n }\\r\\n\\r\\n var allLevels = ['basic', 'easy', 'medium', 'hard'];\\r\\n if(this.levelsRanks) {\\r\\n for(var lr in this.levelsRanks) {\\r\\n allLevels.push(lr);\\r\\n }\\r\\n }\\r\\n for(var i=0; i < allLevels.length; i++) {\\r\\n var curLevel = allLevels[i];\\r\\n $('#tab_' + curLevel).removeClass('current');\\r\\n $('.' + curLevel).hide();\\r\\n }\\r\\n $('#tab_' + newLevel).addClass('current');\\r\\n $('.' + newLevel).show();\\r\\n\\r\\n // Add prev and next classes to .current direct siblings\\r\\n $('#tabsMenu .li').removeClass('prev next');\\r\\n $('#tabsMenu .li.current').prev().addClass('prev');\\r\\n $('#tabsMenu .li.current').next().addClass('next');\\r\\n this.showSolution(false);\\r\\n this.updateLayout();\\r\\n },\\r\\n\\r\\n setLevel: function(newLevel, force) {\\r\\n // Always make sure we're displaying the level\\r\\n this.displayLevel(newLevel, true);\\r\\n\\r\\n // Skip actually changing the level if we're already on this level\\r\\n if (this.taskLevel == newLevel && !force) {\\r\\n return;\\r\\n }\\r\\n\\r\\n var answer = task.getAnswerObject();\\r\\n var state = task.getStateObject();\\r\\n state.level = newLevel;\\r\\n var self = this;\\r\\n\\r\\n var afterReload = function() {\\r\\n if(displayHelper.reponsive){\\r\\n displayHelper.updateTaskDimensions();\\r\\n displayHelper.toggleTask();\\r\\n }\\r\\n self.submittedScore = self.levelsScores[self.taskLevel];\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n self.stopShowingResult();\\r\\n if ($('#tab_' + newLevel).hasClass('lockedLevel')) {\\r\\n if(window.location.protocol == 'file:') {\\r\\n self.showPopupMessage(self.strings.lockedLevelDev, 'tab', self.strings.alright, reload);\\r\\n } else {\\r\\n self.showPopupMessage(self.strings.lockedLevel, 'lock');\\r\\n }\\r\\n } else if (!self.hasSolution) {\\r\\n if ($('#tab_' + newLevel).hasClass('uselessLevel') && self.levelsScores[newLevel] < self.levelsMaxScores[newLevel]) {\\r\\n var popupType = (self.responsive) ? \\\"blanket\\\" : \\\"tab\\\";\\r\\n self.showPopupMessage(self.strings.harderLevelSolved, popupType, self.strings.showLevelAnyway, reload, null, \\\"warning\\\");\\r\\n } else if (newLevel == 'hard' && self.neverHadHard) {\\r\\n var hardVersionKey = \\\"levelVersionName_hard\\\";\\r\\n var easyVersionKey = \\\"levelVersionName_easy\\\";\\r\\n if (self.pointsAsStars) {\\r\\n hardVersionKey += \\\"_stars\\\";\\r\\n easyVersionKey += \\\"_stars\\\";\\r\\n }\\r\\n self.showPopupMessage(self.formatTranslation(self.strings.hardVersionTakesTime, [self.strings[hardVersionKey], self.strings[easyVersionKey]]),\\r\\n 'tab',\\r\\n self.strings.illKeepThatInMind, function() {\\r\\n self.neverHadHard = false;\\r\\n reload();\\r\\n }\\r\\n );\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n var reload = function(callback) {\\r\\n if(self.reloadWithCallbacks) {\\r\\n task.reloadStateObject(state, function() {\\r\\n task.reloadAnswerObject(answer, callback);\\r\\n });\\r\\n }\\r\\n else {\\r\\n task.reloadStateObject(state, true);\\r\\n task.reloadAnswerObject(answer);\\r\\n if(callback) { callback(); }\\r\\n }\\r\\n };\\r\\n\\r\\n reload(afterReload);\\r\\n\\r\\n if(self.responsive){\\r\\n self.updateTaskDimensions();\\r\\n }\\r\\n },\\r\\n\\r\\n getImgPath: function() {\\r\\n if(window.contestsRoot) {\\r\\n // Hack: when in the context of the platform, we need to change the path\\r\\n return window.contestsRoot + '/' + window.contestFolder + '/';\\r\\n } else if(window.modulesPath) {\\r\\n var modulesPath = window.modulesPath[window.modulesPath.length-1] == '/' ? window.modulesPath : window.modulesPath + '/';\\r\\n return modulesPath + 'img/';\\r\\n } else {\\r\\n return '../../modules/img/';\\r\\n }\\r\\n },\\r\\n\\r\\n getAvatar: function(mood) {\\r\\n if (displayHelper.avatarType == \\\"beaver\\\") {\\r\\n return \\\"castor.png\\\";\\r\\n } else if (displayHelper.avatarType == \\\"none\\\") {\\r\\n return \\\"\\\";\\r\\n } else {\\r\\n if (mood == \\\"success\\\") {\\r\\n return \\\"laptop_success.png\\\";\\r\\n } else if (mood == \\\"warning\\\") {\\r\\n return \\\"laptop_warning.png\\\";\\r\\n }{\\r\\n return \\\"laptop_error.png\\\";\\r\\n }\\r\\n }\\r\\n },\\r\\n\\r\\n\\r\\n showPopupDialog: function(message) {\\r\\n if ($('#popupMessage').length == 0) {\\r\\n $('#task').after('<div id=\\\"popupMessage\\\"></div>');\\r\\n }\\r\\n\\r\\n $('#popupMessage').addClass('floatingMessage');\\r\\n\\r\\n var imgPath = displayHelper.getImgPath();\\r\\n\\r\\n var popupHtml = '<div class=\\\"container\\\">' +\\r\\n '<img class=\\\"messageArrow\\\" src=\\\"' + imgPath + 'fleche-bulle.png\\\"/>' +\\r\\n '<div class=\\\"message\\\">' + message + '</div></div>';\\r\\n\\r\\n $('#popupMessage').html(popupHtml).show();\\r\\n\\r\\n this.popupMessageShown = true;\\r\\n try {\\r\\n $(parent.document).scrollTop(0);\\r\\n } catch (e) {\\r\\n }\\r\\n },\\r\\n\\r\\n\\r\\n errorPopupAvatar: function() {\\r\\n $('#popupMessage').addClass('noAvatar');\\r\\n },\\r\\n\\r\\n\\r\\n showPopupMessage: function(message, mode, yesButtonText, agreeFunc, noButtonText, avatarMood, defaultText, disagreeFunc) {\\r\\n if(this.popupMessageHandler) {\\r\\n // A custom popupMessageHandler was defined, call it\\r\\n // It must return true if it handled the popup, false if displayHelper\\r\\n // should handle the popup instead\\r\\n if(this.popupMessageHandler.apply(null, arguments)) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n\\r\\n if ($('#popupMessage').length == 0) {\\r\\n $('#task').after('<div id=\\\"popupMessage\\\"></div>');\\r\\n }\\r\\n if (mode == 'blanket' || mode == 'input') {\\r\\n $('#popupMessage').addClass('floatingMessage');\\r\\n } else {\\r\\n $('#taskContent, #displayHelperAnswering').hide();\\r\\n $('#popupMessage').removeClass('floatingMessage');\\r\\n }\\r\\n $('#popupMessage').removeClass('noAvatar');\\r\\n\\r\\n var imgPath = displayHelper.getImgPath();\\r\\n if(mode == 'lock') {\\r\\n var buttonYes = '';\\r\\n } else if (mode == 'input') {\\r\\n var buttonYes = '<button class=\\\"buttonYes\\\">' + (yesButtonText || this.strings.validate) + '</button>';\\r\\n } else {\\r\\n var buttonYes = '<button class=\\\"buttonYes\\\">' + (yesButtonText || this.strings.alright) + '</button>';\\r\\n }\\r\\n var buttonNo = '';\\r\\n if (noButtonText != undefined) {\\r\\n buttonNo = '<button class=\\\"buttonNo\\\" style=\\\"margin-left: 10px;\\\">' + noButtonText + '</button>';\\r\\n }\\r\\n var popupHtml = '<div class=\\\"container\\\">' +\\r\\n '<img class=\\\"beaver\\\" src=\\\"' + imgPath + this.getAvatar(avatarMood) + '\\\" onerror=\\\"displayHelper.errorPopupAvatar();\\\"/>' +\\r\\n '<img class=\\\"messageArrow\\\" src=\\\"' + imgPath + 'fleche-bulle.png\\\"/>' +\\r\\n '<div class=\\\"message\\\">' + message + '</div>';\\r\\n if(mode == 'input') {\\r\\n popupHtml += '<input id=\\\"popupInput\\\" type=\\\"text\\\" value=\\\"' + (defaultText ? defaultText : '') + '\\\"></input>';\\r\\n }\\r\\n popupHtml += '<div class=\\\"buttonsWrapper\\\">' + buttonYes + buttonNo + '</div></div>';\\r\\n $('#popupMessage').html(popupHtml).show();\\r\\n if(mode == 'input') {\\r\\n $('#popupInput').focus();\\r\\n }\\r\\n\\r\\n var validateFunc = function() {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n displayHelper.popupMessageShown = false;\\r\\n if (agreeFunc) {\\r\\n if(mode == 'input') {\\r\\n agreeFunc($('#popupInput').val());\\r\\n } else {\\r\\n agreeFunc();\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n var validateFuncNo = function() {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n displayHelper.popupMessageShown = false;\\r\\n if (disagreeFunc) {\\r\\n if(mode == 'input') {\\r\\n disagreeFunc($('#popupInput').val());\\r\\n } else {\\r\\n disagreeFunc();\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n $('#popupMessage .buttonYes').click(validateFunc);\\r\\n $('#popupMessage .buttonNo').click(validateFuncNo);\\r\\n $('#popupInput').keypress(function (e) {\\r\\n if(e.which === 13) { validateFunc(); }\\r\\n });\\r\\n\\r\\n $('#popupMessage .buttonNo').click(function() {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n displayHelper.popupMessageShown = false;\\r\\n });\\r\\n this.popupMessageShown = true;\\r\\n try {\\r\\n $(parent.document).scrollTop(0);\\r\\n } catch (e) {\\r\\n }\\r\\n },\\r\\n\\r\\n // Function to call at the beginning of task loading, before any html has\\r\\n // been modified. It places the markers where the buttons will appear, if the\\r\\n // markers are not present already.\\r\\n showViews: function(views) {\\r\\n // Fix for an old version of Firefox in which selection was stuck\\r\\n try {\\r\\n if (document.getSelection) {\\r\\n var selection = document.getSelection();\\r\\n if (selection !== undefined && selection.removeAllRanges !== undefined) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n }\\r\\n } catch (err) {}\\r\\n\\r\\n this.views = views;\\r\\n this.hasSolution = (typeof views.solution !== 'undefined');\\r\\n if (this.hasSolution && this.graderScore) {\\r\\n this.prevSavedScore = this.graderScore;\\r\\n }\\r\\n var self = this;\\r\\n this.checkAnswerInterval = setInterval(\\r\\n function() {\\r\\n self.checkAnswerChanged();\\r\\n }, 1000);\\r\\n task.getAnswer(function(answer) {\\r\\n self.defaultAnswer = answer;\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n });\\r\\n },\\r\\n\\r\\n reloadAnswer: function(strAnswer) {\\r\\n this.savedAnswer = strAnswer;\\r\\n this.prevAnswer = strAnswer;\\r\\n this.submittedAnswer = strAnswer;\\r\\n var that = this;\\r\\n if (this.showScore) {\\r\\n // TODO we only know the answer here, and not the state. Possibly problematic?\\r\\n this.updateScore(strAnswer, true, function() {\\r\\n that.checkAnswerChanged(); // necessary?\\r\\n });\\r\\n } else {\\r\\n that.checkAnswerChanged(); // necessary?\\r\\n }\\r\\n },\\r\\n\\r\\n reloadState: function() {\\r\\n this.checkAnswerChanged(); // necessary?\\r\\n },\\r\\n\\r\\n stopShowingResult: function() {\\r\\n this.stoppedShowingResult = true;\\r\\n this.updateMessages();\\r\\n },\\r\\n\\r\\n /**********************\\r\\n * Internal functions *\\r\\n **********************/\\r\\n restartAll: function() {\\r\\n if(this.confirmRestartAll) {\\r\\n this.showPopupMessage(this.strings.confirmRestart, 'blanket', this.strings.yes, this.restartAllNoConfirm, this.strings.no);\\r\\n }\\r\\n else {\\r\\n this.restartAllNoConfirm();\\r\\n }\\r\\n },\\r\\n\\r\\n restartAllNoConfirm: function() {\\r\\n displayHelper.stopShowingResult();\\r\\n if (!displayHelper.hasLevels) {\\r\\n // TODO is this the desired behavior for no levels?\\r\\n task.reloadAnswer('', function() {});\\r\\n } else {\\r\\n task.getAnswer(function(strAnswer) {\\r\\n var answer = $.parseJSON(strAnswer);\\r\\n var defaultAnswer = task.getDefaultAnswerObject();\\r\\n var level = displayHelper.taskLevel;\\r\\n answer[level] = defaultAnswer[level];\\r\\n task.reloadAnswer(JSON.stringify(answer), function() {});\\r\\n });\\r\\n }\\r\\n },\\r\\n\\r\\n setValidateString: function(str) {\\r\\n this.customValidateString = str;\\r\\n $(\\\"#displayHelper_validate > input\\\").val(str);\\r\\n },\\r\\n\\r\\n callValidate: function() {\\r\\n if (this.customValidate != undefined) {\\r\\n this.customValidate();\\r\\n } else {\\r\\n platform.validate(\\\"none\\\", function() {});\\r\\n }\\r\\n },\\r\\n\\r\\n validate: function(mode) {\\r\\n this.stoppedShowingResult = false;\\r\\n var self = this;\\r\\n if (mode == 'log') {\\r\\n // Ignore it? Do something?\\r\\n } else if (mode == 'cancel') {\\r\\n this.savedAnswer = '';\\r\\n task.reloadAnswer('', function() {\\r\\n self.checkAnswerChanged();\\r\\n });\\r\\n } else {\\r\\n task.getAnswer(function(strAnswer) {\\r\\n if (!self.hasSolution) {\\r\\n self.prevSavedScore = self.graderScore;\\r\\n if (self.hasLevels) {\\r\\n self.prevLevelsScores[self.taskLevel] = self.levelsScores[self.taskLevel];\\r\\n }\\r\\n }\\r\\n var refresh = function() {\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n };\\r\\n self.submittedAnswer = strAnswer;\\r\\n if (self.showScore) {\\r\\n self.updateScore(strAnswer, false, refresh, (mode == \\\"silent\\\"));\\r\\n } else {\\r\\n self.savedAnswer = strAnswer;\\r\\n refresh();\\r\\n }\\r\\n });\\r\\n }\\r\\n },\\r\\n\\r\\n updateScore: function(strAnswer, allLevels, callback, silentMode) {\\r\\n var self = this;\\r\\n function refresh() {\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n callback();\\r\\n }\\r\\n if (allLevels) {\\r\\n // TODO: make sure the grader doesn't evaluate each level at each call (most do right now!)\\r\\n var levelsToDo = this.levels.slice();\\r\\n var updateNextScore = null;\\r\\n updateNextScore = function() {\\r\\n var nextLevel = levelsToDo.shift();\\r\\n if(nextLevel) {\\r\\n self.updateScoreOneLevel(strAnswer, nextLevel, updateNextScore);\\r\\n } else {\\r\\n refresh();\\r\\n }\\r\\n }\\r\\n updateNextScore();\\r\\n } else {\\r\\n this.updateScoreOneLevel(strAnswer, this.taskLevel, function() {\\r\\n if (!silentMode) {\\r\\n if (self.hasLevels) {\\r\\n self.showValidatePopup(self.taskLevel);\\r\\n } else {\\r\\n self.showValidatePopup();\\r\\n }\\r\\n }\\r\\n callback();\\r\\n }, silentMode);\\r\\n }\\r\\n },\\r\\n updateScoreOneLevel: function(strAnswer, gradedLevel, callback, silentMode) {\\r\\n var self = this;\\r\\n this.graderMessage = this.strings.gradingInProgress;\\r\\n task.getLevelGrade(strAnswer, null, function(score, message) {\\r\\n score = +score;\\r\\n self.submittedScore = score;\\r\\n if (self.hasSolution) {\\r\\n self.graderScore = score;\\r\\n self.levelsScores[gradedLevel] = score;\\r\\n } else {\\r\\n if (self.hasLevels) {\\r\\n if (score > self.levelsScores[gradedLevel]) {\\r\\n self.levelsScores[gradedLevel] = score;\\r\\n self.graderScore = score;\\r\\n if (self.savedAnswer === '') {\\r\\n self.savedAnswer = strAnswer;\\r\\n } else {\\r\\n var savedAnswerObj = $.parseJSON(self.savedAnswer);\\r\\n var answerObj = $.parseJSON(strAnswer);\\r\\n savedAnswerObj[gradedLevel] = answerObj[gradedLevel];\\r\\n self.savedAnswer = JSON.stringify(savedAnswerObj);\\r\\n }\\r\\n }\\r\\n } else if (score > self.graderScore) {\\r\\n self.savedAnswer = strAnswer;\\r\\n self.graderScore = score;\\r\\n }\\r\\n }\\r\\n if (silentMode) {\\r\\n message = \\\"\\\";\\r\\n }\\r\\n if (message !== undefined) {\\r\\n self.graderMessage = message;\\r\\n } else {\\r\\n self.graderMessage = \\\"\\\";\\r\\n }\\r\\n // TODO : should not be called from here, might update the display of a level not currently opened!\\r\\n if (self.hasLevels) {\\r\\n self.updateScoreDisplays(gradedLevel);\\r\\n }\\r\\n callback();\\r\\n }, gradedLevel);\\r\\n },\\r\\n updateScoreDisplays: function(gradedLevel) {\\r\\n var scores = this.levelsScores;\\r\\n var maxScores = this.levelsMaxScores;\\r\\n if (this.pointsAsStars) {\\r\\n this.updateStarsAtLevel(gradedLevel);\\r\\n var maxMaxScore = 0;\\r\\n for(var lvl in maxScores) {\\r\\n maxMaxScore = Math.max(maxScores[lvl], maxMaxScore);\\r\\n }\\r\\n drawStars('titleStars', this.maxStars, 24, this.graderScore / maxMaxScore, 'normal');\\r\\n } else {\\r\\n $('#tabScore_' + gradedLevel).html(scores[gradedLevel]);\\r\\n $('#bestScore').html(this.graderScore);\\r\\n }\\r\\n\\r\\n var gradedLevelNum = $.inArray(gradedLevel, this.levels);\\r\\n var curLevel;\\r\\n // Possibly unlocking a level\\r\\n if (maxScores[gradedLevel] == scores[gradedLevel]) {\\r\\n var unlockedLevel = gradedLevelNum + 1;\\r\\n if (unlockedLevel < this.levels.length && unlockedLevel >= this.unlockedLevels) {\\r\\n curLevel = this.levels[unlockedLevel];\\r\\n $('#tab_' + curLevel).removeClass('lockedLevel');\\r\\n this.unlockedLevels++;\\r\\n this.updateStarsAtLevel(curLevel);\\r\\n // Currently displayed level has been unlocked, display it\\r\\n if(curLevel == this.taskLevel) {\\r\\n this.setLevel(this.taskLevel, true);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (scores[gradedLevel] == this.graderScore) {\\r\\n // Marks levels that can't earn points as useless\\r\\n for (curLevel in this.levelsRanks) {\\r\\n if (maxScores[curLevel] > this.graderScore) {\\r\\n break;\\r\\n }\\r\\n if (this.pointsAsStars) {\\r\\n this.updateStarsAtLevel(curLevel);\\r\\n }\\r\\n $('#tab_' + curLevel).addClass('uselessLevel');\\r\\n }\\r\\n }\\r\\n },\\r\\n showValidatePopup: function(gradedLevel) {\\r\\n var curTime = new Date().getTime();\\r\\n var secondsSinceLoaded = (curTime - this.timeLoaded) / 1000;\\r\\n var actionNext = \\\"stay\\\";\\r\\n // Display popup to indicate what to do next\\r\\n var fullMessage = this.graderMessage;\\r\\n var maxScores = this.levelsMaxScores;\\r\\n var buttonText = this.strings.alright;\\r\\n var avatarMood = \\\"error\\\";\\r\\n if ((gradedLevel == undefined) && (this.graderScore >= this.taskParams.maxScore - 0.001)) {\\r\\n avatarMood = \\\"success\\\";\\r\\n buttonText = this.strings.moveOn;\\r\\n fullMessage += \\\"<br/><br/>\\\";\\r\\n actionNext = \\\"nextTask\\\";\\r\\n fullMessage += this.strings.solvedMoveOn;\\r\\n } else if (maxScores && (gradedLevel !== undefined) && this.graderScore >= maxScores[gradedLevel] - 0.001) {\\r\\n avatarMood = \\\"success\\\";\\r\\n buttonText = this.strings.moveOn;\\r\\n fullMessage += \\\"<br/><br/>\\\";\\r\\n var levelIdx = this.levelsIdx[gradedLevel];\\r\\n var nextLevel = levelIdx !== undefined && levelIdx < this.levels.length-1 ? this.levels[levelIdx+1] : null;\\r\\n if(nextLevel) {\\r\\n // Offer to try next task if the user solved this difficulty slowly\\r\\n var threshold = this.thresholds[gradedLevel];\\r\\n if(!threshold) {\\r\\n if(gradedLevel == \\\"medium\\\") { threshold = this.thresholdMedium; }\\r\\n else if(gradedLevel == \\\"easy\\\") { threshold = this.thresholdEasy; }\\r\\n }\\r\\n if(levelIdx == this.forceNextTaskAfter) {\\r\\n // Move onto next task after a specified difficulty\\r\\n actionNext = \\\"top\\\";\\r\\n fullMessage += this.strings.tryNextTask;\\r\\n } else if(!threshold || (threshold && secondsSinceLoaded < threshold)) {\\r\\n actionNext = nextLevel;\\r\\n if(gradedLevel == \\\"easy\\\") { fullMessage += this.strings.tryMediumLevel; }\\r\\n if(gradedLevel == \\\"medium\\\") { fullMessage += this.strings.tryHardLevel; }\\r\\n } else {\\r\\n actionNext = \\\"nextTask\\\";\\r\\n fullMessage += this.strings.tryNextTask;\\r\\n }\\r\\n } else {\\r\\n // Solved the last level, move on\\r\\n actionNext = \\\"nextTask\\\";\\r\\n fullMessage += this.strings.solvedMoveOn;\\r\\n }\\r\\n }\\r\\n var self = this;\\r\\n // Offer an option to stay on the task instead of forcing nextTask\\r\\n var noButtonText = actionNext == \\\"nextTask\\\" ? this.strings.no : null;\\r\\n this.showPopupMessage(fullMessage, 'blanket', buttonText,\\r\\n function() {\\r\\n // TODO: replace with something compatible with the API.\\r\\n try {\\r\\n $(parent.document).scrollTop(0);\\r\\n } catch (e) {\\r\\n }\\r\\n if (actionNext == \\\"nextTask\\\") {\\r\\n platform.validate(\\\"nextImmediate\\\");\\r\\n } else if (actionNext == \\\"top\\\") {\\r\\n platform.validate(\\\"top\\\");\\r\\n } else if(self.levelsIdx[actionNext] !== undefined) {\\r\\n self.setLevel(actionNext);\\r\\n }\\r\\n },\\r\\n noButtonText,\\r\\n avatarMood\\r\\n );\\r\\n },\\r\\n\\r\\n // Does task have unsaved answers?\\r\\n hasNonSavedAnswer: function(callback) {\\r\\n if (!task) {\\r\\n return false;\\r\\n }\\r\\n var self = this;\\r\\n task.getAnswer(function(curAnswer) {\\r\\n if (curAnswer != self.prevAnswer) {\\r\\n try {\\r\\n if (self != top && parent.Tracker) {\\r\\n var data = {\\r\\n dataType: 'nonSavedAnswer', teamID: parent.teamID, questionKey: parent.currentQuestionKey, answer: curAnswer\\r\\n };\\r\\n // Call TrackData, only when loaded in an iframe\\r\\n // this is not yet document in the API, but should be soonish\\r\\n parent.Tracker.trackData(data);\\r\\n }\\r\\n } catch (e) {}\\r\\n self.prevAnswer = curAnswer;\\r\\n }\\r\\n if (curAnswer != self.submittedAnswer) {\\r\\n self.submittedAnswer = '';\\r\\n self.refreshMessages = true;\\r\\n }\\r\\n if (curAnswer == self.defaultAnswer && self.savedAnswer === '') {\\r\\n callback(false);\\r\\n } else {\\r\\n callback(curAnswer != self.submittedAnswer);\\r\\n }\\r\\n });\\r\\n },\\r\\n\\r\\n // Checks task.getAnswer() against previously recorded result, and calls\\r\\n // displayHelper.updateMessages() accordingly.\\r\\n checkAnswerChanged: function() {\\r\\n if (!this.loaded) {\\r\\n this.checkAnswerInterval = clearInterval(this.checkAnswerInterval);\\r\\n return;\\r\\n }\\r\\n var self = this;\\r\\n this.hasNonSavedAnswer(function(hasNonSavedAnswer) {\\r\\n if (hasNonSavedAnswer && !self.hasAnswerChanged) {\\r\\n self.refreshMessages = true;\\r\\n self.hasAnswerChanged = true;\\r\\n } else if (!hasNonSavedAnswer && self.hasAnswerChanged) {\\r\\n self.refreshMessages = true;\\r\\n self.hasAnswerChanged = false;\\r\\n }\\r\\n if (self.refreshMessages) {\\r\\n self.updateMessages();\\r\\n }\\r\\n });\\r\\n },\\r\\n\\r\\n getFullFeedbackSavedMessage: function(taskMode) {\\r\\n var scoreDiffMsg = this.strings.score;\\r\\n var showRetrieveAnswer = false;\\r\\n if (this.submittedAnswer !== '' && this.prevSavedScore !== undefined) {\\r\\n if (!this.hasSolution) {\\r\\n if (this.prevSavedScore < this.submittedScore) {\\r\\n scoreDiffMsg = this.strings.yourScoreIsNow;\\r\\n } else if (this.prevSavedScore > this.submittedScore) {\\r\\n scoreDiffMsg = this.strings.worseScoreStays;\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n else {\\r\\n scoreDiffMsg = this.strings.scoreStays;\\r\\n }\\r\\n } else {\\r\\n if (this.prevSavedScore != this.submittedScore) {\\r\\n scoreDiffMsg = this.strings.contestOverScoreStays + \\\" \\\" + this.prevSavedScore + \\\". \\\" + this.strings.scoreWouldBecome;\\r\\n } else if (this.submittedAnswer != this.savedAnswer) {\\r\\n scoreDiffMsg = this.strings.contestOverScoreStays + \\\" \\\" + this.prevSavedScore + \\\". \\\" + this.strings.scoreWouldStay;\\r\\n } else {\\r\\n scoreDiffMsg = this.strings.scoreIs;\\r\\n }\\r\\n }\\r\\n }\\r\\n scoreDiffMsg += \\\" \\\" + this.graderScore + this.strings.outOf + this.taskParams.maxScore + \\\".\\\";\\r\\n if ((this.hasSolution && this.savedAnswer != this.prevAnswer) ||\\r\\n (this.graderScore > 0 && (taskMode == 'saved_changed' || showRetrieveAnswer))) {\\r\\n scoreDiffMsg += ' <a href=\\\"#\\\" onclick=\\\"displayHelper.retrieveAnswer(); return false;\\\">' + this.strings.reloadValidAnswer + '</a>';\\r\\n }\\r\\n return scoreDiffMsg;\\r\\n },\\r\\n getFullFeedbackWithLevelsSavedMessage: function() {\\r\\n var maxScoreLevel = this.levelsMaxScores[this.taskLevel];\\r\\n var showRetrieveAnswer = false;\\r\\n var message = \\\"\\\";\\r\\n var curAnswer = this.submittedAnswer;\\r\\n var answerExists = false;\\r\\n if (curAnswer !== '') {\\r\\n curAnswer = $.parseJSON(curAnswer);\\r\\n answerExists = !$.isEmptyObject(curAnswer);\\r\\n }\\r\\n if (!answerExists) {\\r\\n if (this.levelsScores[this.taskLevel] > 0) {\\r\\n if (this.hideScoreDetails) {\\r\\n message = this.strings.scoreObtained + ' <span id=\\\"answerScore\\\">' + this.levelsScores[this.taskLevel] + \\\" \\\" + strPoint + \\\" \\\" + this.strings.outOf + \\\" \\\" + maxScoreLevel + \\\".</span><br/>\\\";;\\r\\n } else {\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n } else {\\r\\n message += this.strings.noPointsForLevel;\\r\\n }\\r\\n } else {\\r\\n var strPoint = this.strings.point;\\r\\n if (this.submittedScore > 1) {\\r\\n strPoint = this.strings.points;\\r\\n }\\r\\n message = this.strings.scoreObtained + ' <span id=\\\"answerScore\\\">' + this.submittedScore + \\\" \\\" + strPoint + \\\" \\\" + this.strings.outOf + \\\" \\\" + maxScoreLevel + \\\".</span><br/>\\\";\\r\\n if (this.hideScoreDetails) {\\r\\n } else if (this.hasSolution) {\\r\\n message += this.strings.contestOverAnswerNotSaved;\\r\\n if (this.prevSavedScore !== undefined) {\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n } else {\\r\\n var prevScore = this.prevLevelsScores[this.taskLevel];\\r\\n if (this.prevSavedScore !== undefined) {\\r\\n if (this.submittedScore > prevScore) {\\r\\n if (this.submittedScore < maxScoreLevel) {\\r\\n if (this.taskLevel == \\\"hard\\\") {\\r\\n message += this.strings.tryToDoBetterOrChangeTask;\\r\\n } else {\\r\\n message += this.strings.tryToDoBetterOrMoveToNextLevel;\\r\\n }\\r\\n } else if (this.taskLevel == \\\"hard\\\") {\\r\\n message += this.strings.bestPossibleScoreCongrats;\\r\\n } else {\\r\\n message += this.strings.forMorePointsMoveToNextLevel;\\r\\n }\\r\\n } else if (this.submittedScore < prevScore) {\\r\\n message += this.strings.youDidBetterBefore;\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n else {\\r\\n message += this.strings.scoreStays2;\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n if (showRetrieveAnswer) {\\r\\n message += ' <a href=\\\"#\\\" onclick=\\\"displayHelper.retrieveAnswer(); return false;\\\">' + this.strings.reloadBestAnswer + '</a>';\\r\\n }\\r\\n return message;\\r\\n },\\r\\n getFullFeedbackGraderMessage: function(taskMode) {\\r\\n switch (taskMode) {\\r\\n case 'saved_unchanged':\\r\\n var color = 'red';\\r\\n if (this.submittedScore == this.taskParams.maxScore) {\\r\\n color = 'green';\\r\\n } else if (this.submittedScore > 0) {\\r\\n color = '#ff8c00';\\r\\n }\\r\\n if (this.graderMessage !== \\\"\\\") {\\r\\n if (!this.stoppedShowingResult) {\\r\\n return '<div style=\\\"margin: .2em 0; color: ' + color + '; font-weight: bold;\\\">' + this.graderMessage + '</div>';\\r\\n }\\r\\n }\\r\\n break;\\r\\n }\\r\\n return '';\\r\\n },\\r\\n // TODO: rename function below to getFullFeedbackValidate, assuming it is not called from outside this file\\r\\n getFullFeedbackValidateMessage: function(taskMode, disabledStr) {\\r\\n var strValidate = this.strings.validate;\\r\\n // var strValidate = ($('#task[alkindi]').length > 0) ? this.strings.validate : this.strings.validate.toUpperCase();\\r\\n if (this.customValidateString != undefined) {\\r\\n strValidate = this.customValidateString;\\r\\n }\\r\\n switch (taskMode) {\\r\\n case 'saved_unchanged':\\r\\n if (this.graderMessage !== \\\"\\\") {\\r\\n if (!this.hideValidateButton && !this.hasSolution) {\\r\\n if(!this.responsive){\\r\\n return '<input type=\\\"button\\\" value=\\\"' + strValidate + '\\\" onclick=\\\"displayHelper.callValidate();\\\" '+disabledStr + '/>';\\r\\n }else{\\r\\n return '<div onclick=\\\"displayHelper.callValidate();\\\"><i class=\\\"fas fa-check\\\"></i><span>' + strValidate +'</span></div>';\\r\\n }\\r\\n }\\r\\n }\\r\\n break;\\r\\n case 'unsaved_unchanged':\\r\\n case 'unsaved_changed':\\r\\n if (!this.hideValidateButton) {\\r\\n if (this.hasSolution) {\\r\\n return '<input type=\\\"button\\\" value=\\\"' + this.strings.gradeThisAnswer + '\\\" onclick=\\\"displayHelper.validate(\\\\'test\\\\');\\\" ' +\\r\\n disabledStr + '/>';\\r\\n } else {\\r\\n if(!this.responsive){\\r\\n return '<input type=\\\"button\\\" value=\\\"' + strValidate + '\\\" onclick=\\\"displayHelper.callValidate();\\\" ' + disabledStr + '/>';\\r\\n }else{\\r\\n return '<div onclick=\\\"displayHelper.callValidate();\\\"><i class=\\\"fas fa-check\\\"></i><span>' + strValidate +'</span></div>';\\r\\n }\\r\\n }\\r\\n }\\r\\n break;\\r\\n case 'saved_changed':\\r\\n if (!this.hideValidateButton) {\\r\\n if (this.hasSolution) {\\r\\n return '<input type=\\\"button\\\" value=\\\"' + this.strings.gradeThisAnswer + '\\\" onclick=\\\"displayHelper.validate(\\\\'test\\\\');\\\" ' +\\r\\n disabledStr + '/>';\\r\\n } else {\\r\\n // was: Valider votre nouvelle réponse\\r\\n if(!this.responsive){\\r\\n return '<input type=\\\"button\\\" value=\\\"' + strValidate + '\\\" onclick=\\\"displayHelper.callValidate();\\\" ' + disabledStr + '/>';\\r\\n }else{\\r\\n return '<div onclick=\\\"displayHelper.callValidate();\\\"><i class=\\\"fas fa-check\\\"></i><span>' + strValidate +'</span></div>';\\r\\n }\\r\\n }\\r\\n }\\r\\n break;\\r\\n }\\r\\n return '';\\r\\n },\\r\\n\\r\\n lastSentHeight: null,\\r\\n updateMessages: function() {\\r\\n this.initLanguage();\\r\\n var self = this;\\r\\n this.refreshMessages = false;\\r\\n var suffix, prefix;\\r\\n if (this.hasAnswerChanged) {\\r\\n suffix = 'changed';\\r\\n } else {\\r\\n suffix = 'unchanged';\\r\\n }\\r\\n if (this.savedAnswer !== '' && this.savedAnswer != this.defaultAnswer) {\\r\\n prefix = 'saved';\\r\\n } else {\\r\\n prefix = 'unsaved';\\r\\n }\\r\\n if (this.submittedAnswer !== '' && this.submittedAnswer != this.savedAnswer) {\\r\\n prefix = 'saved'; // equivalent, should be named differently\\r\\n suffix = 'unchanged';\\r\\n }\\r\\n var taskMode = prefix + '_' + suffix;\\r\\n var messages = { graderMessage: '', validate: '', cancel: '', saved: '' };\\r\\n var disabledStr = this.readOnly ? ' disabled' : '';\\r\\n if (this.showScore) {\\r\\n if (!this.hideRestartButton) {\\r\\n var strRestart = this.strings.restart;\\r\\n // var strRestart = ($('#task[alkindi]').length > 0) ? this.strings.restart : this.strings.restart.toUpperCase();\\r\\n if(!this.responsive){\\r\\n messages.cancel = '<input type=\\\"button\\\" value=\\\"' + this.strings.restart + '\\\" onclick=\\\"displayHelper.restartAll();\\\"' + disabledStr + '/></div>';\\r\\n }else{\\r\\n messages.cancel = '<div onclick=\\\"displayHelper.restartAll();\\\"><i class=\\\"fas fa-undo\\\"></i><span>' + strRestart +'</span></div>';\\r\\n }\\r\\n }\\r\\n messages.graderMessage = this.getFullFeedbackGraderMessage(taskMode);\\r\\n messages.validate = this.getFullFeedbackValidateMessage(taskMode, disabledStr);\\r\\n if (this.hasLevels) {\\r\\n messages.saved = this.getFullFeedbackWithLevelsSavedMessage(taskMode);\\r\\n } else {\\r\\n messages.saved = this.getFullFeedbackSavedMessage(taskMode);\\r\\n }\\r\\n } else {\\r\\n switch (taskMode) {\\r\\n case 'unsaved_unchanged':\\r\\n case 'unsaved_changed':\\r\\n if (!this.hasSolution) {\\r\\n messages.validate = '<input type=\\\"button\\\" value=\\\"' + this.strings.saveAnswer + '\\\" ' +\\r\\n 'onclick=\\\"platform.validate(\\\\'done\\\\', function(){})\\\" ' + disabledStr + '/>';\\r\\n }\\r\\n break;\\r\\n case 'saved_unchanged':\\r\\n if (!this.hasSolution) {\\r\\n messages.saved = this.formatTranslation(this.strings.answerSavedModifyOrCancelIt,\\r\\n [\\\"<a href='#' onclick=\\\\\\\"platform.validate('cancel', function(){}); return false;\\\\\\\" \\\" + disabledStr + \\\">\\\" + this.strings.cancelIt + \\\"</a>\\\"]);\\r\\n } else {\\r\\n messages.saved = this.formatTranslation(this.strings.answerNotSavedContestOver,\\r\\n [\\\"<a href='#' onclick=\\\\\\\"displayHelper.validate('cancel'); return false;\\\\\\\" \\\" + disabledStr + \\\">\\\" + this.strings.reloadSubmittedAnswer + \\\"</a>\\\"]);\\r\\n }\\r\\n break;\\r\\n case 'saved_changed':\\r\\n messages.saved = \\\"<br/><b style='color: red;'>\\\" + this.strings.warningDifferentAnswerSaved + \\\"</b> \\\" +\\r\\n this.formatTranslation(this.strings.youMay, [\\\"<a href='#' onclick='displayHelper.retrieveAnswer(); return false;'>\\\" + this.strings.reloadIt + \\\"</a>\\\"]);\\r\\n if (!this.hideValidateButton) {\\r\\n messages.validate = \\\"<input type='button' value='\\\" + this.strings.saveThisNewAnswer + \\\"' onclick=\\\\\\\"platform.validate('done', function(){})\\\\\\\" \\\" + disabledStr + \\\"/>\\\";\\r\\n }\\r\\n break;\\r\\n }\\r\\n }\\r\\n for (var type in messages) {\\r\\n if (this.loaded && (typeof this.previousMessages[type] === 'undefined' || this.previousMessages[type] !== messages[type])) {\\r\\n $('#displayHelper_' + type).html(messages[type]);\\r\\n this.previousMessages[type] = messages[type];\\r\\n }\\r\\n }\\r\\n if (this.pointsAsStars && $('#answerScore').length) {\\r\\n drawStars('answerScore', this.levelsRanks[this.taskLevel], 20,\\r\\n this.levelsScores[this.taskLevel] / this.levelsMaxScores[this.taskLevel], 'normal');\\r\\n }\\r\\n window.task.getHeight(function(height) {\\r\\n if (Math.abs(height - self.lastSentHeight) > 30) {\\r\\n self.lastSentHeight = height;\\r\\n window.platform.updateDisplay({height: height}, function(){});\\r\\n }\\r\\n });\\r\\n },\\r\\n\\r\\n getSavedAnswer: function() {\\r\\n // Gets the previously saved answer\\r\\n var retrievedAnswer;\\r\\n if (this.hasLevels) {\\r\\n var savedAnswerObj = this.savedAnswer && $.parseJSON(this.savedAnswer);\\r\\n if(savedAnswerObj) {\\r\\n var retrievedAnswerObj = task.getAnswerObject();\\r\\n retrievedAnswerObj[this.taskLevel] = savedAnswerObj[this.taskLevel];\\r\\n retrievedAnswer = retrievedAnswerObj[this.taskLevel] && JSON.stringify(retrievedAnswerObj);\\r\\n } else {\\r\\n retrievedAnswer = null;\\r\\n }\\r\\n } else {\\r\\n retrievedAnswer = this.savedAnswer;\\r\\n }\\r\\n return retrievedAnswer;\\r\\n },\\r\\n retrieveAnswer: function() {\\r\\n // Loads previously saved answer\\r\\n var retrievedAnswer = this.getSavedAnswer();\\r\\n if(!retrievedAnswer) {\\r\\n this.showPopupMessage(this.strings.noAnswerSaved, 'blanket', this.strings.alright, null, null, \\\"warning\\\");\\r\\n return;\\r\\n }\\r\\n var self = displayHelper;\\r\\n task.reloadAnswer(retrievedAnswer, function() {\\r\\n self.submittedAnswer = self.savedAnswer;\\r\\n self.updateScore(self.savedAnswer, false, function() {});\\r\\n });\\r\\n },\\r\\n hasSavedAnswer: function() {\\r\\n // Returns whether a saved answer exists\\r\\n if (this.hasLevels) {\\r\\n var savedAnswerObj = this.savedAnswer && $.parseJSON(this.savedAnswer);\\r\\n if(savedAnswerObj) {\\r\\n return !!savedAnswerObj[this.taskLevel];\\r\\n }\\r\\n } else {\\r\\n return !!this.savedAnswer;\\r\\n }\\r\\n return false;\\r\\n },\\r\\n\\r\\n sendBestScore: function(callback, scores, messages) {\\r\\n var bestLevel = 'easy';\\r\\n var bestScore = null;\\r\\n for (var curLevel in scores) {\\r\\n if (bestScore === null || bestScore <= scores[curLevel]) {\\r\\n bestLevel = curLevel;\\r\\n bestScore = scores[curLevel];\\r\\n }\\r\\n }\\r\\n callback(scores[bestLevel], messages[bestLevel] + \\\" (\\\" + this.strings[\\\"levelVersionName_\\\" + bestLevel] + \\\")\\\");\\r\\n },\\r\\n\\r\\n displayError: function(msg) {\\r\\n var that = this;\\r\\n if(this.responsive){\\r\\n $(\\\"#error\\\").html('<i class=\\\"fas fa-exclamation-triangle\\\"></i><span id=\\\"errorMsg\\\">'+msg+'</span> <i class=\\\"fas fa-times\\\"></i>');\\r\\n if (msg) {\\r\\n $('#error').css('max-width', '');\\r\\n $(\\\"#error\\\").show();\\r\\n // Check how much space the error banner takes and push buttons\\r\\n var errorWidth = $(\\\"#error\\\").outerWidth();\\r\\n var dhaWidth = $(\\\"#displayHelperAnswering\\\").outerWidth();\\r\\n var wWidth = $(window).width();\\r\\n if (errorWidth >= (wWidth - dhaWidth) / 2) {\\r\\n // Need to move the buttons to the right\\r\\n $('#displayHelperAnswering').addClass('forceRight');\\r\\n // Avoid the error banner going over the buttons\\r\\n $('#error').css('max-width', (wWidth - dhaWidth - 8) + 'px')\\r\\n } else {\\r\\n $('#displayHelperAnswering').removeClass('forceRight');\\r\\n }\\r\\n } else {\\r\\n this.hideError();\\r\\n }\\r\\n $('#error').click(function() {\\r\\n that.hideError();\\r\\n });\\r\\n }else{\\r\\n $(\\\"#displayHelper_graderMessage\\\").html(msg);\\r\\n }\\r\\n },\\r\\n\\r\\n hideError: function () {\\r\\n $(\\\"#error\\\").hide();\\r\\n $('#displayHelperAnswering').removeClass('forceRight');\\r\\n }\\r\\n};\\r\\n\\r\\n\\r\\n/*\\r\\n draw nbStars stars of width starWidth in element of id id\\r\\n fills rate% of them in yellow from the left\\r\\n mode is \\\"norma\\\", \\\"locked\\\" or \\\"useless\\\"\\r\\n*/\\r\\nfunction drawStars(id, nbStars, starWidth, rate, mode,layout4) {\\r\\n $('#' + id).addClass('stars');\\r\\n var starH = starWidth*0.95;\\r\\n if(layout4){\\r\\n // console.log(id,nbStars,starWidth,rate,mode)\\r\\n }\\r\\n function clipPath(coords, xClip) {\\r\\n var result = [[coords[0][0], coords[0][1]]];\\r\\n var clipped = false;\\r\\n for (var iCoord = 1; iCoord <= coords.length; iCoord++) {\\r\\n var x1 = coords[iCoord - 1][0];\\r\\n var y1 = coords[iCoord - 1][1];\\r\\n var x2 = coords[iCoord % coords.length][0];\\r\\n var y2 = coords[iCoord % coords.length][1];\\r\\n if (x2 > xClip) {\\r\\n if (!clipped) {\\r\\n result.push([xClip, y1 + (y2 - y1) * (xClip - x1) / (x2 - x1)]);\\r\\n clipped = true;\\r\\n }\\r\\n } else {\\r\\n if (clipped) {\\r\\n result.push([xClip, y1 + (y2 - y1) * (xClip - x1) / (x2 - x1)]);\\r\\n clipped = false;\\r\\n }\\r\\n result.push([x2, y2]);\\r\\n }\\r\\n }\\r\\n result.pop();\\r\\n return result;\\r\\n }\\r\\n\\r\\n function pathFromCoords(coords) {\\r\\n var result = 'm' + coords[0][0] + ',' + coords[0][1];\\r\\n for (var iCoord = 1; iCoord < coords.length; iCoord++) {\\r\\n var x1 = coords[iCoord - 1][0];\\r\\n var y1 = coords[iCoord - 1][1];\\r\\n var x2 = coords[iCoord][0];\\r\\n var y2 = coords[iCoord][1];\\r\\n result += ' ' + (x2 - x1) + ',' + (y2 - y1);\\r\\n }\\r\\n result += 'z';\\r\\n return result;\\r\\n }\\r\\n\\r\\n var fillColors = { normal: 'none', locked: '#ddd', useless: '#ced' };\\r\\n var strokeColors = { normal: 'black', locked: '#ddd', useless: '#444' };\\r\\n var starCoords = [[25, 60], [5, 37], [35, 30], [50, 5], [65, 30], [95, 37], [75, 60], [78, 90], [50, 77], [22, 90]];\\r\\n var fullStarCoords = [\\r\\n [[5, 37], [35, 30], [50, 5], [65, 30], [95, 37], [75, 60], [25, 60]],\\r\\n [[22, 90], [50, 77], [78, 90], [75, 60], [25, 60]]\\r\\n ];\\r\\n\\r\\n\\r\\n if ($('#' + id).length == 0) {\\r\\n return;\\r\\n }\\r\\n $('#' + id).html('');\\r\\n if(!layout4){\\r\\n var paper = new Raphael(id, starWidth * nbStars, starH);\\r\\n }else{\\r\\n var paper = new Raphael(id, 2*starWidth, 2*starH);\\r\\n }\\r\\n for (var iStar = 0; iStar < nbStars; iStar++) {\\r\\n var scaleFactor = starWidth / 100;\\r\\n var deltaX, deltaY;\\r\\n if(!layout4){\\r\\n deltaX = iStar * starWidth;\\r\\n deltaY = 0;\\r\\n }else{\\r\\n switch(nbStars){\\r\\n case 1:\\r\\n deltaX = starWidth * 0.5;\\r\\n deltaY = starH * 0.5;\\r\\n break;\\r\\n case 2:\\r\\n deltaX = iStar*starWidth;\\r\\n deltaY = starH * 0.5;\\r\\n break;\\r\\n case 3:\\r\\n if(iStar < 2){\\r\\n deltaX = iStar*starWidth;\\r\\n deltaY = 0;\\r\\n }else{\\r\\n deltaX = starWidth * 0.5;\\r\\n deltaY = starH;\\r\\n }\\r\\n break;\\r\\n case 4:\\r\\n deltaX = (iStar%2)*starWidth;\\r\\n deltaY = Math.floor(iStar/2)*starH;\\r\\n }\\r\\n }\\r\\n var coordsStr = pathFromCoords(starCoords);\\r\\n\\r\\n paper.path(coordsStr).attr({\\r\\n fill: fillColors[mode],\\r\\n stroke: 'none'\\r\\n }).transform('s' + scaleFactor + ',' + scaleFactor + ' 0,0 t' + (deltaX / scaleFactor) + ',' + (deltaY / scaleFactor));\\r\\n\\r\\n var ratio = Math.min(1, Math.max(0, rate * nbStars - iStar));\\r\\n var xClip = ratio * 100;\\r\\n if (xClip > 0) {\\r\\n for (var iPiece = 0; iPiece < fullStarCoords.length; iPiece++) {\\r\\n var coords = clipPath(fullStarCoords[iPiece], xClip);\\r\\n var star = paper.path(pathFromCoords(coords)).attr({\\r\\n fill: '#ffc90e',\\r\\n stroke: 'none'\\r\\n }).transform('s' + scaleFactor + ',' + scaleFactor + ' 0,0 t' + (deltaX / scaleFactor) + ',' + (deltaY / scaleFactor));\\r\\n }\\r\\n }\\r\\n paper.path(coordsStr).attr({\\r\\n fill: 'none',\\r\\n stroke: strokeColors[mode],\\r\\n 'stroke-width': 5 * scaleFactor\\r\\n }).transform('s' + scaleFactor + ',' + scaleFactor + ' 0,0 t' + (deltaX / scaleFactor) + ',' + (deltaY / scaleFactor));\\r\\n }\\r\\n}\\r\\n\\r\\n\\r\\nwindow.platform.subscribe(displayHelper);\\r\\n\\r\\n})();\\r\\n\",\"id\":\"http://www.france-ioi.org/modules/integrationAPI.01/installationAPI.01/pemFioi/buttonsAndMessages_resp.js\"},\"taskStyles-0.3_M\":{\"content\":\"* {\\n -moz-user-select: -moz-none;\\n -webkit-user-select: none;\\n -o-user-select: none;\\n user-select: none;\\n -khtml-user-select: none;\\n}\\n\\n.touch {\\n -ms-touch-action: none;\\n}\\n\\nhtml {\\n overflow-y: auto !important;\\n}\\n\\nbody {\\n font-family: Arial, sans-serif;\\n font-size: 16px;\\n margin: 0 auto;\\n position: relative;\\n}\\nbody > * {\\n margin: 0 auto;\\n}\\nbody * {\\n box-sizing: border-box;\\n}\\n\\na {\\n color: #4D87CE;\\n text-decoration: none;\\n}\\n\\nbutton,\\ninput[type=\\\"button\\\"] {\\n line-height: 1.2;\\n font-size: 16px;\\n}\\n.btn,\\ninput[type=button] {\\n display: inline-block;\\n padding: 6px 12px;\\n margin-bottom: 0;\\n font-size: 14px;\\n font-weight: 400;\\n line-height: 1.42857143;\\n text-align: center;\\n white-space: nowrap;\\n vertical-align: middle;\\n -ms-touch-action: manipulation;\\n touch-action: manipulation;\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n background-image: none;\\n border: 1px solid transparent;\\n border-radius: 4px;\\n color: #333;\\n background-color: #fff;\\n border-color: #ccc;\\n}\\n.btn-group {\\n position: relative;\\n display: inline-block;\\n vertical-align: middle;\\n}\\n.btn-group-vertical>.btn,\\n.btn-group>.btn {\\n position: relative;\\n float: left;\\n}\\n.btn-group .btn+.btn,\\n.btn-group .btn+.btn-group,\\n.btn-group .btn-group+.btn,\\n.btn-group .btn-group+.btn-group {\\n margin-left: -1px;\\n}\\n.btn-group>.btn:first-child {\\n margin-left: 0;\\n}\\n.btn-group>.btn:first-child:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.btn-group>.btn:last-child:not(:first-child) {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n.btn-group>.btn:not(:first-child):not(:last-child) {\\n border-radius: 0;\\n}\\n.btn-group>.btn.active,\\n.btn-group>.btn:active,\\n.btn-group>.btn:focus,\\n.btn-group>.btn:hover {\\n z-index: 2;\\n}\\n.btn.btn-xs {\\n padding: 1px 5px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\n\\n.btn-primary {\\n color: #fff;\\n background-color: #337ab7;\\n border-color: #2e6da4;\\n}\\n.btn-primary:hover {\\n color: #fff;\\n background-color: #286090;\\n border-color: #204d74;\\n}\\n.btn-default {\\n color: #333;\\n background-color: #fff;\\n border-color: #ccc;\\n}\\n.btn-default:hover {\\n color: #333;\\n background-color: #e6e6e6;\\n border-color: #adadad;\\n}\\n.btn-icon {\\n font-family: 'Courier New', Inconsolata, 'Roboto Mono', 'PT Mono', 'Ubuntu', monospace;\\n}\\n.selectable,\\ninput,\\ntextarea {\\n -moz-user-select: text;\\n -webkit-user-select: auto !important;\\n -o-user-select: text;\\n -khtml-user-select: text;\\n user-select: text;\\n}\\n\\n.borders, .borders td {\\n\\tborder: 1px solid black;\\n}\\n\\n.contentCentered {\\n text-align: center;\\n}\\n\\n.warningHeader { \\n margin: 10px 0px 10px 0px; \\n padding: 10px 10px 10px 10px; \\n background: #FFEEEE; \\n /*font-weight: bold;*/\\n border: 2px solid black; \\n border-radius: 6px;\\n }\\n#task h1,\\n.question h1 {\\n display: none;\\n margin-bottom: 10px;\\n margin-top: 10px;\\n}\\n#solution {\\n display: none;\\n margin-bottom: 50px;\\n margin-top: 0;\\n}\\n#taskIntro {\\n border: 1px solid #8d9daa;\\n margin: 10px 0;\\n padding: 0 10px;\\n font-weight: bold;\\n}\\n#taskContent {\\n text-align: justify;\\n}\\n.pythonIntro code {\\n cursor: pointer;\\n}\\n\\n/*#success,\\n#error {\\n font-weight: bold;\\n text-align: center;\\n}\\n#success {\\n color: blue;\\n}*/\\n\\n/**************************************************************/\\n/* TABS */\\n\\n#tabsContainer {\\n position: relative;\\n /*border-bottom: 2px solid #8d9daa;*/\\n border-bottom: 2px solid white;\\n min-width: 300px;\\n}\\n#tabsMenu {\\n /*text-align: center;*/\\n}\\n#tabsMenu .li {\\n display: inline-block;\\n position: relative;\\n width: 180px;\\n margin: 0;\\n background: #eeeeee;\\n border-radius: 6px 6px 0 0;\\n text-align: center;\\n}\\n#tabsMenu.moreTabs .li {\\n margin: 0 10px;\\n}\\n#tabsMenu .li.first {\\n border-radius: 0 6px 0 0;\\n}\\n#tabsMenu .li.lockedLevel {\\n background: #404040;\\n}\\n#tabsMenu .li.current {\\n background: white;\\n}\\n#tabsMenu .li::after {\\n content: '|';\\n color: #a5a5a5;\\n position: absolute;\\n top: 8px;\\n right: -1px;\\n}\\n#tabsMenu .li.current::after, \\n#tabsMenu .li.prev::after {\\n content: '';\\n}\\n#tabsMenu .li.current.lockedLevel {\\n padding-bottom: 1px;\\n border-bottom: 1px solid #c0c0c0;\\n background: #606060;\\n}\\n#tabsMenu .li a {\\n display: block;\\n padding: 8px;\\n text-decoration: none; \\n font-size: 14px;\\n}\\n#tabsMenu .li:not(.current) a {\\n color: #a5a5a5;\\n}\\n#tabsMenu .li .levelLabel {\\n margin-right: 1em;\\n}\\n[alkindi] #tabsMenu .li.current .levelLabel {\\n color: #88bb88;\\n}\\n#tabsMenu .li.lockedLevel a {\\n color: #ddd;\\n}\\n#tabsMenu .li a:focus {\\n outline: none;\\n}\\n#tabsMenu .li:not(.current) a:active {\\n background: #c4d3de;\\n}\\n#tabsMenu .li.lockedLevel a:active {\\n background: #6c7787;\\n}\\n[id^=stars_resp_alt_], #tabsMenuAlt {\\n display: none;\\n}\\nh1 span {\\n display: inline-block;\\n width: .8em;\\n height: .8em;\\n}\\nh1 .stars {\\n vertical-align: baseline;\\n}\\n.stars {\\n vertical-align: middle;\\n}\\n\\n/**************************************************************/\\n/* CONSIGNE */\\n\\n.consigne {\\n /*background: white;*/\\n background: #F5F5F5;\\n font-size: 16px;\\n color: #30242B;\\n padding: 0;\\n margin: 20px;\\n border-radius: 5px;\\n}\\n.consigne h3 {\\n display: block;\\n background: #4a90e2;\\n font-size: 16px;\\n color: white;\\n border-radius: 5px 5px 0 0;\\n text-align: center;\\n margin: 0;\\n padding: 13px;\\n}\\n[alkindi] .consigne h3 {\\n background: #88BB88;\\n}\\n[alkindi] .consigne h3 i {\\n display: none;\\n}\\n.consigne #text {\\n padding: 20px;\\n padding-bottom: 10px;\\n padding-top: 0px;\\n}\\n\\n/**************************************************************/\\n\\n.bestScore {\\n position: absolute;\\n right: 0;\\n top: .3em;\\n font-size: 1.2em;\\n}\\n#bestScore {\\n font-weight: bold;\\n}\\n\\n#popupMessage {\\n display: none;\\n}\\n#popupMessage .container {\\n position: relative;\\n margin: .5em 0;\\n padding: 8px;\\n}\\n#popupMessage.floatingMessage {\\n position: absolute;\\n z-index: 100;\\n top: 0;\\n left: 0;\\n height: 100%;\\n width: 100%;\\n background-color: gray;\\n background: rgba(0, 0, 0, .6);\\n}\\n#popupMessage.floatingMessage .container {\\n min-height: 100px;\\n max-width: 600px;\\n /*margin: 360px auto;*/\\n margin: 50vh auto;\\n border: 2px solid black;\\n background: white;\\n transform: translateY(-50%);\\n}\\n#popupMessage img.beaver {\\n position: absolute;\\n width: 90px;\\n left: 0px;\\n}\\n#popupMessage img.messageArrow {\\n position: absolute;\\n z-index: 1;\\n left: 100px;\\n top: 16px;\\n}\\n#popupMessage .message {\\n margin-left: 115px;\\n padding: 8px;\\n max-width: 500px;\\n border: 2px solid black;\\n border-radius: 8px;\\n text-align: justify;\\n}\\n#popupMessage.noAvatar img.beaver, #popupMessage.noAvatar img.messageArrow {\\n display: none;\\n}\\n#popupMessage.noAvatar .message {\\n margin-left: 0px;\\n border: none;\\n}\\n#popupMessage p {\\n margin: .5em 0 0;\\n}\\n#popupMessage p:first-child {\\n margin-top: 0;\\n}\\n#popupMessage input {\\n margin-top: 1em;\\n margin-left: 200px;\\n}\\n#popupMessage button {\\n margin-top: 1em;\\n margin-left: 200px;\\n padding: 5px 18px 5px 18px;\\n margin-bottom: 0.5em;\\n}\\n\\n.easy,\\n.medium,\\n.hard {\\n display: none;\\n}\\n\\n/**************************************************************/\\n/* ZONE_3 */\\n\\n#zone_3 {\\n width: 100%;\\n position: fixed;\\n height: 50px;\\n bottom: 0;\\n background: #eeeeee;\\n}\\n#displayHelperAnswering {\\n display: inline;\\n position: absolute;\\n right: 0;\\n background: #eeeeee;\\n border-radius: 10px 0 0 0;\\n height: 100%;\\n}\\n.layout_1 .noSolution #displayHelperAnswering,\\n.layout_2 .noSolution #displayHelperAnswering {\\n right: 50%;\\n transform: translateX(50%);\\n}\\n#displayHelper_validate,\\n#displayHelper_cancel {\\n display: inline-block;\\n margin-top: 10px;\\n}\\n#displayHelper_validate > div,\\n#displayHelper_cancel > div {\\n width: 150px;\\n border: none;\\n border-radius: 50px;\\n color: white;\\n font-weight: bold;\\n padding: 6px 12px;\\n font-size: 14px;\\n cursor: pointer;\\n text-align: center;\\n}\\n#displayHelper_validate > div i,\\n#displayHelper_cancel > div i {\\n display: none;\\n /*margin-right: 10px;*/\\n}\\n#displayHelper_validate > div {\\n background: #4a90e2;\\n margin-right: 10px;\\n}\\n#displayHelper_cancel > div {\\n background: #4a4a4a;\\n margin: 0 10px;\\n}\\n\\n[alkindi] #displayHelper_validate,\\n[alkindi] #displayHelper_cancel {\\n display: inline-block;\\n margin-top: 12px;\\n}\\n[alkindi] #displayHelper_validate > div,\\n[alkindi] #displayHelper_cancel > div {\\n border-radius: 5px;\\n width: 150px;\\n font-size: 16px;\\n text-align: center;\\n}\\n[alkindi] #displayHelper_validate > div i,\\n[alkindi] #displayHelper_cancel > div i {\\n display: none;\\n font-size: 14px;\\n}\\n[alkindi] #displayHelper_validate > div {\\n background: #88bb88;\\n margin-right: 10px;\\n}\\n[alkindi] #displayHelper_cancel > div {\\n background: #30242b;\\n margin: 0 10px;\\n}\\n\\n#displayHelper_saved {\\n margin: .6em;\\n}\\n#displayHelper_graderMessage, #displayHelper_saved {\\n /*margin: 16px 0px;*/\\n display: none;\\n}\\n\\n[id^=resp_switch] {\\n display: none;\\n}\\n\\n/**************************************************************/\\n/* ERROR */\\n#error {\\n display: inline-block;\\n background: red;\\n color: white;\\n border-radius: 5px;\\n position: fixed;\\n bottom: 0;\\n left: 0;\\n padding: 10px 30px 10px 20px;\\n max-width: 100%;\\n font-size: 1.2em;\\n cursor: pointer;\\n}\\n#error i:first-of-type {\\n margin-right: 10px;\\n}\\n#error i:last-of-type {\\n font-size: 12px;\\n position: absolute;\\n top: 5px;\\n right: 7px;\\n}\\n\\n/**************************************************************/\\n#choose-view {\\n margin-bottom: 1em;\\n text-align: center;\\n display: none; /* useless div ? */\\n}\\n#choose-view .choose-view-button {\\n margin: 0 10px;\\n}\\n\\n#task {\\n\\tmargin: 0 auto;\\n}\\n#task.largeScreen {\\n\\twidth: 1200px;\\n}\\n#taskContent:after {\\n content: \\\" \\\";\\n display: table;\\n clear: both;\\n}\\n#zone_0 {\\n width: 100%;\\n background: #eeeeee;\\n}\\n#zone_12 {\\n position: relative;\\n float: left;\\n width: 100%;\\n}\\n#zone_1, #zone_2,\\n.zone_1, .zone_2 {\\n\\tmargin: 0 auto;\\n}\\n#zone_2 {\\n position: relative;\\n}\\n.largeScreen #zone_1,\\n.largeScreen #zone_2\\n{\\n\\tvertical-align: top;\\n\\tbox-sizing: content-box;\\n\\tfloat: left;\\n}\\n.largeScreen #zone_1 {\\n\\twidth: 430px;\\n}\\n[class^=layout_] [id^=zone] {\\n float: left;\\n /*border: 2px dashed #a7e2a7;*/\\n}\\n#main_header {\\n position: fixed;\\n top: 0;\\n background: white;\\n z-index: 10;\\n}\\n#zone_012 {\\n /*overflow: auto;*/\\n width: 100%;\\n}\\n#task [id^=scroll_arr_] {\\n display: none;\\n background: #4a90e2;\\n width: 30px;\\n height: 30px;\\n font-size: 18px;\\n color: white;\\n position: fixed;\\n text-align: center;\\n border-radius: 15px;\\n cursor: pointer;\\n}\\n#task[alkindi] [id^=scroll_arr_] {\\n background: #88bb88;\\n}\\n#task [id^=scroll_arr_] i {\\n margin-top: 50%;\\n transform: translateY(-50%);\\n}\\n#task #scroll_arr_up,\\n#task #scroll_arr_down {\\n right: 30px;\\n}\\n#task #scroll_arr_up {\\n top: 103px;\\n}\\n#task #scroll_arr_down {\\n bottom: 60px;\\n}\\n#task #scroll_arr_left,\\n#task #scroll_arr_right {\\n bottom: 60px;\\n}\\n#task #scroll_arr_left {\\n left: 10px;\\n}\\n#task #scroll_arr_right {\\n right: 30px;\\n}\\n\\n/**************************************************************/\\n/* SIDE ZONE */\\n#side_zone {\\n display: none;\\n}\\n#side_zone.show {\\n display: block;\\n}\\n\\n/**************************************************************/\\n/* LAYOUT 1 (large screen) */\\n#main_header[class^=layout_] {\\n height: 71px;\\n}\\n#main_header[class^=layout_] table {\\n width: 100% !important;\\n margin: 0 !important;\\n min-width: 300px;\\n}\\n#main_header.layout_1 td,\\n#main_header.layout_2 td,\\n#main_header.layout_3 td,\\n#main_header.layout_4 td {\\n text-align: center;\\n}\\n.layout_1 h1,\\n.layout_2 h1,\\n.layout_3 h1,\\n.layout_4 h1 {\\n padding-left: 1em;\\n}\\n.layout_1 #tabsContainer #tabsMenu .resp_tabs, \\n.layout_2 #tabsContainer #tabsMenu .resp_tabs,\\n.layout_3 #tabsContainer #tabsMenu:not(.compact) .resp_tabs,\\n.layout_1 #tabsContainer #tabsMenu .resp_version_arr, \\n.layout_2 #tabsContainer #tabsMenu .resp_version_arr,\\n.layout_3 #tabsContainer #tabsMenu:not(.compact) .resp_version_arr {\\n display: none;\\n}\\n\\n#task.layout_1,\\n#task.layout_2,\\n#task.layout_3,\\n#task.layout_4 {\\n width: 100%;\\n}\\n[class^=layout_] #taskCont {\\n margin: auto;\\n} \\n#zone_12 {\\n border: none;\\n margin-bottom: 50px;\\n}\\n.layout_1 #zone_1 {\\n width: 30%;\\n}\\n.layout_1 #zone_2 {\\n width: 70%;\\n height: 100%;\\n position: absolute;\\n right: 0;\\n}\\n.layout_1 #zone_3.noSolution.vertical_scroll,\\n.layout_2 #zone_3.noSolution.vertical_scroll {\\n background: none;\\n}\\n.layout_1 #zone_3 #showSolution,\\n.layout_2 #zone_3 #showSolution,\\n.layout_1 #zone_3 #showExercice,\\n.layout_2 #zone_3 #showExercice {\\n position: absolute;\\n width: 150px;\\n height: 45px;\\n text-align: center;\\n font-weight: bold;\\n font-size: 14px;\\n color: #787878;\\n padding: 15px;\\n border-radius: 0 0 10px 10px;\\n cursor: pointer;\\n}\\n.layout_1 #zone_3 .selected,\\n.layout_2 #zone_3 .selected {\\n background: white;\\n}\\n[alkindi].layout_1 #zone_3 .selected,\\n[alkindi].layout_2 #zone_3 .selected {\\n color: #88bb88 !important;\\n}\\n.layout_1 #zone_3 #showSolution,\\n.layout_2 #zone_3 #showSolution {\\n left: 150px;\\n}\\n.layout_1 #zone_3 #showExercice,\\n.layout_2 #zone_3 #showExercice {\\n left: 0;\\n}\\n.layout_1 #zone_3 [id^=show] i,\\n.layout_2 #zone_3 [id^=show] i {\\n margin-right: 10px;\\n}\\n\\n.layout_1 .consigne {\\n min-height: 30%;\\n}\\n\\n.layout_1 .consigne #example,\\n.layout_2 .consigne #example,\\n.layout_3 .consigne #example {\\n /*border: 2px dashed #a7e2a7;*/\\n padding: 10px;\\n}\\n\\n/**************************************************************/\\n/* LAYOUT 2 (>= 800px) */\\n.layout_2 #zone_1, \\n.layout_2 #zone_2,\\n.layout_2 #zone_3 {\\n width: 100%;\\n}\\n.layout_2 .consigne #text {\\n float: left;\\n width: 70%;\\n}\\n.layout_2 .consigne.no_example #text {\\n float: left;\\n width: 100%;\\n}\\n.layout_2 .consigne #example {\\n float: right;\\n width: 30%;\\n}\\n\\n/**************************************************************/\\n/* LAYOUT 3 */\\n.layout_3 #zone_1, \\n.layout_3 #zone_2,\\n.layout_3 #zone_3 {\\n width: 100%;\\n}\\n#main_header.layout_3 span,\\n#main_header.layout_4 span {\\n display: none;\\n}\\n.layout_3 h1,\\n.layout_4 h1 {\\n font-size: 25px;\\n}\\n.layout_3 #tabsMenu .li {\\n width: 160px;\\n}\\n.layout_3 #tabsContainer #tabsMenu.compact .resp_tabs {\\n font-size: 14px;\\n padding: 8px;\\n color: #4a90e2;\\n}\\n.layout_3 #tabsContainer #tabsMenu.compact .resp_tabs i {\\n color: black;\\n}\\n.layout_3 #tabsContainer #tabsMenu.compact a:not(.resp_version_arr),\\n.layout_4 #tabsContainer #tabsMenu.compact a {\\n display: none;\\n}\\n.layout_3 #tabsContainer #tabsMenu.compact a.resp_version_arr {\\n width: 2em;\\n padding: 0;\\n opacity: 0.5;\\n}\\n.layout_3 #tabsContainer #tabsMenu.compact a.resp_right_arr {\\n float: right;\\n}\\n.layout_3 #tabsContainer #tabsMenu.compact a.resp_left_arr {\\n float: left;\\n}\\n.layout_3 .li > a.resp_version_arr {\\n display: none !important;\\n}\\n.layout_3 #tabsMenu.compact {\\n width: 90%;\\n margin: 0 5%;\\n}\\n.layout_3 #tabsMenu.compact .li:not(.current),\\n.layout_4 #tabsMenu.compact .li:not(.current) {\\n display: none;\\n}\\n.layout_3 #tabsMenu.compact .li.current {\\n width: 100%;\\n border-radius: 6px 6px 0 0;\\n}\\n.layout_3 #error,\\n.layout_4 #error {\\n top: 50%;\\n left: 50%;\\n bottom: auto;\\n transform: translate(-50%,-50%);\\n}\\n.layout_3 #zone_3 {\\n background: #eeeeee;\\n min-width: 366px;\\n}\\n.layout_3 #zone_3 > div,\\n.layout_4 #zone_3 > div {\\n display: block;\\n}\\n.layout_3 #zone_3 #showExercice,\\n.layout_4 #zone_3 #showExercice {\\n display: none;\\n}\\n.layout_3 [id^=resp_sw],\\n.layout_3 #showSolution {\\n background: #eeeeee;\\n color: #4a90e2;\\n height: 50px;\\n width: 50px;\\n cursor: pointer;\\n float: left;\\n}\\n[alkindi].layout_3 [id^=resp_sw],\\n[alkindi].layout_3 #showSolution,\\n[alkindi].layout_4 [id^=resp_sw],\\n[alkindi].layout_4 #showSolution {\\n color: #6d6d6d;\\n}\\n.layout_3 div.selected {\\n background: #4a90e2;\\n color: white;\\n}\\n[alkindi].layout_3 div.selected,\\n[alkindi].layout_4 div.selected {\\n background: white;\\n color: #88bb88;\\n}\\n.layout_3 #showSolution {\\n float: right;\\n}\\n.layout_3 #zone_3 #showSolution.selected,\\n.layout_4 #zone_3 #showSolution.selected {\\n background: #4a90e2;\\n color: white;\\n}\\n[alkindi].layout_3 #zone_3 #showSolution.selected,\\n[alkindi].layout_4 #zone_3 #showSolution.selected {\\n background: white;\\n color: #88bb88;\\n}\\n\\n.layout_3 .compact [id^=resp_sw] i,\\n.layout_3 .compact #showSolution i,\\n.layout_4 [id^=resp_sw] i,\\n.layout_4 #showSolution i {\\n margin-top: 50%;\\n margin-left: 50%;\\n transform: translate(-50%,-50%);\\n}\\n.layout_3 .compact [id^=resp_sw] span,\\n.layout_3 .compact #showSolution span,\\n.layout_4 [id^=resp_sw] span,\\n.layout_4 #showSolution span {\\n display: none;\\n}\\n\\n.layout_3 [id^=resp_sw],\\n.layout_3 #showSolution {\\n width: auto;\\n font-size: 14px;\\n padding: 15px;\\n font-weight: bold;\\n}\\n.layout_3 [id^=resp_sw] i,\\n.layout_3 #showSolution i {\\n margin: 0 10px 0 0;\\n transform: none;\\n}\\n.layout_3 [id^=resp_sw] span,\\n.layout_3 #showSolution span {\\n display: inline;\\n position: relative;\\n}\\n.layout_3 #resp_switch_2 {\\n border-right: 1px solid #d5d5d5;\\n}\\n\\n.layout_3 .hideButtons [id^=resp_sw],\\n.layout_3 .hideButtons #showSolution {\\n width: auto;\\n font-size: 14px;\\n padding: 15px;\\n font-weight: bold;\\n}\\n.layout_3 .hideButtons [id^=resp_sw] i,\\n.layout_3 .hideButtons #showSolution i {\\n margin: 0 10px 0 0;\\n transform: none;\\n}\\n.layout_3 .hideButtons [id^=resp_sw] span,\\n.layout_3 .hideButtons #showSolution span {\\n display: inline;\\n position: relative;\\n}\\n.layout_3 .hideButtons #resp_switch_2 {\\n border-right: 1px solid #d5d5d5;\\n}\\n.layout_3 #displayHelperAnswering {\\n position: static;\\n float: left;\\n}\\n[alkindi].layout_3 #displayHelperAnswering,\\n[alkindi].layout_4 #displayHelperAnswering {\\n background: white;\\n border-radius: 0;\\n}\\n.layout_3 .hideButtons #displayHelperAnswering,\\n.layout_4 .hideButtons #displayHelperAnswering {\\n display: none;\\n}\\n\\n.layout_3 .compact #displayHelper_cancel > div {\\n padding: 6px 8px;\\n}\\n.layout_3 .compact #displayHelper_cancel > div span {\\n display: none\\n}\\n.layout_3 .compact #displayHelper_cancel > div i {\\n margin-right: 0;\\n}\\n.layout_3 #displayHelper_validate > div span {\\n font-size: 14px;\\n}\\n.layout_3 #displayHelper_validate > div i {\\n margin-right: 5px;\\n}\\n[alkindi].layout_3 #displayHelper_validate > div {\\n width: 100px;\\n}\\n.layout_3 .compact #displayHelper_cancel > div,\\n.layout_4 #displayHelper_cancel > div,\\n.layout_4 #displayHelper_validate > div {\\n width: auto;\\n border-radius: 50px;\\n}\\n[alkindi].layout_3 .compact #displayHelper_cancel > div {\\n padding: 6px 8px;\\n}\\n[alkindi].layout_3 .compact #displayHelper_cancel > div span {\\n display: none\\n}\\n.layout_3 .compact #displayHelper_cancel > div i,\\n/*[alkindi].layout_3 #displayHelper_validate > div i,*/\\n.layout_4 #displayHelper_cancel > div i,\\n.layout_4 #displayHelper_validate > div i {\\n display: inline;\\n}\\n.layout_3 #displayHelper_cancel > div i {\\n margin-right: 0;\\n}\\n[alkindi].layout_3 #displayHelper_validate > div span,\\n[alkindi].layout_3 #displayHelper_cancel > div span {\\n font-size: 14px;\\n}\\n[alkindi].layout_3 #displayHelper_validate > div i {\\n margin-right: 5px;\\n}\\n\\n/**************************************************************/\\n/* LAYOUT 4 */\\n\\n#task.layout_4 #scroll_arr_up,\\n#task.layout_4 #scroll_arr_down,\\n#task.layout_4 #scroll_arr_right {\\n right: 60px;\\n}\\n#task.layout_4 #scroll_arr_down,\\n#task.layout_4 #scroll_arr_left,\\n#task.layout_4 #scroll_arr_right {\\n bottom: 10px;\\n}\\n\\n.layout_4 #zone_12 {\\n margin-right: 50px;\\n margin-bottom: 0;\\n}\\n\\n.layout_4 #zone_3 {\\n width: 50px;\\n height: 100%;\\n position: fixed;\\n right: 0;\\n bottom: 0;\\n background: #eeeeee;\\n}\\n.layout_4 #tabsContainer {\\n display: none;\\n}\\n.layout_4 .levelVersionCont {\\n display: block;\\n margin-top: 50%;\\n transform: translateY(-50%);\\n}\\n.layout_4 [id^=stars_resp_] {\\n display: none;\\n}\\n.layout_4 [id^=stars_resp_alt_] {\\n display: block;\\n}\\n.layout_4 #tabsMenu .li {\\n width: 50px;\\n height: 50px;\\n position: fixed;\\n right: 0;\\n bottom: 240px;\\n background: #eeeeee;\\n z-index: 10;\\n cursor: pointer;\\n /*display: none;*/\\n}\\n.layout_4 #tabsContainer #tabsMenu a {\\n display: none;\\n}\\n.layout_4 #tabsMenu .li:not(.current) {\\n display: none;\\n}\\n.layout_4 #tabsMenu .li .levelLabel {\\n display: none;\\n} \\n.layout_4 #tabsMenuAlt {\\n background: #eeeeee;\\n position: fixed;\\n right: 0;\\n bottom: 240px;\\n z-index: 20;\\n border-left: 2px solid #a5a5a5;\\n}\\n.layout_4 #tabsMenuAlt > * {\\n display: inline-block;\\n vertical-align: middle;\\n}\\n.layout_4 #tabsMenuAlt > span {\\n margin: 0 10px;\\n color: #4a90e2;\\n}\\n[alkindi].layout_4 #tabsMenuAlt > span {\\n color: #88bb88;\\n}\\n.layout_4 #tabsMenuAlt > .stars {\\n width: 50px;\\n height: 50px;\\n border-left: 2px solid #a5a5a5;\\n cursor: pointer;\\n}\\n.layout_4 #tabsMenuAlt > span + .stars {\\n border: none;\\n}\\n.layout_4 #tabsMenuAlt > .stars > * {\\n margin: 50% 50%;\\n transform: translate(-50%,-50%);\\n}\\n.layout_4 [id^=resp_sw],\\n.layout_4 #showSolution {\\n position: fixed;\\n /*background: white;*/\\n background: #eeeeee;\\n /*color: #4a90e2;*/\\n height: 50px;\\n width: 50px;\\n cursor: pointer;\\n /*font-size: 16px;*/\\n}\\n.layout_4 div.selected {\\n background: #4a4a4a;\\n color: white;\\n}\\n.layout_4 #resp_switch_1 {\\n right: 0;\\n bottom: 190px;\\n border-top: 1px solid #d5d5d5;\\n}\\n\\n.layout_4 #resp_switch_2 {\\n right: 0;\\n bottom: 140px;\\n}\\n.layout_4 .hideButtons #resp_switch_2 {\\n border-bottom: 1px solid #d5d5d5;\\n}\\n.layout_4 .hideButtons #resp_switch_1 {\\n border-top: none;\\n}\\n.layout_4 #showSolution {\\n bottom: 0;\\n right: 0;\\n}\\n.layout_4 #displayHelperAnswering {\\n position: fixed;\\n right: 0;\\n bottom: 50px;\\n background: white;\\n border-radius: 0;\\n width: 50px;\\n height: 90px;\\n}\\n.layout_4 #displayHelper_cancel,\\n.layout_4 #displayHelper_validate {\\n display: inline-block;\\n margin-left: 10px;\\n}\\n.layout_4 #displayHelper_validate {\\n margin-bottom: 10px;\\n}\\n.layout_4 #displayHelper_cancel div,\\n.layout_4 #displayHelper_validate div {\\n margin: 0;\\n padding: 6px 8px;\\n}\\n.layout_4 #displayHelper_cancel span,\\n.layout_4 #displayHelper_validate span {\\n display: none;\\n}\\n.layout_4 #displayHelper_cancel i,\\n.layout_4 #displayHelper_validate i {\\n margin: 0;\\n}\\n\\n/**************************************************************/\\n\\n#displayHelperAnswering {\\n\\t/*padding: 10px;*/\\n}\\n\\n.exemple\\n{\\n\\tmargin: auto;\\n\\tmargin-top: 10px;\\n\\ttext-align: center;\\n\\tborder: 1px solid black;\\n\\tborder-radius: 1px;\\n\\twidth: 290px;\\n}\\n\\n.grille, .boutons_sujet\\n{\\n\\tdisplay: inline-block;\\n\\tvertical-align: middle;\\n\\tmargin: auto;\\n}\\n\\n.boutons_sujet\\n{\\n\\tmargin-top: 20px; \\n}\\n\\n\\n.objectif\\n{\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\tmargin: auto;\\n\\tmargin-top: 20px;\\n}\\n\\n\\n.container_inverse\\n{\\n\\tdisplay: inline-block;\\n\\twidth: 100%;\\n}\\n\\n/* css présent à l'origine dans tous les sujets et déplacé ci-dessous */\\n\\n#anim_container\\n{\\n\\ttext-align: center;\\n}\\n\\n#anim_container table {\\n\\tmargin: auto;\\n}\\n\\n#anim {\\n\\tdisplay: inline-block;\\n\\tmargin-top: 20px;\\n}\\n\\n#feedback {\\n\\theight: 1em;\\n\\tmargin-top: 0.5em;\\n\\tmargin-bottom: 0.1em;\\n\\ttext-align: center;\\n\\tfont-weight: bold;\\n\\tcolor: red; \\n}\\n\\n#showSolutionButton {\\n display: none;\\n margin-top: 24px;\\n}\\n\",\"id\":\"http://www.france-ioi.org/modules/pemFioi/taskStyles-0.3_M.css\",\"type\":\"stylesheet\"},\"buttonsAndMessages\":{\"content\":\"(function() {\\r\\n\\r\\n'use strict';\\r\\n\\r\\n/*\\r\\n * Implementation of the displayHelper API.\\r\\n *\\r\\n * Copyright (c) 2012 Association France-ioi, MIT License http://opensource.org/licenses/MIT\\r\\n *\\r\\n * See documentation for more information.\\r\\n */\\r\\n\\r\\nwindow.displayHelper = {\\r\\n loaded: false,\\r\\n timeLoaded: 0,\\r\\n checkAnswerInterval: null,\\r\\n prevAnswer: '',\\r\\n readOnly: false,\\r\\n savedAnswer: '',\\r\\n submittedAnswer: '',\\r\\n submittedScore: 0,\\r\\n hasAnswerChanged: true,\\r\\n taskSelector: '#task',\\r\\n hideValidateButton: false,\\r\\n hideRestartButton: false,\\r\\n confirmRestartAll: true,\\r\\n showScore: false,\\r\\n refreshMessages: true,\\r\\n stoppedShowingResult: false,\\r\\n previousMessages: {},\\r\\n popupMessageShown: false,\\r\\n\\r\\n thresholds: {},\\r\\n // Legacy settings for old tasks ; new ones are expected to use thresholds\\r\\n thresholdEasy: 60,\\r\\n thresholdMedium: 120,\\r\\n\\r\\n timeoutMinutes: 5,\\r\\n avatarType: \\\"beoi\\\",\\r\\n bUseFullWidth: false,\\r\\n\\r\\n hasLevels: false,\\r\\n pointsAsStars: true, // TODO: false as default\\r\\n unlockedLevels: 5,\\r\\n forceNextTaskAfter: -1,\\r\\n neverHadHard: false,\\r\\n showMultiversionNotice: false,\\r\\n taskLevel: '',\\r\\n\\r\\n // Defaults\\r\\n levels: ['easy', 'medium', 'hard'],\\r\\n levelsIdx: { easy: 0, medium: 1, hard: 2 },\\r\\n maxStars: 4,\\r\\n popupMessageHandler: null,\\r\\n\\r\\n formatTranslation: function(s, args) { return s.replace(/\\\\{([^}]+)\\\\}/g, function(_, match){ return args[match]; }); },\\r\\n\\r\\n languageStrings: {\\r\\n fr: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"version facile\\\",\\r\\n levelVersionName_medium: \\\"version moyenne\\\",\\r\\n levelVersionName_hard: \\\"version difficile\\\",\\r\\n levelVersionName_easy_stars: \\\"version à 2 étoiles\\\",\\r\\n levelVersionName_medium_stars: \\\"version à 3 étoiles\\\",\\r\\n levelVersionName_hard_stars: \\\"version à 4 étoiles\\\",\\r\\n levelName_easy: \\\"Facile\\\",\\r\\n levelName_medium: \\\"Moyen\\\",\\r\\n levelName_hard: \\\"Difficile\\\",\\r\\n warningTimeout: \\\"<p>Attention, cela fait plus de {0} minutes que vous êtes sur cette question.</p><p>Vous devriez sans doute changer de sujet, en cliquant sur le bouton tout en haut à droite.</p>\\\",\\r\\n alright: \\\"D'accord\\\",\\r\\n moveOn: \\\"Passer à la suite\\\",\\r\\n solvedMoveOn: \\\"Vous avez entièrement résolu cette question, passez à une autre question.\\\",\\r\\n confirmRestart: \\\"Êtes-vous certain de vouloir recommencer cette version ?\\\",\\r\\n yes: \\\"Oui\\\",\\r\\n no: \\\"Non\\\",\\r\\n tryHardLevel: \\\"Nous vous proposons d'essayer la version 4 étoiles.\\\",\\r\\n tryMediumLevel: \\\"Nous vous proposons d'essayer la version 3 étoiles.\\\",\\r\\n tryNextTask: \\\"Nous vous proposons de passer à un autre sujet. S'il vous reste du temps, vous reviendrez plus tard essayer la version suivante.\\\",\\r\\n yourScoreIsNow: \\\"Votre score est maintenant :\\\",\\r\\n worseScoreStays: \\\"C'est moins bien qu'avant ; votre score reste :\\\",\\r\\n scoreStays: \\\"Votre score reste le même :\\\",\\r\\n score: \\\"Score :\\\",\\r\\n noPointsForLevel: \\\"Vous n'avez pas encore de points sur cette version.\\\",\\r\\n outOf: \\\" sur \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Essayez de faire encore mieux, ou passez à une autre question.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Essayez de faire encore mieux, ou passez à une version plus difficile.\\\",\\r\\n bestPossibleScoreCongrats: \\\"C'est le meilleur score possible sur ce sujet ; félicitations !\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Pour obtenir plus de points, passez à une version plus difficile.\\\",\\r\\n youDidBetterBefore: \\\"Vous aviez fait mieux avant.\\\",\\r\\n scoreStays2: \\\"Votre score reste le même.\\\",\\r\\n reloadBestAnswer: \\\"Rechargez votre meilleure réponse.\\\",\\r\\n noAnswerSaved: \\\"Aucune réponse actuellement enregistrée pour cette version.\\\",\\r\\n validate: \\\"Valider\\\",\\r\\n restart: \\\"Recommencer\\\",\\r\\n harderLevelSolved: \\\"Attention : vous avez déjà résolu une version plus difficile. Vous ne pourrez pas gagner de points supplémentaires avec cette version.\\\",\\r\\n showLevelAnyway: \\\"Voir quand même\\\",\\r\\n scoreObtained: \\\"Score obtenu :\\\",\\r\\n hardVersionTakesTime: \\\"Résoudre une {0} peut vous prendre beaucoup de temps ; songez en priorité à répondre aux questions en {1} pour gagner des points rapidement.\\\",\\r\\n illKeepThatInMind: \\\"J'y prendrai garde\\\",\\r\\n harderLevelAvailable: \\\"Notez que pour cette question, vous pouvez résoudre directement une version plus difficile que celle-ci.\\\",\\r\\n lockedLevel: \\\"Cette version est verrouillée. Résolvez la précédente pour l'afficher !\\\",\\r\\n lockedLevelDev: \\\"Cette version est normalement verrouillée, et la précédente doit être résolue avant de pouvoir afficher cette version. Comme vous avez chargé ce sujet en local, vous pouvez néanmoins la voir.\\\",\\r\\n gradeThisAnswer: \\\"Évaluer cette réponse\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Enregistrer votre réponse\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Votre réponse a été enregistrée. Vous pouvez la modifier, ou bien {0} et recommencer.\\\",\\r\\n cancelIt: \\\"l'annuler\\\",\\r\\n warningDifferentAnswerSaved: \\\"Attention : une réponse différente est enregistrée.\\\",\\r\\n youMay: \\\"Vous pouvez {0}.\\\",\\r\\n reloadIt: \\\"la recharger\\\",\\r\\n saveThisNewAnswer: \\\"Enregistrer cette nouvelle réponse\\\",\\r\\n\\r\\n gradingInProgress: \\\"Évaluation en cours\\\",\\r\\n scoreIs: \\\"Votre score est de :\\\",\\r\\n point: \\\"point\\\",\\r\\n points: \\\"points\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Le concours étant terminé, votre réponse n'est pas enregistrée et votre score reste de :\\\",\\r\\n scoreWouldBecome: \\\"Avec cette réponse, votre score serait :\\\",\\r\\n reloadValidAnswer: \\\"Rechargez la réponse validée.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Le concours est terminé : votre réponse n'est pas enregistrée.\\\",\\r\\n scoreWouldStay: \\\"Avec cette réponse, votre score resterait le même :\\\",\\r\\n answerNotSavedContestOver: \\\"Le concours étant terminé, votre réponse n'a pas été enregistrée. Vous pouvez {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"recharger la réponse que vous avez soumise\\\",\\r\\n difficultyWarning: \\\"<strong>Attention :</strong> résoudre cette version prend du temps.<br/>Vous pourrez résoudre bien plus rapidement les versions 2 et 3 étoiles d'autres sujets.\\\",\\r\\n enemyWarning: \\\"<strong>Attention :</strong> dans ce défi, l'ordinateur vous empêchera de trouver la solution par hasard.\\\"\\r\\n },\\r\\n en: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"easy version\\\",\\r\\n levelVersionName_medium: \\\"medium version\\\",\\r\\n levelVersionName_hard: \\\"hard version\\\",\\r\\n levelVersionName_easy_stars: \\\"2 stars version\\\",\\r\\n levelVersionName_medium_stars: \\\"3 stars version\\\",\\r\\n levelVersionName_hard_stars: \\\"4 stars version\\\",\\r\\n levelName_easy: \\\"Easy\\\",\\r\\n levelName_medium: \\\"Medium\\\",\\r\\n levelName_hard: \\\"Hard\\\",\\r\\n warningTimeout: \\\"<p>Warning, it has been more than {0} minutes since you started working on this task.</p><p>You should probably switch to a diffrent task, by clicking on the button on the top-right.</p>\\\",\\r\\n alright: \\\"Alright\\\",\\r\\n moveOn: \\\"Move on\\\",\\r\\n solvedMoveOn: \\\"You solved this task completely, move on to another task.\\\",\\r\\n confirmRestart: \\\"Are you sure you want to restart this version?\\\",\\r\\n yes: \\\"Yes\\\",\\r\\n no: \\\"No\\\",\\r\\n tryHardLevel: \\\"We suggest you try the 4 stars version.\\\",\\r\\n tryMediumLevel: \\\"We suggest you try the 3 stars version.\\\",\\r\\n tryNextTask: \\\"We suggest you try the next task. If you still have time, come back later and try the next version of this task.\\\",\\r\\n yourScoreIsNow: \\\"Your score is now:\\\",\\r\\n worseScoreStays: \\\"This is not as good as before. Your score stays:\\\",\\r\\n scoreStays: \\\"Your score stays the same:\\\",\\r\\n score: \\\"Score:\\\",\\r\\n noPointsForLevel: \\\"You have not received any points yet on this version.\\\",\\r\\n outOf: \\\" out of \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Try to do even better, or move on to another task.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Try to do even better, or move on to a more difficult version.\\\",\\r\\n bestPossibleScoreCongrats: \\\"This is the best possible score on this task, congratulations!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"To obtain more points, move on to a harder version of this task.\\\",\\r\\n youDidBetterBefore: \\\"You did better before.\\\",\\r\\n scoreStays2: \\\"Your score stays the same.\\\",\\r\\n reloadBestAnswer: \\\"Reload your best answer.\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"Validate\\\",\\r\\n restart: \\\"Restart\\\",\\r\\n harderLevelSolved: \\\"Warning: you already solved a harder version of this task. You won't be able to obtain extra points with this version.\\\",\\r\\n showLevelAnyway: \\\"Show it to me anyways.\\\",\\r\\n scoreObtained: \\\"Obtained score:\\\",\\r\\n hardVersionTakesTime: \\\"Solving a {0} can take a lot of time. Consider working on the {1} to gain points quickly.\\\",\\r\\n illKeepThatInMind: \\\"I'll consider it.\\\",\\r\\n harderLevelAvailable: \\\"Note that for this task, you may try to directly work on a harder version than this one.\\\",\\r\\n lockedLevel: \\\"This version is locked. Solve the previous version to display it!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Grade this answer\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Save this answer\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Your answer has been saved. You can modify it, or {0} and restart.\\\",\\r\\n cancelIt: \\\"cancel it\\\",\\r\\n warningDifferentAnswerSaved: \\\"Warning: a different answer was saved before.\\\",\\r\\n youMay: \\\"You may {0}.\\\",\\r\\n reloadIt: \\\"reload it\\\",\\r\\n saveThisNewAnswer: \\\"Save this new answer\\\",\\r\\n\\r\\n gradingInProgress: \\\"Grading in process\\\",\\r\\n scoreIs: \\\"Your score is:\\\",\\r\\n point: \\\"point\\\",\\r\\n points: \\\"points\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"The contest being over, your new answer was not saved and your score stays:\\\",\\r\\n scoreWouldBecome: \\\"With this answer, your score would be:\\\",\\r\\n reloadValidAnswer: \\\"Reload the validated answer.\\\",\\r\\n contestOverAnswerNotSaved: \\\"The contest being over, your new answer was not saved.\\\",\\r\\n scoreWouldStay: \\\"With this answer, your score would stay the same:\\\",\\r\\n answerNotSavedContestOver: \\\"The contest being over, your answer was not saved. You may {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"reload the validated answer\\\",\\r\\n difficultyWarning: \\\"<strong>Warning:</strong> solving this version takes time.<br/>You would solve the 2 or 3 star versions of other tasks more quickly.\\\",\\r\\n enemyWarning: \\\"<strong>Warning:</strong> in this challenge, the computer will make sure you don't find the solution by chance.\\\"\\r\\n },\\r\\n sv: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"lätt version\\\",\\r\\n levelVersionName_medium: \\\"medelsvår version\\\",\\r\\n levelVersionName_hard: \\\"svår version\\\",\\r\\n levelVersionName_easy_stars: \\\"2-stjärnig version\\\",\\r\\n levelVersionName_medium_stars: \\\"3-stjärnig version\\\",\\r\\n levelVersionName_hard_stars: \\\"4-stjärnig version\\\",\\r\\n levelName_easy: \\\"Lätt\\\",\\r\\n levelName_medium: \\\"Medelsvår\\\",\\r\\n levelName_hard: \\\"Svår\\\",\\r\\n warningTimeout: \\\"<p>Varning: det har gått mer än {0} minuter sedan du började med den här uppgiften. </p><p>Du borde kanske byta till en annan uppgift, genom att klicka på knappen uppe till höger.</p>\\\",\\r\\n alright: \\\"Okej\\\",\\r\\n moveOn: \\\"Gå vidare\\\",\\r\\n solvedMoveOn: \\\"Du löste uppgiften helt! Gå nu vidare till en annan uppgift.\\\",\\r\\n confirmRestart: \\\"Är du säker på att du vill börja om med den här versionen?\\\",\\r\\n yes: \\\"Ja\\\",\\r\\n no: \\\"Nej\\\",\\r\\n tryHardLevel: \\\"Vi föreslår att du provar den 4-stjärniga versionen.\\\",\\r\\n tryMediumLevel: \\\"Vi föreslår att du provar den 3-stjärniga versionen.\\\",\\r\\n tryNextTask: \\\"Vi föreslår att du provar nästa uppgift. Kom tillbaka senare och prova en svårare version av den här uppgiften.\\\",\\r\\n yourScoreIsNow: \\\"Din poäng är nu:\\\",\\r\\n worseScoreStays: \\\"Det är inte lika bra som tidigare. Poängen fortfarande:\\\",\\r\\n scoreStays: \\\"Din poäng är fortfarande:\\\",\\r\\n score: \\\"Poäng:\\\",\\r\\n noPointsForLevel: \\\"Du har inte fått några poäng än på den här versionen.\\\",\\r\\n outOf: \\\" utav \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Försök klara det ännu bättre, eller gå vidare till en annan uppgift.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Försök klara det ännu bättre, eller gå vidare till en svårare version.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Detta är högsta möjliga poäng på den här uppgiften. Grattis!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"För att få mer poäng, gå vidare till en svårare version av den här uppgiften.\\\",\\r\\n youDidBetterBefore: \\\"Det gick bättre tidigare.\\\",\\r\\n scoreStays2: \\\"Din poäng ändras inte.\\\",\\r\\n reloadBestAnswer: \\\"Ladda in ditt bästa svar.\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"Kontrollera svaret\\\",\\r\\n restart: \\\"Börja om\\\",\\r\\n harderLevelSolved: \\\"Varning: du har redan löst en svårare version av den här uppgiften. Du kommer inte kunna få mer poäng med den här versionen.\\\",\\r\\n showLevelAnyway: \\\"Visa den ändå.\\\",\\r\\n scoreObtained: \\\"Uppnådd poäng:\\\",\\r\\n hardVersionTakesTime: \\\"Att lösa en {0} kan ta lång tid. Fundera på om du ska jobba med en {1} för att tjäna poäng snabbare.\\\",\\r\\n illKeepThatInMind: \\\"Jag ska tänka på det.\\\",\\r\\n harderLevelAvailable: \\\"Notera att på den här uppgiften kan du direkt försöka med en svårare version än denna.\\\",\\r\\n lockedLevel: \\\"Den här versionen är låst. Lös den föregående nivån för att visa den!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Bedöm svaret\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Spara svaret\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Ditt svar har sparats. Du kan ändra det, eller {0} och börja om.\\\",\\r\\n cancelIt: \\\"avbryta det\\\",\\r\\n warningDifferentAnswerSaved: \\\"Varning: ett annat svar finns redan sparat.\\\",\\r\\n youMay: \\\"Du kan {0}.\\\",\\r\\n reloadIt: \\\"ladda in det på nytt\\\",\\r\\n saveThisNewAnswer: \\\"Spara det här nya svaret\\\",\\r\\n\\r\\n gradingInProgress: \\\"Rättning pågår\\\",\\r\\n scoreIs: \\\"Din poäng är:\\\",\\r\\n point: \\\"poäng\\\",\\r\\n points: \\\"poäng\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Eftersom tävlingen är över sparas inte ditt svar och din poäng ändras inte.\\\",\\r\\n scoreWouldBecome: \\\"Med det här svaret, skulle din poäng vara:\\\",\\r\\n reloadValidAnswer: \\\"Ladda in det kontrollerade svaret.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Eftersom tävlingen är över sparas inte ditt svar.\\\",\\r\\n scoreWouldStay: \\\"Med det här svaret, skulle din poäng inte ändras:\\\",\\r\\n answerNotSavedContestOver: \\\"Eftersom tävlingen är över sparas inte ditt svar. Du kan {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"ladda in det kontrollerade svaret på nytt\\\",\\r\\n difficultyWarning: \\\"<strong>Varning:</strong> att lösa den här versionen tar lång tid.<br/>Det kan gå snabbare att lösa 2- eller 3-stjärniga versioner av andra uppgifter.\\\",\\r\\n enemyWarning: \\\"<strong>Varning:</strong> i den här utmaningen kommer datorn se till att du inte hittar lösningen av en slump.\\\"\\r\\n },\\r\\n fi: {\\r\\n version: \\\"Versio \\\",\\r\\n levelVersionName_easy: \\\"helppo versio\\\",\\r\\n levelVersionName_medium: \\\"hieman vaikeampi versio\\\",\\r\\n levelVersionName_hard: \\\"vaikea versio\\\",\\r\\n levelVersionName_easy_stars: \\\"2 tähden versio\\\",\\r\\n levelVersionName_medium_stars: \\\"3 tähden versio\\\",\\r\\n levelVersionName_hard_stars: \\\"4 tähden versio\\\",\\r\\n levelName_easy: \\\"Helppo\\\",\\r\\n levelName_medium: \\\"Hieman vaikeampi\\\",\\r\\n levelName_hard: \\\"Vaikea\\\",\\r\\n warningTimeout: \\\"<p>Huomio: on kulunut jo yli {0} minuuttia siitä, kun aloit tekemään tätä tehtävää.</p><p>Sinun mahdollisesti kannattaisi siirtyä yrittämään jotain toista tehtävää klikkaamalla oikean yläkulman nappia.</p>\\\",\\r\\n alright: \\\"Ok\\\",\\r\\n moveOn: \\\"Siirry eteenpäin\\\",\\r\\n solvedMoveOn: \\\"Ratkaisit tämän tehtävän kokonaan, siirry nyt seuraavaan tehtävään.\\\",\\r\\n confirmRestart: \\\"Oletko varma, että haluat aloittaa tämän version alusta?\\\",\\r\\n yes: \\\"Kyllä\\\",\\r\\n no: \\\"Ei\\\",\\r\\n tryHardLevel: \\\"Ehdotamme, että kokeilet 4 tähden versiota.\\\",\\r\\n tryMediumLevel: \\\"Ehdotamme, että kokeilet 3 tähden versiota.\\\",\\r\\n tryNextTask: \\\"Ehdotamme, että kokeilet seuraavaa tehtävää. Jos sinulle jää vielä aikaa, voit myöhemmin palata takaisin tämän tehtävän pariin.\\\",\\r\\n yourScoreIsNow: \\\"Pisteesi nyt:\\\",\\r\\n worseScoreStays: \\\"Tämä on aiempaa alhaisempi. Pistemääränäsi säilyy:\\\",\\r\\n scoreStays: \\\"Pistemääränäsi sailyy:\\\",\\r\\n score: \\\"Pisteet:\\\",\\r\\n noPointsForLevel: \\\"Et ole vielä saanut pisteitä tästä versiosta.\\\",\\r\\n outOf: \\\" / \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Yritä saada vielä paremmat pisteet tai siirry toiseen tehtävään.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Yritä saada vielä paremmat pisteet tai siirry saman tehtävän vaikeampaan versioon.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Onnittelut: saavutit tehtävän maksimipistemäärän!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Siirry tehtävän vaikeampaan versioon saadaksesi enemmän pisteitä.\\\",\\r\\n youDidBetterBefore: \\\"Sait aiemmin enemmän pisteitä.\\\",\\r\\n scoreStays2: \\\"Pistemääräsi säilyy samana.\\\",\\r\\n reloadBestAnswer: \\\"Palauta paras aiempi vastauksesi.\\\",\\r\\n noAnswerSaved: \\\"Tähän versioon ei ole vielä tallennettu vastausta.\\\",\\r\\n validate: \\\"Tarkista vastaus\\\",\\r\\n restart: \\\"Aloita alusta\\\",\\r\\n harderLevelSolved: \\\"Varoitus: olet jo ratkaissut vaikeamman version tästä tehtävästä. Tämän helpomman version ratkaiseminen ei voi korottaa pistemäärääsi.\\\",\\r\\n showLevelAnyway: \\\"Siirry joka tapauksessa.\\\",\\r\\n scoreObtained: \\\"Saatu pistemäärä:\\\",\\r\\n hardVersionTakesTime: \\\"{0} voi viedä runsaasti aikaa. {1} voi tuottaa pisteitä nopeammin.\\\",\\r\\n illKeepThatInMind: \\\"Ymmärrän tämän.\\\",\\r\\n harderLevelAvailable: \\\"Huomaa, että voit myös suoraan koittaa ratkaista vaikeampaa versiota tästä tehtävästä.\\\",\\r\\n lockedLevel: \\\"Tämä versio on vielä lukittu: ratkaise ensin helpompi versio!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Tarkista vastaus\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Tallenna vastaus\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Vastauksesi on tallennettu. Voit muokata sitä tai {0} ja aloittaa uudelleen alusta.\\\",\\r\\n cancelIt: \\\"perua sen\\\",\\r\\n warningDifferentAnswerSaved: \\\"Varoitus: toisenlainen vastaus on tallennettu jo aiemmin.\\\",\\r\\n youMay: \\\"Voit {0}.\\\",\\r\\n reloadIt: \\\"ladata sen uudelleen\\\",\\r\\n saveThisNewAnswer: \\\"tallentaa tämän uuden vastauksen\\\",\\r\\n\\r\\n gradingInProgress: \\\"Pisteytystä suoritetaan\\\",\\r\\n scoreIs: \\\"Pistemääräsi on:\\\",\\r\\n point: \\\"piste\\\",\\r\\n points: \\\"pisteet\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Kilpailu on jo päättynyt, joten uutta vastaustasi ei enää tallennettu ja pistemääränäsi säilyy:\\\",\\r\\n scoreWouldBecome: \\\"Jos tämäkin vastaus huomioitaisiin, pistemääräsi olisi:\\\",\\r\\n reloadValidAnswer: \\\"Palauta aiemmin hyväksytty vastaus.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Kilpailu on jo päättynyt, joten uutta vastaustasi ei enää tallennettu.\\\",\\r\\n scoreWouldStay: \\\"Jos tämäkin vastaus huomioitaisiin, pistemääräsi olisi yhä:\\\",\\r\\n answerNotSavedContestOver: \\\"Kilpailu on jo päättynyt, joten uutta vastaustasi ei enää tallennettu. Voit {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"palauttaa aiemmin lähetetyn vastauksen\\\",\\r\\n difficultyWarning: \\\"<strong>Varoitus:</strong> tämän version ratkaiseminen vie aikaa.<br/>Saat luultavasti ratkaistua 2 tai 3 tähden version nopeammin.\\\",\\r\\n enemyWarning: \\\"<strong>Huomio:</strong> tässä tehtävässä tietokone pyrkii varmistamaan, ettet voi löytää ratkaisua sattumalta.\\\"\\r\\n },\\r\\n de: {\\r\\n version: \\\"Version\\\",\\r\\n levelVersionName_easy: \\\"leichte Version\\\",\\r\\n levelVersionName_medium: \\\"mittlere Version\\\",\\r\\n levelVersionName_hard: \\\"schwere Version\\\",\\r\\n levelVersionName_easy_stars: \\\"2-Sterne-Version\\\",\\r\\n levelVersionName_medium_stars: \\\"3-Sterne-Version\\\",\\r\\n levelVersionName_hard_stars: \\\"4-Sterne-Version\\\",\\r\\n levelName_easy: \\\"Leicht\\\",\\r\\n levelName_medium: \\\"Mittel\\\",\\r\\n levelName_hard: \\\"Schwer\\\",\\r\\n warningTimeout: \\\"<p>Achtung, du bist schon seit {0} Minuten bei dieser Frage.</p><p>Du solltest jetzt zu einer anderen Aufgabe wechseln.</p>\\\",\\r\\n alright: \\\"OK\\\",\\r\\n moveOn: \\\"Fortfahren\\\",\\r\\n solvedMoveOn: \\\"Du hast diese Frage bereits vollständig gelöst. Wähle eine andere Frage zum Bearbeiten aus.\\\",\\r\\n confirmRestart: \\\"Bist du sicher, dass du diese Version neustarten möchtest?\\\",\\r\\n yes: \\\"Ja\\\",\\r\\n no: \\\"Nein\\\",\\r\\n tryHardLevel: \\\"Wir schlagen dir vor, die 4-Sterne-Version zu bearbeiten.\\\",\\r\\n tryMediumLevel: \\\"Wir schlagen dir vor, die 3-Sterne-Version zu bearbeiten\\\",\\r\\n tryNextTask: \\\"Wir schlagen dir vor, die nächste Aufgabe zu bearbeiten. Wenn du am Ende noch Zeit hast, kannst du hierher zurückkehren und die schwerere Version bearbeiten.\\\",\\r\\n yourScoreIsNow: \\\"Dein Punktestand ist jetzt:\\\",\\r\\n worseScoreStays: \\\"Das ist weniger als vorher; dein Punktestand bleibt:\\\",\\r\\n scoreStays: \\\"Dein Punktestand bleibt gleich:\\\",\\r\\n score: \\\"Punktestand:\\\",\\r\\n noPointsForLevel: \\\"Du hast noch keine Punkte für diese Version erhalten.\\\",\\r\\n outOf: \\\" von \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Versuche, dich zu verbessern oder wähle eine andere Frage.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Versuche, dich zu verbessern oder wähle schwierigere Version.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Das ist die bestmögliche Punktzahl für diese Aufgabe. Glückwunsch!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Wähle eine schwerere Version aus, um noch mehr Punkte zu bekommen.\\\",\\r\\n youDidBetterBefore: \\\"Du hast dich verbessern.\\\",\\r\\n scoreStays2: \\\"Dein Punktestand bleibt gleich.\\\",\\r\\n reloadBestAnswer: \\\"Deine beste Antwort wieder laden.\\\",\\r\\n noAnswerSaved: \\\"Bisher noch keine Antwort für diese Version gespeichert.\\\",\\r\\n validate: \\\"Überprüfen\\\",\\r\\n restart: \\\"Neustarten\\\",\\r\\n harderLevelSolved: \\\"Achtung: Du hast schon eine schwerere Version gelöst. Du kannst mit dieser Version keine zusätzlichen Punkte bekommen.\\\",\\r\\n showLevelAnyway: \\\"Trotzdem anzeigen\\\",\\r\\n scoreObtained: \\\"Erhaltene Punkte:\\\",\\r\\n hardVersionTakesTime: \\\"Eine {0} zu lösen kann dich viel Zeit kosten; Denke zunächst daran, die Fragen in {1} zu beantworten, um schnell Punkte zu bekommen.\\\",\\r\\n illKeepThatInMind: \\\"Ich hab das verstanden\\\",\\r\\n harderLevelAvailable: \\\"Beachte, dass du bei dieser Frage direkt zu einer schwereren Version gehen kannst.\\\",\\r\\n lockedLevel: \\\"Diese Version ist noch gesperrt. Löse die vorherige um diese freizuschalten.\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Diese Antwort auswerten\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Antwort speichern\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Deine Antwort wurde eingereicht. Du kannst sie noch bearbeiten, oder {0} und neu beginnen.\\\",\\r\\n cancelIt: \\\"Abbrechen\\\",\\r\\n warningDifferentAnswerSaved: \\\"Achtung: Eine andere Antwort ist bereits gespeichert!\\\",\\r\\n youMay: \\\"Du kannst {0}.\\\",\\r\\n reloadIt: \\\"Neu laden\\\",\\r\\n saveThisNewAnswer: \\\"Diese Antwort speichern\\\",\\r\\n\\r\\n gradingInProgress: \\\"Das Ergebnis wird ausgewertet …\\\",\\r\\n scoreIs: \\\"Dein Punktestand beträgt:\\\",\\r\\n point: \\\"Punkt\\\",\\r\\n points: \\\"Punkte\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Der Contest ist vorbei, deine Antwort wurde nicht eingereicht und deine Punktestand bleibt:\\\",\\r\\n scoreWouldBecome: \\\"Mit dieser Antwort wäre dein Punktestand:\\\",\\r\\n reloadValidAnswer: \\\"Die gültige Antwort neu laden.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Der Contest ist vorbei, deine Antwort wurde nicht eingereicht.\\\",\\r\\n scoreWouldStay: \\\"Mit dieser Antwort bliebe dein Punktestand gleich:\\\",\\r\\n answerNotSavedContestOver: \\\"Der Contest ist vorbei, deine Antwort wurde nicht eingereicht. Du kannst {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"Lade die Lösung, die du eingereicht hast\\\",\\r\\n difficultyWarning: \\\"<strong>Achtung:</strong> diese Version zu lösen kann einige Zeit in Anspruch nehmen.<br/>Die 2- und 3-Stern Version von anderen Aufgaben lassen sich schneller lösen.\\\",\\r\\n enemyWarning: \\\"<strong>Achtung:</strong> in dieser Herausforderung wird der Computer, den Sie von der Suche nach der Lösung zufällig verhindern.\\\"\\r\\n\\r\\n },\\r\\n nl: {\\r\\n version: \\\"Versie\\\",\\r\\n levelVersionName_easy: \\\"gemakkelijke versie\\\",\\r\\n levelVersionName_medium: \\\"gemiddelde versie\\\",\\r\\n levelVersionName_hard: \\\"moeilijke versie\\\",\\r\\n levelVersionName_easy_stars: \\\"versie met 2 sterren\\\",\\r\\n levelVersionName_medium_stars: \\\"versie met 3 sterren\\\",\\r\\n levelVersionName_hard_stars: \\\"versie met 4 sterren\\\",\\r\\n levelName_easy: \\\"Gemakkelijk\\\",\\r\\n levelName_medium: \\\"Gemiddeld\\\",\\r\\n levelName_hard: \\\"Moeilijk\\\",\\r\\n warningTimeout: \\\"<p>Let op, je bent al meer dan {0} minuten bezig met deze vraag.</p><p>Misschien moet je van onderwerp veranderen, door te klikken op de knop rechtsboven.</p>\\\",\\r\\n alright: \\\"Akkoord\\\",\\r\\n moveOn: \\\"Ga naar de volgende\\\",\\r\\n solvedMoveOn: \\\"Je hebt deze vraag helemaal opgelost, ga verder met een andere vraag.\\\",\\r\\n confirmRestart: \\\"Ben je zeker dat je deze versie wilt herbeginnen?\\\",\\r\\n yes: \\\"Ja\\\",\\r\\n no: \\\"Nee\\\",\\r\\n tryHardLevel: \\\"We stellen voor dat je de versie met 4 sterren probeert.\\\",\\r\\n tryMediumLevel: \\\"We stellen voor dat je de versie met 3 sterren probeert.\\\",\\r\\n tryNextTask: \\\"We stellen voor dat je met de volgende vraag begint. Als je tijd over hebt, kan je later terugkomen voor de volgende versie.\\\",\\r\\n yourScoreIsNow: \\\"Jouw score is nu:\\\",\\r\\n worseScoreStays: \\\"Dit is minder dan voordien; jouw score blijft:\\\",\\r\\n scoreStays: \\\"Jouw score blijft hetzelfde:\\\",\\r\\n score: \\\"Score:\\\",\\r\\n noPointsForLevel: \\\"Je hebt nog geen punten behaald op deze vraag.\\\",\\r\\n outOf: \\\" op \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Probeer om nog beter te doen, of ga verder met een andere vraag.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Probeer om nog beter te doen, of ga verder naar een moeilijkere versie.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Dit is de best mogelijke score op deze vraag; proficiat!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Ga verder naar een moeilijkere versie om meer punten te behalen.\\\",\\r\\n youDidBetterBefore: \\\"Je hebt eerder al beter gedaan.\\\",\\r\\n scoreStays2: \\\"Je score blijft hetzelfde.\\\",\\r\\n reloadBestAnswer: \\\"Herlaad je beste antwoord.\\\",\\r\\n noAnswerSaved: \\\"Nog geen antwoord opgeslagen voor deze versie.\\\",\\r\\n validate: \\\"Valideren\\\",\\r\\n restart: \\\"Herbeginnen\\\",\\r\\n harderLevelSolved: \\\"Let op: je hebt al een moeilijkere versie opgelost. Je kan met deze versie geen extra punten halen.\\\",\\r\\n showLevelAnyway: \\\"Toon het mij toch\\\",\\r\\n scoreObtained: \\\"Behaalde score:\\\",\\r\\n hardVersionTakesTime: \\\"Het oplossen van {0} kan je veel tijd kosten; overweeg om eerst de vragen in {1} op te lossen om snel punten te halen.\\\",\\r\\n illKeepThatInMind: \\\"Ik zal er aan denken\\\",\\r\\n harderLevelAvailable: \\\"Merk op dat je voor deze vraag nu al een moeilijkere versie dan deze mag oplossen.\\\",\\r\\n lockedLevel: \\\"Deze versie is nog geblokkeerd. Los de vorige versie op om ze te ontsluiten!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Evalueer dit antwoord\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Bewaar jouw antwoord\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Jouw antwoord is bewaard. Je kan het aanpassen, of {0} en herbeginnen.\\\",\\r\\n cancelIt: \\\"het annuleren\\\",\\r\\n warningDifferentAnswerSaved: \\\"Let op: er is een verschillend antwoord bewaard.\\\",\\r\\n youMay: \\\"Je kan {0}.\\\",\\r\\n reloadIt: \\\"het herladen\\\",\\r\\n saveThisNewAnswer: \\\"Bewaar dit nieuwe antwoord\\\",\\r\\n\\r\\n gradingInProgress: \\\"Bezig met evalueren\\\",\\r\\n scoreIs: \\\"Jouw score is:\\\",\\r\\n point: \\\"punt\\\",\\r\\n points: \\\"punten\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"De wedstrijd is reeds afgelopen, jouw antwoord is dus niet bewaard en jouw score blijft:\\\",\\r\\n scoreWouldBecome: \\\"Met dit antwoord zou dit jouw score zijn:\\\",\\r\\n reloadValidAnswer: \\\"Herlaad het gevalideerde antwoord.\\\",\\r\\n contestOverAnswerNotSaved: \\\"De wedstrijd is afgelopen: jouw antwoord is niet bewaard.\\\",\\r\\n scoreWouldStay: \\\"Met dit antwoord, zou jouw score hetzelfde zijn gebleven:\\\",\\r\\n answerNotSavedContestOver: \\\"De wedstrijd is reeds afgelopen, je antwoord werd niet bewaard. Je kan {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"het antwoord herlanden dat je hebt ingediend\\\",\\r\\n difficultyWarning: \\\"<strong>Let op</strong>: deze versie oplossen kan wat tijd kosten.<br/>Je kan waarschijnlijk sneller de 2 of 3 sterren-versies van andere vragen oplossen.\\\",\\r\\n enemyWarning: \\\"<strong>Let op :</strong> in deze opdracht zorgt de computer ervoor dat je de oplossing niet per toeval kan vinden.\\\"\\r\\n },\\r\\n ar: {\\r\\n version: \\\"المستوى\\\",\\r\\n levelVersionName_easy: \\\"المستوى السهل\\\",\\r\\n levelVersionName_medium: \\\"المستوى المتوسط\\\",\\r\\n levelVersionName_hard: \\\"المستوى الصعب\\\",\\r\\n levelVersionName_easy_stars: \\\"المستوى الأول\\\",\\r\\n levelVersionName_medium_stars: \\\"المستوى الثاني\\\",\\r\\n levelVersionName_hard_stars: \\\"المستوى الثالث\\\",\\r\\n levelName_easy: \\\"سهل\\\",\\r\\n levelName_medium: \\\"متوسط\\\",\\r\\n levelName_hard: \\\"صعب\\\",\\r\\n warningTimeout: \\\"<p>لقد مر وقت طويل منذ أن بدأت في هذه المسألة, من الأفضل أن تبدأ في مسألة أخرى حتى لا يضيع الوقت</p>\\\",\\r\\n alright: \\\"حسناً\\\",\\r\\n moveOn: \\\"استمر\\\",\\r\\n solvedMoveOn: \\\"لقد أجبت على هذا السؤال بالكامل. ابدأ في سؤال أخر\\\",\\r\\n confirmRestart: \\\"هل ترغب في بدء هذا سؤال من جديد؟\\\",\\r\\n yes: \\\"نعم\\\",\\r\\n no: \\\"لا\\\",\\r\\n tryHardLevel: \\\"نقترح أن تبدأ في المستوى الثالث للسؤال\\\",\\r\\n tryMediumLevel: \\\"نقترح أن تبدأ في المستوى الثاني للسؤال\\\",\\r\\n tryNextTask: \\\"نقترح أن تبدأ في المسألة التالية, وإذا تبقى عندك وقت يمكنك حل المستوى الأصعب في هذه المسألة لاحقاً\\\",\\r\\n yourScoreIsNow: \\\"مجموع نقاطك:\\\",\\r\\n worseScoreStays: \\\"هذا ليس جيداً. ما زالت نقاطك:\\\",\\r\\n scoreStays: \\\"نقاطك ما زالت كما هي:\\\",\\r\\n score: \\\"النقاط\\\",\\r\\n noPointsForLevel: \\\"لم تحقق أي نقاط في هذا المستوى\\\",\\r\\n outOf: \\\"من\\\",\\r\\n tryToDoBetterOrChangeTask: \\\"حاول في مسألة أخرى\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"حاول في المستوى الأصعب\\\",\\r\\n bestPossibleScoreCongrats: \\\"مبروك ... لقد حصلت على أعلى درجة في هذا السؤال\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"للحصول على المزيد من النقاط جاوب على المستوى الأصعب\\\",\\r\\n youDidBetterBefore: \\\"لقد قمت بها أفضل من هذا في وقت سابق\\\",\\r\\n scoreStays2: \\\"ما زالت نقاطك كما هي\\\",\\r\\n reloadBestAnswer: \\\"اعد تحميل إجابتك الأفضل\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"تحقق\\\",\\r\\n restart: \\\"ابدأ من جديد\\\",\\r\\n harderLevelSolved: \\\"لقد قمت بحل المستوى الأصعب في هذا السؤال, لن تتمكن من الحصول على درجات أعلى في هذا السؤال\\\",\\r\\n showLevelAnyway: \\\"اظهرها لي على أي حال\\\",\\r\\n scoreObtained: \\\"النقاط المكتسبة:\\\",\\r\\n hardVersionTakesTime: \\\"Solving a {0} can take a lot of time. Consider working on the {1} to gain points quickly.\\\",\\r\\n illKeepThatInMind: \\\"I'll consider it.\\\",\\r\\n harderLevelAvailable: \\\"تنبيه: يمكنك حل المستوى الأصعب في هذه المسألة مباشرة\\\",\\r\\n lockedLevel: \\\"هذا المستوى مغلق. يجب عليك حل المستوى السابق أولا\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"قيم هذه الإجابة\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"احفظ هذه الإجابة\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"تم حفظ إجابتك, يمكنك تعديلها أو بدأها من جديد\\\",\\r\\n cancelIt: \\\"احذفها\\\",\\r\\n warningDifferentAnswerSaved: \\\"تنبيه: يوجد اجابة أخرى محفوظة سابقاً\\\",\\r\\n youMay: \\\"You may {0}.\\\",\\r\\n reloadIt: \\\"حملها من جديد\\\",\\r\\n saveThisNewAnswer: \\\"احفظ الإجابة الجديدة\\\",\\r\\n\\r\\n gradingInProgress: \\\"نقوم بالتقييم\\\",\\r\\n scoreIs: \\\"مجموع نقاطك:\\\",\\r\\n point: \\\"نقطة\\\",\\r\\n points: \\\"نقاط\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"المسابقة انتهت. إجابتك الجديدة لم تحفظ ومجموع نقاطك ما زال:\\\",\\r\\n scoreWouldBecome: \\\" مع تلك الإجابة، مجموع نقاطك أصبح:\\\",\\r\\n reloadValidAnswer: \\\"اعد تحميل الإجابة المحققة\\\",\\r\\n contestOverAnswerNotSaved: \\\"المسابقة إنتهت ولم يتم حفظ إجاباتك الجديدة\\\",\\r\\n scoreWouldStay: \\\"بهذه الإجابة سوف يظل مجموع نقاطك كما هو\\\",\\r\\n answerNotSavedContestOver: \\\"The contest being over, your answer was not saved. You may {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"اعد تحميل الإجابة المحققة\\\",\\r\\n difficultyWarning: \\\"تنبيه: حل هذه النسخة سوف يستغرق وقت كثير. الإفضل أن تبدأ في حل مسائل أخرى\\\",\\r\\n enemyWarning: \\\"تحذير: في هذه المسألة سيمنعك الكمبيوتر من إيجاد الحل عن طريق الصدفة. فكر جيداً\\\"\\r\\n },\\r\\n es: {\\r\\n version: \\\"Versión\\\",\\r\\n levelVersionName_easy: \\\"versión fácil\\\",\\r\\n levelVersionName_medium: \\\"versión moderada\\\",\\r\\n levelVersionName_hard: \\\"versión difícil\\\",\\r\\n levelVersionName_easy_stars: \\\"versión de 2 estrellas\\\",\\r\\n levelVersionName_medium_stars: \\\"versión de 3 estrellas\\\",\\r\\n levelVersionName_hard_stars: \\\"versión de 4 estrellas\\\",\\r\\n levelName_easy: \\\"Fácil\\\",\\r\\n levelName_medium: \\\"Moderado\\\",\\r\\n levelName_hard: \\\"Difícil\\\",\\r\\n warningTimeout: \\\"<p>Atención, ya llevas {0} minutos en esta pregunta.</p><p>Te recomendamos cambiar de tema haciendo click sobre el botón de arriba a la derecha.</p>\\\",\\r\\n alright: \\\"De acuerdo\\\",\\r\\n moveOn: \\\"Pasar a la siguiente\\\",\\r\\n solvedMoveOn: \\\"Has resuelto completamente esta pregunta. Pasa a otra pregunta.\\\",\\r\\n confirmRestart: \\\"¿Estás seguro que deseas volver a iniciar esta versión?\\\",\\r\\n yes: \\\"Sí\\\",\\r\\n no: \\\"No\\\",\\r\\n tryHardLevel: \\\"Te recomendamos intentar la versión de 4 estrellas.\\\",\\r\\n tryMediumLevel: \\\"Te recomendamos intentar la versión de 3 estrellas.\\\",\\r\\n tryNextTask: \\\"Te recomendamos que pases a la siguiente pregunta. Si tienes tiempo, puedes volver más tarde para probar la siguiente versión\\\",\\r\\n yourScoreIsNow: \\\"Tu puntuación es ahora :\\\",\\r\\n worseScoreStays: \\\"Esto no está tan bien como antes; tu puntuación se mantiene en :\\\",\\r\\n scoreStays: \\\"tu puntuación se mantiene igual :\\\",\\r\\n score: \\\"Puntuación :\\\",\\r\\n noPointsForLevel: \\\"Aún no has recibido puntos en esta versión.\\\",\\r\\n outOf: \\\" de \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Intenta nuevamente para obtener una mejor puntuación, o pasa a la siguiente pregunta.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Intenta nuevamente para obtener una mejor puntuación, o pasa a una versión más difícil.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Esta es la mejor puntuación posible en este problema, ¡felicitaciones!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Para obtener más puntos, pasa a una versión más difícil.\\\",\\r\\n youDidBetterBefore: \\\"Realizaste un mejor trabajo antes.\\\",\\r\\n scoreStays2: \\\"Tu puntuación se mantiene igual.\\\",\\r\\n reloadBestAnswer: \\\"Recargar tu mejor respuesta.\\\",\\r\\n noAnswerSaved: \\\"Aún no hay respuesta guardada para esta versión.\\\",\\r\\n validate: \\\"Validar\\\",\\r\\n restart: \\\"Reiniciar\\\",\\r\\n harderLevelSolved: \\\"Atención: ya has resuelto una versión más difícil. No puedes ganar puntos extra con esta versión.\\\",\\r\\n showLevelAnyway: \\\"Mostrar el nivel de igual manera\\\",\\r\\n scoreObtained: \\\"Puntuación obtenida:\\\",\\r\\n hardVersionTakesTime: \\\"Resolver una {0} puede tomar mucho tiempo; te aconsejamos priorizar el resolver las preguntas en {1} para ganar puntos más rápidamente.\\\",\\r\\n illKeepThatInMind: \\\"Lo tendré en mente\\\",\\r\\n harderLevelAvailable: \\\"Nota que para esta pregunta, puedes resolver directamente una versión más difícil que esta.\\\",\\r\\n lockedLevel: \\\"Esta versión está bloqueada. Resuelve la version anterior para verla.\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Evaluar esta respuesta\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Guardar tu respuesta\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Tu respuesta fue guardada. Puedes modificarla, o bien {0} y reiniciar.\\\",\\r\\n cancelIt: \\\"cancelarla\\\",\\r\\n warningDifferentAnswerSaved: \\\"Atención: una respuesta diferente ha sido guardada.\\\",\\r\\n youMay: \\\"Tú puedes {0}.\\\",\\r\\n reloadIt: \\\"recargarla\\\",\\r\\n saveThisNewAnswer: \\\"Guardar esta nueva respuesta\\\",\\r\\n\\r\\n gradingInProgress: \\\"Evaluación en curso\\\",\\r\\n scoreIs: \\\"Tu puntuación es:\\\",\\r\\n point: \\\"punto\\\",\\r\\n points: \\\"puntos\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"La actividad está terminando, tu respuesta no ha sido guardada y tu puntuación se mantiene en:\\\",\\r\\n scoreWouldBecome: \\\"Con esta respuesta, tu puntuación será :\\\",\\r\\n reloadValidAnswer: \\\"Volver a cargar la respuesta válida.\\\",\\r\\n contestOverAnswerNotSaved: \\\"La actividad ha terminado: tu respuesta no fue guardada.\\\",\\r\\n scoreWouldStay: \\\"Con esta respuesta, tu puntuación será la misma:\\\",\\r\\n answerNotSavedContestOver: \\\"La actividad está terminando y tu respuesta no ha sido guardada. Tú puedes {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"recargar la respuesta que ha enviado\\\",\\r\\n difficultyWarning: \\\"<strong>Advertencia:</strong> resolver esta versión toma tiempo.<br/>Puedes resolver más rápidamente las versiones de 2 y 3 estrellas de otros problemas.\\\",\\r\\n enemyWarning: \\\"<strong>Advertencia:</strong> en este desafío, la computadora se asegurará que no encuentres la respuesta por casualidad.\\\"\\r\\n },\\r\\n it: {\\r\\n version: \\\"Versione\\\",\\r\\n levelVersionName_easy: \\\"versione facile\\\",\\r\\n levelVersionName_medium: \\\"versione media\\\",\\r\\n levelVersionName_hard: \\\"versione difficile\\\",\\r\\n levelVersionName_easy_stars: \\\"versione a 2 stelle\\\",\\r\\n levelVersionName_medium_stars: \\\"versione a 3 stelle\\\",\\r\\n levelVersionName_hard_stars: \\\"versione a 4 stelle\\\",\\r\\n levelName_easy: \\\"Facile\\\",\\r\\n levelName_medium: \\\"Medio\\\",\\r\\n levelName_hard: \\\"Difficile\\\",\\r\\n warningTimeout: \\\"<p>Attenzione, sono più di {0} minuti che sei su questa domanda.</p><p>Dovresti cambiare argomento, cliccando sul pulsante in alto a destra.</p>\\\",\\r\\n alright: \\\"Va bene\\\",\\r\\n moveOn: \\\"Vai avanti\\\",\\r\\n solvedMoveOn: \\\"Hai risolto completamente questo quesito, passa a un'altra domanda.\\\",\\r\\n confirmRestart: \\\"Sei sicuro di voler ricominciare questa versione ?\\\",\\r\\n yes: \\\"Sì\\\",\\r\\n no: \\\"No\\\",\\r\\n tryHardLevel: \\\"Ti proponiamo di provare la versione 4 stelle.\\\",\\r\\n tryMediumLevel: \\\"Ti proponiamo di provare la versione 3 stelle.\\\",\\r\\n tryNextTask: \\\"Ti proponiamo di passare all'argomento successivo. Se ti resta del tempo, potrai riprovare più tardi la seguente versione.\\\",\\r\\n yourScoreIsNow: \\\"Adesso il tuo punteggio è :\\\",\\r\\n worseScoreStays: \\\"Non è buono come prima ; il tuo punteggio rimane :\\\",\\r\\n scoreStays: \\\"Il tuo punteggio resta lo stesso :\\\",\\r\\n score: \\\"Score :\\\",\\r\\n noPointsForLevel: \\\"Non hai ancora punti su questa versione.\\\",\\r\\n outOf: \\\" sur \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Prova a fare di meglio, o passa ad un'altra domanda.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Prova a fare di meglio, o passa a una versione più difficile.\\\",\\r\\n bestPossibleScoreCongrats: \\\"E' il miglior punteggio possibile su quest'argomento ; congratulazioni !\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Per ottenere più punti, passa a una versione più difficile.\\\",\\r\\n youDidBetterBefore: \\\"Sei andato meglio prima.\\\",\\r\\n scoreStays2: \\\"Il tuo punteggio resta lo stesso.\\\",\\r\\n reloadBestAnswer: \\\"Ricarica la tua miglior risposta.\\\",\\r\\n noAnswerSaved: \\\"Nessuna risposta salvata per questa versione.\\\",\\r\\n validate: \\\"Convalida\\\",\\r\\n restart: \\\"Ricomincia\\\",\\r\\n harderLevelSolved: \\\"Attenzione : hai già risolto una versione più difficile. Non potrai più ottenere punti supplementari con questa versione.\\\",\\r\\n showLevelAnyway: \\\"Vedi lo stesso\\\",\\r\\n scoreObtained: \\\"Score ottenuto :\\\",\\r\\n hardVersionTakesTime: \\\"Risolvere una {0} ti può prendere molto tempo ; dai priorità alle risposte alle domande in {1} per guadagnare rapidamente punti.\\\",\\r\\n illKeepThatInMind: \\\"Me lo ricorderò\\\",\\r\\n harderLevelAvailable: \\\"Si noti che per questa domanda è possibile risolvere direttamente una versione più difficile di questa.\\\",\\r\\n lockedLevel: \\\"Questa versione è bloccata. Risolvi la precedente per visualizzarla !\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Valuta questa risposta\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Salva la tua risposta\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"La sua risposta è stata registrata. Puoi cambiarla, oppure {0} e ricominciare da capo.\\\",\\r\\n cancelIt: \\\"annullarla\\\",\\r\\n warningDifferentAnswerSaved: \\\"Attenzione : è salvata una risposta diversa.\\\",\\r\\n youMay: \\\"Puoi {0}.\\\",\\r\\n reloadIt: \\\"ricaricala\\\",\\r\\n saveThisNewAnswer: \\\"Salva questa nuova risposta\\\",\\r\\n\\r\\n gradingInProgress: \\\"Valutazione in corso\\\",\\r\\n scoreIs: \\\"Il tuo punteggio è di :\\\",\\r\\n point: \\\"punto\\\",\\r\\n points: \\\"punti\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Il concorso è terminato, la tua risposta non è stata salvata e il tuo punteggio è di :\\\",\\r\\n scoreWouldBecome: \\\"Con questa risposta, il tuo punteggio sarà :\\\",\\r\\n reloadValidAnswer: \\\"Ricarica la risposta convalidata.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Il concorso è terminato : la tua risposta non è stata salvata.\\\",\\r\\n scoreWouldStay: \\\"Con questa risposta, il tuo punteggio resterà lo stesso :\\\",\\r\\n answerNotSavedContestOver: \\\"Il concorso è terminato, la tua risposta non è stata salvata. Puoi {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"ricarica la risposta che hai inviato\\\",\\r\\n difficultyWarning: \\\"<strong>Attenzione :</strong> risolvere questa versione richiede del tempo.<br/>Potresti risolvere molto più rapidamente le versioni 2 e 3 stelle di altri argomenti.\\\",\\r\\n enemyWarning: \\\"<strong>Attenzione </strong> in questa sfida, il computer ti impedirà di trovare la soluzione per caso.\\\"\\r\\n },\\r\\n sl: {\\r\\n version: \\\"Stopnja\\\",\\r\\n levelVersionName_easy: \\\"enostavna stopnja\\\",\\r\\n levelVersionName_medium: \\\"srednja stopnja\\\",\\r\\n levelVersionName_hard: \\\"težka stopnja\\\",\\r\\n levelVersionName_easy_stars: \\\"stopnja 2 zvezdici\\\",\\r\\n levelVersionName_medium_stars: \\\"stopnja 3 zvezdice\\\",\\r\\n levelVersionName_hard_stars: \\\"stopnja 4 zvezdice\\\",\\r\\n levelName_easy: \\\"Enostavno\\\",\\r\\n levelName_medium: \\\"Srednje\\\",\\r\\n levelName_hard: \\\"Težko\\\",\\r\\n warningTimeout: \\\"<p>Opozorilo: Odkar rešuješ to nalogo, je minilo že več kot {0} minut.</p><p>Najbolje, da izbereš drugo nalogo, tako da klikneš gumb v zgornjem desnem kotu.</p>\\\",\\r\\n alright: \\\"V redu\\\",\\r\\n moveOn: \\\"Nadaljuj\\\",\\r\\n solvedMoveOn: \\\"Ta naloga je dokončana, nadaljuj z naslednjo nalogo.\\\",\\r\\n confirmRestart: \\\"Ali res želiš znova začeti to stopnjo?\\\",\\r\\n yes: \\\"Da\\\",\\r\\n no: \\\"Ne\\\",\\r\\n tryHardLevel: \\\"Predlagamo, da poizkusiš stopnjo s 4 zvezdicami.\\\",\\r\\n tryMediumLevel: \\\"Predlagamo, da poizkusiš stopnjo s 3 zvezdicami.\\\",\\r\\n tryNextTask: \\\"Prdlagamo, da poizkusiš naslednjo nalogo. Če bo ostalo dovolj časa, se vrni in poizkusi naslednjo stopnjo te naloge.\\\",\\r\\n yourScoreIsNow: \\\"Tvoj rezultat je:\\\",\\r\\n worseScoreStays: \\\"Rešitev ni tako dobra, kot prejšnja. Tvoj rezultat ostaja:\\\",\\r\\n scoreStays: \\\"Tvoj rezultat ostaja enak:\\\",\\r\\n score: \\\"Rezultat:\\\",\\r\\n noPointsForLevel: \\\"Na tej stopnji nisi dobil(-a) še nobene točke.\\\",\\r\\n outOf: \\\" od \\\",\\r\\n tryToDoBetterOrChangeTask: \\\"Poskusi nalogo rešiti še bolje ali se premakni na naslednjo nalogo.\\\",\\r\\n tryToDoBetterOrMoveToNextLevel: \\\"Poskusi nalogo rešiti še bolje ali se premakni na težjo stopnjo.\\\",\\r\\n bestPossibleScoreCongrats: \\\"Čestitamo, to je najboljši možni rezultat te naloge!\\\",\\r\\n forMorePointsMoveToNextLevel: \\\"Če želiš dobiti še več točk, se premakni na težjo stopnjo te naloge.\\\",\\r\\n youDidBetterBefore: \\\"Rešitev je boljša od prejšnje.\\\",\\r\\n scoreStays2: \\\"Tvoj rezultat ostaja enak.\\\",\\r\\n reloadBestAnswer: \\\"Znova naloži najboljšo rešitev.\\\",\\r\\n noAnswerSaved: \\\"No answer saved so far for this version.\\\",\\r\\n validate: \\\"Preveri\\\",\\r\\n restart: \\\"Začni znova\\\",\\r\\n harderLevelSolved: \\\"Opozorilo: Rešil(-a) si že težjo stopnjo te naloge. S to stopnjo ne boš dobil(-a) dodatnih točk.\\\",\\r\\n showLevelAnyway: \\\"Vseeno mi pokaži stopnjo.\\\",\\r\\n scoreObtained: \\\"Dobljeni rezultat:\\\",\\r\\n hardVersionTakesTime: \\\"Reševanje {0} lahko traja veliko časa. Razmisli o reševanju {1}, da boš hitro dobil(-a) točke.\\\",\\r\\n illKeepThatInMind: \\\"Razmislil(-a) bom.\\\",\\r\\n harderLevelAvailable: \\\"Ne pozabi, da lahko to nalogo rešuješ na težji stopnji kot je ta.\\\",\\r\\n lockedLevel: \\\"Ta stopnja je zaklenjena! Za pikaz moraš najprej rešiti prejšnjo stopnjo!\\\",\\r\\n lockedLevelDev: \\\"This version is normally locked, and the previous version must be solved before displaying this. As you opened this task locally, you can however display this version for testing purposes.\\\",\\r\\n gradeThisAnswer: \\\"Oceni ta odgovor\\\",\\r\\n\\r\\n // The following messages are used for tasks with no feedback\\r\\n saveAnswer: \\\"Shrani ta odgovor\\\",\\r\\n answerSavedModifyOrCancelIt: \\\"Tvoj odgovor je bil shranjen. Lahko ga spremeniš ali {0} in začneš znova.\\\",\\r\\n cancelIt: \\\"prekličeš\\\",\\r\\n warningDifferentAnswerSaved: \\\"Opozorilo: Prej je bil shranjen drugačen odgovor.\\\",\\r\\n youMay: \\\"Lahko ga {0}.\\\",\\r\\n reloadIt: \\\"naložiš znova\\\",\\r\\n saveThisNewAnswer: \\\"Shrani ta nov odgovor\\\",\\r\\n\\r\\n gradingInProgress: \\\"Ocenjevanje poteka\\\",\\r\\n scoreIs: \\\"Tvoj rezultat je:\\\",\\r\\n point: \\\"točka\\\",\\r\\n points: \\\"točk\\\",\\r\\n // The following messages are used when viewing tasks after contest is over\\r\\n contestOverScoreStays: \\\"Ker je tekmovanja konec, tvoj novi odgovor ni bil shranjen in rezultat bo ostal:\\\",\\r\\n scoreWouldBecome: \\\"S to rešitvijo bi bil tvoj rezultat:\\\",\\r\\n reloadValidAnswer: \\\"Znova naloži preverjeno rešitev.\\\",\\r\\n contestOverAnswerNotSaved: \\\"Ker je tekmovanja konec, tvoj novi odgovor ni bil shranjen.\\\",\\r\\n scoreWouldStay: \\\"S to rešitvijo bi tvoj rezultat ostal enak:\\\",\\r\\n answerNotSavedContestOver: \\\"Ker je tekmovanja konec, tvoj novi odgovor ni bil shranjen. Lahko {0}.\\\",\\r\\n reloadSubmittedAnswer: \\\"znova naložiš preverjeno rešitev\\\",\\r\\n difficultyWarning: \\\"<strong>Opozorilo:</strong> Reševanje te stopnje lahko traja veliko časa. <br/>Hitreje lahko rešiš stopnje z 2 ali s 3 zvezdicami drugih nalog.\\\",\\r\\n enemyWarning: \\\"<strong>Opozorilo:</strong> Pri tej nalogi ti bo računalnik preprečil naključno rešitev.\\\"\\r\\n },\\r\\n },\\r\\n initLanguage: function() {\\r\\n if (window.stringsLanguage == undefined) {\\r\\n window.stringsLanguage = 'fr';\\r\\n }\\r\\n this.strings = this.languageStrings[window.stringsLanguage];\\r\\n },\\r\\n /***********************************************\\r\\n * Initialization functions called by the task *\\r\\n ***********************************************/\\r\\n load: function(views) {\\r\\n this.initLanguage();\\r\\n var self = this;\\r\\n this.showScore = (typeof views.grader !== 'undefined' && views.grader === true);\\r\\n window.platform.getTaskParams(null, null, function(taskParams) {\\r\\n self.taskParams = taskParams;\\r\\n self.readOnly = (self.taskParams.readonly === true || self.taskParams.readOnly == 'true');\\r\\n self.graderScore = +self.taskParams.noScore;\\r\\n self.savedAnswer = '';\\r\\n\\r\\n $(\\\"#difficultyWarning\\\").html(self.strings.difficultyWarning).addClass(\\\"warningHeader\\\");\\r\\n $(\\\"#enemyWarning\\\").html(self.strings.enemyWarning).addClass(\\\"warningHeader\\\");\\r\\n var addTaskHTML = '<div id=\\\"displayHelperAnswering\\\" class=\\\"contentCentered\\\">';\\r\\n // Place button placements at the end of HTML if they don't already exist\\r\\n var placementNames = ['graderMessage', 'validate', 'cancel', 'saved'];\\r\\n for (var iPlacement = 0; iPlacement < placementNames.length; iPlacement++) {\\r\\n var placement = 'displayHelper_' + placementNames[iPlacement];\\r\\n if ($('#' + placement).length === 0) {\\r\\n addTaskHTML += '<div id=\\\"' + placement + '\\\"></div>';\\r\\n }\\r\\n }\\r\\n addTaskHTML += '</div>';\\r\\n if (!document.getElementById('displayHelperAnswering')) {\\r\\n $(self.taskSelector).append(addTaskHTML);\\r\\n }\\r\\n self.loaded = true;\\r\\n self.timeLoaded = new Date().getTime();\\r\\n if (self.popupMessageShown) {\\r\\n $('#displayHelperAnswering').hide();\\r\\n }\\r\\n\\r\\n var taskDelayWarning = function() {\\r\\n if (self.popupMessageShown) {\\r\\n self.taskDelayWarningTimeout = setTimeout(taskDelayWarning, 5000);\\r\\n } else {\\r\\n self.showPopupMessage(self.formatTranslation(self.strings.warningTimeout, [self.timeoutMinutes]), 'blanket', self.strings.alright, null, null, \\\"warning\\\");\\r\\n self.taskDelayWarningTimeout = null;\\r\\n }\\r\\n };\\r\\n if (self.timeoutMinutes > 0) {\\r\\n self.taskDelayWarningTimeout = setTimeout(taskDelayWarning, self.timeoutMinutes * 60 * 1000);\\r\\n }\\r\\n });\\r\\n },\\r\\n unload: function() {\\r\\n if (this.taskDelayWarningTimeout) {\\r\\n this.taskDelayWarningTimeout = clearTimeout(this.taskDelayWarningTimeout);\\r\\n }\\r\\n clearInterval(this.checkAnswerInterval);\\r\\n this.checkAnswerInterval = null;\\r\\n this.loaded = false;\\r\\n this.prevAnswer = '';\\r\\n this.readOnly = false;\\r\\n this.savedAnswer = '';\\r\\n this.submittedAnswer = '';\\r\\n this.submittedScore = 0;\\r\\n this.hasAnswerChanged = true;\\r\\n this.hideValidateButton = false;\\r\\n this.hideRestartButton = false;\\r\\n this.showScore = false;\\r\\n this.refreshMessages = true;\\r\\n this.stoppedShowingResult = false;\\r\\n this.previousMessages = {};\\r\\n this.popupMessageShown = false;\\r\\n this.hasLevels = false;\\r\\n this.pointsAsStars = true; // TODO: false as default\\r\\n this.unlockedLevels = 4;\\r\\n this.neverHadHard = false;\\r\\n this.showMultiversionNotice = false;\\r\\n this.taskLevel = '';\\r\\n this.initLevelVars();\\r\\n return true;\\r\\n },\\r\\n\\r\\n initLevelVars: function() {\\r\\n var defaultLevelsRanks = { basic: 1, easy: 2, medium: 3, hard: 4 };\\r\\n this.taskLevel = '';\\r\\n this.levelsRanks = {};\\r\\n this.levelsScores = {};\\r\\n this.prevLevelsScores = {};\\r\\n for(var i=0; i < this.levels.length; i++) {\\r\\n var levelName = this.levels[i];\\r\\n if(typeof this.levelsRanks[levelName] == 'undefined') {\\r\\n if(i == this.levels.length - 1) {\\r\\n // The highest level always gets the max stars\\r\\n this.levelsRanks[levelName] = this.maxStars;\\r\\n } else {\\r\\n this.levelsRanks[levelName] = defaultLevelsRanks[levelName];\\r\\n }\\r\\n }\\r\\n this.levelsScores[levelName] = 0;\\r\\n this.prevLevelsScores[levelName] = 0;\\r\\n }\\r\\n },\\r\\n\\r\\n setupLevels: function(initLevel, reloadWithCallbacks, levels) {\\r\\n this.reloadWithCallbacks = reloadWithCallbacks;\\r\\n this.initLanguage();\\r\\n if(levels) {\\r\\n this.levels = levels;\\r\\n this.levelsIdx = {};\\r\\n for(var i = 0; i < this.levels.length; i++) {\\r\\n this.levelsIdx[this.levels[i]] = i;\\r\\n }\\r\\n }\\r\\n this.initLevelVars();\\r\\n\\r\\n var self = this;\\r\\n function callSetupLevels() {\\r\\n if(!initLevel) {\\r\\n initLevel = self.taskParams.options.difficulty ? self.taskParams.options.difficulty : \\\"easy\\\";\\r\\n }\\r\\n self.doSetupLevels(initLevel);\\r\\n };\\r\\n if (!this.taskParams) {\\r\\n window.platform.getTaskParams(null, null, function(taskParams) {\\r\\n self.taskParams = taskParams;\\r\\n callSetupLevels();\\r\\n });\\r\\n } else {\\r\\n callSetupLevels();\\r\\n }\\r\\n },\\r\\n doSetupLevels: function(initLevel) {\\r\\n // TODO To fix: levelWrapper-1 does not work correctly without this part,\\r\\n // so the level is loaded twice initially (once here, and once below).\\r\\n if(!this.reloadWithCallbacks) {\\r\\n task.reloadStateObject(task.getDefaultStateObject(), true);\\r\\n task.reloadAnswerObject(task.getDefaultAnswerObject());\\r\\n }\\r\\n\\r\\n this.setupParams();\\r\\n if (!document.getElementById('popupMessage')) {\\r\\n this.setupLevelsTabs();\\r\\n $('#tabsMenu .li').on('click', function(event) {\\r\\n event.preventDefault();\\r\\n var newLevel = $(this).children().attr('href').split('#')[1];\\r\\n displayHelper.setLevel(newLevel);\\r\\n });\\r\\n }\\r\\n\\r\\n this.setLevel(initLevel);\\r\\n\\r\\n if (this.unlockedLevels > 1 && this.showMultiversionNotice) {\\r\\n this.showPopupMessage(this.strings.harderLevelAvailable, 'blanket', this.strings.alright,\\r\\n function() {\\r\\n this.showMultiversionNotice = false;\\r\\n }\\r\\n );\\r\\n }\\r\\n },\\r\\n setupParams: function() {\\r\\n var taskParams = this.taskParams;\\r\\n\\r\\n this.hasLevels = true;\\r\\n var paramNames = ['pointsAsStars', 'unlockedLevels', 'neverHadHard', 'showMultiversionNotice'];\\r\\n for (var iParam = 0; iParam < paramNames.length; iParam++) {\\r\\n var param = paramNames[iParam];\\r\\n if (taskParams[param] !== undefined) {\\r\\n this[param] = taskParams[param];\\r\\n }\\r\\n }\\r\\n\\r\\n var maxScore = taskParams.maxScore !== undefined ? taskParams.maxScore : 40;\\r\\n this.levelsMaxScores = {};\\r\\n for(var i=0; i < this.levels.length; i++) {\\r\\n var levelName = this.levels[i];\\r\\n var levelMaxScore = maxScore * this.levelsRanks[levelName] / this.maxStars;\\r\\n this.levelsMaxScores[levelName] = this.pointsAsStars ? levelMaxScore : Math.round(levelMaxScore);\\r\\n }\\r\\n },\\r\\n setupLevelsTabs: function() {\\r\\n var scoreHTML;\\r\\n var maxScores = this.levelsMaxScores;\\r\\n if (this.pointsAsStars) {\\r\\n var titleStarContainers = [];\\r\\n scoreHTML = '<span></span><span id=\\\"titleStars\\\"></span>';\\r\\n $('#task > h1').append(scoreHTML);\\r\\n drawStars('titleStars', this.maxStars, 24, 0, 'normal');\\r\\n } else {\\r\\n // Disabled: doesn't work with new tabs layout.\\r\\n //scoreHTML = '<div class=\\\"bestScore\\\">Score retenu : <span id=\\\"bestScore\\\">0</span> sur ' + maxScores.hard + '</div>';\\r\\n //$('#tabsContainer').append(scoreHTML);\\r\\n }\\r\\n\\r\\n var tabsStarContainers = [];\\r\\n var curLevel;\\r\\n // We only render the tabs if there is more than one level ; but we\\r\\n // keep tabsMenu as some interfaces depend on that\\r\\n var tabsInnerHTML = '';\\r\\n var nbLevels = 0;\\r\\n for (curLevel in this.levelsRanks) {\\r\\n nbLevels++;\\r\\n tabsInnerHTML += '<span class=\\\"li\\\" id=\\\"tab_' + curLevel + '\\\"><a href=\\\"#' + curLevel + '\\\">';\\r\\n if (this.pointsAsStars) {\\r\\n tabsInnerHTML += '<span class=\\\"levelLabel\\\">' + this.strings.version + '</span><span id=\\\"stars_' + this.levelsRanks[curLevel] + '\\\"></span>';\\r\\n } else {\\r\\n tabsInnerHTML += this.strings[\\\"levelName_\\\" + curLevel] + ' — ' +\\r\\n '<span id=\\\"tabScore_' + curLevel + '\\\">0</span> / ' + maxScores[curLevel];\\r\\n }\\r\\n tabsInnerHTML += '</a></span>';\\r\\n }\\r\\n if(nbLevels < 2) { tabsInnerHTML = ''; }\\r\\n var tabsHTML = '<div id=\\\"tabsMenu\\\">' + tabsInnerHTML + '</div>';\\r\\n $('#tabsContainer').append(tabsHTML);\\r\\n\\r\\n var self = this;\\r\\n setTimeout(function() {\\r\\n for (var iLevel = 0; iLevel < self.levels.length; iLevel++) {\\r\\n curLevel = self.levels[iLevel];\\r\\n if (iLevel >= self.unlockedLevels) {\\r\\n $('#tab_' + curLevel).addClass('lockedLevel');\\r\\n }\\r\\n self.updateStarsAtLevel(curLevel);\\r\\n }\\r\\n self.updateLayout();\\r\\n }, 100);\\r\\n\\r\\n $('#tabsContainer').after('<div id=\\\"popupMessage\\\"></div>');\\r\\n },\\r\\n\\r\\n updateStarsAtLevel: function(level) {\\r\\n var rate = this.levelsScores[level] / this.levelsMaxScores[level];\\r\\n var iLevel = this.levelsIdx[level];\\r\\n var starsIdx = this.levelsRanks[level];\\r\\n var mode = 'normal';\\r\\n if (iLevel >= this.unlockedLevels) {\\r\\n mode = 'locked';\\r\\n }\\r\\n if (this.graderScore > this.levelsMaxScores[level]) {\\r\\n mode = 'useless';\\r\\n }\\r\\n drawStars('stars_' + starsIdx, starsIdx, 14, rate, mode);\\r\\n },\\r\\n\\r\\n updateLayout: function() {\\r\\n if (!this.bUseFullWidth) {\\r\\n return\\r\\n }\\r\\n $('#valider').appendTo($('#displayHelper_validate'));\\r\\n if(window.innerWidth >= 1200) {\\r\\n $('#task').addClass('largeScreen');\\r\\n $('#displayHelperAnswering').appendTo($('#zone_1'));\\r\\n }\\r\\n else {\\r\\n $('#task').removeClass('largeScreen');\\r\\n if ($('#showSolutionButton')) {\\r\\n $('#displayHelperAnswering').insertBefore($('#showSolutionButton'));\\r\\n }\\r\\n else {\\r\\n $('#displayHelperAnswering').appendTo($('#task'));\\r\\n }\\r\\n }\\r\\n },\\r\\n\\r\\n useFullWidth: function() {\\r\\n // TODO: find a clean way to do this\\r\\n try {\\r\\n $('#question-iframe', window.parent.document).css('width', '100%');\\r\\n } catch(e) {\\r\\n }\\r\\n $('body').css('width', '100%');\\r\\n // This try is probably not needed but avoid breaking just in case\\r\\n try {\\r\\n $(document).ready(function () {displayHelper.updateLayout();});\\r\\n $(window).resize(function () {displayHelper.updateLayout();});\\r\\n this.bUseFullWidth = true;\\r\\n } catch(e) {\\r\\n }\\r\\n },\\r\\n\\r\\n // Deprecated: use directly levelsMaxScores instead\\r\\n getLevelsMaxScores: function() {\\r\\n return this.levelsMaxScores;\\r\\n },\\r\\n\\r\\n displayLevel: function(newLevel) {\\r\\n // Only displays a level, without requesting a level change to the task\\r\\n this.taskLevel = newLevel;\\r\\n\\r\\n if (this.popupMessageShown) {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n this.popupMessageShown = false;\\r\\n }\\r\\n\\r\\n var allLevels = ['basic', 'easy', 'medium', 'hard'];\\r\\n if(this.levelsRanks) {\\r\\n for(var lr in this.levelsRanks) {\\r\\n allLevels.push(lr);\\r\\n }\\r\\n }\\r\\n for(var i=0; i < allLevels.length; i++) {\\r\\n var curLevel = allLevels[i];\\r\\n $('#tab_' + curLevel).removeClass('current');\\r\\n $('.' + curLevel).hide();\\r\\n }\\r\\n $('#tab_' + newLevel).addClass('current');\\r\\n $('.' + newLevel).show();\\r\\n\\r\\n // Add prev and next classes to .current direct siblings\\r\\n $('#tabsMenu .li').removeClass('prev next');\\r\\n $('#tabsMenu .li.current').prev().addClass('prev');\\r\\n $('#tabsMenu .li.current').next().addClass('next');\\r\\n },\\r\\n\\r\\n setLevel: function(newLevel, force) {\\r\\n if (this.taskLevel == newLevel && !force) {\\r\\n return;\\r\\n }\\r\\n\\r\\n this.displayLevel(newLevel);\\r\\n\\r\\n var answer = task.getAnswerObject();\\r\\n var state = task.getStateObject();\\r\\n state.level = newLevel;\\r\\n var self = this;\\r\\n\\r\\n var afterReload = function() {\\r\\n self.submittedScore = self.levelsScores[self.taskLevel];\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n self.stopShowingResult();\\r\\n if ($('#tab_' + newLevel).hasClass('lockedLevel')) {\\r\\n if(window.location.protocol == 'file:') {\\r\\n self.showPopupMessage(self.strings.lockedLevelDev, 'tab', self.strings.alright);\\r\\n } else {\\r\\n self.showPopupMessage(self.strings.lockedLevel, 'lock');\\r\\n }\\r\\n } else if (!self.hasSolution) {\\r\\n if ($('#tab_' + newLevel).hasClass('uselessLevel') && self.levelsScores[newLevel] < self.levelsMaxScores[newLevel]) {\\r\\n self.showPopupMessage(self.strings.harderLevelSolved, 'tab', self.strings.showLevelAnyway, null, null, \\\"warning\\\");\\r\\n } else if (newLevel == 'hard' && self.neverHadHard) {\\r\\n var hardVersionKey = \\\"levelVersionName_hard\\\";\\r\\n var easyVersionKey = \\\"levelVersionName_easy\\\";\\r\\n if (self.pointsAsStars) {\\r\\n hardVersionKey += \\\"_stars\\\";\\r\\n easyVersionKey += \\\"_stars\\\";\\r\\n }\\r\\n self.showPopupMessage(self.formatTranslation(self.strings.hardVersionTakesTime, [self.strings[hardVersionKey], self.strings[easyVersionKey]]),\\r\\n 'tab',\\r\\n self.strings.illKeepThatInMind, function() {\\r\\n self.neverHadHard = false;\\r\\n }\\r\\n );\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n if(self.reloadWithCallbacks) {\\r\\n task.reloadStateObject(state, function() {\\r\\n task.reloadAnswerObject(answer, afterReload);\\r\\n });\\r\\n }\\r\\n else {\\r\\n task.reloadStateObject(state, true);\\r\\n task.reloadAnswerObject(answer);\\r\\n afterReload();\\r\\n }\\r\\n },\\r\\n\\r\\n getImgPath: function() {\\r\\n if(window.contestsRoot) {\\r\\n // Hack: when in the context of the platform, we need to change the path\\r\\n return window.contestsRoot + '/' + window.contestFolder + '/';\\r\\n } else if(window.modulesPath) {\\r\\n var modulesPath = window.modulesPath[window.modulesPath.length-1] == '/' ? window.modulesPath : window.modulesPath + '/';\\r\\n return modulesPath + 'img/';\\r\\n } else {\\r\\n return '../../modules/img/';\\r\\n }\\r\\n },\\r\\n\\r\\n getAvatar: function(mood) {\\r\\n if (displayHelper.avatarType == \\\"beaver\\\") {\\r\\n return \\\"beoi.png\\\";\\r\\n } else if (displayHelper.avatarType == \\\"none\\\") {\\r\\n return \\\"\\\";\\r\\n } else {\\r\\n if (mood == \\\"success\\\") {\\r\\n return \\\"laptop_success.png\\\";\\r\\n } else if (mood == \\\"warning\\\") {\\r\\n return \\\"laptop_warning.png\\\";\\r\\n }{\\r\\n return \\\"laptop_error.png\\\";\\r\\n }\\r\\n }\\r\\n },\\r\\n\\r\\n\\r\\n showPopupDialog: function(message) {\\r\\n if ($('#popupMessage').length == 0) {\\r\\n $('#task').after('<div id=\\\"popupMessage\\\"></div>');\\r\\n }\\r\\n\\r\\n $('#popupMessage').addClass('floatingMessage');\\r\\n\\r\\n var imgPath = displayHelper.getImgPath();\\r\\n\\r\\n var popupHtml = '<div class=\\\"container\\\">' +\\r\\n '<img class=\\\"messageArrow\\\" src=\\\"' + imgPath + 'fleche-bulle.png\\\"/>' +\\r\\n '<div class=\\\"message\\\">' + message + '</div></div>';\\r\\n\\r\\n $('#popupMessage').html(popupHtml).show();\\r\\n\\r\\n this.popupMessageShown = true;\\r\\n try {\\r\\n $(parent.document).scrollTop(0);\\r\\n } catch (e) {\\r\\n }\\r\\n },\\r\\n\\r\\n\\r\\n errorPopupAvatar: function() {\\r\\n $('#popupMessage').addClass('noAvatar');\\r\\n },\\r\\n\\r\\n\\r\\n showPopupMessage: function(message, mode, yesButtonText, agreeFunc, noButtonText, avatarMood, defaultText, disagreeFunc) {\\r\\n if(this.popupMessageHandler) {\\r\\n // A custom popupMessageHandler was defined, call it\\r\\n // It must return true if it handled the popup, false if displayHelper\\r\\n // should handle the popup instead\\r\\n if(this.popupMessageHandler.apply(null, arguments)) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n\\r\\n if ($('#popupMessage').length == 0) {\\r\\n $('#task').after('<div id=\\\"popupMessage\\\"></div>');\\r\\n }\\r\\n if (mode == 'blanket' || mode == 'input') {\\r\\n $('#popupMessage').addClass('floatingMessage');\\r\\n } else {\\r\\n $('#taskContent, #displayHelperAnswering').hide();\\r\\n $('#popupMessage').removeClass('floatingMessage');\\r\\n }\\r\\n $('#popupMessage').removeClass('noAvatar');\\r\\n\\r\\n var imgPath = displayHelper.getImgPath();\\r\\n if(mode == 'lock') {\\r\\n var buttonYes = '';\\r\\n } else if (mode == 'input') {\\r\\n var buttonYes = '<button class=\\\"buttonYes\\\">' + (yesButtonText || this.strings.validate) + '</button>';\\r\\n } else {\\r\\n var buttonYes = '<button class=\\\"buttonYes\\\">' + (yesButtonText || this.strings.alright) + '</button>';\\r\\n }\\r\\n var buttonNo = '';\\r\\n if (noButtonText != undefined) {\\r\\n buttonNo = '<button class=\\\"buttonNo\\\" style=\\\"margin-left: 10px;\\\">' + noButtonText + '</button>';\\r\\n }\\r\\n var popupHtml = '<div class=\\\"container\\\">' +\\r\\n '<img class=\\\"beaver\\\" src=\\\"' + imgPath + this.getAvatar(avatarMood) + '\\\" onerror=\\\"displayHelper.errorPopupAvatar();\\\"/>' +\\r\\n '<img class=\\\"messageArrow\\\" src=\\\"' + imgPath + 'fleche-bulle.png\\\"/>' +\\r\\n '<div class=\\\"message\\\">' + message + '</div>';\\r\\n if(mode == 'input') {\\r\\n popupHtml += '<input id=\\\"popupInput\\\" type=\\\"text\\\" value=\\\"' + (defaultText ? defaultText : '') + '\\\"></input>';\\r\\n }\\r\\n popupHtml += '<div class=\\\"buttonsWrapper\\\">' + buttonYes + buttonNo + '</div></div>';\\r\\n $('#popupMessage').html(popupHtml).show();\\r\\n if(mode == 'input') {\\r\\n $('#popupInput').focus();\\r\\n }\\r\\n\\r\\n var validateFunc = function() {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n displayHelper.popupMessageShown = false;\\r\\n if (agreeFunc) {\\r\\n if(mode == 'input') {\\r\\n agreeFunc($('#popupInput').val());\\r\\n } else {\\r\\n agreeFunc();\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n var validateFuncNo = function() {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n displayHelper.popupMessageShown = false;\\r\\n if (disagreeFunc) {\\r\\n if(mode == 'input') {\\r\\n disagreeFunc($('#popupInput').val());\\r\\n } else {\\r\\n disagreeFunc();\\r\\n }\\r\\n }\\r\\n };\\r\\n\\r\\n $('#popupMessage .buttonYes').click(validateFunc);\\r\\n $('#popupMessage .buttonNo').click(validateFuncNo);\\r\\n $('#popupInput').keypress(function (e) {\\r\\n if(e.which === 13) { validateFunc(); }\\r\\n });\\r\\n\\r\\n $('#popupMessage .buttonNo').click(function() {\\r\\n $('#popupMessage').hide();\\r\\n $('#displayHelperAnswering, #taskContent').show();\\r\\n displayHelper.popupMessageShown = false;\\r\\n });\\r\\n this.popupMessageShown = true;\\r\\n try {\\r\\n $(parent.document).scrollTop(0);\\r\\n } catch (e) {\\r\\n }\\r\\n },\\r\\n\\r\\n // Function to call at the beginning of task loading, before any html has\\r\\n // been modified. It places the markers where the buttons will appear, if the\\r\\n // markers are not present already.\\r\\n showViews: function(views) {\\r\\n // Fix for an old version of Firefox in which selection was stuck\\r\\n try {\\r\\n if (document.getSelection) {\\r\\n var selection = document.getSelection();\\r\\n if (selection !== undefined && selection.removeAllRanges !== undefined) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n }\\r\\n } catch (err) {}\\r\\n\\r\\n this.views = views;\\r\\n this.hasSolution = (typeof views.solution !== 'undefined');\\r\\n if (this.hasSolution && this.graderScore) {\\r\\n this.prevSavedScore = this.graderScore;\\r\\n }\\r\\n var self = this;\\r\\n this.checkAnswerInterval = setInterval(\\r\\n function() {\\r\\n self.checkAnswerChanged();\\r\\n }, 1000);\\r\\n task.getAnswer(function(answer) {\\r\\n self.defaultAnswer = answer;\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n });\\r\\n },\\r\\n\\r\\n reloadAnswer: function(strAnswer) {\\r\\n this.savedAnswer = strAnswer;\\r\\n this.prevAnswer = strAnswer;\\r\\n this.submittedAnswer = strAnswer;\\r\\n var that = this;\\r\\n if (this.showScore) {\\r\\n // TODO we only know the answer here, and not the state. Possibly problematic?\\r\\n this.updateScore(strAnswer, true, function() {\\r\\n that.checkAnswerChanged(); // necessary?\\r\\n });\\r\\n } else {\\r\\n that.checkAnswerChanged(); // necessary?\\r\\n }\\r\\n },\\r\\n\\r\\n reloadState: function() {\\r\\n this.checkAnswerChanged(); // necessary?\\r\\n },\\r\\n\\r\\n stopShowingResult: function() {\\r\\n this.stoppedShowingResult = true;\\r\\n this.updateMessages();\\r\\n },\\r\\n\\r\\n /**********************\\r\\n * Internal functions *\\r\\n **********************/\\r\\n restartAll: function() {\\r\\n if(this.confirmRestartAll) {\\r\\n this.showPopupMessage(this.strings.confirmRestart, 'blanket', this.strings.yes, this.restartAllNoConfirm, this.strings.no);\\r\\n }\\r\\n else {\\r\\n this.restartAllNoConfirm();\\r\\n }\\r\\n },\\r\\n\\r\\n restartAllNoConfirm: function() {\\r\\n displayHelper.stopShowingResult();\\r\\n if (!displayHelper.hasLevels) {\\r\\n // TODO is this the desired behavior for no levels?\\r\\n task.reloadAnswer('', function() {});\\r\\n } else {\\r\\n task.getAnswer(function(strAnswer) {\\r\\n var answer = $.parseJSON(strAnswer);\\r\\n var defaultAnswer = task.getDefaultAnswerObject();\\r\\n var level = displayHelper.taskLevel;\\r\\n answer[level] = defaultAnswer[level];\\r\\n task.reloadAnswer(JSON.stringify(answer), function() {});\\r\\n });\\r\\n }\\r\\n },\\r\\n\\r\\n setValidateString: function(str) {\\r\\n this.customValidateString = str;\\r\\n $(\\\"#displayHelper_validate > input\\\").val(str);\\r\\n },\\r\\n\\r\\n callValidate: function() {\\r\\n if (this.customValidate != undefined) {\\r\\n this.customValidate();\\r\\n } else {\\r\\n platform.validate(\\\"none\\\", function() {});\\r\\n }\\r\\n },\\r\\n\\r\\n validate: function(mode) {\\r\\n this.stoppedShowingResult = false;\\r\\n var self = this;\\r\\n if (mode == 'log') {\\r\\n // Ignore it? Do something?\\r\\n } else if (mode == 'cancel') {\\r\\n this.savedAnswer = '';\\r\\n task.reloadAnswer('', function() {\\r\\n self.checkAnswerChanged();\\r\\n });\\r\\n } else {\\r\\n task.getAnswer(function(strAnswer) {\\r\\n if (!self.hasSolution) {\\r\\n self.prevSavedScore = self.graderScore;\\r\\n if (self.hasLevels) {\\r\\n self.prevLevelsScores[self.taskLevel] = self.levelsScores[self.taskLevel];\\r\\n }\\r\\n }\\r\\n var refresh = function() {\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n };\\r\\n self.submittedAnswer = strAnswer;\\r\\n if (self.showScore) {\\r\\n self.updateScore(strAnswer, false, refresh, (mode == \\\"silent\\\"));\\r\\n } else {\\r\\n self.savedAnswer = strAnswer;\\r\\n refresh();\\r\\n }\\r\\n });\\r\\n }\\r\\n },\\r\\n\\r\\n updateScore: function(strAnswer, allLevels, callback, silentMode) {\\r\\n var self = this;\\r\\n function refresh() {\\r\\n self.refreshMessages = true;\\r\\n self.checkAnswerChanged();\\r\\n callback();\\r\\n }\\r\\n if (allLevels) {\\r\\n // TODO: make sure the grader doesn't evaluate each level at each call (most do right now!)\\r\\n var levelsToDo = this.levels.slice();\\r\\n var updateNextScore = null;\\r\\n updateNextScore = function() {\\r\\n var nextLevel = levelsToDo.shift();\\r\\n if(nextLevel) {\\r\\n self.updateScoreOneLevel(strAnswer, nextLevel, updateNextScore);\\r\\n } else {\\r\\n refresh();\\r\\n }\\r\\n }\\r\\n updateNextScore();\\r\\n } else {\\r\\n this.updateScoreOneLevel(strAnswer, this.taskLevel, function() {\\r\\n if (!silentMode) {\\r\\n if (self.hasLevels) {\\r\\n self.showValidatePopup(self.taskLevel);\\r\\n } else {\\r\\n self.showValidatePopup();\\r\\n }\\r\\n }\\r\\n callback();\\r\\n }, silentMode);\\r\\n }\\r\\n },\\r\\n updateScoreOneLevel: function(strAnswer, gradedLevel, callback, silentMode) {\\r\\n var self = this;\\r\\n this.graderMessage = this.strings.gradingInProgress;\\r\\n task.getLevelGrade(strAnswer, null, function(score, message) {\\r\\n score = +score;\\r\\n self.submittedScore = score;\\r\\n if (self.hasSolution) {\\r\\n self.graderScore = score;\\r\\n self.levelsScores[gradedLevel] = score;\\r\\n } else {\\r\\n if (self.hasLevels) {\\r\\n if (score > self.levelsScores[gradedLevel]) {\\r\\n self.levelsScores[gradedLevel] = score;\\r\\n self.graderScore = score;\\r\\n if (self.savedAnswer === '') {\\r\\n self.savedAnswer = strAnswer;\\r\\n } else {\\r\\n var savedAnswerObj = $.parseJSON(self.savedAnswer);\\r\\n var answerObj = $.parseJSON(strAnswer);\\r\\n savedAnswerObj[gradedLevel] = answerObj[gradedLevel];\\r\\n self.savedAnswer = JSON.stringify(savedAnswerObj);\\r\\n }\\r\\n }\\r\\n } else if (score > self.graderScore) {\\r\\n self.savedAnswer = strAnswer;\\r\\n self.graderScore = score;\\r\\n }\\r\\n }\\r\\n if (silentMode) {\\r\\n message = \\\"\\\";\\r\\n }\\r\\n if (message !== undefined) {\\r\\n self.graderMessage = message;\\r\\n } else {\\r\\n self.graderMessage = \\\"\\\";\\r\\n }\\r\\n // TODO : should not be called from here, might update the display of a level not currently opened!\\r\\n if (self.hasLevels) {\\r\\n self.updateScoreDisplays(gradedLevel);\\r\\n }\\r\\n callback();\\r\\n }, gradedLevel);\\r\\n },\\r\\n updateScoreDisplays: function(gradedLevel) {\\r\\n var scores = this.levelsScores;\\r\\n var maxScores = this.levelsMaxScores;\\r\\n if (this.pointsAsStars) {\\r\\n this.updateStarsAtLevel(gradedLevel);\\r\\n var maxMaxScore = 0;\\r\\n for(var lvl in maxScores) {\\r\\n maxMaxScore = Math.max(maxScores[lvl], maxMaxScore);\\r\\n }\\r\\n drawStars('titleStars', this.maxStars, 24, this.graderScore / maxMaxScore, 'normal');\\r\\n } else {\\r\\n $('#tabScore_' + gradedLevel).html(scores[gradedLevel]);\\r\\n $('#bestScore').html(this.graderScore);\\r\\n }\\r\\n\\r\\n var gradedLevelNum = $.inArray(gradedLevel, this.levels);\\r\\n var curLevel;\\r\\n // Possibly unlocking a level\\r\\n if (maxScores[gradedLevel] == scores[gradedLevel]) {\\r\\n var unlockedLevel = gradedLevelNum + 1;\\r\\n if (unlockedLevel < this.levels.length && unlockedLevel >= this.unlockedLevels) {\\r\\n curLevel = this.levels[unlockedLevel];\\r\\n $('#tab_' + curLevel).removeClass('lockedLevel');\\r\\n this.unlockedLevels++;\\r\\n this.updateStarsAtLevel(curLevel);\\r\\n // Currently displayed level has been unlocked, display it\\r\\n if(curLevel == this.taskLevel) {\\r\\n this.setLevel(this.taskLevel, true);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (scores[gradedLevel] == this.graderScore) {\\r\\n // Marks levels that can't earn points as useless\\r\\n for (curLevel in this.levelsRanks) {\\r\\n if (maxScores[curLevel] > this.graderScore) {\\r\\n break;\\r\\n }\\r\\n if (this.pointsAsStars) {\\r\\n this.updateStarsAtLevel(curLevel);\\r\\n }\\r\\n $('#tab_' + curLevel).addClass('uselessLevel');\\r\\n }\\r\\n }\\r\\n },\\r\\n showValidatePopup: function(gradedLevel) {\\r\\n var curTime = new Date().getTime();\\r\\n var secondsSinceLoaded = (curTime - this.timeLoaded) / 1000;\\r\\n var actionNext = \\\"stay\\\";\\r\\n // Display popup to indicate what to do next\\r\\n var fullMessage = this.graderMessage;\\r\\n var maxScores = this.levelsMaxScores;\\r\\n var buttonText = this.strings.alright;\\r\\n var avatarMood = \\\"error\\\";\\r\\n if ((gradedLevel == undefined) && (this.graderScore >= this.taskParams.maxScore - 0.001)) {\\r\\n avatarMood = \\\"success\\\";\\r\\n buttonText = this.strings.moveOn;\\r\\n fullMessage += \\\"<br/><br/>\\\";\\r\\n actionNext = \\\"nextTask\\\";\\r\\n fullMessage += this.strings.solvedMoveOn;\\r\\n } else if (maxScores && (gradedLevel !== undefined) && this.graderScore >= maxScores[gradedLevel] - 0.001) {\\r\\n avatarMood = \\\"success\\\";\\r\\n buttonText = this.strings.moveOn;\\r\\n fullMessage += \\\"<br/><br/>\\\";\\r\\n var levelIdx = this.levelsIdx[gradedLevel];\\r\\n var nextLevel = levelIdx !== undefined && levelIdx < this.levels.length-1 ? this.levels[levelIdx+1] : null;\\r\\n if(nextLevel) {\\r\\n // Offer to try next task if the user solved this difficulty slowly\\r\\n var threshold = this.thresholds[gradedLevel];\\r\\n if(!threshold) {\\r\\n if(gradedLevel == \\\"medium\\\") { threshold = this.thresholdMedium; }\\r\\n else if(gradedLevel == \\\"easy\\\") { threshold = this.thresholdEasy; }\\r\\n }\\r\\n if(levelIdx == this.forceNextTaskAfter) {\\r\\n // Move onto next task after a specified difficulty\\r\\n actionNext = \\\"top\\\";\\r\\n fullMessage += this.strings.tryNextTask;\\r\\n } else if(!threshold || (threshold && secondsSinceLoaded < threshold)) {\\r\\n actionNext = nextLevel;\\r\\n if(gradedLevel == \\\"easy\\\") { fullMessage += this.strings.tryMediumLevel; }\\r\\n if(gradedLevel == \\\"medium\\\") { fullMessage += this.strings.tryHardLevel; }\\r\\n } else {\\r\\n actionNext = \\\"nextTask\\\";\\r\\n fullMessage += this.strings.tryNextTask;\\r\\n }\\r\\n } else {\\r\\n // Solved the last level, move on\\r\\n actionNext = \\\"nextTask\\\";\\r\\n fullMessage += this.strings.solvedMoveOn;\\r\\n }\\r\\n }\\r\\n var self = this;\\r\\n // Offer an option to stay on the task instead of forcing nextTask\\r\\n var noButtonText = actionNext == \\\"nextTask\\\" ? this.strings.no : null;\\r\\n this.showPopupMessage(fullMessage, 'blanket', buttonText,\\r\\n function() {\\r\\n // TODO: replace with something compatible with the API.\\r\\n try {\\r\\n $(parent.document).scrollTop(0);\\r\\n } catch (e) {\\r\\n }\\r\\n if (actionNext == \\\"nextTask\\\") {\\r\\n platform.validate(\\\"nextImmediate\\\");\\r\\n } else if (actionNext == \\\"top\\\") {\\r\\n platform.validate(\\\"top\\\");\\r\\n } else if(self.levelsIdx[actionNext] !== undefined) {\\r\\n self.setLevel(actionNext);\\r\\n }\\r\\n },\\r\\n noButtonText,\\r\\n avatarMood\\r\\n );\\r\\n },\\r\\n\\r\\n // Does task have unsaved answers?\\r\\n hasNonSavedAnswer: function(callback) {\\r\\n if (!task) {\\r\\n return false;\\r\\n }\\r\\n var self = this;\\r\\n task.getAnswer(function(curAnswer) {\\r\\n if (curAnswer != self.prevAnswer) {\\r\\n try {\\r\\n if (self != top && parent.Tracker) {\\r\\n var data = {\\r\\n dataType: 'nonSavedAnswer', teamID: parent.teamID, questionKey: parent.currentQuestionKey, answer: curAnswer\\r\\n };\\r\\n // Call TrackData, only when loaded in an iframe\\r\\n // this is not yet document in the API, but should be soonish\\r\\n parent.Tracker.trackData(data);\\r\\n }\\r\\n } catch (e) {}\\r\\n self.prevAnswer = curAnswer;\\r\\n }\\r\\n if (curAnswer != self.submittedAnswer) {\\r\\n self.submittedAnswer = '';\\r\\n self.refreshMessages = true;\\r\\n }\\r\\n if (curAnswer == self.defaultAnswer && self.savedAnswer === '') {\\r\\n callback(false);\\r\\n } else {\\r\\n callback(curAnswer != self.submittedAnswer);\\r\\n }\\r\\n });\\r\\n },\\r\\n\\r\\n // Checks task.getAnswer() against previously recorded result, and calls\\r\\n // displayHelper.updateMessages() accordingly.\\r\\n checkAnswerChanged: function() {\\r\\n if (!this.loaded) {\\r\\n this.checkAnswerInterval = clearInterval(this.checkAnswerInterval);\\r\\n return;\\r\\n }\\r\\n var self = this;\\r\\n this.hasNonSavedAnswer(function(hasNonSavedAnswer) {\\r\\n if (hasNonSavedAnswer && !self.hasAnswerChanged) {\\r\\n self.refreshMessages = true;\\r\\n self.hasAnswerChanged = true;\\r\\n } else if (!hasNonSavedAnswer && self.hasAnswerChanged) {\\r\\n self.refreshMessages = true;\\r\\n self.hasAnswerChanged = false;\\r\\n }\\r\\n if (self.refreshMessages) {\\r\\n self.updateMessages();\\r\\n }\\r\\n });\\r\\n },\\r\\n\\r\\n getFullFeedbackSavedMessage: function(taskMode) {\\r\\n var scoreDiffMsg = this.strings.score;\\r\\n var showRetrieveAnswer = false;\\r\\n if (this.submittedAnswer !== '' && this.prevSavedScore !== undefined) {\\r\\n if (!this.hasSolution) {\\r\\n if (this.prevSavedScore < this.submittedScore) {\\r\\n scoreDiffMsg = this.strings.yourScoreIsNow;\\r\\n } else if (this.prevSavedScore > this.submittedScore) {\\r\\n scoreDiffMsg = this.strings.worseScoreStays;\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n else {\\r\\n scoreDiffMsg = this.strings.scoreStays;\\r\\n }\\r\\n } else {\\r\\n if (this.prevSavedScore != this.submittedScore) {\\r\\n scoreDiffMsg = this.strings.contestOverScoreStays + \\\" \\\" + this.prevSavedScore + \\\". \\\" + this.strings.scoreWouldBecome;\\r\\n } else if (this.submittedAnswer != this.savedAnswer) {\\r\\n scoreDiffMsg = this.strings.contestOverScoreStays + \\\" \\\" + this.prevSavedScore + \\\". \\\" + this.strings.scoreWouldStay;\\r\\n } else {\\r\\n scoreDiffMsg = this.strings.scoreIs;\\r\\n }\\r\\n }\\r\\n }\\r\\n scoreDiffMsg += \\\" \\\" + this.graderScore + this.strings.outOf + this.taskParams.maxScore + \\\".\\\";\\r\\n if ((this.hasSolution && this.savedAnswer != this.prevAnswer) ||\\r\\n (this.graderScore > 0 && (taskMode == 'saved_changed' || showRetrieveAnswer))) {\\r\\n scoreDiffMsg += ' <a href=\\\"#\\\" onclick=\\\"displayHelper.retrieveAnswer(); return false;\\\">' + this.strings.reloadValidAnswer + '</a>';\\r\\n }\\r\\n return scoreDiffMsg;\\r\\n },\\r\\n getFullFeedbackWithLevelsSavedMessage: function() {\\r\\n var maxScoreLevel = this.levelsMaxScores[this.taskLevel];\\r\\n var showRetrieveAnswer = false;\\r\\n var message = \\\"\\\";\\r\\n var curAnswer = this.submittedAnswer;\\r\\n var answerExists = false;\\r\\n if (curAnswer !== '') {\\r\\n curAnswer = $.parseJSON(curAnswer);\\r\\n answerExists = !$.isEmptyObject(curAnswer);\\r\\n }\\r\\n if (!answerExists) {\\r\\n if (this.levelsScores[this.taskLevel] > 0) {\\r\\n if (this.hideScoreDetails) {\\r\\n message = this.strings.scoreObtained + ' <span id=\\\"answerScore\\\">' + this.levelsScores[this.taskLevel] + \\\" \\\" + strPoint + \\\" \\\" + this.strings.outOf + \\\" \\\" + maxScoreLevel + \\\".</span><br/>\\\";;\\r\\n } else {\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n } else {\\r\\n message += this.strings.noPointsForLevel;\\r\\n }\\r\\n } else {\\r\\n var strPoint = this.strings.point;\\r\\n if (this.submittedScore > 1) {\\r\\n strPoint = this.strings.points;\\r\\n }\\r\\n message = this.strings.scoreObtained + ' <span id=\\\"answerScore\\\">' + this.submittedScore + \\\" \\\" + strPoint + \\\" \\\" + this.strings.outOf + \\\" \\\" + maxScoreLevel + \\\".</span><br/>\\\";\\r\\n if (this.hideScoreDetails) {\\r\\n } else if (this.hasSolution) {\\r\\n message += this.strings.contestOverAnswerNotSaved;\\r\\n if (this.prevSavedScore !== undefined) {\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n } else {\\r\\n var prevScore = this.prevLevelsScores[this.taskLevel];\\r\\n if (this.prevSavedScore !== undefined) {\\r\\n if (this.submittedScore > prevScore) {\\r\\n if (this.submittedScore < maxScoreLevel) {\\r\\n if (this.taskLevel == \\\"hard\\\") {\\r\\n message += this.strings.tryToDoBetterOrChangeTask;\\r\\n } else {\\r\\n message += this.strings.tryToDoBetterOrMoveToNextLevel;\\r\\n }\\r\\n } else if (this.taskLevel == \\\"hard\\\") {\\r\\n message += this.strings.bestPossibleScoreCongrats;\\r\\n } else {\\r\\n message += this.strings.forMorePointsMoveToNextLevel;\\r\\n }\\r\\n } else if (this.submittedScore < prevScore) {\\r\\n message += this.strings.youDidBetterBefore;\\r\\n showRetrieveAnswer = true;\\r\\n }\\r\\n else {\\r\\n message += this.strings.scoreStays2;\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n if (showRetrieveAnswer) {\\r\\n message += ' <a href=\\\"#\\\" onclick=\\\"displayHelper.retrieveAnswer(); return false;\\\">' + this.strings.reloadBestAnswer + '</a>';\\r\\n }\\r\\n return message;\\r\\n },\\r\\n getFullFeedbackGraderMessage: function(taskMode) {\\r\\n switch (taskMode) {\\r\\n case 'saved_unchanged':\\r\\n var color = 'red';\\r\\n if (this.submittedScore == this.taskParams.maxScore) {\\r\\n color = 'green';\\r\\n } else if (this.submittedScore > 0) {\\r\\n color = '#ff8c00';\\r\\n }\\r\\n if (this.graderMessage !== \\\"\\\") {\\r\\n if (!this.stoppedShowingResult) {\\r\\n return '<div style=\\\"margin: .2em 0; color: ' + color + '; font-weight: bold;\\\">' + this.graderMessage + '</div>';\\r\\n }\\r\\n }\\r\\n break;\\r\\n }\\r\\n return '';\\r\\n },\\r\\n // TODO: rename function below to getFullFeedbackValidate, assuming it is not called from outside this file\\r\\n getFullFeedbackValidateMessage: function(taskMode, disabledStr) {\\r\\n var strValidate = this.strings.validate;\\r\\n if (this.customValidateString != undefined) {\\r\\n strValidate = this.customValidateString;\\r\\n }\\r\\n switch (taskMode) {\\r\\n case 'saved_unchanged':\\r\\n if (this.graderMessage !== \\\"\\\") {\\r\\n if (!this.hideValidateButton && !this.hasSolution) {\\r\\n return '<input type=\\\"button\\\" value=\\\"' + strValidate + '\\\" onclick=\\\"displayHelper.callValidate();\\\" ' +\\r\\n disabledStr + '/>';\\r\\n }\\r\\n }\\r\\n break;\\r\\n case 'unsaved_unchanged':\\r\\n case 'unsaved_changed':\\r\\n if (!this.hideValidateButton) {\\r\\n if (this.hasSolution) {\\r\\n return '<input type=\\\"button\\\" value=\\\"' + this.strings.gradeThisAnswer + '\\\" onclick=\\\"displayHelper.validate(\\\\'test\\\\');\\\" ' +\\r\\n disabledStr + '/>';\\r\\n } else {\\r\\n return '<input type=\\\"button\\\" value=\\\"' + strValidate + '\\\" onclick=\\\"displayHelper.callValidate();\\\" ' +\\r\\n disabledStr + '/>';\\r\\n }\\r\\n }\\r\\n break;\\r\\n case 'saved_changed':\\r\\n if (!this.hideValidateButton) {\\r\\n if (this.hasSolution) {\\r\\n return '<input type=\\\"button\\\" value=\\\"' + this.strings.gradeThisAnswer + '\\\" onclick=\\\"displayHelper.validate(\\\\'test\\\\');\\\" ' +\\r\\n disabledStr + '/>';\\r\\n } else {\\r\\n // was: Valider votre nouvelle réponse\\r\\n return '<input type=\\\"button\\\" value=\\\"' + strValidate + '\\\" onclick=\\\"displayHelper.callValidate();\\\" ' +\\r\\n disabledStr + '/>';\\r\\n }\\r\\n }\\r\\n break;\\r\\n }\\r\\n return '';\\r\\n },\\r\\n\\r\\n lastSentHeight: null,\\r\\n updateMessages: function() {\\r\\n this.initLanguage();\\r\\n var self = this;\\r\\n this.refreshMessages = false;\\r\\n var suffix, prefix;\\r\\n if (this.hasAnswerChanged) {\\r\\n suffix = 'changed';\\r\\n } else {\\r\\n suffix = 'unchanged';\\r\\n }\\r\\n if (this.savedAnswer !== '' && this.savedAnswer != this.defaultAnswer) {\\r\\n prefix = 'saved';\\r\\n } else {\\r\\n prefix = 'unsaved';\\r\\n }\\r\\n if (this.submittedAnswer !== '' && this.submittedAnswer != this.savedAnswer) {\\r\\n prefix = 'saved'; // equivalent, should be named differently\\r\\n suffix = 'unchanged';\\r\\n }\\r\\n var taskMode = prefix + '_' + suffix;\\r\\n var messages = { graderMessage: '', validate: '', cancel: '', saved: '' };\\r\\n var disabledStr = this.readOnly ? ' disabled' : '';\\r\\n if (this.showScore) {\\r\\n if (!this.hideRestartButton) {\\r\\n messages.cancel = '<input type=\\\"button\\\" value=\\\"' + this.strings.restart + '\\\" onclick=\\\"displayHelper.restartAll();\\\"' +\\r\\n disabledStr + '/></div>';\\r\\n }\\r\\n messages.graderMessage = this.getFullFeedbackGraderMessage(taskMode);\\r\\n messages.validate = this.getFullFeedbackValidateMessage(taskMode, disabledStr);\\r\\n if (this.hasLevels) {\\r\\n messages.saved = this.getFullFeedbackWithLevelsSavedMessage(taskMode);\\r\\n } else {\\r\\n messages.saved = this.getFullFeedbackSavedMessage(taskMode);\\r\\n }\\r\\n } else {\\r\\n switch (taskMode) {\\r\\n case 'unsaved_unchanged':\\r\\n case 'unsaved_changed':\\r\\n if (!this.hasSolution) {\\r\\n messages.validate = '<input type=\\\"button\\\" value=\\\"' + this.strings.saveAnswer + '\\\" ' +\\r\\n 'onclick=\\\"platform.validate(\\\\'done\\\\', function(){})\\\" ' + disabledStr + '/>';\\r\\n }\\r\\n break;\\r\\n case 'saved_unchanged':\\r\\n if (!this.hasSolution) {\\r\\n messages.saved = this.formatTranslation(this.strings.answerSavedModifyOrCancelIt,\\r\\n [\\\"<a href='#' onclick=\\\\\\\"platform.validate('cancel', function(){}); return false;\\\\\\\" \\\" + disabledStr + \\\">\\\" + this.strings.cancelIt + \\\"</a>\\\"]);\\r\\n } else {\\r\\n messages.saved = this.formatTranslation(this.strings.answerNotSavedContestOver,\\r\\n [\\\"<a href='#' onclick=\\\\\\\"displayHelper.validate('cancel'); return false;\\\\\\\" \\\" + disabledStr + \\\">\\\" + this.strings.reloadSubmittedAnswer + \\\"</a>\\\"]);\\r\\n }\\r\\n break;\\r\\n case 'saved_changed':\\r\\n messages.saved = \\\"<br/><b style='color: red;'>\\\" + this.strings.warningDifferentAnswerSaved + \\\"</b> \\\" +\\r\\n this.formatTranslation(this.strings.youMay, [\\\"<a href='#' onclick='displayHelper.retrieveAnswer(); return false;'>\\\" + this.strings.reloadIt + \\\"</a>\\\"]);\\r\\n if (!this.hideValidateButton) {\\r\\n messages.validate = \\\"<input type='button' value='\\\" + this.strings.saveThisNewAnswer + \\\"' onclick=\\\\\\\"platform.validate('done', function(){})\\\\\\\" \\\" + disabledStr + \\\"/>\\\";\\r\\n }\\r\\n break;\\r\\n }\\r\\n }\\r\\n for (var type in messages) {\\r\\n if (this.loaded && (typeof this.previousMessages[type] === 'undefined' || this.previousMessages[type] !== messages[type])) {\\r\\n $('#displayHelper_' + type).html(messages[type]);\\r\\n this.previousMessages[type] = messages[type];\\r\\n }\\r\\n }\\r\\n if (this.pointsAsStars && $('#answerScore').length) {\\r\\n drawStars('answerScore', this.levelsRanks[this.taskLevel], 20,\\r\\n this.levelsScores[this.taskLevel] / this.levelsMaxScores[this.taskLevel], 'normal');\\r\\n }\\r\\n window.task.getHeight(function(height) {\\r\\n if (Math.abs(height - self.lastSentHeight) > 30) {\\r\\n self.lastSentHeight = height;\\r\\n window.platform.updateDisplay({height: height}, function(){});\\r\\n }\\r\\n });\\r\\n },\\r\\n\\r\\n getSavedAnswer: function() {\\r\\n // Gets the previously saved answer\\r\\n var retrievedAnswer;\\r\\n if (this.hasLevels) {\\r\\n var savedAnswerObj = this.savedAnswer && $.parseJSON(this.savedAnswer);\\r\\n if(savedAnswerObj) {\\r\\n var retrievedAnswerObj = task.getAnswerObject();\\r\\n retrievedAnswerObj[this.taskLevel] = savedAnswerObj[this.taskLevel];\\r\\n retrievedAnswer = retrievedAnswerObj[this.taskLevel] && JSON.stringify(retrievedAnswerObj);\\r\\n } else {\\r\\n retrievedAnswer = null;\\r\\n }\\r\\n } else {\\r\\n retrievedAnswer = this.savedAnswer;\\r\\n }\\r\\n return retrievedAnswer;\\r\\n },\\r\\n retrieveAnswer: function() {\\r\\n // Loads previously saved answer\\r\\n var retrievedAnswer = this.getSavedAnswer();\\r\\n if(!retrievedAnswer) {\\r\\n this.showPopupMessage(this.strings.noAnswerSaved, 'blanket', this.strings.alright, null, null, \\\"warning\\\");\\r\\n return;\\r\\n }\\r\\n var self = displayHelper;\\r\\n task.reloadAnswer(retrievedAnswer, function() {\\r\\n self.submittedAnswer = self.savedAnswer;\\r\\n self.updateScore(self.savedAnswer, false, function() {});\\r\\n });\\r\\n },\\r\\n hasSavedAnswer: function() {\\r\\n // Returns whether a saved answer exists\\r\\n if (this.hasLevels) {\\r\\n var savedAnswerObj = this.savedAnswer && $.parseJSON(this.savedAnswer);\\r\\n if(savedAnswerObj) {\\r\\n return !!savedAnswerObj[this.taskLevel];\\r\\n }\\r\\n } else {\\r\\n return !!this.savedAnswer;\\r\\n }\\r\\n return false;\\r\\n },\\r\\n\\r\\n sendBestScore: function(callback, scores, messages) {\\r\\n var bestLevel = 'easy';\\r\\n var bestScore = null;\\r\\n for (var curLevel in scores) {\\r\\n if (bestScore === null || bestScore <= scores[curLevel]) {\\r\\n bestLevel = curLevel;\\r\\n bestScore = scores[curLevel];\\r\\n }\\r\\n }\\r\\n callback(scores[bestLevel], messages[bestLevel] + \\\" (\\\" + this.strings[\\\"levelVersionName_\\\" + bestLevel] + \\\")\\\");\\r\\n }\\r\\n};\\r\\n\\r\\n\\r\\n/*\\r\\n draw nbStars stars of width starWidth in element of id id\\r\\n fills rate% of them in yellow from the left\\r\\n mode is \\\"norma\\\", \\\"locked\\\" or \\\"useless\\\"\\r\\n*/\\r\\nfunction drawStars(id, nbStars, starWidth, rate, mode) {\\r\\n $('#' + id).addClass('stars');\\r\\n\\r\\n function clipPath(coords, xClip) {\\r\\n var result = [[coords[0][0], coords[0][1]]];\\r\\n var clipped = false;\\r\\n for (var iCoord = 1; iCoord <= coords.length; iCoord++) {\\r\\n var x1 = coords[iCoord - 1][0];\\r\\n var y1 = coords[iCoord - 1][1];\\r\\n var x2 = coords[iCoord % coords.length][0];\\r\\n var y2 = coords[iCoord % coords.length][1];\\r\\n if (x2 > xClip) {\\r\\n if (!clipped) {\\r\\n result.push([xClip, y1 + (y2 - y1) * (xClip - x1) / (x2 - x1)]);\\r\\n clipped = true;\\r\\n }\\r\\n } else {\\r\\n if (clipped) {\\r\\n result.push([xClip, y1 + (y2 - y1) * (xClip - x1) / (x2 - x1)]);\\r\\n clipped = false;\\r\\n }\\r\\n result.push([x2, y2]);\\r\\n }\\r\\n }\\r\\n result.pop();\\r\\n return result;\\r\\n }\\r\\n\\r\\n function pathFromCoords(coords) {\\r\\n var result = 'm' + coords[0][0] + ',' + coords[0][1];\\r\\n for (var iCoord = 1; iCoord < coords.length; iCoord++) {\\r\\n var x1 = coords[iCoord - 1][0];\\r\\n var y1 = coords[iCoord - 1][1];\\r\\n var x2 = coords[iCoord][0];\\r\\n var y2 = coords[iCoord][1];\\r\\n result += ' ' + (x2 - x1) + ',' + (y2 - y1);\\r\\n }\\r\\n result += 'z';\\r\\n return result;\\r\\n }\\r\\n\\r\\n var fillColors = { normal: 'white', locked: '#ddd', useless: '#ced' };\\r\\n var strokeColors = { normal: 'black', locked: '#ddd', useless: '#444' };\\r\\n var starCoords = [[25, 60], [5, 37], [35, 30], [50, 5], [65, 30], [95, 37], [75, 60], [78, 90], [50, 77], [22, 90]];\\r\\n var fullStarCoords = [\\r\\n [[5, 37], [35, 30], [50, 5], [65, 30], [95, 37], [75, 60], [25, 60]],\\r\\n [[22, 90], [50, 77], [78, 90], [75, 60], [25, 60]]\\r\\n ];\\r\\n\\r\\n\\r\\n if ($('#' + id).length == 0) {\\r\\n return;\\r\\n }\\r\\n $('#' + id).html('');\\r\\n var paper = new Raphael(id, starWidth * nbStars, starWidth * 0.95);\\r\\n for (var iStar = 0; iStar < nbStars; iStar++) {\\r\\n var scaleFactor = starWidth / 100;\\r\\n var deltaX = iStar * starWidth;\\r\\n var coordsStr = pathFromCoords(starCoords, iStar * 100);\\r\\n\\r\\n paper.path(coordsStr).attr({\\r\\n fill: fillColors[mode],\\r\\n stroke: 'none'\\r\\n }).transform('s' + scaleFactor + ',' + scaleFactor + ' 0,0 t' + (deltaX / scaleFactor) + ',0');\\r\\n\\r\\n var ratio = Math.min(1, Math.max(0, rate * nbStars - iStar));\\r\\n var xClip = ratio * 100;\\r\\n if (xClip > 0) {\\r\\n for (var iPiece = 0; iPiece < fullStarCoords.length; iPiece++) {\\r\\n var coords = clipPath(fullStarCoords[iPiece], xClip);\\r\\n var star = paper.path(pathFromCoords(coords)).attr({\\r\\n fill: '#ffc90e',\\r\\n stroke: 'none'\\r\\n }).transform('s' + scaleFactor + ',' + scaleFactor + ' 0,0 t' + (deltaX / scaleFactor) + \\\",0\\\");\\r\\n }\\r\\n }\\r\\n paper.path(coordsStr).attr({\\r\\n fill: 'none',\\r\\n stroke: strokeColors[mode],\\r\\n 'stroke-width': 5 * scaleFactor\\r\\n }).transform('s' + scaleFactor + ',' + scaleFactor + ' 0,0 t' + (deltaX / scaleFactor) + ',0');\\r\\n }\\r\\n}\\r\\n\\r\\n\\r\\nwindow.platform.subscribe(displayHelper);\\r\\n\\r\\n})();\\r\\n\",\"id\":\"http://www.france-ioi.org/modules/integrationAPI.01/installationAPI.01/pemFioi/buttonsAndMessages.js\"},\"taskStyles-0.1\":{\"content\":\"* {\\n -moz-user-select: -moz-none;\\n -webkit-user-select: none;\\n -o-user-select: none;\\n user-select: none;\\n -khtml-user-select: none;\\n}\\n\\n.touch {\\n -ms-touch-action: none;\\n}\\n\\nbody {\\n font-family: Arial, sans-serif;\\n font-size: 16px;\\n margin: 0 auto;\\n}\\nbody > * {\\n margin: 0 auto;\\n}\\n\\na {\\n color: #4D87CE;\\n font-weight: bold;\\n text-decoration: none;\\n}\\n\\nbutton,\\ninput[type=\\\"button\\\"] {\\n line-height: 1.2;\\n font-size: 16px;\\n}\\n.btn,\\ninput[type=button] {\\n display: inline-block;\\n padding: 6px 12px;\\n margin-bottom: 0;\\n font-size: 14px;\\n font-weight: 400;\\n line-height: 1.42857143;\\n text-align: center;\\n white-space: nowrap;\\n vertical-align: middle;\\n -ms-touch-action: manipulation;\\n touch-action: manipulation;\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n background-image: none;\\n border: 1px solid transparent;\\n border-radius: 4px;\\n color: #333;\\n background-color: #fff;\\n border-color: #ccc;\\n}\\n.btn-group {\\n position: relative;\\n display: inline-block;\\n vertical-align: middle;\\n}\\n.btn-group-vertical>.btn,\\n.btn-group>.btn {\\n position: relative;\\n float: left;\\n}\\n.btn-group .btn+.btn,\\n.btn-group .btn+.btn-group,\\n.btn-group .btn-group+.btn,\\n.btn-group .btn-group+.btn-group {\\n margin-left: -1px;\\n}\\n.btn-group>.btn:first-child {\\n margin-left: 0;\\n}\\n.btn-group>.btn:first-child:not(:last-child) {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n}\\n.btn-group>.btn:last-child:not(:first-child) {\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n.btn-group>.btn:not(:first-child):not(:last-child) {\\n border-radius: 0;\\n}\\n.btn-group>.btn.active,\\n.btn-group>.btn:active,\\n.btn-group>.btn:focus,\\n.btn-group>.btn:hover {\\n z-index: 2;\\n}\\n.btn.btn-xs {\\n padding: 1px 5px;\\n font-size: 12px;\\n line-height: 1.5;\\n border-radius: 3px;\\n}\\n\\n.btn-primary {\\n color: #fff;\\n background-color: #337ab7;\\n border-color: #2e6da4;\\n}\\n.btn-primary:hover {\\n color: #fff;\\n background-color: #286090;\\n border-color: #204d74;\\n}\\n.btn-default {\\n color: #333;\\n background-color: #fff;\\n border-color: #ccc;\\n}\\n.btn-default:hover {\\n color: #333;\\n background-color: #e6e6e6;\\n border-color: #adadad;\\n}\\n.btn-icon {\\n font-family: 'Courier New', Inconsolata, 'Roboto Mono', 'PT Mono', 'Ubuntu', monospace;\\n}\\n.selectable,\\ninput,\\ntextarea {\\n -moz-user-select: text;\\n -webkit-user-select: auto !important;\\n -o-user-select: text;\\n -khtml-user-select: text;\\n user-select: text;\\n}\\n\\n.borders, .borders td {\\n\\tborder: 1px solid black;\\n}\\n\\n.contentCentered {\\n text-align: center;\\n}\\n\\n.warningHeader { \\n margin: 10px 0px 10px 0px; \\n padding: 10px 10px 10px 10px; \\n background: #FFEEEE; \\n /*font-weight: bold;*/\\n border: 2px solid black; \\n border-radius: 6px;\\n }\\n#task h1,\\n.question h1,\\n#solution {\\n display: none;\\n margin-bottom: 0.4em;\\n margin-top: 0.4em;\\n}\\n#taskIntro {\\n border: 1px solid #8d9daa;\\n margin: 10px 0;\\n padding: 0 10px;\\n font-weight: bold;\\n}\\n#taskContent {\\n text-align: justify;\\n}\\n.pythonIntro code {\\n cursor: pointer;\\n}\\n\\n#success,\\n#error {\\n font-weight: bold;\\n}\\n#success {\\n color: blue;\\n}\\n#error {\\n color: red;\\n}\\n\\n#tabsContainer {\\n position: relative;\\n border-bottom: 2px solid #8d9daa;\\n}\\n#tabsMenu {\\n text-align: center;\\n}\\n#tabsMenu .li {\\n display: inline-block;\\n width: 165px;\\n margin: 0 20px;\\n background: #88BB88;\\n border: 2px solid #8d9daa;\\n border-bottom: 0;\\n border-radius: 6px 6px 0 0;\\n text-align: center;\\n}\\n#tabsMenu .li.lockedLevel {\\n background: #404040;\\n}\\n#tabsMenu .li.current {\\n margin-bottom: -2px;\\n padding-bottom: 2px;\\n background: white;\\n}\\n#tabsMenu .li.current.lockedLevel {\\n padding-bottom: 1px;\\n border-bottom: 1px solid #c0c0c0;\\n background: #606060;\\n}\\n#tabsMenu .li a {\\n display: block;\\n padding: 8px;\\n color: #000;\\n text-decoration: none; \\n font-size: 1.1em;\\n}\\n#tabsMenu .li.lockedLevel a {\\n color: #ddd;\\n}\\n#tabsMenu .li a:focus {\\n outline: none;\\n}\\n#tabsMenu .li:not(.current) a:active {\\n background: #c4d3de;\\n}\\n#tabsMenu .li.lockedLevel a:active {\\n background: #6c7787;\\n}\\n\\nh1 span {\\n display: inline-block;\\n width: .8em;\\n height: .8em;\\n}\\nh1 .stars {\\n vertical-align: baseline;\\n}\\n.stars {\\n vertical-align: middle;\\n}\\n\\n#tabsContainer {\\n position: relative;\\n}\\n.bestScore {\\n position: absolute;\\n right: 0;\\n top: .3em;\\n font-size: 1.2em;\\n}\\n#bestScore {\\n font-weight: bold;\\n}\\n\\n#popupMessage {\\n display: none;\\n}\\n#popupMessage .container {\\n position: relative;\\n margin: .5em 0;\\n padding: 8px;\\n}\\n#popupMessage.floatingMessage {\\n position: absolute;\\n z-index: 100;\\n top: 0;\\n left: 0;\\n height: 100%;\\n width: 100%;\\n background-color: gray;\\n background: rgba(0, 0, 0, .6);\\n}\\n#popupMessage.floatingMessage .container {\\n min-height: 100px;\\n max-width: 600px;\\n margin: 360px auto;\\n border: 2px solid black;\\n background: white;\\n}\\n#popupMessage img.beaver {\\n position: absolute;\\n width: 90px;\\n left: 0px;\\n}\\n#popupMessage img.messageArrow {\\n position: absolute;\\n z-index: 1;\\n left: 100px;\\n top: 16px;\\n}\\n#popupMessage .message {\\n margin-left: 115px;\\n padding: 8px;\\n max-width: 500px;\\n border: 2px solid black;\\n border-radius: 8px;\\n text-align: justify;\\n}\\n#popupMessage p {\\n margin: .5em 0 0;\\n}\\n#popupMessage p:first-child {\\n margin-top: 0;\\n}\\n#popupMessage input {\\n margin-top: 1em;\\n margin-left: 200px;\\n}\\n#popupMessage button {\\n margin-top: 1em;\\n margin-left: 200px;\\n padding: 5px 18px 5px 18px;\\n margin-bottom: 0.5em;\\n}\\n\\n.easy,\\n.medium,\\n.hard {\\n display: none;\\n}\\n\\n#displayHelperAnswering {\\n margin-top: 15px;\\n}\\n#displayHelper_validate,\\n#displayHelper_cancel {\\n display: inline-block;\\n}\\n#displayHelper_validate > input,\\n#displayHelper_cancel > input {\\n margin: 0 20px;\\n /* width: 9em; */\\n}\\n#displayHelper_saved {\\n margin: .6em;\\n}\\n#choose-view {\\n margin-bottom: 1em;\\n text-align: center;\\n}\\n#choose-view .choose-view-button {\\n margin: 0 10px;\\n}\\n\\n\\n#task {\\n\\twidth: 770px;\\n\\tmargin: 0 auto;\\n}\\n#task.largeScreen {\\n\\twidth: 1200px;\\n}\\n#taskContent:after {\\n content: \\\" \\\";\\n display: table;\\n clear: both;\\n}\\n#zone_1, #zone_2,\\n.zone_1, .zone_2 {\\n\\tmargin: 0 auto;\\n}\\n#zone_2,\\n.zone_2 {\\n\\twidth: 770px;\\n}\\n.largeScreen #zone_1,\\n.largeScreen #zone_2\\n{\\n\\tvertical-align: top;\\n\\tbox-sizing: content-box;\\n\\tfloat: left;\\n}\\n.largeScreen #zone_1 {\\n\\twidth: 430px;\\n}\\n.consigne {\\n\\tpadding: 10px;\\n}\\n.\\n#displayHelperAnswering {\\n\\tpadding: 10px;\\n}\\n\\n.exemple\\n{\\n\\tmargin: auto;\\n\\tmargin-top: 10px;\\n\\ttext-align: center;\\n\\tborder: 1px solid black;\\n\\tborder-radius: 1px;\\n\\twidth: 290px;\\n}\\n\\n.grille, .boutons_sujet\\n{\\n\\tdisplay: inline-block;\\n\\tvertical-align: middle;\\n\\tmargin: auto;\\n}\\n\\n.boutons_sujet\\n{\\n\\tmargin-top: 20px; \\n}\\n\\n\\n.objectif\\n{\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\tmargin: auto;\\n\\tmargin-top: 20px;\\n}\\n\\n\\n.container_inverse\\n{\\n\\tdisplay: inline-block;\\n\\twidth: 100%;\\n}\\n\\n/* css présent à l'origine dans tous les sujets et déplacé ci-dessous */\\n\\n#anim_container\\n{\\n\\ttext-align: center;\\n}\\n\\n#anim_container table {\\n\\tmargin: auto;\\n}\\n\\n#anim {\\n\\tdisplay: inline-block;\\n\\tmargin-top: 20px;\\n}\\n\\n#feedback {\\n\\theight: 1em;\\n\\tmargin-top: 0.5em;\\n\\tmargin-bottom: 0.1em;\\n\\ttext-align: center;\\n\\tfont-weight: bold;\\n\\tcolor: red; \\n}\\n\\n#showSolutionButton {margin-top: 24px;}\\n\",\"id\":\"http://www.france-ioi.org/modules/pemFioi/taskStyles-0.1_M.css\",\"type\":\"stylesheet\"}}");
var importedModules = {};
window.importModules = function(modulesList) {
var modulesStr = '';
for(var iMod in modulesList) {
var moduleName = modulesList[iMod];
var curModule = importableModules[moduleName];
if(curModule) {
// Avoid importing the same module twice
if(importedModules[moduleName] === true) {
continue;
} else {
importedModules[moduleName] = true;
}
var modClass = curModule.classStr ? curModule.classStr : "remove";
var modContent = curModule.content;
var modId = curModule.id ? curModule.id : moduleName;
if (document.getElementById('jsContent')) {
if (curModule.type == 'stylesheet') {
var newScript = document.createElement('style');
} else {
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
}
newScript.class = modClass;
newScript.id = modId;
if (window.addEventListener) {
newScript.appendChild(document.createTextNode(modContent));
} else {
newScript.text = modContent;
}
document.getElementById('jsContent').appendChild(newScript);
} else {
if (curModule.type == 'stylesheet') {
modulesStr += '<style class="' + modClass + '" id="' + modId + '">' + modContent + '</style>';
} else {
modulesStr += '<script class="' + modClass + '" type="text/javascript" id="' + modId + '">' + modContent + '</script>';
}
}
} else if(window.mainImportModules) {
window.mainImportModules([modulesList[iMod]]);
} else {
console.error("Module '"+moduleName+"' unknown.");
}
}
if(modulesStr) {
document.write(modulesStr);
}
}
})();